Run a turn's tool calls at once, and say how long a child has been running Two things from one session that looked stuck for two minutes and was not. **A turn's tool calls ran in order.** A model asking for two tools in one turn is saying they do not depend on each other, and both lanes ran anyway one after the other: three minutes thirty-eight, then eleven seconds. The session then reported that they "ran in parallel", which was the reasonable thing to believe and not true. They now run together and the turn costs the slower of the two — the same two-lane fan-out finishes in twenty-one seconds. Order within one call is preserved, because a tool call and its result are a sequence. A tool that throws no longer strands the others mid-flight: the first failure is raised once every stream has stopped, so a caller never sees half a turn's events and no error. **A running child said only `Initializing…`.** It says that until its first tool call arrives, and a recon child that thinks for ninety seconds before touching anything showed it for all ninety. That is indistinguishable from a hang, which is exactly how it was read. Every running row now carries its elapsed time. Neither was a deadlock. The child in that session completed in about a hundred seconds when run again on its own; what was missing was any way to tell slow from stuck. Still missing, and worth its own change: a delegated child has no deadline at all. The only timer in the fleet is the kill grace after someone asks a child to stop, so a child that genuinely hangs hangs the turn until the reader presses ctrl+x. 438 tests pass, five of them on running streams together.
Run a turn's tool calls at once, and say how long a child has been running
Deploy story
What this commit did to the running system — joined from the forge receipt chain, the part a commit page elsewhere cannot show.
Not deployed through the forge lane
No push, promotion, build, or deploy receipt references this commit (receipts are scanned over a bounded recent window). Changes shipped by full node replacement carry their proof in the release gate receipt instead.
Changed files
-
modified
docs/assure-repo/false-green-candidates.v1.json -
modified
docs/assure-repo/surface-inventory.v1.json -
modified
packages/openagents-cli/src/coder-fleet.ts -
added
packages/openagents-cli/src/coder-merge.ts -
modified
packages/openagents-cli/src/coder-ollama.ts -
modified
packages/openagents-cli/src/coder-thread.ts -
modified
packages/openagents-cli/test/coder-delegate.test.ts -
added
packages/openagents-cli/test/coder-merge.test.ts
Diff
8 files changed, +161 -18
docs/assure-repo/false-green-candidates.v1.json modified +1 -1
@@ -4,7 +4,7 @@
| 4 | 4 |
|
| 5 | 5 |
|
| 6 | 6 |
|
| 7 |
|
|
| 7 |
|
|
| 8 | 8 |
|
| 9 | 9 |
|
| 10 | 10 |
|
docs/assure-repo/surface-inventory.v1.json modified +2 -2
@@ -1,7 +1,7 @@
| 1 | 1 |
|
| 2 | 2 |
|
| 3 | 3 |
|
| 4 |
|
|
| 4 |
|
|
| 5 | 5 |
|
| 6 | 6 |
|
| 7 | 7 |
|
packages/openagents-cli/src/coder-fleet.ts modified +14 -5
@@ -73,7 +73,7 @@ export function fleetPhrase(tasks: ReadonlyArray<CoderTask>): string | undefined
| 73 | 73 |
|
| 74 | 74 |
|
| 75 | 75 |
|
| 76 |
|
|
| 76 |
|
|
| 77 | 77 |
|
| 78 | 78 |
|
| 79 | 79 |
|
@@ -86,10 +86,15 @@ export function taskActivity(task: CoderTask): string {
| 86 | 86 |
|
| 87 | 87 |
|
| 88 | 88 |
|
| 89 |
|
|
| 90 |
|
|
| 91 |
|
|
| 92 |
|
|
| 93 |
|
|
| 89 | 94 |
|
| 90 |
|
|
| 95 |
|
|
| 91 | 96 |
|
| 92 |
|
|
| 97 |
|
|
| 93 | 98 |
|
| 94 | 99 |
|
| 95 | 100 |
|
@@ -119,7 +124,11 @@ export function taskCounters(task: CoderTask): string {
| 119 | 124 |
|
| 120 | 125 |
|
| 121 | 126 |
|
| 122 |
|
|
| 127 |
|
|
| 128 |
|
|
| 129 |
|
|
| 130 |
|
|
| 131 |
|
|
| 123 | 132 |
|
| 124 | 133 |
|
| 125 | 134 |
|
@@ -129,7 +138,7 @@ export function fleetRows(tasks: ReadonlyArray<CoderTask>, width: number): Reado
| 129 | 138 |
|
| 130 | 139 |
|
| 131 | 140 |
|
| 132 |
|
|
| 141 |
|
|
| 133 | 142 |
|
| 134 | 143 |
|
| 135 | 144 |
|
packages/openagents-cli/src/coder-merge.ts added +64
@@ -0,0 +1,64 @@
| 1 |
|
|
| 2 |
|
|
| 3 |
|
|
| 4 |
|
|
| 5 |
|
|
| 6 |
|
|
| 7 |
|
|
| 8 |
|
|
| 9 |
|
|
| 10 |
|
|
| 11 |
|
|
| 12 |
|
|
| 13 |
|
|
| 14 |
|
|
| 15 |
|
|
| 16 |
|
|
| 17 |
|
|
| 18 |
|
|
| 19 |
|
|
| 20 |
|
|
| 21 |
|
|
| 22 |
|
|
| 23 |
|
|
| 24 |
|
|
| 25 |
|
|
| 26 |
|
|
| 27 |
|
|
| 28 |
|
|
| 29 |
|
|
| 30 |
|
|
| 31 |
|
|
| 32 |
|
|
| 33 |
|
|
| 34 |
|
|
| 35 |
|
|
| 36 |
|
|
| 37 |
|
|
| 38 |
|
|
| 39 |
|
|
| 40 |
|
|
| 41 |
|
|
| 42 |
|
|
| 43 |
|
|
| 44 |
|
|
| 45 |
|
|
| 46 |
|
|
| 47 |
|
|
| 48 |
|
|
| 49 |
|
|
| 50 |
|
|
| 51 |
|
|
| 52 |
|
|
| 53 |
|
|
| 54 |
|
|
| 55 |
|
|
| 56 |
|
|
| 57 |
|
|
| 58 |
|
|
| 59 |
|
|
| 60 |
|
|
| 61 |
|
|
| 62 |
|
|
| 63 |
|
|
| 64 |
|
packages/openagents-cli/src/coder-ollama.ts modified +6 -4
@@ -14,6 +14,7 @@
| 14 | 14 |
|
| 15 | 15 |
|
| 16 | 16 |
|
| 17 |
|
|
| 17 | 18 |
|
| 18 | 19 |
|
| 19 | 20 |
|
@@ -498,10 +499,11 @@ export class OllamaReplySource implements ReplySource {
| 498 | 499 |
|
| 499 | 500 |
|
| 500 | 501 |
|
| 501 |
|
|
| 502 |
|
|
| 503 |
|
|
| 504 |
|
|
| 502 |
|
|
| 503 |
|
|
| 504 |
|
|
| 505 |
|
|
| 506 |
|
|
| 505 | 507 |
|
| 506 | 508 |
|
| 507 | 509 |
|
packages/openagents-cli/src/coder-thread.ts modified +6 -4
@@ -63,6 +63,7 @@
| 63 | 63 |
|
| 64 | 64 |
|
| 65 | 65 |
|
| 66 |
|
|
| 66 | 67 |
|
| 67 | 68 |
|
| 68 | 69 |
|
@@ -380,10 +381,11 @@ export class ThreadReplySource implements ReplySource {
| 380 | 381 |
|
| 381 | 382 |
|
| 382 | 383 |
|
| 383 |
|
|
| 384 |
|
|
| 385 |
|
|
| 386 |
|
|
| 384 |
|
|
| 385 |
|
|
| 386 |
|
|
| 387 |
|
|
| 388 |
|
|
| 387 | 389 |
|
| 388 | 390 |
|
| 389 | 391 |
|
packages/openagents-cli/test/coder-delegate.test.ts modified +5 -2
@@ -319,9 +319,12 @@ describe("fleet rendering", () => {
| 319 | 319 |
|
| 320 | 320 |
|
| 321 | 321 |
|
| 322 |
|
|
| 322 |
|
|
| 323 |
|
|
| 324 |
|
|
| 325 |
|
|
| 323 | 326 |
|
| 324 |
|
|
| 327 |
|
|
| 325 | 328 |
|
| 326 | 329 |
|
| 327 | 330 |
|
packages/openagents-cli/test/coder-merge.test.ts added +63
@@ -0,0 +1,63 @@
| 1 |
|
|
| 2 |
|
|
| 3 |
|
|
| 4 |
|
|
| 5 |
|
|
| 6 |
|
|
| 7 |
|
|
| 8 |
|
|
| 9 |
|
|
| 10 |
|
|
| 11 |
|
|
| 12 |
|
|
| 13 |
|
|
| 14 |
|
|
| 15 |
|
|
| 16 |
|
|
| 17 |
|
|
| 18 |
|
|
| 19 |
|
|
| 20 |
|
|
| 21 |
|
|
| 22 |
|
|
| 23 |
|
|
| 24 |
|
|
| 25 |
|
|
| 26 |
|
|
| 27 |
|
|
| 28 |
|
|
| 29 |
|
|
| 30 |
|
|
| 31 |
|
|
| 32 |
|
|
| 33 |
|
|
| 34 |
|
|
| 35 |
|
|
| 36 |
|
|
| 37 |
|
|
| 38 |
|
|
| 39 |
|
|
| 40 |
|
|
| 41 |
|
|
| 42 |
|
|
| 43 |
|
|
| 44 |
|
|
| 45 |
|
|
| 46 |
|
|
| 47 |
|
|
| 48 |
|
|
| 49 |
|
|
| 50 |
|
|
| 51 |
|
|
| 52 |
|
|
| 53 |
|
|
| 54 |
|
|
| 55 |
|
|
| 56 |
|
|
| 57 |
|
|
| 58 |
|
|
| 59 |
|
|
| 60 |
|
|
| 61 |
|
|
| 62 |
|
|
| 63 |
|