Skip to content

Agent pane: messages between agents share the tool rows' icon column and text inset - #28796

Closed
teamleaderleo wants to merge 4 commits into
feat-cmux-nextfrom
lane/ux-icon-column
Closed

teamleaderleo wants to merge 4 commits into
feat-cmux-nextfrom
lane/ux-icon-column

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 31, 2026 •

Copy link
Copy Markdown
Collaborator

Leo: "the alignment i feel like we might as well"

The agent pane's transcript rows (a tool row, a message from another agent, this agent's send, the waiting group's head) each put their glyph in a different place: the received line's padding pushed the sender's mark 8px right of the tool rows' glyph slot and its name to x=28, a sent line's words started 1.5px left of the tool rows', and a harness logo drew at 14px beside 12px stroke glyphs. Now every row shares one icon column and one text inset.

  • Received lines: no inline padding, so the sender's mark takes the tool rows' 16px glyph slot and the name starts at the tool rows' 24px text x (conversation.css).
  • Sent lines: the tool icon's -1.5px end margin (a no-op in the tool rows' grid, not in this flex line) is cleared (AgentMessageRow.css).
  • Waiting group head: its chevron moves into the glyph slot (PendingMessagesCard.css).
  • Harness logos draw at 12px, the stroke glyphs' drawn size (IncomingMessageCard.tsx).
  • No row's content, order or presence changes.

Spec: design/chat-transcript.md "One icon column" (leo-workspace#1814).

Measured (gallery agent-pane.agent-message-row#icon-column, Chromium, px from the row's left)

row slot left before → after glyph center before → after glyph ink before → after text x before → after
tool (Ran git log) 0 → 0 8 → 8 11.5 → 11.5 24 → 24
received, Codex logo (go-live) 8 → 0 16 → 8 14 → 12 28 → 24
sent (envelope) 0 → 0 8 → 8 11.5 → 11.5 22.5 → 24
received, no mark (release-notes) 8 → 0 16 → 8 12.5 → 12.5 28 → 24

Light and dark measure the same. Before, the test reported 8 problems per theme; after, none.

Stills (2x, gallery, synthetic data)

before after
light before light after light
dark before dark after dark

Viewed after image: icon-column-after-light.png and icon-column-after-dark.png. The terminal, Codex logo, envelope and bot glyphs share one center line, and "Ran", "go-live", "Sent to" and "release-notes" all start at the same x. No control repeats per row, and nothing is clipped or off-screen.

Tests

Changelog

none

Agent session: agent session

🤖 Generated with Claude Code

…ext inset

A gallery state (agent-pane.agent-message-row / icon-column) stacks a command
row, a message from a Codex session (its logo), this agent's send (the
envelope) and a message from a sender with no mark (the bot). The browser test
measures each top-level row's icon slot, glyph center, drawn glyph size and
first word's x, and fails while a received message's mark sits 8px right of
the tool rows' slot, its name 5.5px right of their words, and its logo draws
at 14px beside the envelope's 11.5px.

Leo: "the alignment i feel like we might as well"

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
@github-actions github-actions Bot added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 31, 2026
Tool rows lay out as a grid: the 16px glyph slot at the row's left edge, the
8px gap, the words at 24px (grid.md 5.5). Messages did not:
- a received message's line and sender each added 4px of inline padding, so
  its mark sat 8px right of the slot and its name started at 28px; the line
  drops the padding and the mark takes the slot (its hover chips keep their
  place before the chevron);
- a sent message's line is flex, where the tool icon's -1.5px end margin (a
  no-op in the grid) pulled its words to 22.5px; it is 0 there;
- the waiting group's chevron moves into the same slot.
A harness logo draws at 12px, the stroke glyphs' drawn size, instead of 14px.

Leo: "the alignment i feel like we might as well"

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

github-actions Bot commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor

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

Review 237a686: 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=pr28796 -f ref=lane/ux-icon-column -f platform=macos -f backend_mode=local

Passes: CI passes on 237a6868af.

CI passes on 237a6868af (run 41263742592 attempt 1).

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.

web and size checks: green

@blacksmith-sh

blacksmith-sh Bot commented Oct 31, 2026 •

Copy link
Copy Markdown

Found 3 test failures on Blacksmith runners:

Failures

Test View Logs
test_every_listed_hook_is_one_glaeda_released_with_the_check (main.SigningHooksInSt
epWithGlaedaTests.test_every_listed_hook_is_one_glaeda_released_with_the_check)/
test_every_listed_hook_is_one_glaeda_released_with_the_check (main.SigningHooksInSt
epWithGlaedaTests.test_every_listed_hook_is_one_glaeda_released_with_the_check)
View Logs
test_only_the_nightly_pickers_read_the_next_build_runner (main.NightlyTrustedRoutin
g.test_only_the_nightly_pickers_read_the_next_build_runner)/
test_only_the_nightly_pickers_read_the_next_build_runner (main.NightlyTrustedRoutin
g.test_only_the_nightly_pickers_read_the_next_build_runner)
View Logs
test_the_repository_highlights_validate (main.DigestTests.test_the_repository_highl
ights_validate)/
test_the_repository_highlights_validate (main.DigestTests.test_the_repository_highl
ights_validate)
View Logs

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

Base's #29800 already put the sent, received and tool rows in one icon
column (--cv-row-icon, --cv-row-icon-gap, the received line's hover plate
inset). Its rules win; this branch keeps the waiting group's chevron in
the slot and the sender's harness logo at 12px, now through base's
AgentIdentity.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
@teamleaderleo
teamleaderleo marked this pull request as ready for review November 1, 2026 01:54
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex-review-box/gpt-6-astra high, lane-place): BLOCK at 9c1ae0b

