Skip to content

Running tray: Stop inside its line, one chevron column, the header's time after its counts - #29264

Merged
teamleaderleo merged 8 commits into
feat-cmux-nextfrom
claude-sr2/running-tray-columns
Oct 31, 2026
Merged

teamleaderleo merged 8 commits into
feat-cmux-nextfrom
claude-sr2/running-tray-columns

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 31, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes the running-in-background tray defects shown in Leo's screenshots of the cmux NEXT agent transcript (2026-10-31). His message didn't reach this lane, only the screenshots, so this PR builds from them and from his standing words:

  • design/chat-transcript.md, quoting Leo (2026-10-29): "Why is it just nothing's aligned? ... It's a proper f***ing, like, grid"
  • design/running-tray.md, quoting Leo: "i guess the alignment overall hasn't finished for these yet :(" (on the open tray) and "oh god this is really bad ui" (on the collapsed strip)
  • design/foundations.md, under alignment: "Icon columns align across adjacent rows and surfaces. Equivalent controls share one text column and one inset." The tray's own spec adds that a line stays quiet at rest (fix(tray): restore the enabled line hover wash #27344), and this PR keeps it that way.

What the screenshots show, and the fix

Defect Fix
The folded header put "2h 43m 19s" in its own column, far from the "Running in background · N subagents · M commands" it measures The time is muted meta 8px after the counts. When space runs out the counts truncate and the time never does. The header is one row at every width, narrow panes included, so the narrow tray's two-row reservation is gone
The header's mark was a chat bubble, which reads as a message A fixed running-work glyph, never the spinner: #27103 took the spinner off the header on Leo's word ("I NEVER SAID TO PUT THE SPINNER HERE"), and it stays on each working line
Each open line's Stop sat below and to the right of the line, outside the row's box and off its centre line Each line's trailing tracks are now time, state, Stop's track, then the chevron. Stop lies over its track and stays one row tall from the line's top (on the controls row when the line is narrow), centred. Its old absolute top: 12px; right: 14px is reset
The header chevron (˅) and the lines' chevrons (>) were in two columns The header's, every line's and View all's chevrons all end on one x, in one 14px trailing column

Kept: Stop and what it does, the counts, the elapsed time, the hover wash, the fold, colours and glass. The motion is untouched: #29092 (the line entrance) owns subagents.css's motion block and the gallery's motion arms, and this PR doesn't touch either.

Gallery: three variants, default picked

agent-pane.subagent-tray-head (variants folded, open) with the experiment subagent-tray-head:

  • glyph (default): a still running-work ring, in the accent while work runs. It's a fixed icon, as Fix running tray icon and composer spacing #27103 settled, and it means background work, which the bubble didn't.
  • bare: no mark.
  • session: the old chat bubble, kept for comparison.

Prior art and overlap

Tests

  • New test/subagent-tray-trailing.test.ts (browser lane, Chromium). At 760 and 300px, light and dark, it checks that every Stop is inside its line's box, centred on the line's state (and on the row centre when wide), sits in its own track between the state and the chevron, and is the hit target at its centre. It also checks that the header's, every line's and View all's chevrons end on one x, that the header is one row, and that its time sits 8px after its counts.
  • test/subagent-tray-columns.test.ts and test/subagent-tray-layout.test.ts are updated for the new header geometry. The header's time is no longer a column, the header is one row when narrow, and the chevron comes after Stop.

Risk

Low and contained to the running tray's layout: CSS tracks, one span per line, and the header's mark. No data or behaviour change. Stop still stops only its own subagent or command.

Stills (Linux gallery, Chromium, 2x, synthetic fixture agent-pane.subagent-tray-head)

Before After (default: running glyph)
Folded, light
Folded, dark
Open, light
Open, dark

Other header arms: bare (folded dark, open light), session, the old bubble kept for comparison (folded light, open dark).

I viewed the after images. The header's time now sits right after "Running in background · 3 subagents". The chat bubble is replaced by a still running glyph. Each Stop sits on its line's centre, between Running and the chevron. The header's chevron and every line's chevron end on one x.

Takes back #27103: that change made the header's mark a fixed agent.session chat bubble. This PR keeps it fixed (no spinner, as #27103 requires) but swaps the bubble for a running-work glyph, because the bubble reads as a message. #27103's flush-tray spacing is kept.

Spec: teamleaderleo/leo-workspace#1913 (design/running-tray.md).

Checks run (fast-checks, Linux 16/32 vCPU)

  • subagent-tray-trailing.test.ts (new, 4 cases), subagent-tray-columns.test.ts (10), browser/glyph-alignment.test.ts, browser/gallery-control-surfaces.test.ts: all pass (run).
  • subagent-tray-layout, subagent-tray, agent-pane-working-counts, agent-pane-background-tasks unit suites: pass.
  • action export areas / autofix repairs fail on "generator merge snapshot is stale" for PageChromiumOffscreenParking.swift, a Swift file this PR doesn't touch. I merged the base again, which cleared it.
  • The independent visual review (Astra, on the earlier stills) returned VISUAL: SHIP. It found the four claims hold, nothing clips, and the Stop controls stay compact.

🤖 Generated with Claude Code

Agent session: agent session

…me after its counts

The open tray hung each line's Stop below and right of the line, outside its box
and off its centre, and the header's chevron and the lines' sat in two columns.
The folded header floated its elapsed time in a column of its own far from the
counts, behind a chat bubble.

