Skip to content

Agent transcript: one-line activity rows share one pitch and columns - #29965

Merged
teamleaderleo merged 12 commits into
feat-cmux-nextfrom
lane/transcript-row-pitch
Nov 1, 2026
Merged

teamleaderleo merged 12 commits into
feat-cmux-nextfrom
lane/transcript-row-pitch

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Nov 1, 2026 •

Copy link
Copy Markdown
Collaborator

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: isLineRow names 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 them acpmux-row--line and treats them as step rows, so they join their neighbours as tool runs already do.
  • CSS: --cv-message-line is 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 Agent pane: status, tool and message rows and the action row line up with the prose #29124 (status rows centred between replies): a one-line row between two replies still takes its centred room; statusDelta counts its 4px run gap as a tool run's.
  • model.ts also estimates a sent message (SendMessage, acpmux send, a sub-session's send_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.

Observed / Not run

  • Observed: the browser files above, plus at 8d0a643 (after the base merge) received-message-fold-browser, transcript-fold-no-blank-space-browser, other-session-message-actions-browser (all pass). Locally rowEstimates (a new case: a sent message estimates 2 + 22 + 4), agent-pane-reply-actions-frame, agent-pane-transcript-spacing, foldAnchor, footerActions pass; transcript-hover-fade fails on .cv-subagent__stop in 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 lint on 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

…nd columns

A browser geometry test over the real transcript (VirtualTranscript): tool
rows, a sent message, received lines, inbox notice lines, a background task
line, a report batch head and the waiting messages' head must share one
line height, one top-to-top pitch, one icon x and one text x within 0.5px.
Red on base: the rows pitch differently by kind.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-013e821a578a652a3caa
@github-actions github-actions Bot added the risk:low Risk tier (docs/ci/risk-tiers.md) label Nov 1, 2026
Tool rows, sent messages, received and inbox lines, a task's notice line,
a report batch's head and the waiting group's head now all draw on the tool
rows' 22px line in a one-call tool run's frame (2px over, 4px under) and
join the step rows beside them, so consecutive one-line rows of any kind
sit one 22px line apart. Before, a received line pitched 38px, a fold head
38px and a tool row 28px after it, so the column read unevenly.

- model.ts: isLineRow names those rows; the estimator uses the same frame
  (LINE_ROW = 2 + 22 + 4) and a grouped member's line alone.
- App.tsx: marks them acpmux-row--line and joins them as step rows.
- CSS: --cv-message-line is the tool row height; received, pending and
  lane-batch lines drop their own margins; the sent message toggle is 22px;
  the waiting group's chevron and words move onto the shared icon and text
  columns; a notice's tool line takes its user row's width (it sat at the
  row's right end).

Leo, 2026-11-01: "doesn't make sense for these to be spaced differently".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-013e821a578a652a3caa
@github-actions github-actions Bot added risk:normal Risk tier (docs/ci/risk-tiers.md) and removed risk:low Risk tier (docs/ci/risk-tiers.md) labels Nov 1, 2026
@teamleaderleo teamleaderleo changed the title Agent transcript: one-line activity rows share one pitch Agent transcript: one-line activity rows share one pitch and columns Nov 1, 2026
@teamleaderleo
teamleaderleo marked this pull request as ready for review November 1, 2026 02:55

@cubic-dev-ai cubic-dev-ai 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.

3 issues found across 9 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="webviews/src/agent-session/acpmux/conversation/AgentMessageRow.css">

<violation number="1" location="webviews/src/agent-session/acpmux/conversation/AgentMessageRow.css:117">
P2: This custom property is not defined in the acpmux production entry, so the declaration is dropped and message toggles lose their row height there. Add a local fallback (or load `conversation.css` in that entry) so the shared frame remains valid wherever this component is rendered.</violation>
</file>

<file name="webviews/src/agent-session/acpmux/model.ts">

<violation number="1" location="webviews/src/agent-session/acpmux/model.ts:1541">
P2: The estimator always reserves the full 28px line frame, but the new step-row classes remove that frame's padding when a line is adjacent to another step. Pass the previous/next step adjacency into the estimator and subtract the corresponding top/bottom padding so initial layout matches the rendered row.</violation>
</file>

<file name="webviews/src/agent-session/acpmux/conversation/conversation.css">

<violation number="1" location="webviews/src/agent-session/acpmux/conversation/conversation.css:63">
P3: The new message-line alias follows the tight and roomy tool-spacing variants, but the row estimator still uses fixed 22px/4px constants. Keep the message line and frame fixed for gallery variants, or make the estimator consume the same configured spacing values.</violation>
</file>

Reply with feedback, questions, or to request a fix.

View guided diff | Turn on auto-fix | Re-trigger cubic

height: 26px;
/* The tool rows' line, so a message row is as tall as the rows around it (Leo, 2026-11-01:
"doesn't make sense for these to be spaced differently"). */
height: var(--cv-tool-row-height);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2: This custom property is not defined in the acpmux production entry, so the declaration is dropped and message toggles lose their row height there. Add a local fallback (or load conversation.css in that entry) so the shared frame remains valid wherever this component is rendered.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At webviews/src/agent-session/acpmux/conversation/AgentMessageRow.css, line 117:

<comment>This custom property is not defined in the acpmux production entry, so the declaration is dropped and message toggles lose their row height there. Add a local fallback (or load `conversation.css` in that entry) so the shared frame remains valid wherever this component is rendered.</comment>

<file context>
@@ -112,7 +112,9 @@ button.cv-agentmsg__name:focus-visible {
-  height: 26px;
+  /* The tool rows' line, so a message row is as tall as the rows around it (Leo, 2026-11-01:
+     "doesn't make sense for these to be spaced differently"). */
+  height: var(--cv-tool-row-height);
   cursor: default;
   border-radius: 4px;
</file context>
Suggested change
height: var(--cv-tool-row-height);
height: var(--cv-tool-row-height, 22px);

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6.1-sol xhigh, router-review): BLOCK at 3bd8fe3

BLOCK at 3bd8fe3

Visual verdict: no images; Leo tries the build

  1. [P1] [blocking] model.ts:977 — Sent-message activity items still use the old estimator: generic SendMessage items return 26px, while cmux-subsessions.send_message returns 40px. Their rendered line is now 22px plus the 6px frame (28px). Unmounted rows therefore reserve too much space and collapse when virtualized into view, causing visible scroll/layout jumps and breaking the promised shared pitch.

Resolves #29124 (status rows centred between replies, shared icon column):
App.tsx keeps its status edge class beside acpmux-row--line; the waiting
group's head takes base's slot geometry and keeps no margins of its own; a
one-line row's padding yields to the status edges (same specificity, later)
and statusDelta counts a line row's 4px run gap as a tool run's.

Also, from review: a message this agent sent another one (SendMessage,
acpmux send, a sub-session's send_message) estimates as one 22px tool line.

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

Copy link
Copy Markdown
Collaborator Author

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

BLOCK at f71b584

Visual verdict: no images; Leo tries the build

  1. [P1][blocking] Received and inbox labels retain a 26px child box inside the new 22px line. conversation.css:2874 constrains .cv-received__line to var(--cv-message-line), but DisclosureRow.css:19-29 leaves .cv-disclosure__open at min-height: var(--cv-disclosure-line-height) (26px). IncomingMessageLine and inbox threads both use this open button, so their previews are vertically offset and can be clipped/overlap adjacent 22px rows. The new rule at line 2892 only changes the chevron toggle’s height and does not reset the open button’s minimum height.

@github-actions

github-actions Bot commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor

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

Review 501cbb2: 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=pr29965 -f ref=lane/transcript-row-pitch -f platform=macos -f backend_mode=local

Gallery before/after for 501cbb2: 16 states rendered, 18 images differ, 2797 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 41298184844 -R manaflow-ai/cmux -n gallery-advisory-29965-501cbb20cac945b019fb51316119e93d1d47e616 (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.addressed-message/relayed Apple System Colors Light changed 2.47% own LaneNoticeBatch.css
agent-pane.addressed-message/relayed Apple System Colors changed 2.46% own LaneNoticeBatch.css
agent-pane.agent-message-row/unicode-boundary Apple System Colors Light changed 2.31% own AgentMessageRow.css
agent-pane.agent-message-row/unicode-boundary Apple System Colors changed 2.3% own AgentMessageRow.css
agent-pane.agent-message-row/sent Apple System Colors Light changed 7.13% own AgentMessageRow.css
agent-pane.agent-message-row/sent Apple System Colors changed 7.09% own AgentMessageRow.css
agent-pane.agent-message-row/lanes Apple System Colors Light changed 1.72% own AgentMessageRow.css
agent-pane.agent-message-row/lanes Apple System Colors changed 1.7% own AgentMessageRow.css
agent-pane.agent-message-row/sent-subagents Apple System Colors Light changed 3.23% own AgentMessageRow.css
agent-pane.agent-message-row/sent-subagents Apple System Colors changed 3.19% own AgentMessageRow.css
agent-pane.agent-message-row/sent-hover Apple System Colors Light changed 7.23% own AgentMessageRow.css
agent-pane.agent-message-row/sent-hover Apple System Colors changed 7.19% own AgentMessageRow.css
agent-pane.agent-message-row/sent-opened Apple System Colors changed 10.3% own AgentMessageRow.css
agent-pane.agent-message-row/sent-opened Apple System Colors Light changed 10.2% own AgentMessageRow.css
agent-pane.agent-message-row/sent-opened-long Apple System Colors Light changed 0.0149% own AgentMessageRow.css
agent-pane.agent-message-row/sent-opened-long Apple System Colors changed 0.012% own AgentMessageRow.css
agent-pane.agent-message-row/outcomes Apple System Colors Light changed 3.58% own AgentMessageRow.css
agent-pane.agent-message-row/outcomes Apple System Colors changed 3.52% own AgentMessageRow.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

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

red: cmux-next checks (god files, concurrency, crash safety, l10n); base red: the same failure on the base c7c9a16; does not block

Shipped in:

@blacksmith-sh

blacksmith-sh Bot commented Nov 1, 2026 •

Copy link
Copy Markdown

Found 13 test failures on Blacksmith runners:

Failures

Test View Logs
/tmp/tmp4uh5a7m9/summary-missing.json (live):/summary-missing.json (live): View Logs
/tmp/tmpl_o2ko34/summary-fail.json (live):/summary-fail.json (live): View Logs
[new_workspaces] debug.new_workspace timed 0 of 50 new workspace rows/
[new_workspaces] debug.new_workspace timed 0 of 50 new workspace rows
View Logs
[new_workspaces] the window draws no frames/[new_workspaces] the window draws no frames View Logs
[tabs] debug.tab_switch timed 0 of 40 switches/
[tabs] debug.tab_switch timed 0 of 40 switches
View Logs
[tabs] the window draws no frames/[tabs] the window draws no frames View Logs
main.DeveloperIdAppTests.test_download_prints_the_active_profile_only/
test_download_prints_the_active_profile_only
View Logs
nightly must build and hand off the macOS 26 helper and Xcode 26.5 app before publishin
g/
nightly must build and hand off the macOS 26 helper and Xcode 26.5 app before publishin
g
View Logs
stubs: /System/Library/Frameworks/Security.framework/Versions/A/Security has no stub/
Security has no stub
View Logs
stubs: CoreFoundation.tbd: install-name /System/Library/Frameworks/
CoreFoundation.framework/Versions/A/CoreFoundation, missing 1: ['_CFRetain']/
CoreFoundation, missing 1: ['_CFRetain']
View Logs

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

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

teamleaderleo and others added 2 commits November 1, 2026 04:51
Review at f71b584: a received line's buttons kept DisclosureRow's 26px floor
inside the 22px line.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-013e821a578a652a3caa
DisclosureRow.css gives .cv-disclosure__toggle and .cv-disclosure__open a
sub-session row's 26px min-height; inside .cv-received both now take the
line's height with no floor.

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

@cubic-dev-ai cubic-dev-ai 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.

1 issue found across 1 file (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="webviews/test/transcript-row-pitch-browser.test.ts">

<violation number="1" location="webviews/test/transcript-row-pitch-browser.test.ts:177">
P2: This assertion misses overflow from nested row parts: it measures the sentence/actions wrapper, not the controls inside it. Inspect all descendant elements so a 24px button or similar child cannot regress the one-line invariant without failing this test.</violation>
</file>

Reply with feedback, questions, or to request a fix.

View guided diff | Turn on auto-fix | Re-trigger cubic

// How far the line's own parts (its buttons, its sentence) stand out of its box.
const overhang = Math.max(
0,
...[...el.children].map((child) => {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2: This assertion misses overflow from nested row parts: it measures the sentence/actions wrapper, not the controls inside it. Inspect all descendant elements so a 24px button or similar child cannot regress the one-line invariant without failing this test.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At webviews/test/transcript-row-pitch-browser.test.ts, line 177:

<comment>This assertion misses overflow from nested row parts: it measures the sentence/actions wrapper, not the controls inside it. Inspect all descendant elements so a 24px button or similar child cannot regress the one-line invariant without failing this test.</comment>

<file context>
@@ -171,11 +171,20 @@ await requireBrowserLane("transcript-row-pitch-browser.test.ts", async () => {
+            // How far the line's own parts (its buttons, its sentence) stand out of its box.
+            const overhang = Math.max(
+              0,
+              ...[...el.children].map((child) => {
+                const part = child.getBoundingClientRect();
+                return part.height === 0 ? 0 : Math.max(box.top - part.top, part.bottom - box.bottom);
</file context>
Suggested change
...[...el.children].map((child) => {
...[...el.querySelectorAll<HTMLElement>("*")].map((child) => {

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex, router-review): SHIP at 00c42fe

Reviewer: codex gpt-6-astra high, fast tier.

Follow-ups: 1. Each lands as an issue in this repo that links this receipt; the lane that opened the PR fixes it forward.

SHIP at 00c42fe

Visual verdict: no images; Leo tries the build

No correctness findings from static review. Tests could not run because Bun and webview dependencies are unavailable.

  1. [P2] [follow-up] review/images/README.txt:2: No after screenshots were supplied; visual verification remains outstanding.

Follow-ups:

  • Verify the transcript spacing and expanded disclosures in the build.

@cursor

cursor Bot commented Nov 1, 2026

Copy link
Copy Markdown

Bugbot needs on-demand usage enabled

Bugbot uses usage-based billing for this team and requires on-demand usage to be enabled.

A team admin can enable on-demand usage in the Cursor dashboard.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (subagent opus-5.5 medium): SHIP at 9979dbb

router-review could not run at this head (the host's GraphQL quota was spent). The delta since the Codex SHIP at 0296ead is a base merge and one test assertion (a received line is 22px in agent-pane-suggested-tasks, which the webview base-check named). Independent read of the whole diff: cascade against styles.css user-row padding, last-turn, the status-edge rules and step joins; estimates against CSS for closed and opened received messages, notices, inbox notices (grouped, ungrouped, card), pending and lane-batch members, lastTurn and statusDelta. No blocking findings.

Follow-ups (filed as one issue):

  1. A line row that is both the turn's last row and before another step row loses its turn gap (rule order); rare, and measurement corrects the estimate.
  2. The waiting group as the chat's last row sits 4px over the composer's edge instead of 10px (matches a tool run there).
  3. A sent message's 24px Copy overhangs its 22px line by 1px and can be clipped by the row's paint containment on hover when joined.
  4. activityStepHeight checks agentMessage before dispatch / acpmux send calls, unlike toolGroups.ts (estimate only).
  5. No rowEstimates case for a line row at a status edge.

CI at this head: transcript-row-pitch-browser, agent-pane-suggested-tasks, transcript-meta-columns-browser, transcript-row-alignment, incoming-message-disclosure-browser: 35 pass, 0 fail (https://github.com/manaflow-ai/cmux/actions/runs/41288684871).

…ript-row-pitch

# Conflicts:
#	webviews/src/agent-session/acpmux/App.tsx
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (subagent opus-5.5 medium): SHIP at 501cbb2

This head only merges base (c7c9a16) into 9979dbb, which already had a SHIP.

  • The merge resolution is right. git show --remerge-diff shows the only conflict was the App.tsx ./model import, and both sides were kept (isLineRow, then restRoom,). Nothing else in the PR's diff against the merge base changed.
  • The change still works with the new base code:
  • The design-tokens baseline merged cleanly. Running check-design-tokens locally flags session-info/sessionInfo.css, cloudStart.css and conversation.css (gap: 6px 14>13, padding: 3px 7px). All of these come from base: the files and their counts are the same at c7c9a16. None is the PR's own.
  • bun test src/agent-session/acpmux/rowEstimates.test.ts: 23 pass, 0 fail. tsc ran out of memory on this host, so there is no local type result. The diff only adds a used import and a const of the existing type.
  • The head still merges cleanly into the current feat-cmux-next tip.

Follow-ups:

  • [follow-up] The estimator hardcodes 22px for line rows (LINE_ROW), but the density variants set --cv-tool-row-height to 20px or 26px (conversation.css about lines 1924 and 1928). Tool rows already do the same, and measured heights correct it after render, so all this costs is a small scroll-thumb jump on first paint in those densities.
  • [follow-up] isLineRow includes inbox notices but isStatusRow does not. An inbox line between two replies gets the one-line frame but not the centred status gap that a message or notice line gets. This predates the PR and is only an inconsistency, not a regression.

@teamleaderleo
teamleaderleo merged commit 4b48c64 into feat-cmux-next Nov 1, 2026
173 of 179 checks passed
@teamleaderleo
teamleaderleo deleted the lane/transcript-row-pitch branch November 1, 2026 12:41
teamleaderleo added a commit that referenced this pull request Nov 1, 2026
…30791) into transcript rhythm

Conflict resolution:
- #29965 one-line rows: lineRow() = the grid tool row (28, scaled) with a zero frame, same 28 at 100%; --cv-message-line follows --cv-tool-row-height; --cv-tool-run-top-gap 0 on the grid
- Rows keep the grid's stack-owned spacing
- userMetaHeight keeps the grid's zero-height action row
- #30791 revert drops .cv-repo-recovery
- Design token baseline re-ratcheted

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
teamleaderleo added a commit that referenced this pull request Nov 1, 2026
…otice lines span the row

After the base merge:
- A legacy activity line keeps the footer slot's one line. Base #30561 measured it as text.
- Session-start and standalone notes estimate one 28 grid row instead of 37. Review at 66ddd56.
- Restore #29965's .acpmux-row--line .cv-tools rule, so a notice's tool line keeps the icon and text columns.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
teamleaderleo added a commit that referenced this pull request Nov 1, 2026
#29965's transcript-row-pitch-browser test caught the report batch head
("N reviews ended") 4px right of the icon column: raising LaneNoticeBatch.css's
toggle selectors with :not() let its inset beat the one-line row rules. Keep
base's selectors and zero the inset and hover plate on the tool-row head
alone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
teamleaderleo added a commit that referenced this pull request Nov 1, 2026
…ark is its real harness (#30652)

* Agent pane: inbox rows share the tool rows' icon column; a sender's mark is its real harness

Leo, 2026-11-01: "i wanted this to be left aligned with the other tool calls", and on the
folded group: "let's just make this look better".

- A folded inbox group ("N messages from M sessions") is now a tool row: the sender's harness
  mark (several senders: the messages glyph) in the tool rows' icon column, their 22px height,
  gap and type, the count as the summary with the senders muted, and the chevron after the label
  shown only on hover, focus or while open. Opened, its threads start at the tool rows' text x.
- A sender's mark comes from the listed chat's harness, else the fromHarness acpmux bound,
  else the neutral agent glyph. It is never guessed from the sender's name: a Codex lane
  called claude-* drew Claude's mark (cmux#30247). Inbox threads read fromHarness.
- Gallery: agent-pane.inbox-notice icon-column (shipped) and two head versions
  (group-chevron, group-count) beside lines and card.
- Tests: inbox-row-icon-column.test.ts (Chromium, light and dark) and
  inbox-sender-mark.test.tsx.

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

* Waiting and delivered message groups: a tool-row head

Leo, 2026-11-01, on "2 messages from 1 session": "let's just make this look
better". On the new base the groups he sees are the waiting group
(PendingMessagesCard) and a delivered inbox batch (LaneNoticeBatch), not the
legacy InboxNoticeCard group. All three now share MessageGroupHead: a tool row
with the sender's harness mark (several senders: the messages glyph) in the icon
column, the count as the summary, the senders muted, and the chevron after them,
shown on hover. acpmux's fromHarness now reaches the batch's received lines.
The row estimate follows the 22px head.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Message group head: keep the report batch's head on base's selectors

#29965's transcript-row-pitch-browser test caught the report batch head
("N reviews ended") 4px right of the icon column: raising LaneNoticeBatch.css's
toggle selectors with :not() let its inset beat the one-line row rules. Keep
base's selectors and zero the inset and hover plate on the tool-row head
alone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
teamleaderleo added a commit that referenced this pull request Nov 1, 2026
* Add shared layout grid tokens and validate their CSS and Swift copies

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

* test(webviews): measure gallery grid lines from runtime tokens

Add warning-level surface scenes, baseline/cap-height text measurements, named optical offsets, and recoverable per-line JSON evidence. Missing mounts and unknown selector coverage fail. Browser measurements and full checks are delegated to the parent fleet run; scoped lint, formatting, browser lane discovery, gallery IDs, and TypeScript syntax checked locally.

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

* Add transcript rhythm tokens and role-based grid measurement selectors

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

* Keep selector fallback valid when the marked surface is the target itself

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

* test(webviews): align grid scenes with shared surface roles

Use stable surface IDs across variants and ink-only role hints with selector fallbacks. Add existing plus, mode, project and tray scenes plus a 31-row expanded subagent fixture. Retain transcript action coverage and leave toolgroup/rhythm implementation to its owner. Scoped lint/format and gallery entry discovery passed; browser measurement remains delegated to parent fleet integration.

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

* Identify repeated grid scenes by their measured root

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

* Add shared transcript between-turn gap token

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

* Run layout grid validation in NEXT checks and scale the base unit

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

* Run layout grid drift check in the webviews warning branch

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

* Keep sidebar trailing marks fixed across densities

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

* test(chat): reproduce transcript column and block rhythm drift

Agent-Session: https://cmux.com/deeplink/agent?id=aid-539c2a9f2e69febb66f6

* Add canonical composer foot gap token and measure against it

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

* fix(chat): centralize virtual transcript block rhythm and columns

Agent-Session: https://cmux.com/deeplink/agent?id=aid-539c2a9f2e69febb66f6

* Measure visible placeholder ink and emit each grid scene baseline

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

* test(webviews): correct card grid fixture selectors

Read card fixture JSX: command permission body is its scope line; inline summary omits popover fold and close controls; glance inspector sections have distinct body labels and only Context/Connectors supply header icons. Scope absence diagnostics by fixture/section without changing coverageFailure assertions. Scoped format/lint, gallery discovery, and diff checks passed. Browser validation remains with parent fleet run.

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

* test(chat): cover turn boundaries, opened cards and count geometry

Agent-Session: https://cmux.com/deeplink/agent?id=aid-539c2a9f2e69febb66f6

* Set composer foot gap token to four points

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

* test(chat): rhythm hover scene and cards fixture covers

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

* fix(chat): gap precedence, waiting indicator, foot gap, count spacing and trailing chevrons

One gap per adjacent pair, most specific first (waiting rule, composer,
turn, block). The waiting indicator takes the block gap on both sides; the
composer gap is the block gap after a message so its action row fits.
The quiet row sits var(--grid-gap-foot) under the composer box. Count
summaries part verb and count with one space and tabular figures. The
user action row is positioned again inside .cv-user__body.

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

* fix(chat): the last turn footer keeps the block gap to the composer

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

* fix(chat): received message chevron ends on col-right like every tool row

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

* test(chat): rhythm and estimate checks on base's received, steps and status rows

Base now leads a received message with its sender, reads a count summary
whole, draws no per-reply action row and centres status rows with its own
gaps. The rhythm test measures those rows where base draws them; the
estimate tests expect the grid's 28 rows with no status room.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test(chat): carets sit inline after their label (#28018), not on col-right

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(chat): a disclosure caret stays inline after its words (#28018)

Review BLOCK at e0c3d9b: the rotor margin-inline-start auto pushed a
sub-session caret to the line end. The rhythm test now checks each caret
sits at most one grid gap after its words.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(chat): transcript gaps scale with Interface Size in the virtual placement

Review BLOCK at 18cf6d8: the CSS grid tokens multiply by
--cmux-interface-scale, but layoutConversation and placeRows placed the
gaps unscaled, so at 125% the footer action row laid in a 24 gap overlapped
the next row. The gaps (and the tail gap) now take the same factor, read
once per pass; kept rows reuse their gaps only at the same scale. The
rhythm test adds a 1.25x case.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(chat): measured placement reads the live Interface Size, kept rows only at their own

Review BLOCK at 1691838: placeRows copied a kept prefix placed at another
scale and stamped the estimate's scale. It now reads gridScale() itself,
keeps a prefix only at the same scale, and a unit test covers 100% to
125% with kept rows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test(chat): hold transcript-spacing to the grid action row (28 control laid in the gap)

Base #30297 measured a 24px meta row 4px under the bubble. design/grid.md lays a
message's action row in the gap with 28 controls and no layout height, so the
test now measures that.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(chat): row estimates scale grid lengths with the Interface Size

Review BLOCK at b1de39a: gaps scaled with --cmux-interface-scale but the
estimates still used raw grid metrics (action row 28, tool row, page edge),
so at 125% rows drawn 35 were estimated 28. layoutConversation now sets the
scale once per pass and those lengths multiply by it; the page edge reads
gridScale(). A unit test covers 100% to 125%.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(chat): scale the remaining grid-derived estimates (bubble, block and list gaps)

Review BLOCK at 5d643f0: the Markdown block gap, tool-run gaps between
activity items, and the prompt bubble's padding and sides were still raw grid
lengths, and listHeight left out the inner gap .cv-list now draws between
items. All of them multiply by the per-pass Interface Size now, and the
unit test also covers a two-call run.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(chat): folded run estimates include the block gap between children

Review BLOCK at 84dc1b7: foldedRunSteps and foldedGroupHeight summed child
heights without the --grid-gap-block that .cv-tools, .cv-tool-run and
.cv-tool-group draw between them, so an expanded or partly folded run was
estimated one 24 gap short per adjacent child. Both add (n - 1) block gaps at
the per-pass Interface Size.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test(chat): folded run lines are stacked with the block gap

The tool stacks (.cv-tools, .cv-tool-run, .cv-tool-group) draw --grid-gap-block
between their lines, which 66ddd56 now estimates. The unit test counted lines
with no gap.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(chat): one-line notes and activity lines estimate one grid row; notice lines span the row

After the base merge:
- A legacy activity line keeps the footer slot's one line. Base #30561 measured it as text.
- Session-start and standalone notes estimate one 28 grid row instead of 37. Review at 66ddd56.
- Restore #29965's .acpmux-row--line .cv-tools rule, so a notice's tool line keeps the icon and text columns.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(chat): centre the footer in the turn gap on the action control token itself

Review at 45df014: the turn-gap footer rule read --cv-meta-row. On this branch
that is var(--grid-transcript-action-control) (28), but base's value is 24,
so naming the 28 control directly takes the ambiguity away. The value does
not change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(chat): a note's estimate takes the grid's zero note gap

Review BLOCK at 5cedb24: #30400 estimates a note as its 20 line plus 12 above and
below, but on the grid .cv-tool-note has no margin (the run's block gap is the
room), so each note was overestimated by 24. NOTE_GAP is 0, matching
--cv-note-gap.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test(chat): a note between tool rows has the run's block gap on the grid

Base's transcript-interim-prose-gap (#30400) holds a 12px note gap. On the grid
a run stacks rows and notes with the 24 block gap, which gives a note more
room than base's 12 and the same room as between any two blocks. The test now
reads the grid token.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
teamleaderleo added a commit that referenced this pull request Nov 2, 2026
Per the grid owner's correction the 22px one-line row pitch is intended
(#29965) and the grid lane restores it, so the row pitch tests go back
to base. transcript-row-alignment now expects the block gap above and
below every status row (grid.md 5.5, block 24, gaps never add up).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-2f629b93d5a20c58e6f8
teamleaderleo added a commit that referenced this pull request Nov 2, 2026
…apart (#29965)

The running turn's live line (thinking/working, and the live run line) took the 24 block gap
under a run of step rows; it is one more line of the run, so it joins flush. Under its own prompt
it still waits a block gap (grid.md 5.5). continuationSpacing tests both. The reply-room comment
no longer says a note adds no room (review follow-up).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-ac5053f7854c8635a4d0
teamleaderleo added a commit that referenced this pull request Nov 2, 2026
teamleaderleo added a commit that referenced this pull request Nov 2, 2026
…on) (#31497)

* fix(chat): one-line activity rows sit 22 apart again (#27580 regression)

#27580 drew every tool, notice, inbox and message line on the 28 list row and put the 24 block
gap between each one (between transcript rows and inside a run's .cv-tools, .cv-tool-run and
.cv-tool-group), so consecutive one-line rows sat about 50 apart top to top. Leo, 2026-11-02:
"well now there's sometimes too much spacing between tool calls". design/chat-transcript.md
"One-line row pitch" (#29965) has them flush, 22 apart.

- --cv-tool-row-height is 22 again; received lines and disclosure lines use it.
- Run stacks list their lines flush (gap 0); a note keeps the block gap around it (--cv-note-gap).
- transcriptGrid: a step row (a tool run or an isLineRow line, MARK_STEP) after another step row
  takes no gap; the block gap is only around a run of them. The estimator matches (22 lines, no
  in-run gaps, the note gap).

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

* test(chat): one-line rows estimate 22; the live line's check resolves its tokens

rowEstimates: another agent's message, a sent message and a task notice are one 22px line
(design/chat-transcript.md "One-line row pitch"). agent-pane-working-counts read --cv-meta-row
with parseFloat, which is NaN since the token is a var() chain; it resolves each token through a
probe's height.

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

* docs(chat): the note rule names the block gap and noteGap

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

* fix(chat): the live line under a run of one-line rows sits flush, 22 apart (#29965)

The running turn's live line (thinking/working, and the live run line) took the 24 block gap
under a run of step rows; it is one more line of the run, so it joins flush. Under its own prompt
it still waits a block gap (grid.md 5.5). continuationSpacing tests both. The reply-room comment
no longer says a note adds no room (review follow-up).

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

* test(chat): transcript-rhythm holds the live line flush under its tool run (#29965)

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

* style(chat): name the step-row test so the layout pass fits the formatter

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

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
teamleaderleo added a commit that referenced this pull request Nov 2, 2026
teamleaderleo added a commit that referenced this pull request Nov 2, 2026
) (#31745)

The running turn's line as its last row sat in the footer's 32 slot even right under a
step row, so it measured 27 under the run and the waiting messages' head 51 under it.
Right under a step row it is now a step row itself, 22 tall, so both are 22.

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

This branch was previously deployed

1 inactive deployment
ci-routing-agent — 501cbb20 Deployed Nov 1, 2026 by teamleaderleo via wait for same-key tree publisher #95735
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