BLOCK at 9c1ae0b

Visual verdict: BLOCK — opened both after screenshots and their before counterparts. Alignment improves, but repeated disclosure controls make both themes busier than ChatGPT’s transcript and trigger your explicit blocking rule.

  1. [P1] [blocking] webviews/test/transcript-icon-column.test.ts:89 selects AgentIdentity’s outer <span> before its SVG. It measures the bot’s wrapper at least 16px wide against the envelope’s 11.5px SVG geometry, exceeding the 1.5px tolerance and failing the new browser test. Select the actual glyph before falling back to a span.

  2. [P1] [blocking] webviews/src/agent-session/acpmux/conversation/IncomingMessageCard.tsx:259 retains a disclosure control on each received row. Both after screenshots show these repeated alongside the tool and sent-row chevrons. This violates your screenshot gate even though the controls predate this change.

Browser execution was unavailable: the box lacks Bun and webview dependencies. Finding 1 follows from the merged DOM and measurement code.

… wrapper

The icon-column test picked AgentIdentity's outer span before its svg, so the
bot sender measured its 16px wrapper against the envelope's svg geometry.
Select the svg or image first and fall back to a span only for a text mark.

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

@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.

2 issues found across 5 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/test/transcript-icon-column.test.ts">

<violation number="1" location="webviews/test/transcript-icon-column.test.ts:197">
P2: This regression test does not exercise the waiting-group row it claims to measure. Add queued messages to the icon-column fixture and require a `waiting` row, so the chevron’s shared slot and text inset are actually asserted.</violation>
</file>

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

<violation number="1" location="webviews/src/agent-session/acpmux/conversation/PendingMessagesCard.css:36">
P3: This removes padding from physical left rather than inline-start, so an RTL transcript keeps the waiting-group chevron inset from the shared icon edge. Use logical inline padding so the icon is flush on either writing direction.</violation>
</file>

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

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

);
await page.screenshot({ path: path.join(artifacts, `icon-column-${theme.file}.png`), fullPage: true });
}
expect(rows.map((row) => row.kind)).toEqual(expect.arrayContaining(["tool", "sent", "received"]));

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 regression test does not exercise the waiting-group row it claims to measure. Add queued messages to the icon-column fixture and require a waiting row, so the chevron’s shared slot and text inset are actually asserted.

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-icon-column.test.ts, line 197:

