Skip to content

Agent chat: a run of rows and status lines sit 16 from the prose around them - #31879

Merged
teamleaderleo merged 4 commits into
feat-cmux-nextfrom
lane/transcript-run-gap-16
Nov 2, 2026
Merged

teamleaderleo merged 4 commits into
feat-cmux-nextfrom
lane/transcript-run-gap-16

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Nov 2, 2026 •

Copy link
Copy Markdown
Collaborator

Leo, 2026-11-02: "well now there's sometimes too much spacing between tool calls", and "ugh we'll really want to study how chatgpt desktop and claude desktop do their spacing i just feel gross looking at these".

What changed

A run of one-line rows (tool calls, sent messages, inbox and notice lines) and any other status line now sits 16 from the reply prose above or below it. It was the 24 block gap. Spec: leo-workspace design/transcript-spacing.md, rule 4 and rows step-to-prose / prose-to-step.

Reference Run to prose
chatgpt.com 16 box to box
ChatGPT desktop about 40 centre to centre
Claude Code desktop 37 to 40 centre to centre
claude.ai 10 box to box
cmux, before 24 box to box (46 / 46.75 centre to centre)
cmux, after 16 box to box (38.375 centre to centre)
  • New grid token gap-run (16): layout-grid.json, then gen-layout-grid.py, which writes desktop.css; the Swift copy in LayoutGrid.swift is updated by hand.
  • transcriptGap gives it to step↔message pairs. A new MARK_STATUS mark covers every other isStatusRow line: a background task's or a subagent's end, a compaction, a failover. Every status line between two replies keeps one gap above and the same gap below. Steps stay flush with each other, and a prompt keeps its centred 32 turn gap.
  • A note folded into a run (.cv-tool-note, noteGap in model.ts) uses the same 16.
  • The table test from test(chat): transcript spacing table, measured against ChatGPT and Claude #31614 drops its two pending marks, so step-to-prose and prose-to-step are enforced from now on.
  • transcript-interim-prose-gap now reads gap-run.
  • continuationSpacing has a new unit test of the gap rules.

Observed / Not run

  • Fleet, before the rebase onto Agent chat: the prompt bubble as ChatGPT and Claude draw it (44 one line, 16 sides, 12 radius) #31719: the table rows pass, continuationSpacing passes 9/9, and interim-prose-gap passes.
  • Fails the same way on base:
    • transcript-row-alignment asks for 26 more room above a status row than below. Base draws 24/24, this branch 16/16. The grid lane is retargeting it to the grid tokens in a test-only PR.
    • transcript-spacing-reference (2026-10-30 values; grid lane, same PR).
    • rowEstimates steer row-height test.
  • Fleet runs at this head and at base are in progress. Results follow in a comment.

Changelog

Changed: In agent chat, a run of tool calls or status lines sits 16px from the reply text around it instead of 24px.

Agent session: agent session

🤖 Generated with Claude Code


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.


Summary by cubic

In agent chat, a run of tool-call or status lines now sits 16px from the reply prose above or below it, down from the previous 24px.

  • Adds a gap-run grid token (16) for the spacing between a run of rows and surrounding prose.
  • Applies the same gap to other status lines (task ends, compactions, failovers) and to notes folded into a run.
  • Steps within a run stay flush, and prompts keep their 32px turn gap.
  • The continuation-spacing and transcript-rhythm tests now enforce the new values.

Written for commit 298d5a8. Summary will update on new commits.

View guided diff Turn on auto-fix

teamleaderleo and others added 2 commits November 2, 2026 05:51
design/transcript-spacing.md rule 4: chatgpt.com draws 16 between its activity rows and the
reply's prose, ChatGPT and Claude Code desktop ~40 centre to centre. New grid token gap-run (16);
transcriptGap gives it to step<->message, and a folded note takes it too. The table's
step-to-prose and prose-to-step rows are enforced from here.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-81baa1463f6190d4c5dc
…runs

A background task's or subagent's end, a compaction and the other isStatusRow lines get
MARK_STATUS: 16 from a reply, as a tool run is, so transcript-row-alignment's one gap above and
below every status row holds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-81baa1463f6190d4c5dc
@teamleaderleo teamleaderleo added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Nov 2, 2026
@github-actions

