What happens
bench/canary/lib/chat.sh waits for the literal ' · idle' on the v3 status line before it types the brief, and chat_asked_frame looks for [a] accept on a card. Neither string exists on dev (f08201024) any more. Every chat cell therefore records noframe after 61 s having spent nothing, and a grid run against dev reports a wall of empty cells that look like model failures.
Replication a stranger can run
make build
AFORGE_MODE=chat bench/run.sh --issue pallets/click#3481 --model deepseek/deepseek-v4.1-flash --runs 1
grep -l noframe bench/out/*/cell.json
Compare with tmux capture-pane of a live bin/aforge chat: the idle status line no longer contains · idle.
Acceptance, end to end first
A chat cell against dev reaches the model: cell.json carries a non-zero cost and calls.jsonl has at least one priced row, on the same command above. The needles the canary waits for come out of the same table the e2e suite reads (internal/e2e/tuiwords_test.go) or a sibling that an untagged test checks against internal/tui3 sources, so the next respelling names the canary instead of silently emptying the grid.
Found by the 2026-09-14 PlanDB A/B grid; the lane patched chat.sh locally to run at all (spark:~/af-plandb-evidence/rig-local-patch.diff). Related: #1028 (fix-branch leak in fresh_clone).
Drafted with CodeAF · reviewed and owned by the author
What happens
bench/canary/lib/chat.shwaits for the literal' · idle'on the v3 status line before it types the brief, andchat_asked_framelooks for[a] accepton a card. Neither string exists ondev(f08201024) any more. Every chat cell therefore recordsnoframeafter 61 s having spent nothing, and a grid run againstdevreports a wall of empty cells that look like model failures.Replication a stranger can run
make build AFORGE_MODE=chat bench/run.sh --issue pallets/click#3481 --model deepseek/deepseek-v4.1-flash --runs 1 grep -l noframe bench/out/*/cell.jsonCompare with
tmux capture-paneof a livebin/aforge chat: the idle status line no longer contains· idle.Acceptance, end to end first
A chat cell against
devreaches the model:cell.jsoncarries a non-zerocostandcalls.jsonlhas at least one priced row, on the same command above. The needles the canary waits for come out of the same table the e2e suite reads (internal/e2e/tuiwords_test.go) or a sibling that an untagged test checks againstinternal/tui3sources, so the next respelling names the canary instead of silently emptying the grid.Found by the 2026-09-14 PlanDB A/B grid; the lane patched
chat.shlocally to run at all (spark:~/af-plandb-evidence/rig-local-patch.diff). Related: #1028 (fix-branch leak infresh_clone).Drafted with CodeAF · reviewed and owned by the author