Pin the mid-tool-call rule in the control board scanner (#1503)

Acceptance rule (plan page, bf641e22): a seat mid-tool-call is working,
never waiting. The scanner already met it through pi's stopReason values;
deriveState now also checks the content for a toolCall block (working),
after the error stop reasons and before "stop" (waiting). Thinking blocks
do not keep a text turn from being waiting. Three JSONL fixture tests and
three state-table cases pin the rule. Live check on the real board:
orch-01 and rev-code-01 mid-tool-call are working, velma's finished
text-only turn is waiting. Sonnet review: APPROVED.

Co-Authored-By: Claude Fable 5.1 <[email protected]>
This commit is contained in:
2026-09-12 09:29:19 -05:00
co-authored by Claude Fable 5.1
parent bf641e220a
commit 6ec253de20
6 changed files with 95 additions and 4 deletions
+15
View File
@@ -2025,3 +2025,18 @@ under the table is unchanged. Page-only change, one static test
(control-board 66/66, packages/mosaic 69/69). Sonnet review:
APPROVED, no findings. Verified in Chrome: "1 of 4", "3 of 4", "4", "13 of 38",
console clean. Next: Jason keeps using it.
## 2026-09-12 — Control board step 3, mid-tool-call rule (#1503)
Before: the acceptance rule "a seat mid-tool-call is working, never
waiting" (plan page, commit bf641e22) had no test of its own. The scanner
met it only through pi's stopReason values.
After: deriveState also checks the message content for a toolCall block
(working), after the error stop reasons (error) and before "stop"
(waiting). Thinking blocks do not affect waiting. Three JSONL fixture tests
and three state-table cases pin it. Suites: control-board 69/69,
packages/mosaic 69/69. Live check at 14:27Z on the real board: orch-01
(assistant + toolCall) working, rev-code-01 (tool result last) working,
velma (text-only, stop) waiting. Sonnet review: APPROVED, no findings.
No seat changed state because of this change; it closes a gap, not a bug.