Skip to content

fix(tray): align status and controls with the composer - #29794

Merged
teamleaderleo merged 20 commits into
feat-cmux-nextfrom
lane/stranded-tray-alignment
Nov 1, 2026
Merged

teamleaderleo merged 20 commits into
feat-cmux-nextfrom
lane/stranded-tray-alignment

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 31, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes #27908. Fixes #28875.

The running tray above the composer keeps its duration, status, Stop and disclosure on shared fixed tracks, including an empty Stop slot for ended rows. Its controls align with the default composer's Stop and microphone, using equal gaps and matching insets. Workflow progress stays beside the title so every status word starts at the same x.

Leo, 2026-10-31:

WHY WAS THIS NOT FIXED IN THE 4:01 NIGHTLY
BULLSHIT ALIGNMENT
BULLSHIT SPACING

Earlier: “align this right side's chevrons”, “IT'S SO MISALIGNED”.

Carries the needed work from #28587, #29030, #27930 and #29250, preserving commit authorship. #27930's folding is superseded by #29030's per-chat memory, and its Stop-before-chevron layout already landed through #29264. The newer one-glyph rows remain. The tray starts folded, retains the person's per-chat choice, and constructs no hidden rows after its fold completes.

Takes back #29276: this latest request explicitly calls for aligned status words, so the tray shows its status in a fixed column; other row consumers retain their current presentation.

Design: running tray, updated in leo-workspace #2038.

Metric Before After Delta Harness
Hidden row constructions in a fully folded 300-agent tray 300 per render 0 -300 subagent-tray.test.tsx observable name-read regression carried from #29250

Validation: fleet browser geometry and web compilation pending. The geometry test compares Running, Done and Cancelled rows against the composer with a 0.5px tolerance. Required webview shards must complete before merge.

Risk: contained tray layout and folding. Existing fold focus, per-chat memory and hidden-row behavior retain regression coverage. The fold animation owns its existing cleanup; no new timers or observers.

No capture: geometry is checked in Chromium; screenshots are not a landing gate.

Agent session: agent session

🤖 Generated with Claude Code

austinywang and others added 15 commits October 31, 2026 23:44
…e person's choice per chat

Closes #28875

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit b0cef69)
Agent-Session: https://cmux.com/deeplink/agent?id=aid-08e2cc96b9b79e73b8e4
…res for between turns

A headed tray starts folded (#28875): the tests that read
its lines open it as the person does, by its header, and the motion edges remember chat-a as opened.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 49315c7)
Agent-Session: https://cmux.com/deeplink/agent?id=aid-08e2cc96b9b79e73b8e4
…d line; browser tests open it

Review of #28875: a lone line gaining a header folds the list,
which goes inert under a focused line or Stop; focus now moves to the header. Reading a chat's choice
refreshes its place in the bounded memory. The browser tests that read the tray's lines open it by its
header (test/support/openRunningTray.ts); the glyph check uses a one-line variant, the panel's closed
play opens the tray.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 0eb37de)
Agent-Session: https://cmux.com/deeplink/agent?id=aid-08e2cc96b9b79e73b8e4
The kind icon (agent.fork) sat inline against the title with no gap, and in a narrow tray the title
started at 22px, flush against the 14px state icon. Both now keep the summary row's 8px icon gap
(--acpmux-line-icon-gap). Browser regression in test/subagent-tray-columns.test.ts measures both gaps,
wide and narrow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 9543b29)
…or the fold to settle

The narrow layout's title already sat 8px past the state icon (the button's padding is the icon's
left); only the kind icon's gap to the title was missing. openRunningTray waits for the fold to let
go of its clip, so a focus or a scroll measures the settled tray.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 114d49d)
…to the header; focus elsewhere stays

Fails before the fix: with no motion the fold leaves in the same commit, and focus falls to the body.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 2624cd3)
Agent-Session: https://cmux.com/deeplink/agent?id=aid-08e2cc96b9b79e73b8e4
…es the focused line

Review of #28875: with Reduce Motion or the motion switch off
the fold leaves in the same commit as the fold, taking the focused line with it, so the layout effect saw
the body and moved nothing. Whether focus is in the list is now kept by focus and blur events; a blur to
another control clears it, a blur to nothing (removal, inert) does not.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 284a554)
Agent-Session: https://cmux.com/deeplink/agent?id=aid-08e2cc96b9b79e73b8e4
feat-cmux-next's #29264 added `const [head]` (the header look arm) to SubagentTray; this
PR's fold-focus ref was also `head`, so the merged file declared it twice. The ref is
now `headButton`. test/subagent-tray.test.tsx 39/39 and subagent-tray-motion 11/11 pass.

