v0.55.0
Minor release: the dashboard gains a real per-agent page, and the review-remediation sweep lands its first three Lane A phases — session lifecycle honesty, persistence atomicity, and agent-pack routes that had been failing silently.
Added
The single-agent view (#948, MOD-261). The machine-scoped dashboard becomes a real per-agent page. Behind it is a unified runs read model: a monitor firing, a chat, and a workflow run are one list of runs rather than three unrelated event sprays — which is also why a monitor now records one run per firing instead of a spray of events. Agent state becomes a tri-state (running / stalled / stopped) rather than a bare pid check, so "the process exists" stops being mistaken for "the agent is working", and the page can surface a stalled workflow run and offer to resume it.
New per-agent nouns under /api/agents/{name}: GET runs, overview, health, sessions, details, spend, and POST workflows/runs/{run_id}/resume. The overview also reports what the script cache did not spend. Integrates #906, #912, #913, #914, #915, #916, #919 and the #941 restyle.
Fixed
- A session could not be stopped while its startup turn was still in flight (#949) —
stop()silently no-opped and the thread plus its brain subprocess kept running, leaking a live, token-burning agent for every timed-out phase while reporting "session failed to start". Setting an event cannot interrupt a turn parked inawait client.receive_response(), so_runis now a cancellable task. start()waited out the full timeout after the session thread had already crashed (#949) — a launch that failed in milliseconds measured 30.006s, and launch paths pass timeouts up to 3600s.- A supervised agent's terminal failure was never persisted (#949) — the
except asyncio.TimeoutErrorhandler was unreachable, soTERMINAL_FAILEDnever landed and the reconciler had nothing to re-emit. - Every durable writer now shares one atomic-write helper (#951) — the pattern had been re-implemented in six places while a comparable set of writers used a bare
write_text. Because every loader treats unparseable state as empty, the cost is never "lose one field": a torn monitor state file re-fires every monitor, a torn spend file zeroes the runaway-loop backstop's window, a tornsetup.jsondiscards the whole wizard session, and a tornconfig.tomlloses the operator's foreign codex keys. - Agent-pack routes that silently matched nothing (#957) —
eng-team'sgithub.issues.assignedmatches a type no adapter emits, soissue-lifecyclenever fired on assignment (this is why issue pickup has needed a Slack directive); the dogfood workflow'sissues_count > 0used an unsupported operator and fell through to a truthy check, closing a 3-issue audit as having passed review. Validation now catches this class via a per-source event-type table that fails open on unknown adapters.eng-team1.5.2 → 1.5.3,dogfood-content-review1.2.1 → 1.2.2. - A raise from
_make_sessionescaped the workflow orchestrator's terminal-honesty handler (#957) — the registry entry stuck atrunningwith nosession.failedorworkflow.failed. - The Worker deploy smoke gated on a version carrying the previous run's credentials (#954) —
wrangler deployand thesecret bulkafter it publish two Worker versions reporting the same release sha, so a sha-only gate could not tell them apart. Readiness now also requires that an operator-authenticated route answers 200 to this run's freshly minted token and thatversion_idholds still.
Changed
AGENTS.mdstates the dated plan-filename convention the repo already follows (#950).- Lane C of the review-remediation plan is 2 PRs, not 3 (#947) — its six remaining web-UI items are deferred, since the single-agent work above rewrites those surfaces.
Full detail in CHANGELOG.md.