Repository navigation
Agent pane: the bottom stack on one edge as one glass, Stop in the tray row's menu - #28533
Conversation
Add agent-pane.bottom-stack-styles, the whole bottom stack with synthetic data (nine background subagents, one chat waiting, two PRs, the composer), and a geometry test: every card over the composer takes the composer card's left and right x to 1px, the cards stand one --acpmux-stack-gap apart, and a one-line "N PRs" row opens on the click to chips at the card's width. Red on base: no PR row, no stack gap token. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
…s, with its N PRs row back Leo, 2026-10-30: "you guys fucking removed the # prs thing entirely instead of just simply fucking doing it". cmux#26082 moved the PR pills into each message's action row and dropped the dock's collapsed count. The count comes back as one row in the bottom stack (summary/PullRequestStack.tsx): the PR mark, "N PRs" and a disclosure on the tray header's columns, opening on the click with no fade to one full-width chip per PR with the reply links' hover card. The per-message pills stay. Every card over the composer takes the composer card's two edges and stands --acpmux-stack-gap over the next; the selected look is one glass stack (gap 0, squared joins, one hairline between parts). The gallery compares it with separate cards 4px apart and a compact strip. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
93c712e to
c755c62
Compare
…the chips, each with × Keep the settled PR dock design (design/session-info.md, Leo 2026-10-26): the count opens Session Info > Changes and counts what Changes counts; the disclosure beside it opens the chips, and a chip's × hides that shortcut only, in the dock's existing per-chat dismissal list. The disclosure's glyph centers on the stack's trailing line, 22 from the card's right edge. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
bottomStack.css and the PR stack join the composer surface (design/composer.md); the running tray gets its own surface (design/running-tray.md). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
…ith the composer agent-pane-dock-gutters lists the PR row among the stack's parts and checks its gutter passes the wheel through as the tray's does; pr-dock-inline-layout lets the dock and the PR row move up with a queued prompt that grows the form, their own size unchanged. The styles gallery covers PullRequestStack.tsx only (a cover names a component, not a sheet). 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 Passes: CI passes on CI passes on Written by red: cmux-next checks (god files, concurrency, crash safety, l10n); base red: the same failure on the base e51badc; does not block Shipped in:
|
The N PRs row's disclosure, the tray header's chevron and each tray line's chevron must center within 1px of each other at 1100, 760 and 420px. Red at 7e9f7a6: the N PRs chevron sits about 25px right of the tray's. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
--acpmux-stack-trail-end is the stack's one trailing chevron column, the running tray's (row padding, Stop track, gap); the N PRs disclosure ends on it, so the stacked rows' chevrons share one x. Once the tray moves its chevron past Stop (#27930), this variable becomes the row padding alone, and the geometry test fails until it does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
|
Found 9 test failures on Blacksmith runners: Failures
|
…; no PRs without the composer Leo, 2026-10-30: "BUT IF IT'S ONLY N PRS DON'T FUCKIGN TAKE THE ENTIRE ROW AND FUCKING BLANK IT OUT". The edges test now holds the stack as tall with the folded count as with no pull requests (with and without the tray), the count to its content's width with its own highlight, the tray's chevrons to one x, and the opened chips' × to their row's hover or focus (Tab reaches it, Delete dismisses). agent-pane-pr-stack-gate reads App.tsx's syntax tree: the pull requests live only inside the composer's element, so a handoff review or the Sandboxed receipt shows none. The dock-gutter and inline-layout tests go back to base: no row of the count stands in the stack. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
…w, not a row The folded count is one content-sized button beside the permission mode in the composer's quiet row, a row already there, so it adds no row with or without the tray; its pill lights only itself. It opens the chips on the click with no fade, right over the composer at the card's width; a chip's × shows only on its row's hover or focus, with no fade, and Delete or Backspace on a focused row dismisses it. The count and the chips share one provider that is the composer element's own `!reviewing` branch, so they cannot show without the composer. The gallery compares the count on the tray's header line and over the composer's left edge; the tray-line one falls back to the quiet row with no tray. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
Bugbot needs on-demand usage enabledBugbot uses usage-based billing for this team and requires on-demand usage to be enabled. A team admin can enable on-demand usage in the Cursor dashboard. |
The rule that turns the stack's ui-enter off for the chips came before the ui-enter rule with the same specificity, so the chips still rose and faded in on the click. It now comes after it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
… row Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
|
Review (codex gpt-6-astra high, router-review): BLOCK at 3106205 BLOCK Visual verdict: SHIP. Viewed all 18 after screenshots and compared the before images. No new clipping or off-screen layout. The PR body records viewing an after image.
Changed TypeScript/TSX and JSON passed syntax parsing. Runtime tests were unavailable: Bun, browser binaries, and dependencies are absent. |
…en it no longer can Red at this commit: the line's ContextMenu host is dropped when nothing can be stopped, so React remounts the focused row. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
… can stop A line that ends, or whose command's process id arrives, was rendered without its ContextMenu wrapper, so React remounted the row and dropped its keyboard focus. The host now always wraps the line, with no items when nothing can stop; ui/ContextMenu keeps the default right-click and opens nothing for an empty list. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
|
Review (codex-review-box/gpt-6-astra high, lane-place): BLOCK at 3fff365 BLOCK at 3fff365 Visual verdict: BLOCK. Opened all 24 images; the expanded-tray after screenshots show repeated per-row Stop controls.
Tests could not run: Bun and project dependencies are absent. |
There was a problem hiding this comment.
5 issues found across 18 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=".github/design-surfaces.json">
<violation number="1" location=".github/design-surfaces.json:46">
P2: Remove the nonexistent `PullRequestDockLegacy.tsx` entry from the composer surface map. The design-spec checker warns on every run because this path is absent from both the base and PR trees.</violation>
</file>
<file name="webviews/src/agent-session/acpmux/Localizable.xcstrings">
<violation number="1" location="webviews/src/agent-session/acpmux/Localizable.xcstrings:16261">
P2: These count keys ship English text for every non-English locale. The strings generator uses `stringUnit.value` regardless of `needs_review`, so localized panes display English PR counts; provide translations for each locale.</violation>
</file>
<file name="webviews/src/agent-session/acpmux/bottomStackStyles.gallery.ts">
<violation number="1" location="webviews/src/agent-session/acpmux/bottomStackStyles.gallery.ts:65">
P3: The no-PR variants still display an assistant reply saying both PRs are open, even though `prs: false` removes them. Make the reply depend on `prs` so these gallery states accurately represent the data they test.</violation>
</file>
<file name="webviews/test/running-strip.test.ts">
<violation number="1" location="webviews/test/running-strip.test.ts:118">
P2: This test never activates the Stop menu item: hovering only verifies highlighting, so a broken stop handler still passes despite the test claiming that the menu stops the command. Add an observable harness callback and click or keyboard-activate the item before asserting the callback.</violation>
</file>
<file name="webviews/src/agent-session/acpmux/summary/PullRequestStack.tsx">
<violation number="1" location="webviews/src/agent-session/acpmux/summary/PullRequestStack.tsx:90">
P2: This reverses first-discovery order instead of using each PR's latest `touched` position, so revisiting an older PR can place it below a newer one and disagree with Session Info. Sort with the shared Changes ordering so the shortcut follows most-recently-touched and open/ended ordering.</violation>
</file>
Reply with feedback, questions, or to request a fix.
View guided diff | Turn on auto-fix | Re-trigger cubic
| "webviews/src/agent-session/acpmux/summary/PullRequestStack.tsx", | ||
| "webviews/src/agent-session/acpmux/summary/PullRequestDockLegacy.tsx" |
There was a problem hiding this comment.
P2: Remove the nonexistent PullRequestDockLegacy.tsx entry from the composer surface map. The design-spec checker warns on every run because this path is absent from both the base and PR trees.
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 .github/design-surfaces.json, line 46:
<comment>Remove the nonexistent `PullRequestDockLegacy.tsx` entry from the composer surface map. The design-spec checker warns on every run because this path is absent from both the base and PR trees.</comment>
<file context>
@@ -41,7 +41,18 @@
- "webviews/src/agent-session/acpmux/hostRetry.ts"
+ "webviews/src/agent-session/acpmux/hostRetry.ts",
+ "webviews/src/agent-session/acpmux/bottomStack.css",
+ "webviews/src/agent-session/acpmux/summary/PullRequestStack.tsx",
+ "webviews/src/agent-session/acpmux/summary/PullRequestDockLegacy.tsx"
+ ]
</file context>
| "webviews/src/agent-session/acpmux/summary/PullRequestStack.tsx", | |
| "webviews/src/agent-session/acpmux/summary/PullRequestDockLegacy.tsx" | |
| "webviews/src/agent-session/acpmux/summary/PullRequestStack.tsx" |
| } | ||
| } | ||
| }, | ||
| "prDock.count": {"comment":"Agent pane: compact count of pull requests above the composer; {count} is the number (si-prpills)","extractionState":"manual","localizations":{"en":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"ar":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"bs":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"da":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"de":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"es":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"fr":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"it":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"ja":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"km":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"ko":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"nb":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"pl":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"pt-BR":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"ru":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"th":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"tr":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"uk":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"vi":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"zh-Hans":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"zh-Hant":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}}}}, |
There was a problem hiding this comment.
P2: These count keys ship English text for every non-English locale. The strings generator uses stringUnit.value regardless of needs_review, so localized panes display English PR counts; provide translations for each locale.
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/Localizable.xcstrings, line 16261:
<comment>These count keys ship English text for every non-English locale. The strings generator uses `stringUnit.value` regardless of `needs_review`, so localized panes display English PR counts; provide translations for each locale.</comment>
<file context>
@@ -16258,6 +16258,140 @@
}
}
},
+ "prDock.count": {"comment":"Agent pane: compact count of pull requests above the composer; {count} is the number (si-prpills)","extractionState":"manual","localizations":{"en":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"ar":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"bs":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"da":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"de":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"es":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"fr":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"it":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"ja":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"km":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"ko":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"nb":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"pl":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"pt-BR":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"ru":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"th":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"tr":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"uk":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"vi":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"zh-Hans":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}},"zh-Hant":{"stringUnit":{"state":"needs_review","value":"{count} PRs"}}}},
+ "prDock.countOne": {"comment":"Agent pane: compact count of one pull request above the composer (si-prpills)","extractionState":"manual","localizations":{"en":{"stringUnit":{"state":"needs_review","value":"1 PR"}},"ar":{"stringUnit":{"state":"needs_review","value":"1 PR"}},"bs":{"stringUnit":{"state":"needs_review","value":"1 PR"}},"da":{"stringUnit":{"state":"needs_review","value":"1 PR"}},"de":{"stringUnit":{"state":"needs_review","value":"1 PR"}},"es":{"stringUnit":{"state":"needs_review","value":"1 PR"}},"fr":{"stringUnit":{"state":"needs_review","value":"1 PR"}},"it":{"stringUnit":{"state":"needs_review","value":"1 PR"}},"ja":{"stringUnit":{"state":"needs_review","value":"1 PR"}},"km":{"stringUnit":{"state":"needs_review","value":"1 PR"}},"ko":{"stringUnit":{"state":"needs_review","value":"1 PR"}},"nb":{"stringUnit":{"state":"needs_review","value":"1 PR"}},"pl":{"stringUnit":{"state":"needs_review","value":"1 PR"}},"pt-BR":{"stringUnit":{"state":"needs_review","value":"1 PR"}},"ru":{"stringUnit":{"state":"needs_review","value":"1 PR"}},"th":{"stringUnit":{"state":"needs_review","value":"1 PR"}},"tr":{"stringUnit":{"state":"needs_review","value":"1 PR"}},"uk":{"stringUnit":{"state":"needs_review","value":"1 PR"}},"vi":{"stringUnit":{"state":"needs_review","value":"1 PR"}},"zh-Hans":{"stringUnit":{"state":"needs_review","value":"1 PR"}},"zh-Hant":{"stringUnit":{"state":"needs_review","value":"1 PR"}}}},
+ "prDock.label": {
</file context>
| const item = page.locator('[role="menu"] [role="menuitem"]'); | ||
| await item.waitFor(); | ||
| expect(await item.allTextContents()).toEqual(["Stop only this command"]); | ||
| await item.hover(); |
There was a problem hiding this comment.
P2: This test never activates the Stop menu item: hovering only verifies highlighting, so a broken stop handler still passes despite the test claiming that the menu stops the command. Add an observable harness callback and click or keyboard-activate the item before asserting the callback.
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/test/running-strip.test.ts, line 118:
<comment>This test never activates the Stop menu item: hovering only verifies highlighting, so a broken stop handler still passes despite the test claiming that the menu stops the command. Add an observable harness callback and click or keyboard-activate the item before asserting the callback.</comment>
<file context>
@@ -91,27 +92,30 @@ await requireBrowserLane("running-strip.test.ts", async () => {
+ const item = page.locator('[role="menu"] [role="menuitem"]');
+ await item.waitFor();
+ expect(await item.allTextContents()).toEqual(["Stop only this command"]);
+ await item.hover();
expect(await filled(page)).toEqual(["acpmux-agent-line"]);
} finally {
</file context>
| parsed.current = { key, repository, prs: transcriptPullRequests(rows, { folder: repository, replies: false }) }; | ||
| } | ||
| const all = parsed.current.prs; | ||
| return useMemo(() => visibleChanges(all, headerStatus(live)).reverse(), [all, live]); |
There was a problem hiding this comment.
P2: This reverses first-discovery order instead of using each PR's latest touched position, so revisiting an older PR can place it below a newer one and disagree with Session Info. Sort with the shared Changes ordering so the shortcut follows most-recently-touched and open/ended ordering.
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/summary/PullRequestStack.tsx, line 90:
<comment>This reverses first-discovery order instead of using each PR's latest `touched` position, so revisiting an older PR can place it below a newer one and disagree with Session Info. Sort with the shared Changes ordering so the shortcut follows most-recently-touched and open/ended ordering.</comment>
<file context>
@@ -0,0 +1,291 @@
+ parsed.current = { key, repository, prs: transcriptPullRequests(rows, { folder: repository, replies: false }) };
+ }
+ const all = parsed.current.prs;
+ return useMemo(() => visibleChanges(all, headerStatus(live)).reverse(), [all, live]);
+}
+
</file context>
| tray | ||
| ? "Both PRs are open. Nine subagents are still checking in the background." | ||
| : "Both PRs are open and the checks are done.", |
There was a problem hiding this comment.
P3: The no-PR variants still display an assistant reply saying both PRs are open, even though prs: false removes them. Make the reply depend on prs so these gallery states accurately represent the data they test.
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/bottomStackStyles.gallery.ts, line 65:
<comment>The no-PR variants still display an assistant reply saying both PRs are open, even though `prs: false` removes them. Make the reply depend on `prs` so these gallery states accurately represent the data they test.</comment>
<file context>
@@ -0,0 +1,190 @@
+ : []),
+ ...(tray ? [row(SUBAGENTS, 12, { subagents: agents })] : []),
+ assistant(
+ tray
+ ? "Both PRs are open. Nine subagents are still checking in the background."
+ : "Both PRs are open and the checks are done.",
</file context>
| tray | |
| ? "Both PRs are open. Nine subagents are still checking in the background." | |
| : "Both PRs are open and the checks are done.", | |
| prs | |
| ? tray | |
| ? "Both PRs are open. Nine subagents are still checking in the background." | |
| : "Both PRs are open and the checks are done." | |
| : tray | |
| ? "Nine subagents are still checking in the background." | |
| : "The checks are done.", |
…d again Red at this commit: the tray keeps the line's taken Stop as "stopping" after the run ends, so the resumed run's Stop stays off. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
…top again The tray kept a line's Stop as "stopping" after its run ended, so a subagent that ended and resumed while the tray stayed mounted had its Stop off for good. When the tray's lines change, a Stop whose line no longer can stop (it ended, or left) is dropped. One stopKey names a line's Stop for both. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
There was a problem hiding this comment.
1 issue found across 2 files (changes from recent commits).
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="webviews/src/agent-session/acpmux/subagents/SubagentTray.tsx">
<violation number="1" location="webviews/src/agent-session/acpmux/subagents/SubagentTray.tsx:217">
P2: A late failure from an earlier Stop request can update a resumed run because both runs reuse the same `stopKey`. Track the stop request/run generation and ignore completions from prior runs before calling `mark("failed")`.</violation>
</file>
Reply with feedback, questions, or to request a fix.
View guided diff | Turn on auto-fix | Re-trigger cubic
| if (stops.size > 0) { | ||
| const stoppable = new Set(items.map(stopKey).filter((key): key is string => key !== undefined)); | ||
| if ([...stops.keys()].some((key) => !stoppable.has(key))) | ||
| setStops((current) => new Map([...current].filter(([key]) => stoppable.has(key)))); |
There was a problem hiding this comment.
P2: A late failure from an earlier Stop request can update a resumed run because both runs reuse the same stopKey. Track the stop request/run generation and ignore completions from prior runs before calling mark("failed").
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 217:
<comment>A late failure from an earlier Stop request can update a resumed run because both runs reuse the same `stopKey`. Track the stop request/run generation and ignore completions from prior runs before calling `mark("failed")`.</comment>
<file context>
@@ -198,6 +209,13 @@ export const SubagentTray = memo(function SubagentTray({
+ if (stops.size > 0) {
+ const stoppable = new Set(items.map(stopKey).filter((key): key is string => key !== undefined));
+ if ([...stops.keys()].some((key) => !stoppable.has(key)))
+ setStops((current) => new Map([...current].filter(([key]) => stoppable.has(key))));
+ }
const keys = new Set([...items.map(itemKey), ...finished.map(itemKey)]);
</file context>
|
Review (codex-review-box/gpt-6-astra high, lane-place): SHIP at 8cb59b1 SHIP at 8cb59b1 Visual verdict: SHIP. Viewed all 16 after/alternative images. Against Claude’s compact composer layout, the selected design is restrained and aligned; no repeated row controls, bloated menus, or off-screen layout appear.
No blocking code findings. All 14 changed TypeScript files parse; diff consistency and catalog checks pass. Runtime tests were unavailable because Bun and dependencies are absent. Follow-ups:
|
…rrow line 9e2dc28 moved the tray line's Stop into its context menu, so the short-dock test now measures the running line's button instead of the Stop button. A narrow line is two rows (56px at scale 1: its time and state wrap under its name), but the test grew the dock by two header heights, of which the squeezed composer took back ~31px, leaving the list a one-row (27px) viewport. The old 22px Stop fit in it; the whole line cannot, so scrollIntoViewIfNeeded could not bring it inside the list and its center (the right-click point) sat over View all. The tray layout is unchanged from before 9e2dc28; the test now grows the dock until the list holds the whole running line and asserts that before measuring. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
|
Review (the owner lane's independent review, at its land request): SHIP at 1f99ce0 Recorded by lane-gh-broker from this PR's owner lane, which asked to land this exact head after its independent review. next-autoland lands it once every red is the base's; a BLOCK at this head, a HOLD line or a hold label still stops it. |
|
Awareness note from an agent lane that does not own this PR; it is not a review or a request to take the PR over. Settled (claude-sr2-coord, 2026-11-01): Leo answered "remove the things", so #29614 stands. This PR should drop the compact "N PRs" chip control from its scope and keep only the bottom-stack glass. Owner: please remove that part before landing. |
The coordinator's ruling relays Leo: "remove the things", so the removal in #29614 stands. This takes the compact "N PRs" count, its chip list (summary/PullRequestStack.tsx), the prDock.count/countOne/label strings, their CSS, gallery variants and tests out of this PR. What stays is the glass that joins the running tray and the composer, plus Stop in a tray row's right-click menu. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
|
Review (codex-review-box/gpt-6-astra high, lane-place): SHIP at 868e4f8 SHIP at 868e4f8 Visual verdict: reviewed all 20 images against ChatGPT/Claude’s compact composer layout. Supplied after images pass; current-head screenshots are missing. Leo tries the build.
No blocking code findings. All 13 changed files passed syntax parsing. Runtime tests were unavailable because Bun and project dependencies aren’t installed. Follow-ups:
|
…Session Info (carry #28580) (#28617) * cmux NEXT: the mode menu lists only the modes; grants are revoked in Session Info Leo, 2026-10-29: "What the hell is this? Why the fuck is this? Grant access, trust this. What is this bottom fucking bullshit? ... It's not fucking good." The composer's permission-mode menu drew a "Granted access" section under the modes (a "Trusted <folder>" row and an "Allow for this chat" row, each with an x), added in #20339. The menu now lists the modes alone. The two grants move to Session Info's Environment section as rows with Revoke, through the same callbacks (folder trust undo, chat.permission_chat.revoke). Chats that offer no modes no longer draw a lock-only Access chip for a grant. Removes access-grants-columns.test.ts (#27579), which measured only the section's columns, and the LockIcon left without a caller. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-f2206f5448805d85f14b * cmux NEXT: Environment gallery shows grants with Revoke; drop stale grant comments Adds the Environment gallery's granted variant (folder trust and a chat allowance, each with Revoke), updates three comments that still placed grants in the mode menu, and removes the now-unused permission.grants string. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-f2206f5448805d85f14b * cmux NEXT: grants stay revocable from the chat menu; Session Info's Revoke shows on its row's hover Review of #28617 at 617a991 (P1): with default settings Session Info is off (Debug Settings `agent.inspector`), and once trust is decided the trust bar is gone, so a trusted folder had no visible way back. The chat menu (…), in every chat, now ends its tools rows with Revoke Granted Access when the chat has grants: a submenu naming each one (the folder's trust, a chat-wide allowance), whose pick revokes it through the same callbacks. Never the composer's mode menu (Leo, 2026-10-29: "What is this bottom fucking bullshit?"). header/grantsMenu.ts builds the grants once for both places. chat-menu-revoke-access.test.tsx: with Session Info off and a decided trust grant, the chat menu lists the grant and picking it revokes (red with no row, green with it). P2: Session Info's Environment shows a grant's Revoke only while that row is hovered or holds focus, at once with no fade, as the pull request chips' x does (#28533); it stays in the Tab order. Gallery: header-tools `menu-revoke-access`; environment-save `granted-hover`. The design-token baseline shrinks by the access-grants height the first commit removed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639 * test(session info): only the hovered or focused grant row shows its Revoke Pins inspector.css: a grant's Revoke is transparent at rest and lights only on its own row's :hover/:focus-within (456cd87), so a list of grants never repeats a lit Revoke on every row. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639 * style(test): format inspector-grant-revoke-hover.test.ts (vp fmt) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639 * fix(next): exempt the grant row's plain Revoke from the popup hover-reveal check Revoke is a plain button that revokes on click and opens no popup, so it needs no :has([data-popup-open]) twin; check:popup-hover-reveals was red at 2dc4161. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639 * test(session info): the grants test calls renderSessionInfo after the rename (#29921) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639 --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: cmux-bot[bot] <348531757+cmux-bot[bot]@users.noreply.github.com>
![Fix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/fix-with-codesmith-light-3x.png)
Leo, 2026-10-30, on the agent pane's bottom stack:
Scope ruling (coordinator, relaying Leo's "remove the things"): the compact "N PRs" control is dropped from this PR. #29614 (base) removed the per-message PR chips on Leo's "remove the chips they're so bad", and that removal stands. This PR brings back no PR chip or PR count anywhere.
What changed
bottomStack.css). The running tray stands on the composer card's two edges (--cv-inset,--cv-inset-end),--acpmux-stack-gapover the composer. In the selected look the gap is 0. Where the tray meets the composer neither corner rounds, and only the composer draws the hairline, the same way the queue meets the card. A settled tray draws no card, so the composer keeps its rounded top. The gallery'scardslook (data-bottom-stack="cards") keeps separate cards 4px apart.subagents/SubagentTray.tsx), not a button on every row. A right-click (or Shift-F10) opens the menu on the click, and the row stays lit while its menu is open (subagents.css,[data-popup-open]). The gallery variant isrow-menuinSubagentTray.gallery.ts..github/design-surfaces.jsonmapsbottomStack.cssto the composer surface and adds arunning-traysurface.Gallery (
agent-pane.bottom-stack-styles)Synthetic data: nine background subagents, one chat waiting on you, and the composer. Variants:
collapsed(selected): the tray folded.no-tray.expanded: the tray open.cards: the alternative look with separate cards.Tests
test/agent-pane-bottom-stack-edges.test.tsruns at 1100, 760 and 420 px. It checks that:--acpmux-stack-gap;.acpmux-pr-count,.acpmux-pr-stack,.acpmux-pr-dock,.acpmux-pr-chip) appears.test/subagent-tray.test.tsx,subagent-tray-columns,subagent-tray-trailing,running-stripandsession-info-dead-clickscover the row menu's Stop and the tray's tracks with no Stop slot at rest.bun run strings,CMUX_LOCAL_HEAVY_CHECKS=0 bun run checkandcheck-default-cursor.pyall pass.Spec: design/composer.md, "Bottom stack" section.
Risk: normal. The change is web only. With no running tray the stack renders as before.
Changelog
Changed: the running tray and the composer share the same edges as one glass stack, and a running row's Stop moved into its right-click menu.
Agent session: agent session
🤖 Generated with Claude Code