Agent-only. Operator report: Start/Stop fire but the status view never updates.
act() now applies the POST's own status response immediately and shows an optimistic starting/stopping state (pulsing, buttons disabled) on click — no longer waits on the lagging /status poll.
A stop with in-flight jobs shows stopping until active drains to 0, then resolves to stopped on its own.
applyStatus() guards the /status-only fields (connection pill + queue) so the lean, fast action response can't blank them.
GPU reads are now cached (1s TTL, single probe at a time) and /status no longer spawns its own nvidia-smi — so the fast /gpu poll + autoscaler + /status share one subprocess instead of piling up in the server thread pool (the underlying reason clicks felt dead under load).
Agent-only. Operator report: Start/Stop fire but the status view never updates.
- `act()` now applies the POST's own status response immediately and shows an optimistic **starting**/**stopping** state (pulsing, buttons disabled) on click — no longer waits on the lagging `/status` poll.
- A stop with in-flight jobs shows **stopping** until `active` drains to 0, then resolves to **stopped** on its own.
- `applyStatus()` guards the `/status`-only fields (connection pill + queue) so the lean, fast action response can't blank them.
- GPU reads are now cached (1s TTL, single probe at a time) and `/status` no longer spawns its own `nvidia-smi` — so the fast `/gpu` poll + autoscaler + `/status` share one subprocess instead of piling up in the server thread pool (the underlying reason clicks felt dead under load).
Ships in the agent image.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Operator: the buttons fire but the status view doesn't reflect the change. Cause:
act() ignored the POST's own status response and waited on the separate /status
poll (which lags behind the curator queue call). Now:
- act() applies the POST's returned status immediately for instant feedback, and
shows an optimistic "starting"/"stopping" state (pulsing, buttons disabled)
the moment it's clicked.
- A stop that still has in-flight jobs draining shows "stopping" until active
hits 0, then resolves to "stopped" on its own.
- applyStatus() guards the /status-only fields (connection pill + queue) so the
lean action response can't blank them — the Start/Stop path deliberately skips
the slow curator call to stay snappy.
Also de-duplicate GPU reads: read_gpu() now caches (1s TTL) with one probe at a
time, and /status no longer spawns its own nvidia-smi — so the fast /gpu poll +
autoscaler + /status share a single subprocess instead of piling up in the
server thread pool (which was what made clicks feel dead under load).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ttrj5P7upUTueSfoJcxEqa
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Agent-only. Operator report: Start/Stop fire but the status view never updates.
act()now applies the POST's own status response immediately and shows an optimistic starting/stopping state (pulsing, buttons disabled) on click — no longer waits on the lagging/statuspoll.activedrains to 0, then resolves to stopped on its own.applyStatus()guards the/status-only fields (connection pill + queue) so the lean, fast action response can't blank them./statusno longer spawns its ownnvidia-smi— so the fast/gpupoll + autoscaler +/statusshare one subprocess instead of piling up in the server thread pool (the underlying reason clicks felt dead under load).Ships in the agent image.
🤖 Generated with Claude Code