(cherry picked from commit aca7fb3)
Agent-Session: https://cmux.com/deeplink/agent?id=aid-08e2cc96b9b79e73b8e4
…nd glyph

feat-cmux-next's #29608 (f66a92e) took the fork glyph off subagent lines, so this PR's two
"8px icon gap" browser tests waited for .acpmux-agent-line__kind-icon and timed out after the
merge (review of aca7fb3). They now check the state icon to title gap (8px, wide and
narrow) and that no kind icon renders; the kind-icon margin rule that styled nothing is gone.
CMUX_BROWSER_TESTS=1 bun test test/subagent-tray-columns.test.ts: 12 pass, 0 fail.

(cherry picked from commit 1ab971c)
Agent-Session: https://cmux.com/deeplink/agent?id=aid-08e2cc96b9b79e73b8e4
…radius, one gap; the tray's chevron at 22

Leo, 2026-10-30: "the stupid right indent misalignemnt". ui-think-tank's rule,
one column, one gap, nothing removed:

- The running tray's header ended in an empty 24px Stop slot, so its chevron sat
  about 46px from the right (43 in a narrow tray) against Send at 22. The header
  has no Stop slot now; every row ends 12px in with a 20px mark box, so the
  chevron (header, line, View all) centres 22px from the right, and a line's
  Stop (or its empty column) centres 42px from the right. Narrow rows keep the
  same columns.
- At composer columns under 298px the box and its quiet row reach 8px past the
  column; every stack part now follows (--acpmux-stack-start/end on the dock
  write the same step out, since the composer's container query cannot reach its
  siblings).
- The tray (10px), the opened pull requests and the recap's card (12px) take the
  box's radius token, now defined on the dock as well.
- The recap, the legacy PR bars, the host's line and the agents pill drop their
  own bottom padding and take the stack's edges; the PR fallback row and the
  in-transcript tray take --cv-inset-end on the right; one dock rule gives the
  stack token between parts. The recap's card joins the glass like the tray.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
@teamleaderleo teamleaderleo added the risk:normal 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 73817e0: 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=pr29794 -f ref=lane/stranded-tray-alignment -f platform=macos -f backend_mode=local

Gallery before/after for 73817e0: 16 states rendered, 14 images differ, 1544 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 41254951957 -R manaflow-ai/cmux -n gallery-advisory-29794-73817e05ae9091aa2adca6ccba5de6d72cff1f06 (then read gallery-review.json)

States
State Theme Status Diff Picked by
agent-pane.background-activity/duration-columns Apple System Colors Light changed 0.172% own subagents.css
agent-pane.background-activity/duration-columns Apple System Colors changed 0.169% own subagents.css
agent-pane.background-activity/pinned-live-tail-light Apple System Colors Light unchanged 0% own subagents.css
agent-pane.background-activity/pinned-live-tail-light Apple System Colors unchanged 0% own subagents.css
agent-pane.background-activity/pinned-live-tail-dark Apple System Colors Light unchanged 0% own subagents.css
agent-pane.background-activity/pinned-live-tail-dark Apple System Colors unchanged 0% own subagents.css
agent-pane.background-activity/after-latest-message-light Apple System Colors Light unchanged 0% own subagents.css
agent-pane.background-activity/after-latest-message-light Apple System Colors unchanged 0% own subagents.css
agent-pane.background-activity/after-latest-message-dark Apple System Colors Light unchanged 0% own subagents.css
agent-pane.background-activity/after-latest-message-dark Apple System Colors unchanged 0% own subagents.css
agent-pane.background-activity/compact-pill-light Apple System Colors Light unchanged 0% own subagents.css
agent-pane.background-activity/compact-pill-light Apple System Colors unchanged 0% own subagents.css
agent-pane.background-activity/compact-pill-dark Apple System Colors Light unchanged 0% own subagents.css
agent-pane.background-activity/compact-pill-dark Apple System Colors unchanged 0% own subagents.css
agent-pane.background-activity/side-panel-light Apple System Colors Light unchanged 0% own subagents.css
agent-pane.background-activity/side-panel-light Apple System Colors unchanged 0% own subagents.css
agent-pane.background-tasks/closed Apple System Colors Light changed 1.42% own BackgroundTasksPanel.gallery.ts
agent-pane.background-tasks/closed Apple System Colors changed 1.41% own BackgroundTasksPanel.gallery.ts
agent-pane.background-tasks/docked Apple System Colors Light changed 1.71% own BackgroundTasksPanel.gallery.ts
agent-pane.background-tasks/docked Apple System Colors changed 1.71% own BackgroundTasksPanel.gallery.ts
agent-pane.background-tasks/alone Apple System Colors changed 0.0207% own BackgroundTasksPanel.gallery.ts
agent-pane.background-tasks/alone Apple System Colors Light changed 0.0163% own BackgroundTasksPanel.gallery.ts
agent-pane.background-tasks/finished Apple System Colors Light changed 0.0114% own BackgroundTasksPanel.gallery.ts
agent-pane.background-tasks/finished Apple System Colors changed 0.0086% own BackgroundTasksPanel.gallery.ts
agent-pane.background-tasks/transcript Apple System Colors Light changed 1.71% own BackgroundTasksPanel.gallery.ts
agent-pane.background-tasks/transcript Apple System Colors changed 1.7% own BackgroundTasksPanel.gallery.ts
agent-pane.chat-inspector/full Apple System Colors Light unchanged 0% own AgentLine.tsx
agent-pane.chat-inspector/full Apple System Colors unchanged 0% own AgentLine.tsx
agent-pane.chat-inspector/workflow-running Apple System Colors Light changed 0.0019% own AgentLine.tsx
agent-pane.chat-inspector/workflow-running Apple System Colors changed 0.0012% own AgentLine.tsx
agent-pane.chat-inspector/workflow-finished Apple System Colors Light unchanged 0% own AgentLine.tsx
agent-pane.chat-inspector/workflow-finished Apple System Colors unchanged 0% own AgentLine.tsx

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

