Secret Scan / scan (push) Successful in 9s
Build App (Preview) / compute-version (pull_request) Successful in 9s
Secret Scan / scan (pull_request) Successful in 8s
Build App (Preview) / create-release (pull_request) Successful in 2s
Build App (Preview) / test (pull_request) Successful in 4m10s
Build App (Preview) / build-macos (pull_request) Successful in 3m12s
Build App (Preview) / build-linux (pull_request) Successful in 9m31s
Build App (Preview) / build-windows (pull_request) Successful in 6m47s
Build App (Preview) / prune-previews (pull_request) Successful in 3s
Build Container / build-container (pull_request) Successful in 17m21s
- Event renamed to `project-container-exited` and carries a reason: `exited` (died while the app was watching) toasts; `found_stopped` (the first look of a run, e.g. after a host reboot) updates silently. Reconnect sweeps report `exited`, since the app was running then. - listen() in useProjectStatusEvents gets a .catch, like its sibling. - Keepalive respawns are throttled to ~1/s with a fork-free pause (`read -t` on a FIFO, `sleep 1` fallback), so a failing fork or an instantly-dying sleep cannot spin a core. Measured: 10748 respawns in 3 s unthrottled vs 3. - Watcher backoff resets only after a working connection (an event delivered, or up for 60 s); ping-OK-but-events-fail now backs off to 60 s instead of re-sweeping every 5 s. - Every Docker call in the watcher (ping, sweep, inspect, stream) races the app's cancellation, so a wedged daemon cannot hold shutdown. - TOCTOU between the inspect and the flip: ProjectsStore now counts writes; running_on() returns a sighting at a revision and mark_exited() refuses with Changed if anything was written since (a stop+start of the same container id included), and settle() re-confirms. - The "Running on this container" rule lives once, in the store, with the 12-char guard on both ids, matched under the lock without cloning. - Marketplace readiness fallback also requires a root-owned process. - TECHNICAL.md no longer documents the `su … sleep infinity` ending. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>