Repository navigation
fix(tray): align status and controls with the composer - #29794
Conversation
…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
(cherry picked from commit b4fbe35)
(cherry picked from commit 691560b)
(cherry picked from commit d47573e) Agent-Session: https://cmux.com/deeplink/agent?id=aid-08e2cc96b9b79e73b8e4
(cherry picked from commit 4a9f422) Agent-Session: https://cmux.com/deeplink/agent?id=aid-08e2cc96b9b79e73b8e4
(cherry picked from commit 01a768b)
…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
|
cmux status (one comment, edited in place; each line is updated by the job that owns it) Review App of this head (app.zip, kept 1 day)
Gallery before/after for
States
Pick other states with a Unclear: CI failed on
Not re-run automatically: Written by red: web / Web status; 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
|
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. |
|
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. |
|
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. |
There was a problem hiding this comment.
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 | |||
There was a problem hiding this comment.
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> |
There was a problem hiding this comment.
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); |
There was a problem hiding this comment.
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); |
There was a problem hiding this comment.
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>
| --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; |
There was a problem hiding this comment.
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>
…" (#29877) This reverts commit 711df45. Agent-Session: https://cmux.com/deeplink/agent?id=aid-dcb1d77e7d3efe26a42d
* 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
* 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>
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:
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.
subagent-tray.test.tsxobservable name-read regression carried from #29250Validation: 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