Unclear: web / react-apps-base-check (5) failed: no known signature; failed step: Run base reds and compare. This PR merged before its CI finished: fix forward on main.

CI failed on 73817e05ae (run 41254951990 attempt 1): 3 unknown.

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

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

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

red: web / Web status; a job it gathers is red on this change (its line here); do not merge until green; see lane-rules
red: web / react-apps-base-check (5); NEW webview test reds: test/subagent-tray-layout.test.ts > the bottom-stack tray is flush with the composer and keeps the shared outer inset; do not merge until green; see lane-rules
red: web / react-apps-base-check (8); NEW webview test reds: test/subagent-tray-columns.test.ts > row anatomy: mixed (Apple System Colors Light); test/subagent-tray-columns.test.ts > row anatomy: done-one (Apple System Colors); test/subagent-tray-columns.test.ts > row anatomy: done-one (Apple System Colors Light) (+7 more); do not merge until green; see lane-rules
red: web / react-apps-check; a job it gathers is red on this change (its line here); do not merge until green; see lane-rules

Shipped in:

…ed-tray-alignment

# Conflicts:
#	webviews/src/agent-session/acpmux/subagents/SubagentTray.gallery.ts
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (subagent): SHIP at 6615ed9

Independent gpt-6-astra review: no remaining blocking findings. Fixed tracks preserve empty Stop slots, default Claude composer alignment and narrow-row geometry. Workflow progress cannot shift the status column. Browser assertions now cover visible status words and duration-before-status ordering. Required fleet browser/build checks and webview shards must finish green before merge.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (subagent): SHIP at 2a22d79

Independent gpt-6-astra review, including the narrow-width repair: the status track is derived from the shared tray width and remains identical across rows, while full duration and composer-aligned action columns stay inside a 200px pane. The normal 74px status track remains at 300px and 760px. No blocking findings. Merge after the required fleet browser/build checks and webview shards finish green.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (subagent): SHIP at 73817e0

Reviewed the final CSS delta: narrow icons use the row containing block, and Stop remains centered with status and duration on both tall wide rows and narrow control rows. No blocking findings. No images; visual comparison is a follow-up.

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

5 issues found across 21 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="release-notes/next/highlights/running-tray-alignment.md">

<violation number="1" location="release-notes/next/highlights/running-tray-alignment.md:2">
P2: This highlight has neither a `docs:` link nor an `action:`, so the What's New digest validator rejects and skips it. Add the relevant documentation link (as the related tray entry does) or a try-it action.</violation>
</file>

<file name="webviews/src/agent-session/acpmux/subagents/AgentLine.tsx">

