Three review agents watched real Claude Code workers build small programs
and compared every panel with the transcript. Replaying their transcripts
through the core found, and now fixes:
- A Bash call was classified from its 400-character display clip, so a
commit or a test run late in a long one-liner vanished (a failing pytest
run drew as "saves the work"). The intent, the printed files and whether
a save ships are now read from the whole command.
- A test run that reports failures failed, even when `| tail` hid the exit
code. With that, the real fix-test-fix-test sequence folds into one loop:
"Fix and test, 2 rounds. It passes in the end."
- node:test (`# pass 7`), all-failing pytest (`3 failed in 0.1s`) and
pytest errors are counted.
- A helper started in the background was drawn as finished, with Claude
Code's internal launch notes as its answer. It now stays running until its
task notification arrives; the answer, tool count and duration are joined
back onto it, and the final panel says when helpers are still out.
- The notification turn reported Claude Code's own duration, counted from
the first prompt (2 min 38 s for a 21 s turn); a turn is capped at its span.
- Logging into scratch (`| tee "$S/dry.txt"`, `> /tmp/x`) counted as an edit;
redirect targets are read quote-aware, and a here-document's body is data.
- A probe (`pytest --version`) reads as looking around, not running a tool.
- A plan Claude writes as a numbered list (no plan tool, as in current
Claude Code builds) is drawn as a plan panel; files it cats are file cards.
- A balloon: code spans stay whole, an ellipsis or e.g. does not end the
sentence, a remark about the check that just ran stays on that check, and
a loop shows the last word of its rounds.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>