Repository navigation
fix(next): unify transcript activity rows - #29754
Conversation
Bugbot needs on-demand usage enabledBugbot 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. |
|
cmux status (one comment, edited in place; each line is updated by the job that owns it) Review App of this head (app.zip, kept 1 day)
Gallery before/after for
States
Pick other states with a Passes: CI passes on CI passes on Written by web and size checks: green Shipped in:
|
d75c4d7 to
9b8fc52
Compare
Bugbot needs on-demand usage enabledBugbot 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. |
34b61e1 to
e98f27d
Compare
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-457f83fe6c6bd3bc38a1
e98f27d to
681df22
Compare
|
Review (subagent): SHIP at 524c055 |
|
Review (subagent): SHIP at dba1453 |
|
Review (subagent): SHIP at f7f4eef |
|
Review (subagent): SHIP at 618b0f3 Preserves the base removal of grouped sent-message rows and its shared icon/text columns. Incoming chip padding is offset consistently for both plain and clickable names. No blocking findings. |
There was a problem hiding this comment.
12 issues found across 17 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/LaneNoticeBatch.tsx">
<violation number="1" location="webviews/src/agent-session/acpmux/conversation/LaneNoticeBatch.tsx:48">
P3: This row now shows two disclosure arrows: the icon column arrow you pass, plus the trailing chevron that `TranscriptActivityRow` always renders and rotates via `expanded`. Drop the disclosure icon here and let the shared trailing chevron signal open state, or pass an activity icon instead.</violation>
</file>
<file name="webviews/src/agent-session/acpmux/conversation/TranscriptActivityRow.test.tsx">
<violation number="1" location="webviews/src/agent-session/acpmux/conversation/TranscriptActivityRow.test.tsx:74">
P2: The third test only renders synthetic rows without `onClick` or `actions`. That leaves the claimed chat-target behavior for incoming sender tags and the retry-outside-control layout untested. Add a case that renders an `onClick` tag and an `actions` node and asserts the tag button fires and sits outside the `.cv-agent-activity__control` element.</violation>
</file>
<file name="webviews/src/agent-session/acpmux/conversation/ActivityLine.tsx">
<violation number="1" location="webviews/src/agent-session/acpmux/conversation/ActivityLine.tsx:20">
P3: The early return for sending rows drops the `⌃B to run in background` hint. The old code rendered it whenever `row.doingCommand` was set, and a sending `acpmux send` execute call still sets that flag. Render `BackgroundHint` in the sending branch too, or confirm the drop is intended, since WorkingFor still shows it.</violation>
</file>
<file name="webviews/src/agent-session/acpmux/conversation/TranscriptActivityRow.css">
<violation number="1" location="webviews/src/agent-session/acpmux/conversation/TranscriptActivityRow.css:53">
P2: This rule lights the whole received line's text when the sender pill is hovered or pressed. The existing `.cv-received > .cv-disclosure__line` rule excludes that case on purpose, so add the same `:not(:has(.cv-received__from--open:hover))` guard here and to the preview rule below.</violation>
</file>
<file name="webviews/src/agent-session/acpmux/conversation/AgentTag.css">
<violation number="1" location="webviews/src/agent-session/acpmux/conversation/AgentTag.css:5">
P2: `text-overflow: ellipsis` has no effect here because `.cv-agent-tag` is a flex container with the name as a bare text child. Long agent or lane names get clipped mid-glyph instead of truncating with an ellipsis. Make the tag a block box so the ellipsis applies to its text.</violation>
</file>
<file name="webviews/src/agent-session/acpmux/conversation/AgentMessageRow.tsx">
<violation number="1" location="webviews/src/agent-session/acpmux/conversation/AgentMessageRow.tsx:113">
P2: The messaging chip keeps the bespoke `.cv-agentmsg__name` class, and its 7px padding overrides the shared `AgentTag` padding of 4px. Subagent and inbox chips use the shared 4px, so the chips still differ in size across rows. Drop the duplicate padding from `AgentMessageRow.css` (or the class from this call) so all activity chips use one padding.</violation>
</file>
<file name="webviews/src/agent-session/acpmux/subagents/subagents.css">
<violation number="1" location="webviews/src/agent-session/acpmux/subagents/subagents.css:1046">
P3: The added rule duplicates flex and min-width settings already on `.cv-agent-activity__control`, and it makes the older `> .cv-subagent-done` rule dead. Keep only the `width` override if it is still needed, and fold it into the shared row CSS.</violation>
</file>
<file name="webviews/src/agent-session/acpmux/subagents/DisclosureRow.tsx">
<violation number="1" location="webviews/src/agent-session/acpmux/subagents/DisclosureRow.tsx:113">
P3: Every `DisclosureRow` line now gets `user-select: none` from the shared activity-row class. Agent and sub-session labels, which were selectable before, can no longer be selected or copied. If that is intended, say so in the PR; otherwise scope the shared class so it does not apply to these lines.</violation>
</file>
<file name="webviews/src/agent-session/acpmux/conversation/AgentMessageRow.css">
<violation number="1" location="webviews/src/agent-session/acpmux/conversation/AgentMessageRow.css:159">
P3: The preview stays dim on hover and press because `.cv-agentmsg__preview` sets its own color, overriding this inherited row color. Include the preview in this state selector, as the shared activity-row rule does for its preview.</violation>
</file>
<file name="webviews/src/agent-session/acpmux/conversation/AgentTag.tsx">
<violation number="1" location="webviews/src/agent-session/acpmux/conversation/AgentTag.tsx:34">
P2: `ActivityLine` renders this plain tag in a non-clickable “Sending message to” row, and `TranscriptActivityRow` drops its `ariaLabel` without `onClick`. Expose the name in static rows or provide an accessible equivalent.</violation>
</file>
<file name="webviews/src/agent-session/acpmux/subagents/SubagentDoneLine.tsx">
<violation number="1" location="webviews/src/agent-session/acpmux/subagents/SubagentDoneLine.tsx:187">
P2: Long failure messages now sit in a non-shrinking trailing meta with no width cap, so they can spill over the row and its actions. Keep the error in the ellipsized sentence and retain a hover title; `ariaLabel` is not a pointer tooltip.</violation>
</file>
<file name="webviews/src/agent-session/acpmux/conversation/IncomingMessageCard.tsx">
<violation number="1" location="webviews/src/agent-session/acpmux/conversation/IncomingMessageCard.tsx:82">
P2: `SenderName` now displays inbox thread senders, but `IncomingMessageLine` still labels the disclosure from `message.name` (`"inbox"`). Use the same inbox-aware sender label for the disclosure so screen readers hear the actual senders.</violation>
</file>
Reply with feedback, questions, or to request a fix.
View guided diff | Turn on auto-fix | Re-trigger cubic
| expect(source("./AgentTag.css")).toContain(":is(:hover, :focus-visible, :active)"); | ||
| }); | ||
|
|
||
| test("the three activity kinds render through one row with an agent tag", () => { |
There was a problem hiding this comment.
P2: The third test only renders synthetic rows without onClick or actions. That leaves the claimed chat-target behavior for incoming sender tags and the retry-outside-control layout untested. Add a case that renders an onClick tag and an actions node and asserts the tag button fires and sits outside the .cv-agent-activity__control element.
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/TranscriptActivityRow.test.tsx, line 74:
<comment>The third test only renders synthetic rows without `onClick` or `actions`. That leaves the claimed chat-target behavior for incoming sender tags and the retry-outside-control layout untested. Add a case that renders an `onClick` tag and an `actions` node and asserts the tag button fires and sits outside the `.cv-agent-activity__control` element.</comment>
<file context>
@@ -0,0 +1,84 @@
+ expect(source("./AgentTag.css")).toContain(":is(:hover, :focus-visible, :active)");
+});
+
+test("the three activity kinds render through one row with an agent tag", () => {
+ const host = renderRows();
+ const rows = [...host.querySelectorAll<HTMLElement>(".cv-agent-activity-row")];
</file context>
| flex: none; | ||
| } | ||
|
|
||
| .cv-agent-activity-row.cv-disclosure__line:is(:hover, :active, :focus-within) { |
There was a problem hiding this comment.
P2: This rule lights the whole received line's text when the sender pill is hovered or pressed. The existing .cv-received > .cv-disclosure__line rule excludes that case on purpose, so add the same :not(:has(.cv-received__from--open:hover)) guard here and to the preview rule below.
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/TranscriptActivityRow.css, line 53:
<comment>This rule lights the whole received line's text when the sender pill is hovered or pressed. The existing `.cv-received > .cv-disclosure__line` rule excludes that case on purpose, so add the same `:not(:has(.cv-received__from--open:hover))` guard here and to the preview rule below.</comment>
<file context>
@@ -0,0 +1,58 @@
+ flex: none;
+}
+
+.cv-agent-activity-row.cv-disclosure__line:is(:hover, :active, :focus-within) {
+ color: var(--cv-text);
+}
</file context>
| .cv-agent-activity-row.cv-disclosure__line:is(:hover, :active, :focus-within) { | |
| .cv-agent-activity-row.cv-disclosure__line:is(:hover, :active, :focus-within):not(:has(.cv-received__from--open:hover)) { |
| .cv-agent-tag { | ||
| all: unset; | ||
| box-sizing: border-box; | ||
| display: inline-flex; |
There was a problem hiding this comment.
P2: text-overflow: ellipsis has no effect here because .cv-agent-tag is a flex container with the name as a bare text child. Long agent or lane names get clipped mid-glyph instead of truncating with an ellipsis. Make the tag a block box so the ellipsis applies to its text.
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/AgentTag.css, line 5:
<comment>`text-overflow: ellipsis` has no effect here because `.cv-agent-tag` is a flex container with the name as a bare text child. Long agent or lane names get clipped mid-glyph instead of truncating with an ellipsis. Make the tag a block box so the ellipsis applies to its text.</comment>
<file context>
@@ -0,0 +1,32 @@
+.cv-agent-tag {
+ all: unset;
+ box-sizing: border-box;
+ display: inline-flex;
+ align-items: center;
+ flex: none;
</file context>
| <span className="cv-agentmsg__name is-plain" aria-hidden title={nameTitle}> | ||
| {name} | ||
| </span> | ||
| <AgentTag name={name} className="cv-agentmsg__name" title={nameTitle} /> |
There was a problem hiding this comment.
P2: The messaging chip keeps the bespoke .cv-agentmsg__name class, and its 7px padding overrides the shared AgentTag padding of 4px. Subagent and inbox chips use the shared 4px, so the chips still differ in size across rows. Drop the duplicate padding from AgentMessageRow.css (or the class from this call) so all activity chips use one padding.
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.tsx, line 113:
<comment>The messaging chip keeps the bespoke `.cv-agentmsg__name` class, and its 7px padding overrides the shared `AgentTag` padding of 4px. Subagent and inbox chips use the shared 4px, so the chips still differ in size across rows. Drop the duplicate padding from `AgentMessageRow.css` (or the class from this call) so all activity chips use one padding.</comment>
<file context>
@@ -86,35 +87,30 @@ export function AgentMessageRow({
- <span className="cv-agentmsg__name is-plain" aria-hidden title={nameTitle}>
- {name}
- </span>
+ <AgentTag name={name} className="cv-agentmsg__name" title={nameTitle} />
)}
{after.trim() && (
</file context>
| <button | ||
| type="button" | ||
| <TranscriptActivityRow | ||
| icon={<Icon name={open ? "disclosure.expanded" : "disclosure.collapsed"} size={12} row />} |
There was a problem hiding this comment.
P3: This row now shows two disclosure arrows: the icon column arrow you pass, plus the trailing chevron that TranscriptActivityRow always renders and rotates via expanded. Drop the disclosure icon here and let the shared trailing chevron signal open state, or pass an activity icon instead.
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/LaneNoticeBatch.tsx, line 48:
<comment>This row now shows two disclosure arrows: the icon column arrow you pass, plus the trailing chevron that `TranscriptActivityRow` always renders and rotates via `expanded`. Drop the disclosure icon here and let the shared trailing chevron signal open state, or pass an activity icon instead.</comment>
<file context>
@@ -43,20 +44,21 @@ export function LaneNoticeBatch({ row, renderMessage }: { row: AcpmuxRow; render
- <button
- type="button"
+ <TranscriptActivityRow
+ icon={<Icon name={open ? "disclosure.expanded" : "disclosure.collapsed"} size={12} row />}
+ before={count}
+ name={batch.kind === "inbox" && names ? names : undefined}
</file context>
| const time = useTicking(true, now); | ||
| // A message going out reads "Sending message to tests", never its raw command (turns.ts `sendingTo`). | ||
| const sendName = useSubsessionInfo(row.doingSendSession)?.name ?? row.doingSendTo; | ||
| if (sendName !== undefined) { |
There was a problem hiding this comment.
P3: The early return for sending rows drops the ⌃B to run in background hint. The old code rendered it whenever row.doingCommand was set, and a sending acpmux send execute call still sets that flag. Render BackgroundHint in the sending branch too, or confirm the drop is intended, since WorkingFor still shows it.
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/ActivityLine.tsx, line 20:
<comment>The early return for sending rows drops the `⌃B to run in background` hint. The old code rendered it whenever `row.doingCommand` was set, and a sending `acpmux send` execute call still sets that flag. Render `BackgroundHint` in the sending branch too, or confirm the drop is intended, since WorkingFor still shows it.</comment>
<file context>
@@ -15,13 +17,27 @@ export function ActivityLine({ row, now = Date.now }: { row: AcpmuxRow; now?: ()
const time = useTicking(true, now);
// A message going out reads "Sending message to tests", never its raw command (turns.ts `sendingTo`).
const sendName = useSubsessionInfo(row.doingSendSession)?.name ?? row.doingSendTo;
+ if (sendName !== undefined) {
+ // Keep the lane name as the same tag used by sent and received transcript rows. A sentinel
+ // lets localization supply the words around the interpolated name without hard-coding them.
</file context>
| .cv-subagent-done-row .cv-subagent-done { | ||
| width: auto; | ||
| min-width: 0; | ||
| flex: 1 1 auto; |
There was a problem hiding this comment.
P3: The added rule duplicates flex and min-width settings already on .cv-agent-activity__control, and it makes the older > .cv-subagent-done rule dead. Keep only the width override if it is still needed, and fold it into the shared row CSS.
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/subagents/subagents.css, line 1046:
<comment>The added rule duplicates flex and min-width settings already on `.cv-agent-activity__control`, and it makes the older `> .cv-subagent-done` rule dead. Keep only the `width` override if it is still needed, and fold it into the shared row CSS.</comment>
<file context>
@@ -1039,3 +1039,9 @@ button.cv-subagent > :last-child {
+.cv-subagent-done-row .cv-subagent-done {
+ width: auto;
+ min-width: 0;
+ flex: 1 1 auto;
+}
</file context>
| data-find-skip | ||
| {...{ [HEADER_TOGGLE_ATTRIBUTE]: "" }} | ||
| ref={onOpen ? collapse.headerRef : undefined} | ||
| <TranscriptActivityRowShell |
There was a problem hiding this comment.
P3: Every DisclosureRow line now gets user-select: none from the shared activity-row class. Agent and sub-session labels, which were selectable before, can no longer be selected or copied. If that is intended, say so in the PR; otherwise scope the shared class so it does not apply to these lines.
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/subagents/DisclosureRow.tsx, line 113:
<comment>Every `DisclosureRow` line now gets `user-select: none` from the shared activity-row class. Agent and sub-session labels, which were selectable before, can no longer be selected or copied. If that is intended, say so in the PR; otherwise scope the shared class so it does not apply to these lines.</comment>
<file context>
@@ -106,15 +110,10 @@ export function DisclosureRow({
- data-find-skip
- {...{ [HEADER_TOGGLE_ATTRIBUTE]: "" }}
- ref={onOpen ? collapse.headerRef : undefined}
+ <TranscriptActivityRowShell
+ className={`cv-disclosure__line${lineClassName ? ` ${lineClassName}` : ""}`}
+ attributes={{ "data-find-skip": "", [HEADER_TOGGLE_ATTRIBUTE]: "" }}
</file context>
| overflow-wrap: anywhere; | ||
| } | ||
| /* Pressing a message row keeps the same readable text treatment as hover. */ | ||
| .cv-agentmsg__line:is(:hover, :active, :focus-within) { |
There was a problem hiding this comment.
P3: The preview stays dim on hover and press because .cv-agentmsg__preview sets its own color, overriding this inherited row color. Include the preview in this state selector, as the shared activity-row rule does for its preview.
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 159:
<comment>The preview stays dim on hover and press because `.cv-agentmsg__preview` sets its own color, overriding this inherited row color. Include the preview in this state selector, as the shared activity-row rule does for its preview.</comment>
<file context>
@@ -155,3 +155,7 @@ button.cv-agentmsg__name:focus-visible {
overflow-wrap: anywhere;
}
+/* Pressing a message row keeps the same readable text treatment as hover. */
+.cv-agentmsg__line:is(:hover, :active, :focus-within) {
+ color: var(--cv-text);
+}
</file context>
| .cv-agentmsg__line:is(:hover, :active, :focus-within) { | |
| .cv-agentmsg__line:is(:hover, :active, :focus-within), | |
| .cv-agentmsg__line:is(:hover, :active, :focus-within) .cv-agentmsg__preview { |
…ript-activity-rows # Conflicts: # webviews/src/agent-session/acpmux/conversation/AgentMessageRow.css # webviews/src/agent-session/acpmux/conversation/AgentMessageRow.tsx # webviews/src/agent-session/acpmux/subagents/SubagentDoneLine.tsx
|
Found 3 test failures on Blacksmith runners: Failures
|
|
Review (subagent): SHIP at 22257e7 Preserves the merged sentence, action, duration, and chevron layout while applying shared activity styling and AgentTag. Delegated toggles, retry/error behavior, and incoming text-column alignment remain intact. No blocking findings. |
Toward base: #29754's one icon column (--cv-row-icon, --cv-row-icon-gap, the tool text inset) is kept whole, and #29740 removed per-reply action rows (hasReplyActions is false), so base's reply-actions test stands. statusEdge now reads the room under a status row from the reply above, as the room over it, so the two always match (12px each side while replies draw no action row; #29585, #29853). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Base landed #28291 itself (985e3a2) and #29754 (48f4dfb), which already draw each send, message and subagent row as icon, sentence, trailing status or duration, then the chevron last, with the chevron only drawing. The carry's inline-chevron reorder is what the reviewers blocked, so every conflict takes base's side. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-f71664ebfb6cf5206479
…ove two lint silencers) (#29931) * a11y: real controls for the What's New copy and the activity row; prove two test Sendables - What's New card (f098118): the build line's commit is a native <button type="button"> instead of a span with role="button", tabIndex and a hand-written Enter/Space handler behind an oxlint silencer. A CSS reset keeps it plain inline text; user-select: text keeps the commit selectable in a drag across the line (u4466). Return or Space (a click with detail 0) copies even while other text on the page is selected; a pointer click that ends a drag still selects instead. - Transcript activity row shell (#29754, 48f4dfb): drop the empty onKeyDown and the lint silencer. The line's click is the pointer's wider target only; DisclosureRow's own toggle <button> (aria-expanded) is the keyboard and screen reader control, as the pre-#29754 code said. role="presentation" states that, and the lint accepts it with no disable. - MobileHostMacIdentityKeychainTests.Recorder (d986f94): state is private and read only under its lock (the test read queries and wrote copyStatus outside it); crash-allow states why. - PhoneAdmissionStoreTests.ReadHookSeal (b5d1dbf): checked Sendable, no @unchecked. Tests: test/updated-card-lists-changes.test.tsx (native button, Return/Space copies with a selection on the page), new test/activity-row-keyboard.test.tsx (the toggle is a focusable button that opens and closes the row from the keyboard; the line is presentation, no tab stop). * a11y: CopyVersion (card build line and Update Ready heading) is a native button feat-cmux-next's ebf5b25 moved the build line's copy span into one CopyVersion component, shared with the Update Ready popover heading, with the same role="button" span, hand-written Enter/Space handler and prefer-tag-over-role silencer. Apply this PR's fix there: a native <button type="button">, a CSS reset on .wn-copy-version so it reads as the text around it, user-select: text over the surfaces' button rule, and Return/Space (detail 0) copies even with a selection on the page. update-ready-popover.test.tsx now expects the native button.
* Transcript: no spinners on tool-call rows Leo, 2026-10-31: "I FUCKING HATE THESE SPINNERS FOR TOOL CALLS AND SHIT" / "IF IT'S SENDING IT SHOULDN'T NEED". Running tool rows (runs, groups, MCP calls, commands, dispatches, message runs, the sending line, sub-session calls and a retrying subagent line) keep their resting glyph; the row's live style says it runs. #29754 had put a spinner back on the sending line. Leo-ask: ask-66b0668459 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-ec1f41720f3942dc6864 * Transcript tool rows: format, lint, and a running message run keeps its live style Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-ec1f41720f3942dc6864 --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…n right after it Leo, 2026-11-03: "this is pretty bad spacing and formatting" / "i thought we made this stuff smaller". The chip on "Subagent finished: [name]" was capped at 40% of its sentence (AgentTag.css, #29754), and #32867 left the duration's trail before the chevron, so its auto margin parked the chevron at the row's far edge. The chip now takes the row's room and is cut with an ellipsis at its edge; the duration follows the chevron at the line's end. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-81baa1463f6190d4c5dc
…ht after it (#33083) * test(transcript): a finished subagent's chip takes the row, its chevron right after it Gallery entry agent-pane.subagent-done (long title, short title, narrow pane, a 60% cap and the base's look) and a Chromium test that measures the chip against the old 40% cap and the chevron against the chip. Red on base. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-81baa1463f6190d4c5dc * fix(transcript): a finished subagent's chip takes the row, its chevron right after it Leo, 2026-11-03: "this is pretty bad spacing and formatting" / "i thought we made this stuff smaller". The chip on "Subagent finished: [name]" was capped at 40% of its sentence (AgentTag.css, #29754), and #32867 left the duration's trail before the chevron, so its auto margin parked the chevron at the row's far edge. The chip now takes the row's room and is cut with an ellipsis at its edge; the duration follows the chevron at the line's end. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-81baa1463f6190d4c5dc * fix(transcript): a failed subagent's error is cut before its chip Review: with the chip free to shrink, a long error (a bare text node, which could not shrink) squeezed the name to an empty pill. The reason and error after the name are now their own box, cut first. Drops a trail order rule that changed nothing, uses a name long enough to be cut under any font, and adds a failed-with-long-error gallery variant and test. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-81baa1463f6190d4c5dc --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
![Fix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/fix-with-codesmith-light-3x.png)
Leo called out two problems in transcript activity rows: “THE TEXT DOESN’T EVEN LIGHT UP LIKE THE HOVER” and “THERE’S NO TAG … THE STYLING HERE WHY IS IT NOT ALL UNIFIED.”
Subagent-finished, messaging, and inbox activity now share one row component, with the same layout, icon column, spacing, name chip, and hover/press text feedback. Incoming sender tags retain their chat targets, and retry actions remain outside the row control.
Design:
leo-workspace/design/chat-transcript.mdrecords the shared activity-row rule.Validation: all 44 targeted tests passed on the fleet at
f201cc711ef1087110de3327ffb227dbaccf8cca, including subagent-tray, activityTone, and TurnRows (run). The exact head passed independent subagent review and fast gates; the full webview verdict is pending.Agent session: agent session
🤖 Generated with Claude Code