Transcript: a run of background-task notifications folds into one line; a reply of only punctuation draws no row
Leo, 2026-11-02, about his chat showing a column of rows that alternated "Background task finished" with a lone "·" agent reply under each: "why do you still do these", then "should we improve the app then".
What changes
- A run of background-task notifications folds into one line. Two or more in a row (a quiet background turn's ended line, a background shell's end noted as finished or stopped) draw as one muted line, the same look as the single line:
4 background tasks finished(orN background updateswhen a stopped shell or a scheduled check is among them). A click opens the run to its rows exactly as they drew before; each member line still opens to its own rows. A failed shell, a running line, a turn the agent answered with something to say, or any other row ends the run, so a real reply stays in sight. A single line stays as it was. - An agent reply of only punctuation and white space (
.,·,…) draws no row. This widensisBareAgentText(#32726 hid a lone.) to any punctuation, so the row, its height and the turn's visibility agree, for an agent's reply and for another agent's received message. A person's.or?is still a message. The check stops at 64 characters, so a streamed token never costs more than that. The #32726 test that said..and…still draw is widened to match.
With #32798 (a quiet background line with nothing to open draws no line), a background turn whose only reply was · now has nothing to open, so it draws no line at all. That is Leo's exact screenshot: the four "Background task finished" + · pairs go away, and the stopped task's note stays. Runs of lines that did open to something (a log read, a check) fold into the one counted line.
No notification row loses information (open the run to see each one), and no other row type changes.
How
conversation/backgroundRuns.ts:foldBackgroundRuns, one pass over a turn's shaped rows next tofoldMessageRunsinshapedTurn(and the rows before the first prompt). The run line reuses the background turn row kind, so its height, spacing and look are the existing line's; it carriesbackgroundRuninstead ofbackground. Its open state lives in the transcript fold set, keyed by its first member, and is part of the cached turn's key (openBackgroundRuns). Its version hashes member versions and the open state, so memoized rows and the height cache keep it across snapshots.hiddenRowFoldsopens the run (then the member line) for Find and links.BackgroundTurnLinedraws the run line. Two new strings, in every catalog language.- Transcript cost: no new pass over the whole transcript per token. The fold runs inside turn shaping, which already walks the live turn's rows, and finished turns stay cached.
The design spec for the transcript surface gets the same rule (leo-workspace design/chat-transcript.md).
References
Design references used: codex-mobile/live/grouped-activity-rows (Codex's "Finished 1 agent ›" count rows) and claude/live/transcript-tool-rows-and-task-list (Claude's "Ran 5 commands (1 failed) ›"). Both fold repeated activity into one counted line with a chevron, which is the look used here. Other wordings considered: "Finished 4 background tasks" (Codex's verb first) and "Background task finished ×4". The noun-first form matches the existing single line, so the line keeps its wording and only gains a count.
Gallery
agent-pane.background-runs, five variants: closed (Leo's case: four in a row with lone dots), open, mixed (a stopped shell among them), reply-kept (a task with a real reply splits the run), single-line.
Tests
conversation/backgroundRuns.test.tsx: punctuation-only replies; four lines with lone dots fold, open in order; stopped shells count as updates; a real reply splits a run; failed and running lines end it; an individually opened member keeps its rows inside the run; Find opens run then member; version stability.conversation/visibleMessage.test.ts: punctuation-only agent words are bare;Done.,ok,+are not.test/agent-pane-background-turns.test.ts: reducer-level reproductions of the chat's event shape: quiet turns answered only with·draw no line and no dot; quiet turns that also ran a check fold into one4 background tasks finishedline that opens to the four lines in order. Also of the chat's event shape (four quiet task turns, each answered with a·in its own message, with config updates between). The dots are tagged to their turns and the view draws one line with no dots.- Fleet runs at the head: the focused files pass (36 tests), typecheck and
bun run checkpass. The review's finding (closing a run left its last member's opened rows visible) is fixed with a test. In the combinedconversation+test/agent-pane-background*run, the only failure isonly Open in terminal, inside the opened note, opens the task's terminal, which fails the same way on base 5ee63b39113.
Agent session: agent session
🤖 Generated with Claude Code