github-actions Bot commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

cmux status (one comment, edited in place; each line is updated by the job that owns it)

Review 298d5a8: HQ feed card · gallery before/after runs · checks

App of this head (app.zip, kept 1 day)

gh workflow run reload-build.yml -R manaflow-ai/cmux --ref feat-cmux-next -f tag=pr31879 -f ref=lane/transcript-run-gap-16 -f platform=macos -f backend_mode=local

Gallery before/after for 298d5a8: 16 states rendered, 0 images differ, 2962 more touched states not rendered. Images are in the run's artifact, not on this public PR; the independent review of this head reads them on its own, so the PR needs no hand-made screenshots of these states.

gh run download 41402375928 -R manaflow-ai/cmux -n gallery-advisory-31879-298d5a82648636c54199fbcbf89f919ae10d9e7d (then read gallery-review.json)

States
State Theme Status Diff Picked by
agent-pane.access-offer/turn-no-credits Apple System Colors Light unchanged 0% own conversation.css
agent-pane.access-offer/turn-no-credits Apple System Colors unchanged 0% own conversation.css
agent-pane.access-offer/turn-low-credits Apple System Colors Light unchanged 0% own conversation.css
agent-pane.access-offer/turn-low-credits Apple System Colors unchanged 0% own conversation.css
agent-pane.access-offer/turn-no-offer Apple System Colors Light unchanged 0% own conversation.css
agent-pane.access-offer/turn-no-offer Apple System Colors unchanged 0% own conversation.css
agent-pane.approval-edits/single Apple System Colors Light unchanged 0% own conversation.css
agent-pane.approval-edits/single Apple System Colors unchanged 0% own conversation.css
agent-pane.approval-edits/grouped Apple System Colors Light unchanged 0% own conversation.css
agent-pane.approval-edits/grouped Apple System Colors unchanged 0% own conversation.css
agent-pane.approval-edits/single-multiedit Apple System Colors Light unchanged 0% own conversation.css
agent-pane.approval-edits/single-multiedit Apple System Colors unchanged 0% own conversation.css
agent-pane.approval-edits/grouped-multiedit Apple System Colors Light unchanged 0% own conversation.css
agent-pane.approval-edits/grouped-multiedit Apple System Colors unchanged 0% own conversation.css
agent-pane.approval-edits/single-long Apple System Colors Light unchanged 0% own conversation.css
agent-pane.approval-edits/single-long Apple System Colors unchanged 0% own conversation.css
agent-pane.approval-edits/grouped-long Apple System Colors Light unchanged 0% own conversation.css
agent-pane.approval-edits/grouped-long Apple System Colors unchanged 0% own conversation.css
agent-pane.attachment-source/before Apple System Colors Light unchanged 0% own conversation.css
agent-pane.attachment-source/before Apple System Colors unchanged 0% own conversation.css
agent-pane.attachment-source/corner Apple System Colors Light unchanged 0% own conversation.css
agent-pane.attachment-source/corner Apple System Colors unchanged 0% own conversation.css
agent-pane.attachment-source/small Apple System Colors Light unchanged 0% own conversation.css
agent-pane.attachment-source/small Apple System Colors unchanged 0% own conversation.css
agent-pane.attachment-source/labelled Apple System Colors Light unchanged 0% own conversation.css
agent-pane.attachment-source/labelled Apple System Colors unchanged 0% own conversation.css
agent-pane.attachment-source/outside Apple System Colors Light unchanged 0% own conversation.css
agent-pane.attachment-source/outside Apple System Colors unchanged 0% own conversation.css
agent-pane.background-activity/duration-columns Apple System Colors Light unchanged 0% own conversation.css
agent-pane.background-activity/duration-columns Apple System Colors unchanged 0% own conversation.css
agent-pane.background-activity/pinned-live-tail-light Apple System Colors Light unchanged 0% own conversation.css
agent-pane.background-activity/pinned-live-tail-light Apple System Colors unchanged 0% own conversation.css