<violation number="1" location="webviews/src/agent-session/acpmux/subagents/AgentLine.tsx:170">
P2: This moves workflow progress into the title’s ellipsized track, so a long agent name can hide the counts completely. Keep `progressAt="meta"` in a separate non-overlapping metadata/grid track so workflow progress remains visible.</violation>
</file>

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

<violation number="1" location="webviews/src/agent-session/acpmux/subagents/subagents.css:439">
P2: Expanding the row chevron track to the 28px composer control width leaves the existing geometry contract measuring the row’s 28px wrapper against the header’s 14px SVG. Update the geometry assertions to compare equivalent track elements, or expose the header’s fixed track for measurement; otherwise the tray-columns browser test fails despite the controls being centered.</violation>
</file>

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

<violation number="1" location="webviews/src/agent-session/acpmux/bottomStack.css:62">
P3: The tray and composer use different narrow-outset breakpoints. At fractional widths between 297px and 297.5px, this rule gives the tray an 8px outset while the composer does not, so their edges no longer align; use the composer’s 297px threshold (or a shared breakpoint token).</violation>
</file>

<file name="webviews/src/agent-session/acpmux/subagents/SubagentTray.tsx">

<violation number="1" location="webviews/src/agent-session/acpmux/subagents/SubagentTray.tsx:181">
P3: The existing `BackgroundActivity` duration-columns fixture now renders only a folded header because it does not provide a chat key or open the tray. Update that fixture to open the header (or provide an explicit gallery-open mode) so it continues to cover the documented duration and control geometry.</violation>
</file>

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

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

@@ -0,0 +1,4 @@
title: Aligned controls in the running tray
category: fixed

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 highlight has neither a docs: link nor an action:, so the What's New digest validator rejects and skips it. Add the relevant documentation link (as the related tray entry does) or a try-it action.

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 release-notes/next/highlights/running-tray-alignment.md, line 2:

<comment>This highlight has neither a `docs:` link nor an `action:`, so the What's New digest validator rejects and skips it. Add the relevant documentation link (as the related tray entry does) or a try-it action.</comment>

<file context>
@@ -0,0 +1,4 @@
+title: Aligned controls in the running tray
+category: fixed
+
+The running tray above the composer keeps durations, status labels and controls aligned across running and finished work. It starts folded and remembers each chat's choice.
</file context>

