Skip to content

Commit 4f3f773

Browse files
committed
Write the 0.2.93 changelog and release notes
Parallel sub-agents were close to unusable: the watchdog meant to catch a hung run was aborting healthy fan-outs, approvals asked once per agent and printed twice, and the panel showing what each agent was doing had collapsed to a line of counts. The notes say what changed for the operator rather than which branch restored it.
1 parent d1d9c5a commit 4f3f773

2 files changed

Lines changed: 122 additions & 0 deletions

File tree

CHANGELOG.md

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

2484
A second sweep over the OpenTUI cutover, plus a rebuilt model surface. Two of

docs/release-notes-0.2.93.md

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
## Parallel sub-agents actually work now
2+
3+
Running several sub-agents at once was close to unusable. The watchdog meant to
4+
catch a hung run was killing healthy ones, approvals piled up one at a time and
5+
printed twice, and the panel that used to show what each agent was doing had
6+
collapsed to a single line of counts. This release fixes that path end to end.
7+
8+
### Your agents were being killed mid-run
9+
10+
The stall watchdog treated any silence as a hang. In a parallel fan-out the
11+
first sub-agent to finish flipped the run back to "awaiting a response", and
12+
because the parent emits nothing while children work, the whole run looked
13+
silent — so after ninety seconds it announced no response, and after fifteen
14+
minutes it aborted everything still in flight. The watchdog now knows that work
15+
is outstanding and stays quiet while it is.
16+
17+
The same watchdog also ran while you were reading an approval. Being blocked on
18+
an operator is now part of the run's state rather than something only the
19+
painter knew, so a prompt you take your time over cannot be torn down
20+
underneath you. That applies to approvals still queued behind another, not only
21+
the one on screen.
22+
23+
### Approvals
24+
25+
**Answer once, not once per agent.** Granting a permission now clears every
26+
queued request that grant already covers, instead of asking again for each
27+
sub-agent that wanted the same thing. The reconciliation lives in the
28+
permission layer, so it holds for any surface, not just the terminal.
29+
30+
**Every approval printed twice.** A screen of approvals read as twice as many
31+
requests as had actually happened. Now there is exactly one row per decision —
32+
including denials, timeouts, and aborts, which previously left no trace at all.
33+
An agent that died of a refused permission looked identical to one that hung.
34+
35+
**Grants you had already given were being ignored.** A project-scoped grant was
36+
recorded against the session root, while a sub-agent asks from inside its own
37+
git worktree, and the two were compared as plain strings. No project grant ever
38+
matched a sub-agent — so the agents generating the approvals were the ones that
39+
could never benefit from a previous answer. Worktrees are now resolved through
40+
the same registry that governs path containment, matched exactly rather than by
41+
prefix, so a directory that merely starts with the same characters cannot pass
42+
for one.
43+
44+
### Watching the work
45+
46+
The live agents panel is back above the prompt: one row per running sub-agent
47+
with elapsed time, current tool, and whether it has gone quiet. It holds
48+
position as agents work rather than reordering on every event, shrinks a row at
49+
a time when the terminal is short instead of vanishing, and when more agents are
50+
running than fit, the quietest one stays visible — that is the one worth seeing.
51+
52+
### Goal mode no longer sticks at "working"
53+
54+
Two events could register the same tool call under different identities, one by
55+
id and one by name, so a call was counted twice and only cleared once. The turn
56+
then waited forever on a call that had already finished. Worst in goal mode,
57+
which keeps continuing on its own and never emitted the fallback that settles a
58+
stuck turn.
59+
60+
Relatedly, `run.json` now records its turn count at every turn boundary instead
61+
of only at the start and end of a session, so a resumed session reports what it
62+
actually did.

0 commit comments

Comments
 (0)