Pick other states with a Gallery: entry.id, entry.id/variant line in the PR body.

Unclear: web / react-apps-base-check (6) failed: no known signature; failed step: Run base reds and compare.

CI failed on 298d5a8264 (run 41402376020 attempt 1): 1 code, 2 unknown.

Job Verdict Why
web / react-apps-base-check (7) code a web test failed
web / react-apps-base-check (6) unknown no known signature; failed step: Run base reds and compare
web / react-apps-check unknown no known signature; failed step: Check webview test shards

Failures:

  • seen on other PRs plainUserHeight.test.ts plain prompt estimates keep wrapping and collapse geometry at font 14: failed (job)
  • seen on other PRs plainUserHeight.test.ts plain prompt estimates keep wrapping and collapse geometry at font 20: failed (job)
  • seen on other PRs plainUserHeight.test.ts hyphen thematic breaks keep their original parser-backed height: failed (job)
  • seen on other PRs guest-read-only-transcript.test.tsx read only, no row draws a control that acts on the owner's machine or daemon: failed (job)
  • seen on other PRs harnesses-page.test.tsx the page shows each harness's state on this Mac: failed (job)
  • seen on other PRs session-chip-browser.test.ts dark received: the session chip sits on the icon's centre line, padded, a link, lit alone: failed (job)
  • seen on other PRs session-chip-browser.test.ts light received: the session chip sits on the icon's centre line, padded, a link, lit alone: failed (job)
  • seen on other PRs session-info-surfaces.test.tsx over the chat, a project click opens its Files tab and the panel steps aside, still open: failed (job)
Matched log lines
web / react-apps-base-check (7): (fail) plain prompt estimates keep wrapping and collapse geometry at font 14 [2.29ms]

Not re-run automatically: web / react-apps-base-check (7), web / react-apps-base-check (6), web / react-apps-check are not machine failures.

Written by scripts/ci/classify_failures.py (ci-failure-attribution.yml); signatures are its SIGNATURES table. A machine verdict is the runner's fault, not this PR's; yours means the failing file is one this PR changes, also red on main that main's latest full suite fails the same way, seen on other PRs that it failed on another pull request's run lately.

red: web / Web status; a job it gathers is red on this change (its line here); do not merge until green; see lane-rules
red: web / react-apps-base-check (6); NEW webview test reds: test/transcript-upward-anchor.test.ts > received card folds preserve painted row-box adjacency while streaming; do not merge until green; see lane-rules
red: web / react-apps-base-check (7); NEW webview test reds: src/agent-session/acpmux/rowLayoutLinearity.test.ts > bookkeeping runs are visited linearly when placing a transcript; do not merge until green; see lane-rules
red: web / react-apps-check; a job it gathers is red on this change (its line here); do not merge until green; see lane-rules

Shipped in:

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Owned by an agent session · session

@blacksmith-sh

blacksmith-sh Bot commented Nov 2, 2026 •

Copy link
Copy Markdown

Found 12 test failures on Blacksmith runners:

Failures

Test View Logs
src/agent-session/acpmux/plainUserHeight.test.ts/plainUserHeight.test View Logs
src/agent-session/acpmux/plainUserHeight.test.ts/plainUserHeight.test View Logs
test/guest-read-only-transcript.test.tsx/guest-read-only-transcript.test.tsx View Logs
test/guest-read-only-transcript.test.tsx/guest-read-only-transcript.test.tsx View Logs
test/harnesses-page.test.tsx/harnesses-page.test.tsx View Logs
test/harnesses-page.test.tsx/harnesses-page.test.tsx View Logs
test/session-chip-browser.test.ts/session-chip-browser.test View Logs
test/session-chip-browser.test.ts/session-chip-browser.test View Logs
test/session-info-surfaces.test.tsx/session-info-surfaces.test.tsx View Logs
test/session-info-surfaces.test.tsx/session-info-surfaces.test.tsx View Logs

...and 2 more test failures. View all on Blacksmith

Fix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6.1-sol xhigh, router-review): BLOCK at 5b75dea

BLOCK at 5b75dea