<span className="acpmux-summary-agent__name">{name}</span>
{detail && detail !== name && <span className="acpmux-summary-agent__kind">{detail}</span>}
{progress && trayColumns && progressAt === "meta" && (
<span className="acpmux-agent-line__stats">{progress}</span>

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 moves workflow progress into the title’s ellipsized track, so a long agent name can hide the counts completely. Keep progressAt="meta" in a separate non-overlapping metadata/grid track so workflow progress remains visible.

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/AgentLine.tsx, line 170:

<comment>This moves workflow progress into the title’s ellipsized track, so a long agent name can hide the counts completely. Keep `progressAt="meta"` in a separate non-overlapping metadata/grid track so workflow progress remains visible.</comment>

<file context>
@@ -166,21 +166,21 @@ export function AgentLine({
         <span className="acpmux-summary-agent__name">{name}</span>
         {detail && detail !== name && <span className="acpmux-summary-agent__kind">{detail}</span>}
+        {progress && trayColumns && progressAt === "meta" && (
+          <span className="acpmux-agent-line__stats">{progress}</span>
+        )}
         {progress && !(trayColumns && progressAt === "meta") && (
</file context>

--acpmux-tray-inset: var(--acpmux-composer-inset, calc(8px * var(--cmux-interface-scale, 1)));
/* The one trailing column every chevron ends in: the header's, each line's and View all's. */
--acpmux-tray-chevron-width: 14px;
--acpmux-tray-chevron-width: var(--acpmux-composer-control, 28px);

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: Expanding the row chevron track to the 28px composer control width leaves the existing geometry contract measuring the row’s 28px wrapper against the header’s 14px SVG. Update the geometry assertions to compare equivalent track elements, or expose the header’s fixed track for measurement; otherwise the tray-columns browser test fails despite the controls being centered.

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

<comment>Expanding the row chevron track to the 28px composer control width leaves the existing geometry contract measuring the row’s 28px wrapper against the header’s 14px SVG. Update the geometry assertions to compare equivalent track elements, or expose the header’s fixed track for measurement; otherwise the tray-columns browser test fails despite the controls being centered.</comment>

<file context>
@@ -431,13 +431,16 @@ button.cv-subagent > :last-child {
+  --acpmux-tray-inset: var(--acpmux-composer-inset, calc(8px * var(--cmux-interface-scale, 1)));
   /* The one trailing column every chevron ends in: the header's, each line's and View all's. */
-  --acpmux-tray-chevron-width: 14px;
+  --acpmux-tray-chevron-width: var(--acpmux-composer-control, 28px);
   box-sizing: border-box;
   padding: 0;
</file context>

/* Match the composer's 8px outset below 298px of content width (#28587). */
.acpmux-dock > .acpmux-running-tray {
margin: 0 var(--cv-inset-end, var(--cv-inset)) 0 var(--cv-inset);
--acpmux-tray-outset: clamp(0px, calc((297.5px - (100% - var(--cv-inset) - var(--cv-inset-end, var(--cv-inset)))) * 1000), 8px);

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 tray and composer use different narrow-outset breakpoints. At fractional widths between 297px and 297.5px, this rule gives the tray an 8px outset while the composer does not, so their edges no longer align; use the composer’s 297px threshold (or a shared breakpoint token).

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/bottomStack.css, line 62:

<comment>The tray and composer use different narrow-outset breakpoints. At fractional widths between 297px and 297.5px, this rule gives the tray an 8px outset while the composer does not, so their edges no longer align; use the composer’s 297px threshold (or a shared breakpoint token).</comment>

<file context>
@@ -57,8 +57,10 @@
+/* Match the composer's 8px outset below 298px of content width (#28587). */
 .acpmux-dock > .acpmux-running-tray {
-  margin: 0 var(--cv-inset-end, var(--cv-inset)) 0 var(--cv-inset);
+  --acpmux-tray-outset: clamp(0px, calc((297.5px - (100% - var(--cv-inset) - var(--cv-inset-end, var(--cv-inset)))) * 1000), 8px);
+  margin: 0 calc(var(--cv-inset-end, var(--cv-inset)) - var(--acpmux-tray-outset)) 0 calc(var(--cv-inset) - var(--acpmux-tray-outset));
 }
</file context>
Suggested change
--acpmux-tray-outset: clamp(0px, calc((297.5px - (100% - var(--cv-inset) - var(--cv-inset-end, var(--cv-inset)))) * 1000), 8px);
--acpmux-tray-outset: clamp(0px, calc((297px - (100% - var(--cv-inset) - var(--cv-inset-end, var(--cv-inset)))) * 1000), 8px);

// ending never takes it (and its collapse) away.
const headed = items.length + finished.length > 1;
const open = !headed || (opened ?? items.length <= TRAY_OPEN_MAX);
const open = !headed || opened === true;

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 existing BackgroundActivity duration-columns fixture now renders only a folded header because it does not provide a chat key or open the tray. Update that fixture to open the header (or provide an explicit gallery-open mode) so it continues to cover the documented duration and control geometry.

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/SubagentTray.tsx, line 181:

<comment>The existing `BackgroundActivity` duration-columns fixture now renders only a folded header because it does not provide a chat key or open the tray. Update that fixture to open the header (or provide an explicit gallery-open mode) so it continues to cover the documented duration and control geometry.</comment>

<file context>
@@ -172,12 +178,28 @@ export const SubagentTray = memo(function SubagentTray({
   // ending never takes it (and its collapse) away.
   const headed = items.length + finished.length > 1;
-  const open = !headed || (opened ?? items.length <= TRAY_OPEN_MAX);
+  const open = !headed || opened === true;
   // The list opens and folds on the shared fold, its height only (no fade in), from the header's
-  // chevron or the list growing past TRAY_OPEN_MAX.
</file context>

@teamleaderleo
teamleaderleo merged commit 711df45 into feat-cmux-next Nov 1, 2026
175 of 182 checks passed
@teamleaderleo
teamleaderleo deleted the lane/stranded-tray-alignment branch November 1, 2026 00:09
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (subagent): SHIP at 9172aa0

Reviewed the two release-highlight metadata lines added since 73817e0: docs and PR keys are valid, and the docs link satisfies the validator. Product source is unchanged from the prior reviewed head.

austinywang added a commit that referenced this pull request Nov 1, 2026
… stale CSS note

feat-cmux-next already carries both through 711df45 (#29794).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
teamleaderleo added a commit that referenced this pull request Nov 1, 2026
* fix(next): the running tray starts folded to its header, and holds the person's choice per chat

Closes #28875

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit b0cef69)
Agent-Session: https://cmux.com/deeplink/agent?id=aid-08e2cc96b9b79e73b8e4

* test(next): open the running tray where a test reads its lines; fixtures for between turns

A headed tray starts folded (#28875): the tests that read
its lines open it as the person does, by its header, and the motion edges remember chat-a as opened.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 49315c7)
Agent-Session: https://cmux.com/deeplink/agent?id=aid-08e2cc96b9b79e73b8e4

* fix(next): the tray's header takes focus when it folds under a focused line; browser tests open it

Review of #28875: a lone line gaining a header folds the list,
which goes inert under a focused line or Stop; focus now moves to the header. Reading a chat's choice
refreshes its place in the bounded memory. The browser tests that read the tray's lines open it by its
header (test/support/openRunningTray.ts); the glyph check uses a one-line variant, the panel's closed
play opens the tray.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 0eb37de)
Agent-Session: https://cmux.com/deeplink/agent?id=aid-08e2cc96b9b79e73b8e4

* fix(next): a subagent line's icons and title keep the row's 8px icon gap

The kind icon (agent.fork) sat inline against the title with no gap, and in a narrow tray the title
started at 22px, flush against the 14px state icon. Both now keep the summary row's 8px icon gap
(--acpmux-line-icon-gap). Browser regression in test/subagent-tray-columns.test.ts measures both gaps,
wide and narrow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 9543b29)

* fix(next): the narrow tray keeps its 8px state-icon gap; tests wait for the fold to settle

The narrow layout's title already sat 8px past the state icon (the button's padding is the icon's
left); only the kind icon's gap to the title was missing. openRunningTray waits for the fold to let
go of its clip, so a focus or a scroll measures the settled tray.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 114d49d)

* test(next): a tray folding with motion off moves focus from its line to the header; focus elsewhere stays

Fails before the fix: with no motion the fold leaves in the same commit, and focus falls to the body.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 2624cd3)
Agent-Session: https://cmux.com/deeplink/agent?id=aid-08e2cc96b9b79e73b8e4

* fix(next): the tray's header takes focus when a motionless fold removes the focused line

Review of #28875: with Reduce Motion or the motion switch off
the fold leaves in the same commit as the fold, taking the focused line with it, so the layout effect saw
the body and moved nothing. Whether focus is in the list is now kept by focus and blur events; a blur to
another control clears it, a blur to nothing (removal, inert) does not.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 284a554)
Agent-Session: https://cmux.com/deeplink/agent?id=aid-08e2cc96b9b79e73b8e4

* fix(tray): rename the header button ref after the feat-cmux-next merge

feat-cmux-next's #29264 added `const [head]` (the header look arm) to SubagentTray; this
PR's fold-focus ref was also `head`, so the merged file declared it twice. The ref is
now `headButton`. test/subagent-tray.test.tsx 39/39 and subagent-tray-motion 11/11 pass.

(cherry picked from commit aca7fb3)
Agent-Session: https://cmux.com/deeplink/agent?id=aid-08e2cc96b9b79e73b8e4

* fix(tray): icon-gap tests and CSS follow #29608, which removed the kind glyph

feat-cmux-next's #29608 (f66a92e) took the fork glyph off subagent lines, so this PR's two
"8px icon gap" browser tests waited for .acpmux-agent-line__kind-icon and timed out after the
merge (review of aca7fb3). They now check the state icon to title gap (8px, wide and
narrow) and that no kind icon renders; the kind-icon margin rule that styled nothing is gone.
CMUX_BROWSER_TESTS=1 bun test test/subagent-tray-columns.test.ts: 12 pass, 0 fail.

(cherry picked from commit 1ab971c)
Agent-Session: https://cmux.com/deeplink/agent?id=aid-08e2cc96b9b79e73b8e4

* perf(agent-pane): skip hidden subagent tray rows when folded

(cherry picked from commit b4fbe35)

* test(agent-pane): 300 collapsed agents construct no hidden lines

(cherry picked from commit 691560b)

* test(tray): avoid 300 hidden row reads across repeated collapsed renders

(cherry picked from commit d47573e)
Agent-Session: https://cmux.com/deeplink/agent?id=aid-08e2cc96b9b79e73b8e4

* perf(agent-pane): index 300 siblings without copying arrays

(cherry picked from commit 4a9f422)
Agent-Session: https://cmux.com/deeplink/agent?id=aid-08e2cc96b9b79e73b8e4

* test(agent-pane): keep 300 sibling rows and cycle fallback

(cherry picked from commit 01a768b)

* fix(agent-pane): every part over the composer on the box's edges and radius, one gap; the tray's chevron at 22

Leo, 2026-10-30: "the stupid right indent misalignemnt". ui-think-tank's rule,
one column, one gap, nothing removed:

- The running tray's header ended in an empty 24px Stop slot, so its chevron sat
  about 46px from the right (43 in a narrow tray) against Send at 22. The header
  has no Stop slot now; every row ends 12px in with a 20px mark box, so the
  chevron (header, line, View all) centres 22px from the right, and a line's
  Stop (or its empty column) centres 42px from the right. Narrow rows keep the
  same columns.
- At composer columns under 298px the box and its quiet row reach 8px past the
  column; every stack part now follows (--acpmux-stack-start/end on the dock
  write the same step out, since the composer's container query cannot reach its
  siblings).
- The tray (10px), the opened pull requests and the recap's card (12px) take the
  box's radius token, now defined on the dock as well.
- The recap, the legacy PR bars, the host's line and the agents pill drop their
  own bottom padding and take the stack's edges; the PR fallback row and the
  in-transcript tray take --cv-inset-end on the right; one dock rule gives the
  stack token between parts. The recap's card joins the glass like the tray.

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

* fix(tray): align fixed status and action tracks with the composer

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

* fix(tray): keep workflow progress out of the status track

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

* fix(tray): keep action columns inside the narrowest panes

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

* fix(web): center tray controls across row heights

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

---------

Co-authored-by: Austin Wang <38676809+austinywang@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: lawrencecchen <54008264+lawrencecchen@users.noreply.github.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-dcb1d77e7d3efe26a42d
teamleaderleo added a commit that referenced this pull request Nov 1, 2026
* fix(tray): align status and controls with the composer (#29794)

* fix(next): the running tray starts folded to its header, and holds the person's choice per chat

Closes #28875

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit b0cef69)
Agent-Session: https://cmux.com/deeplink/agent?id=aid-08e2cc96b9b79e73b8e4

* test(next): open the running tray where a test reads its lines; fixtures for between turns

A headed tray starts folded (#28875): the tests that read
its lines open it as the person does, by its header, and the motion edges remember chat-a as opened.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 49315c7)
Agent-Session: https://cmux.com/deeplink/agent?id=aid-08e2cc96b9b79e73b8e4

* fix(next): the tray's header takes focus when it folds under a focused line; browser tests open it

Review of #28875: a lone line gaining a header folds the list,
which goes inert under a focused line or Stop; focus now moves to the header. Reading a chat's choice
refreshes its place in the bounded memory. The browser tests that read the tray's lines open it by its
header (test/support/openRunningTray.ts); the glyph check uses a one-line variant, the panel's closed
play opens the tray.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 0eb37de)
Agent-Session: https://cmux.com/deeplink/agent?id=aid-08e2cc96b9b79e73b8e4

* fix(next): a subagent line's icons and title keep the row's 8px icon gap

The kind icon (agent.fork) sat inline against the title with no gap, and in a narrow tray the title
started at 22px, flush against the 14px state icon. Both now keep the summary row's 8px icon gap
(--acpmux-line-icon-gap). Browser regression in test/subagent-tray-columns.test.ts measures both gaps,
wide and narrow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 9543b29)

* fix(next): the narrow tray keeps its 8px state-icon gap; tests wait for the fold to settle

The narrow layout's title already sat 8px past the state icon (the button's padding is the icon's
left); only the kind icon's gap to the title was missing. openRunningTray waits for the fold to let
go of its clip, so a focus or a scroll measures the settled tray.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 114d49d)

* test(next): a tray folding with motion off moves focus from its line to the header; focus elsewhere stays

Fails before the fix: with no motion the fold leaves in the same commit, and focus falls to the body.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 2624cd3)
Agent-Session: https://cmux.com/deeplink/agent?id=aid-08e2cc96b9b79e73b8e4

