Agent transcript: one-line activity rows share one pitch and columns
Leo, 2026-11-01, on a column of transcript rows (tool rows, inbox lines, agent message lines, fold heads) whose vertical gaps differ by row type:
doesn't make sense for these to be spaced differently
Every one-line activity row in the agent transcript now draws on the tool rows' 22px line in a one-call tool run's frame (2px over, 4px under), and joins the step rows beside it, so any two consecutive one-line rows sit exactly 22px apart, top to top, whatever their kind. Their icons share one column and their words one text column.
| Row (beside other one-line rows) | Height before | Pitch before | Height after | Pitch after |
|---|---|---|---|---|
| Tool row (one-call run) | 22 | 28-34 | 22 | 22 |
| Sent message line | 26 | 34 | 22 | 22 |
| Received / inbox line | 26 | 28-38 | 22 | 22 |
| Task notice line | 22 (drawn at the row's right end) | 28-34 | 22 | 22 |
| Report batch head | 22 | 28-38 | 22 | 22 |
| Waiting group head | 26 (icon 4px right, words 5.5px right) | 38 | 22 | 22 |
What changed:
model.ts:isLineRownames those rows (another agent's message, a notice, an inbox notice, a report batch, the waiting group). The estimator uses the same frame (LINE_ROW= 2 + 22 + 4) and an open group's member as its line alone.App.tsx: marks themacpmux-row--lineand treats them as step rows, so they join their neighbours as tool runs already do.- CSS:
--cv-message-lineis now the tool row height; received, pending and lane-batch lines drop their own vertical margins; the sent message's toggle is 22px and its hidden Copy no longer stretches the line to 24px; the waiting group's chevron and words sit on the shared icon and text columns; a task notice's tool line takes its row's width (it sat at the row's right end, since the row is a user row). - Merged with #29124 (status rows centred between replies): a one-line row between two replies still takes its centred room;
statusDeltacounts its 4px run gap as a tool run's. model.tsalso estimates a sent message (SendMessage,acpmux send, a sub-session'ssend_message) as one 22px line (review finding at 3bd8fe3).- A received line's buttons take the line's 22px (DisclosureRow.css gave them a 26px floor).
- Design spec: leo-workspace
design/chat-transcript.md, "One-line row pitch" (separate notes PR).
Prior art: #29754 (shared activity row grammar), #29613 (meta rows' icon and text columns) and #29124 (status rows' columns and centred gaps), all merged, are built on, not redone: this keeps their columns and adds the vertical rhythm. #29830 (flat waiting group) touches the group's contents, not its head geometry.
Changelog
Fixed: every one-line row in the agent transcript (tool rows, sent and received messages, inbox lines, background task lines, report and waiting-message fold heads) now sits on one line height and one spacing, with one icon and text column.
Test
CMUX_BROWSER_TESTS=1 bun test test/transcript-row-pitch-browser.test.ts (Chromium through cmux-ci test, real VirtualTranscript layout, light and dark): equal line height, equal top-to-top pitch, one icon x and one text x within 0.5px across 12 rows of 7 kinds.
- Red on base (commit d4488d857d2e, run https://github.com/manaflow-ai/cmux/actions/runs/41264320120):
t1 (cv-tool) is 22px tall, m1 26px,i1 sits 28px under t1, 38px elsewhere,t3 sits 34px under lane-notices:r1,n1 (cv-tool) icon at 534, 20 elsewhere,pending-messages icon at 24, 20 elsewhere; words at 48, 42.5 elsewhere, and more (19 findings). - Review finding at f71b584 (a received line's buttons kept DisclosureRow's 26px floor inside the 22px line): the test now also checks that no part of a line stands out of it. Red at cce7be5cb6db (run https://github.com/manaflow-ai/cmux/actions/runs/41275988869):
m1 (cv-disclosure__line) has a part 2px out of its line, same for i1, i2, m2. - Green at 00c42fe89a06 (run https://github.com/manaflow-ai/cmux/actions/runs/41276966512): 16 pass, 0 fail with
transcript-meta-columns-browser,transcript-row-alignment(#29124's centred status gaps),incoming-message-disclosure-browserandreceived-message-fold-browser.
Observed / Not run
- Observed: the browser files above, plus at 8d0a64357139 (after the base merge)
received-message-fold-browser,transcript-fold-no-blank-space-browser,other-session-message-actions-browser(all pass). LocallyrowEstimates(a new case: a sent message estimates 2 + 22 + 4),agent-pane-reply-actions-frame,agent-pane-transcript-spacing,foldAnchor,footerActionspass;transcript-hover-fadefails on.cv-subagent__stopin subagents.css, a file this PR does not touch. Locally:rowEstimates,rowLayoutLinearity,continuationSpacing,lane-notice-batches,lane-notice-card,transcript-received-messages(41 pass).vp fmt/vp linton the changed TS files,prepush-gate.py. - Not run: the full webview suite (CI runs it), a DEV build by hand. No screenshots.
risk:normal
Agent session: agent session
š¤ Generated with Claude Code