Skip to content

fix(next): unify transcript activity rows - #29754

Merged
teamleaderleo merged 15 commits into
feat-cmux-nextfrom
lane/transcript-activity-rows
Nov 1, 2026
Merged

teamleaderleo merged 15 commits into
feat-cmux-nextfrom
lane/transcript-activity-rows

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 31, 2026 •

Copy link
Copy Markdown
Collaborator

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.md records 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

@cursor

cursor Bot commented Oct 31, 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 teamleaderleo added the risk:low Risk tier (docs/ci/risk-tiers.md) label Oct 31, 2026
@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 22257e7: 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=pr29754 -f ref=lane/transcript-activity-rows -f platform=macos -f backend_mode=local

Gallery before/after for 22257e7: 16 states rendered, 16 images differ, 1389 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 41256614315 -R manaflow-ai/cmux -n gallery-advisory-29754-22257e79021861d70d64e193133bf5cc1948852a (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 0.61% own IncomingMessageCard.tsx
agent-pane.addressed-message/relayed Apple System Colors changed 0.601% own IncomingMessageCard.tsx
agent-pane.agent-message-row/unicode-boundary Apple System Colors Light changed 1.24% own AgentMessageRow.css
agent-pane.agent-message-row/unicode-boundary Apple System Colors changed 1.24% own AgentMessageRow.css
agent-pane.agent-message-row/sent Apple System Colors Light changed 0.0135% own AgentMessageRow.css
agent-pane.agent-message-row/sent Apple System Colors changed 0.0126% own AgentMessageRow.css
agent-pane.agent-message-row/lanes Apple System Colors Light unchanged 0% own AgentMessageRow.css
agent-pane.agent-message-row/lanes Apple System Colors unchanged 0% own AgentMessageRow.css
agent-pane.agent-message-row/sent-subagents Apple System Colors Light changed 0.865% own AgentMessageRow.css
agent-pane.agent-message-row/sent-subagents Apple System Colors changed 0.864% own AgentMessageRow.css
agent-pane.agent-message-row/sent-hover Apple System Colors Light changed 0.147% own AgentMessageRow.css
agent-pane.agent-message-row/sent-hover Apple System Colors changed 0.146% own AgentMessageRow.css
agent-pane.agent-message-row/sent-opened Apple System Colors Light changed 0.0157% own AgentMessageRow.css
agent-pane.agent-message-row/sent-opened Apple System Colors changed 0.0147% own AgentMessageRow.css
agent-pane.agent-message-row/sent-opened-long Apple System Colors Light changed 0.014% own AgentMessageRow.css
agent-pane.agent-message-row/sent-opened-long Apple System Colors changed 0.0126% own AgentMessageRow.css
agent-pane.agent-message-row/outcomes Apple System Colors Light changed 1.26% own AgentMessageRow.css
agent-pane.agent-message-row/outcomes Apple System Colors changed 1.25% 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.

Passes: CI passes on 22257e7902.

CI passes on 22257e7902 (run 41256614552 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

Shipped in:

@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 Oct 31, 2026
@teamleaderleo
teamleaderleo force-pushed the lane/transcript-activity-rows branch from d75c4d7 to 9b8fc52 Compare October 31, 2026 22:14
@cursor

cursor Bot commented Oct 31, 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
teamleaderleo force-pushed the lane/transcript-activity-rows branch 2 times, most recently from 34b61e1 to e98f27d Compare October 31, 2026 22:16
@teamleaderleo
teamleaderleo force-pushed the lane/transcript-activity-rows branch from e98f27d to 681df22 Compare October 31, 2026 22:17
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (subagent): SHIP at 524c055

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (subagent): SHIP at dba1453

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (subagent): SHIP at f7f4eef

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

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.

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

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", () => {

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: 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) {

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 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>
Suggested change
.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;

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: 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} />

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: 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 />}

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 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) {

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: 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;

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: 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

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: 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) {

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: 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>
Suggested change
.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
@blacksmith-sh

blacksmith-sh Bot commented Nov 1, 2026 •

Copy link
Copy Markdown

Found 3 test failures on Blacksmith runners:

Failures

Test View Logs
test_a_picked_signing_label_has_a_rerun_alternative (main.RunsOnFallbackTests.test_
a_picked_signing_label_has_a_rerun_alternative)/
test_a_picked_signing_label_has_a_rerun_alternative (main.RunsOnFallbackTests.test_
a_picked_signing_label_has_a_rerun_alternative)
View Logs
test_the_nightly_is_covered (main.NightlyStepCoverageTests.test_the_nightly_is_cove
red)/
test_the_nightly_is_covered (main.NightlyStepCoverageTests.test_the_nightly_is_cove
red)
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.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

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.

@teamleaderleo
teamleaderleo merged commit 48f4dfb into feat-cmux-next Nov 1, 2026
104 of 106 checks passed
@teamleaderleo
teamleaderleo deleted the lane/transcript-activity-rows branch November 1, 2026 00:27
teamleaderleo added a commit that referenced this pull request Nov 1, 2026
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>
teamleaderleo added a commit that referenced this pull request Nov 1, 2026
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
lawrencecchen added a commit that referenced this pull request Nov 1, 2026
…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.
teamleaderleo added a commit that referenced this pull request Nov 2, 2026
* 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>
teamleaderleo added a commit that referenced this pull request Nov 3, 2026
…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
teamleaderleo added a commit that referenced this pull request Nov 3, 2026
…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>

This branch was previously deployed

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