* fix(next): the tray's header takes focus when a motionless fold removes the focused line

Review of #28875: with Reduce Motion or the motion switch off
the fold leaves in the same commit as the fold, taking the focused line with it, so the layout effect saw
the body and moved nothing. Whether focus is in the list is now kept by focus and blur events; a blur to
another control clears it, a blur to nothing (removal, inert) does not.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 284a554)
Agent-Session: https://cmux.com/deeplink/agent?id=aid-08e2cc96b9b79e73b8e4

* fix(tray): rename the header button ref after the feat-cmux-next merge

feat-cmux-next's #29264 added `const [head]` (the header look arm) to SubagentTray; this
PR's fold-focus ref was also `head`, so the merged file declared it twice. The ref is
now `headButton`. test/subagent-tray.test.tsx 39/39 and subagent-tray-motion 11/11 pass.

(cherry picked from commit aca7fb3)
Agent-Session: https://cmux.com/deeplink/agent?id=aid-08e2cc96b9b79e73b8e4

* fix(tray): icon-gap tests and CSS follow #29608, which removed the kind glyph

feat-cmux-next's #29608 (f66a92e) took the fork glyph off subagent lines, so this PR's two
"8px icon gap" browser tests waited for .acpmux-agent-line__kind-icon and timed out after the
merge (review of aca7fb3). They now check the state icon to title gap (8px, wide and
narrow) and that no kind icon renders; the kind-icon margin rule that styled nothing is gone.
CMUX_BROWSER_TESTS=1 bun test test/subagent-tray-columns.test.ts: 12 pass, 0 fail.

