Transcript: status and tool rows sit flush; a lone "." reply draws nothing
Leo, on a Claude chat in the dark theme: "these are all so stupid looking"
Closes #32723 (status lines 45.5 to 46 from neighbouring one-line rows; now 22).
His capture: the end of a reply, another agent's received line, a lone "." on its own line, about three rows of empty space, "Scheduled check", a gap, "Ran 2 commands" (opened), another gap, "Compacting the conversation…".
What was wrong
- The lone "." was an assistant reply whose whole text was ".": Claude often answers another agent's message with a single period. It drew at the prose column (not the tool text column), and its turn's empty footer followed it. Together they made the big gap.
- A background turn's line ("Scheduled check") had no layout mark. It took the 24 block gap on both sides.
- A status row (a compaction, a background task's end and so on) and a tool run next to it were also 24 apart (
transcriptGap: STATUS to STEP, STEP to STATUS and STATUS to STATUS were all BLOCK). That breaks design/transcript-spacing.md rule 3 ("consecutive ones are 22 apart centre to centre with no gap") and chat-transcript.md ("Consecutive status rows keep the step rhythm between themselves").
Change
transcriptGrid.ts: any two consecutive step or status rows sit flush (gap 0, so a 22 pitch). The 16 run gap to prose and the turn gap are unchanged.model.tsisStatusKindand the App.tsx row classes: a background turn's line (BACKGROUND_TURN) is a status row.visibleMessage.ts: a reply, or another agent's received message, whose text is empty, blank or a lone "." draws nothing (isBareAgentText). A person's own "." prompt still draws.test/support/upwardAnchorTrace.ts: treatsacpmux-backgroundTurnas a one-line row, matching the grid rule.transcriptSpacing.ts:SYSTEM_ROW_PITCH = 22.
"Scheduled check" and "Compacting the conversation…" already start their words on the run's text column (x 249, the same as "Ran 2 commands"). The test now pins that. They keep their marks: the spec keeps the compaction spinner and the background turn's clock or spinner.
Left as is: the brief also asked to drop each opened step's terminal icon and the thin guide line. Both are settled designs. Shared columns with step glyphs aligned to the header come from cmux#29638, and the guide is from cmux#32363 (Leo: "let's just make this look better"; design/chat-transcript.md, Grouped steps).
Gallery
agent-pane.transcript-system-rows, variant leo-capture. It is Leo's sequence in a Claude chat (summary.family = "claude"), and its play opens "Ran 2 commands".
Red/green
Command, the same on both sides: cmux-ci test --setup playwright -- bash -c 'cd webviews && CMUX_TRANSCRIPT_SPACING_LOG=1 bun test test/transcript-system-rows.test.ts'
- Red, test commit 5d6c30b on base source (run 41550430565): 8 pass, 8 fail. Received line to Scheduled check: 124.25 px. Scheduled check to Ran 2 commands: 46. Last step to Compacting: 46. A bare "." row is drawn.
- Green, fix commit addc916 (run 41550767062): 16 pass, 0 fail. Every pitch is 22 (±0.5). No bare row.
Observed / Not run
- Observed: the red/green above in Chromium, light and dark. Locally:
bun run checkpasses,prepush-gate.pyreports no new violations, and these unit tests pass: continuationSpacing (new flush case), visibleMessage (new), rowEstimates, rowLayoutLinearity, backgroundTurns, TurnFooter, message runs, worked fold and others (123 pass). - Existing browser suites on fleet at addc916 (run 41551153235), 101 pass, 0 fail: transcript-spacing-table, transcript-upward-anchor, transcript-row-pitch-browser, transcript-row-alignment, transcript-continuation-spacing, transcript-spacing-reference, agent-pane-background-turns, received-message-fold-browser, transcript-received-messages, continuationSpacing and visibleMessage.
- After the review follow-ups at 3c6149a (a person's relayed "." still draws; a bare received message keeps its delivery and retry affordances; its estimate is 0): run 41552547189, 100 pass, 0 fail across transcript-system-rows, spacing-table, upward-anchor, row-pitch, the received-message suites, background-turns and visibleMessage.
- Not run: a DEV or nightly build in the app.
Agent session: agent session
🤖 Generated with Claude Code