<comment>This regression test does not exercise the waiting-group row it claims to measure. Add queued messages to the icon-column fixture and require a `waiting` row, so the chevron’s shared slot and text inset are actually asserted.</comment>

<file context>
@@ -0,0 +1,204 @@
+          );
+          await page.screenshot({ path: path.join(artifacts, `icon-column-${theme.file}.png`), fullPage: true });
+        }
+        expect(rows.map((row) => row.kind)).toEqual(expect.arrayContaining(["tool", "sent", "received"]));
+        expect(rows.filter((row) => row.kind === "received").length).toBeGreaterThanOrEqual(2);
+        expect(found).toEqual([]);
</file context>

/* The trailing room keeps the count clear of the plate's edge; none before the chevron, which
sits in the tool rows' glyph slot at the row's left edge (design/chat-transcript.md "One icon
column"). */
padding: 0 var(--ds-space-1) 0 0;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P3: This removes padding from physical left rather than inline-start, so an RTL transcript keeps the waiting-group chevron inset from the shared icon edge. Use logical inline padding so the icon is flush on either writing direction.

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/PendingMessagesCard.css, line 36:

<comment>This removes padding from physical left rather than inline-start, so an RTL transcript keeps the waiting-group chevron inset from the shared icon edge. Use logical inline padding so the icon is flush on either writing direction.</comment>

<file context>
@@ -30,7 +30,10 @@
+  /* The trailing room keeps the count clear of the plate's edge; none before the chevron, which
+     sits in the tool rows' glyph slot at the row's left edge (design/chat-transcript.md "One icon
+     column"). */
+  padding: 0 var(--ds-space-1) 0 0;
   border-radius: 6px;
   cursor: default;
</file context>
Suggested change
padding: 0 var(--ds-space-1) 0 0;
padding-inline: 0 var(--ds-space-1);

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Codex review rev-28796-iconcol (BLOCK at 9c1ae0b), addressed at 237a6868af56eba6ef709845aaada91afd50631a:

  1. Test measured AgentIdentity's wrapper span (this PR's own red): fixed in 237a686. The test now measures the drawn glyph (svg or img) first and uses a span only as the fallback for a text mark. bun test test/transcript-icon-column.test.ts on fleet Linux: 2 pass, 0 fail (light and dark), tested_sha 237a686 (run). The rows share one slot (0px+16px), one glyph center (8px) and one text inset within 0.5px, so no CSS change was needed.
  2. Disclosure control on every received row: out of the diff, since those controls were there before this PR. Per the Agent pane: the bottom stack on one edge as one glass, Stop in the tray row's menu #28533 ruling on out-of-diff BLOCKs, this is a follow-up and does not block this PR. Filed as manaflow-ai/cmuxterm-hq#5776.

Fresh review started at the new head: rev-28796-237a686 (b85875a..237a686).

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Subsumed by #29124, merged as 9d0d544 with this PR's commits and authorship folded in. The footer's first action glyph, the 'Worked for' label and the agent-message icon now start on the prose's left edge. The shared icon column stays at #29754's 22.5px; #29996 tracks 22.5 vs 24. Leaving it to this PR's owner to close.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (independent Codex gpt-6.1-sol, high, via the review router; full diff from merge base b85875a to this head): SHIP at 237a686.

No P1/P2 findings.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Closing: everything in this PR already landed on feat-cmux-next through #29124 (9d0d544, "Agent pane: status, tool and message rows and the action row line up with the prose"). A merge of feat-cmux-next into this branch comes out byte-identical to base, so there is nothing left to merge.

This branch was previously deployed

1 inactive deployment
ci-routing-agent — 237a6868 Deployed Nov 1, 2026 by teamleaderleo via cmux-tui tree preflight #92887
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