(cherry picked from commit 1ab971c)
Agent-Session: https://cmux.com/deeplink/agent?id=aid-08e2cc96b9b79e73b8e4

* perf(agent-pane): skip hidden subagent tray rows when folded

(cherry picked from commit b4fbe35)

* test(agent-pane): 300 collapsed agents construct no hidden lines

(cherry picked from commit 691560b)

* test(tray): avoid 300 hidden row reads across repeated collapsed renders

(cherry picked from commit d47573e)
Agent-Session: https://cmux.com/deeplink/agent?id=aid-08e2cc96b9b79e73b8e4

* perf(agent-pane): index 300 siblings without copying arrays

(cherry picked from commit 4a9f422)
Agent-Session: https://cmux.com/deeplink/agent?id=aid-08e2cc96b9b79e73b8e4

* test(agent-pane): keep 300 sibling rows and cycle fallback

(cherry picked from commit 01a768b)

* fix(agent-pane): every part over the composer on the box's edges and radius, one gap; the tray's chevron at 22

Leo, 2026-10-30: "the stupid right indent misalignemnt". ui-think-tank's rule,
one column, one gap, nothing removed:

- The running tray's header ended in an empty 24px Stop slot, so its chevron sat
  about 46px from the right (43 in a narrow tray) against Send at 22. The header
  has no Stop slot now; every row ends 12px in with a 20px mark box, so the
  chevron (header, line, View all) centres 22px from the right, and a line's
  Stop (or its empty column) centres 42px from the right. Narrow rows keep the
  same columns.