Visual verdict: no images; Leo tries the build

  1. [P1] [blocking] transcriptGrid.ts:99: Update webviews/test/browser/transcript-rhythm.test.ts:150 for the new gap. Its fixture measures step↔prose gaps but still requires 24 * scale. This change produces 16px instead of 24px, and 20px instead of 30px at 125%, breaking all five cases.

  2. [P2] [follow-up] model.ts:2149: Exclude edited-files cards from the run mark. isStepRow accepts every activity row, so these cards also acquire 16px spacing from prose, outside the stated scope of one-line runs and status lines. Apply the renderer’s isEditRow exclusion.

  3. [P2] [follow-up] conversation.css:106: Supply after captures covering run↔prose, status↔prose, and folded-note spacing for visual verification.

transcript-rhythm measured header->message and message->group (step<->prose) against the 24
block gap; they are gridLength("gap-run") now (review of #31879).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-81baa1463f6190d4c5dc
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex, router-review): SHIP at d7a14cf

Reviewer: codex gpt-6.1-sol xhigh, fast tier.

SHIP at d7a14cf
Visual verdict: all 16 supplied pairs are identical; they do not show the changed spacing.

No correctness findings. Grid validation and 12 gap-rule assertions pass; Bun/browser suites were unavailable.

Follow-ups: none

@cmux-bot cmux-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cmux-bot approves d7a14cf: an independent review passed this exact head (router-review receipt by teamleaderleo). A push needs a new review; a later BLOCK at this head dismisses this approval.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-81baa1463f6190d4c5dc
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (subagent opus-5.5 medium): SHIP at 298d5a8

Since the Codex SHIP at d7a14cf, the only change is the marks[index] = line in model.ts re-wrapped by the formatter. Tokens and logic are unchanged.
Follow-ups: none

@teamleaderleo
teamleaderleo merged commit 5678105 into feat-cmux-next Nov 2, 2026
193 of 205 checks passed
@teamleaderleo
teamleaderleo deleted the lane/transcript-run-gap-16 branch November 2, 2026 07:28
teamleaderleo added a commit that referenced this pull request Nov 2, 2026
…ard) (#32076)

upwardAnchorTrace.ts keeps its own copy of transcriptGap's rules (it runs serialized in the page).
#31879 drew a step or status line 16 from a reply's prose (--grid-gap-run), and the oracle still
expected the 24 block gap, so every such pair counted as a blank band: "received card folds
preserve painted row-box adjacency while streaming" reported blankBandFrames 79. The oracle reads
--grid-gap-run for step<->message now; its negative fixture declares the token.


Agent-Session: https://cmux.com/deeplink/agent?id=aid-81baa1463f6190d4c5dc

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
cmux-bot Bot pushed a commit that referenced this pull request Nov 2, 2026
…nt's line (#32138)

#31879 made every status row (model.ts isStatusRow, which includes another
agent's received message) sit the run gap (16) from the reply around it.
transcript-continuation-spacing still expected the block gap (24) under the
reply for the gallery's peer line. Read transcriptGap(MARK_MESSAGE,
MARK_STATUS) instead of a literal token.


Agent-Session: https://cmux.com/deeplink/agent?id=aid-2f629b93d5a20c58e6f8

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
cmux-bot Bot pushed a commit that referenced this pull request Nov 2, 2026
…k again (#32154)

#31879 made layoutConversation ask isStatusRow of every non-step row, and isStatusRow read
row.incoming twice for a user row; isLineRow (via isStepRow) already read it three times. A hidden
bookkeeping row went from 11 to 13 reads of incoming per placement, past rowLayoutLinearity's
12-per-row bound. isStatusRow and isLineRow now read the kind once and compare it, which leaves
10 reads per hidden row. Same results for every row.


Agent-Session: https://cmux.com/deeplink/agent?id=aid-2f629b93d5a20c58e6f8

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

This branch was previously deployed

1 inactive deployment
ci-routing-agent — 298d5a82 Deployed Nov 2, 2026 by teamleaderleo via cmux-tui tree preflight #99855
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

risk:normal Risk tier (docs/ci/risk-tiers.md)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant