@@ -19,6 +19,66 @@ Format loosely follows [Keep a Changelog](https://keepachangelog.com/). Versions
1919- Live OTEL collector verify (Phoenix or equivalent) against the merged sink.
2020- Dogfood session migrate: new session under ` ~/.corbits/projects ` , one legacy ` .agent-state ` migrate, write under state root still asks.
2121
22+ ## [ 0.2.93] - 2026-08-08
23+
24+ Running several sub-agents at once was close to unusable. The watchdog meant to
25+ catch a hung run was killing healthy ones, approvals piled up one at a time and
26+ printed twice, and the panel showing what each agent was doing had collapsed to
27+ a line of counts. This release fixes that path end to end.
28+
29+ ### Sub-agents were being killed mid-run
30+
31+ - ** The stall watchdog aborted healthy parallel fan-outs.** Any silence counted
32+ as a hang, and in a fan-out the first sub-agent to finish flipped the run back
33+ to awaiting-a-response while the rest still worked. Since the parent emits
34+ nothing while children run, the whole run read as silent: a no-response notice
35+ at ninety seconds, then an abort of everything in flight at fifteen minutes.
36+ The watchdog now consults the outstanding tool calls it was already tracking.
37+ (CL-5641)
38+ - ** The clock also ran while you read an approval.** Blocked-on-the-operator is
39+ now part of the turn state rather than something only the painter derived, so
40+ the watchdog and the phase line read one source. Gates still queued behind
41+ another are covered, not only the one on screen. (CL-5642)
42+
43+ ### Approvals
44+
45+ - ** A grant no longer has to be given once per agent.** Minting one now settles
46+ every queued request it already covers. The reconciliation lives in the
47+ permission layer behind a single idempotent settle, so it holds for any
48+ surface and cannot double-resolve or strand a request. Session teardown denies
49+ whatever is still queued instead of abandoning it. (CL-4995)
50+ - ** Every approval wrote two transcript rows.** A screen of approvals read as
51+ twice as many requests as had happened. There is now exactly one row per
52+ decision — including denials, timeouts, and aborts, which previously wrote
53+ nothing, so a refused permission was indistinguishable from a hang. (CL-5644)
54+ - ** Project-scoped grants never matched a sub-agent.** A grant was stamped with
55+ the session root while a sub-agent asks from its own git worktree, and the two
56+ were compared as plain strings — so the agents generating the approvals could
57+ never benefit from an earlier answer. Both sides now resolve through the
58+ worktree registry that already governs path containment, by exact match rather
59+ than prefix. (CL-5662)
60+
61+ ### Watching the work
62+
63+ - ** The live agents panel is back above the prompt** — one row per running
64+ sub-agent with elapsed time, current tool, and whether it has gone quiet.
65+ Rows hold position instead of reordering on each event, the zone shrinks a row
66+ at a time under a short terminal rather than disappearing, and when a fan-out
67+ exceeds the space the quietest agent stays visible. Rows are measured in
68+ terminal columns, so a wide-character description cannot overflow the zone.
69+ (CL-5646)
70+
71+ ### Turns that never ended
72+
73+ - ** Goal mode stuck at "working" indefinitely.** Two events registered the same
74+ tool call under different identities — one by id, one by name — so a call was
75+ counted twice and cleared once, and the turn waited forever on work that had
76+ finished. Goal mode was worst affected because it continues on its own and
77+ never emits the fallback that settles a stalled turn. (CL-5645)
78+ - ` run.json ` records its turn count at every turn boundary rather than only at
79+ session start and end, so a resumed session reports what it actually did.
80+ (CL-5570, CL-5534)
81+
2282## [ 0.2.92] - 2026-08-07
2383
2484A second sweep over the OpenTUI cutover, plus a rebuilt model surface. Two of
0 commit comments