- At composer columns under 298px the box and its quiet row reach 8px past the
  column; every stack part now follows (--acpmux-stack-start/end on the dock
  write the same step out, since the composer's container query cannot reach its
  siblings).
- The tray (10px), the opened pull requests and the recap's card (12px) take the
  box's radius token, now defined on the dock as well.
- The recap, the legacy PR bars, the host's line and the agents pill drop their
  own bottom padding and take the stack's edges; the PR fallback row and the
  in-transcript tray take --cv-inset-end on the right; one dock rule gives the
  stack token between parts. The recap's card joins the glass like the tray.

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

* fix(tray): align fixed status and action tracks with the composer

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

* fix(tray): keep workflow progress out of the status track

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

* fix(tray): keep action columns inside the narrowest panes

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

* fix(web): center tray controls across row heights

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

---------

Co-authored-by: Austin Wang <38676809+austinywang@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: lawrencecchen <54008264+lawrencecchen@users.noreply.github.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-dcb1d77e7d3efe26a42d

* docs: link tray release highlight to agent documentation

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

* fix(web): preserve tray icon and scrolled control geometry

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

* style: wrap tray geometry assertions

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

* test(tray): cover visible state and narrow scroll geometry

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

* fix(tray): keep short dock controls inside scroll viewport

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

* fix(tray): keep populated list at one row minimum

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

* fix(tray): keep narrow stop inside fractional viewport

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

* fix(tray): preserve folded tray behavior during rebase

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

* fix(tray): follow current session info imports

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

* fix(tray): settle gallery plays after folded start

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

* fix(tray): keep row stop controls on the running lines

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

* test(tray): cover row stop controls in trailing geometry

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

* test(tray): target populated stop slots

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

* test(tray): settle only finite running-strip animations

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

---------

Co-authored-by: Austin Wang <38676809+austinywang@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: lawrencecchen <54008264+lawrencecchen@users.noreply.github.com>

This branch was previously deployed

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

3 participants