- Each line: time, state, Stop's track, then the chevron, last at the row's end.
  Stop lies over its track, one row tall from the line's top (its controls' row
  when narrow), centred, with its own absolute offsets reset.
- The header: a running mark (the shared spinner while work runs), the counts,
  the elapsed time as quiet meta one gap after them, and the chevron in the same
  trailing column as every line's and View all's. One row at every width.
- Gallery agent-pane.subagent-tray-head with three header arms
  (trayHead.experiment.ts: spinner, still glyph, no mark); spinner is the default.
- test/subagent-tray-trailing.test.ts measures Stop inside its row and centred
  and every chevron on one x, at 760 and 300px, light and dark.

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

Copy link
Copy Markdown
Collaborator Author

Owned by an agent session · session

@github-actions github-actions Bot added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 31, 2026
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@blacksmith-sh

blacksmith-sh Bot commented Oct 31, 2026 •

Copy link
Copy Markdown

Found 3 test failures on Blacksmith runners:

Failures

Test View Logs
tab: tabGroup.addTab is not a top-level row/tab: tabGroup.addTab is not a top-level row View Logs
tab: tabGroup.create is not a top-level row/tab: tabGroup.create is not a top-level row View Logs
tab: tabGroup.removeTab is not a top-level row/
tab: tabGroup.removeTab is not a top-level row
View Logs

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

@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 3b4af02: 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=pr29264 -f ref=claude-sr2/running-tray-columns -f platform=macos -f backend_mode=local

Gallery before/after for 80c2bcd: 16 states rendered, 12 images differ, 1527 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 41230058598 -R manaflow-ai/cmux -n gallery-advisory-29264-80c2bcd338895d5917e817e6d71191cc2b3178db (then read gallery-review.json)

States
State Theme Status Diff Picked by
agent-pane.background-activity/duration-columns Apple System Colors changed 0.291% own subagents.css
agent-pane.background-activity/duration-columns Apple System Colors Light changed 0.291% 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.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.0045% own AgentLine.tsx
agent-pane.chat-inspector/workflow-running Apple System Colors changed 0.004% 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
agent-pane.chat-inspector/workflow-agent-row-compact Apple System Colors Light changed 0.0045% own AgentLine.tsx
agent-pane.chat-inspector/workflow-agent-row-compact Apple System Colors changed 0.004% own AgentLine.tsx
agent-pane.chat-inspector/workflow-agent-row-detail Apple System Colors changed 0.0044% own AgentLine.tsx
agent-pane.chat-inspector/workflow-agent-row-detail Apple System Colors Light changed 0.0043% own AgentLine.tsx
agent-pane.chat-inspector/workflow-agent-row-grid Apple System Colors Light changed 0.0042% own AgentLine.tsx
agent-pane.chat-inspector/workflow-agent-row-grid Apple System Colors changed 0.0038% own AgentLine.tsx
agent-pane.chat-inspector/workflow-agent-row-narrow Apple System Colors Light changed 0.0031% own AgentLine.tsx
agent-pane.chat-inspector/workflow-agent-row-narrow Apple System Colors changed 0.0031% own AgentLine.tsx
agent-pane.chat-inspector/reorder-dragging Apple System Colors Light unchanged 0% own AgentLine.tsx
agent-pane.chat-inspector/reorder-dragging Apple System Colors unchanged 0% own AgentLine.tsx

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

Passes: CI passes on 80c2bcd338.

CI passes on 80c2bcd338 (run 41230058791 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:

#27103 took the spinner off the header on Leo's word ("I NEVER SAID TO
PUT THE SPINNER HERE"); the spinner stays on each working line. The header
now draws a still running-work glyph by default. The gallery arms are glyph
(default), bare, and the chat bubble it drew before, for comparison. The tray
unit test checks the glyph, and that the bubble is gone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@teamleaderleo
teamleaderleo marked this pull request as ready for review October 31, 2026 16:26
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6-astra high, next-review): SHIP at 3b4af02

SHIP at 3b4af02

Visual verdict: after screenshots and gallery renders show aligned controls with no clipping or off-screen layout.

Follow-ups: none

@teamleaderleo teamleaderleo removed the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 31, 2026
cmux-bot[bot]
cmux-bot Bot previously approved these changes Oct 31, 2026

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

cmux-bot approves 3b4af02: an independent review passed this exact head (next-review receipt by teamleaderleo). A push needs a new review; a later BLOCK at this head dismisses this approval.

@github-actions github-actions Bot added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 31, 2026
@cmux-bot
cmux-bot Bot dismissed their stale review October 31, 2026 18:39

A newer verdict blocks 80c2bcd (no independent SHIP at the head).

@teamleaderleo
teamleaderleo merged commit 6e01daa into feat-cmux-next Oct 31, 2026
175 checks passed
@teamleaderleo
teamleaderleo deleted the claude-sr2/running-tray-columns branch October 31, 2026 19:05
teamleaderleo added a commit that referenced this pull request Oct 31, 2026
…cks; its state stays in the trailing meta

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
lawrencecchen added a commit that referenced this pull request Oct 31, 2026
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.
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>
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 — 80c2bcd3 Deployed Oct 31, 2026 by teamleaderleo via wait for same-key tree publisher #90981
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