Repository navigation
agent pane: one subagent row anatomy (one glyph, no type subtitle, quiet done) - #29276
Conversation
One leading glyph (the spinner while it runs, the fork once it ended), the title a gap after it, one muted trailing meta (stats, a state worth a word) before the time, the chevron. No agent-type subtitle on the line (the tooltip keeps it), no Done or Running word (screen readers keep it), and no card around a tray with nothing running. Three gallery arms for where a running line's stats sit; trailing meta ships. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The kind moves to the hover card and the tooltip, as on the tray line. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Found 3 test failures on Blacksmith runners: Failures
|
|
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 web and size checks: green Shipped in:
|
Without the kind glyph the kind prop drew the word; the one glyph is the fork. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Review (codex gpt-6-astra high, next-review): SHIP at 000d80f SHIP at 000d80f Visual verdict: supplied after screenshots look correct; no repeated controls or off-screen layout.
Follow-ups:
|
|
Review (codex, router-review): SHIP at 000d80f Reviewer: codex gpt-6-astra high, fast tier. Follow-ups: 2. Each lands as an issue in this repo that links this receipt; the lane that opened the PR fixes it forward. SHIP at 000d80f Visual verdict: no images; Leo tries the build
Follow-ups:
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Heads-up from #29608: Leo, 2026-10-31, on the subagent row: "why didn't you guys remove the icons nor the tokens", then "the leading icons — just the stupid fork one". #29608 removes the fork glyph (kindIcon agent.fork) from tray lines and drops tokens and tool uses from the tray and transcript group rows ( |
|
Review (codex, router-review): SHIP at 51d82ee Reviewer: codex gpt-6-astra high, fast tier. Follow-ups: 1. Each lands as an issue in this repo that links this receipt; the lane that opened the PR fixes it forward. SHIP at 51d82ee Visual verdict: Reviewed all 22 after images against their before renders. The compact, Claude-style tray rows look clearer; no visible layout regression in the supplied states.
All 13 changed TypeScript files parsed successfully. Tests could not run locally because Bun and webview dependencies are unavailable. Follow-ups:
|
…ses on a row); keep no subtitle and the quiet state Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Review (codex, router-review): SHIP at 896d0c7 Reviewer: codex gpt-6-astra high, fast tier. Follow-ups: 1. Each lands as an issue in this repo that links this receipt; the lane that opened the PR fixes it forward. SHIP at 896d0c7 Visual verdict: Reviewed all 22 after images against their before pairs. No new visible overflow or duplicated controls. PR-body tray screenshots predate the rebase.
Tests could not run locally: Bun and dependencies are absent. Follow-ups:
|
|
Review (codex, router-review): SHIP at 5bf6cd8 Reviewer: codex gpt-6-astra high, fast tier. SHIP at 5bf6cd8 Visual verdict: Reviewed all 22 after images against their before images. No blocking visual regression; the simplified rows fit the compact Claude-style layout. PR-body stills predate the rebase. No correctness findings. Tests weren’t rerun: Bun and dependencies are unavailable in this box. Follow-ups: none |
Base added the agent's kind to the Inspector's hover card (#29276); the card that subscribes to live progress keeps it. The workflow test now checks only that Stop's track and the chevron stay last, and subagent-tray-trailing owns the column order. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
Base #29276 made a settled tray (nothing runs) draw no card. The stack's join rules gave it a rim and squared the part under it, so the subagent-row-anatomy#done-one scene threw. A settled tray now joins nothing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
Base #29276 made a settled tray (nothing runs) draw no card. The stack's join rules gave it a rim and squared the part under it, so the subagent-row-anatomy#done-one scene threw. A settled tray now joins nothing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
…ay row's menu (#28533) * test(agent-pane): every bottom card shares the composer card's edges 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 * fix(agent-pane): the bottom stack is one glass on the composer's edges, 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 * fix(agent-pane): the N PRs count opens Changes; its disclosure opens 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 * chore(design): map the bottom stack and the running tray to their specs 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 * test(agent-pane): the N PRs row is a part of the stack; it rides up with 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 * test(agent-pane): every stacked row's chevron shares one x 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 * fix(agent-pane): the N PRs chevron ends on the tray's chevron column --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 * test(agent-pane): the folded N PRs count adds no row; × on hover only; 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 * fix(agent-pane): the N PRs count is a compact control in the quiet row, 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 * fix(agent-pane): the opened pull requests skip the stack's rise-on-mount 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 * test(agent-pane): the opened-chips still has the pointer on its first row Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639 * fix(agent-pane): focus goes to the prompt after the last PR row; the expanded gallery state settles Router review at 3106205: after the last PR row was dismissed, focus went to the count, which is disabled with nothing left to open, so keyboard focus was lost. It now goes on to the composer's prompt; the edges test dismisses the last row with Delete and checks the active element is the prompt, never the body. gallery-health's agent-pane.bottom-stack-styles#expanded timed out: its play waited for every animation in the dock to end, and a running line's spinner never ends. The play now waits only for motion that ends. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639 * fix(agent-pane): no control repeats on every opened PR row; a row's own menu dismisses it The opened chips drew a × on every row (shown on hover or focus), which repeats a control on every row. A row is now its link alone; right-click (or Shift-F10) opens its menu with "Dismiss pull request #N", and Delete or Backspace on a focused row still dismisses it. The edges test asserts no row carries a control at rest, hovered or focused, Tab goes row to row, and the menu's Dismiss removes the row and moves focus to the next one. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639 * test(agent-pane): open a PR row's menu from the keyboard (the hover card from the earlier hover sat over the row) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639 * fix(agent-pane): the N PRs count and its rows keep the arrow cursor check-default-cursor (Leo, 2026-10-30: "change all pointers back to cursor-default") flagged the two cursor: pointer rules this branch added. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639 * fix(agent-pane): a settled tray stays cardless in the one-glass stack Base #29276 made a settled tray (nothing runs) draw no card. The stack's join rules gave it a rim and squared the part under it, so the subagent-row-anatomy#done-one scene threw. A settled tray now joins nothing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639 * fix(agent-pane): a tray line's Stop moves into its context menu #28533's review [P1][blocking]: a Stop button on every running tray line is a control repeated down the rows. Each running subagent and registry command now stops from its line's context menu (right-click, or Shift-F10 / the menu key on the focused line), through the shared ui/ContextMenu (the app's native menu). The item keeps the old button's states: off while the request is out, "Couldn't stop X" and retryable when refused; a command's says "Stop only this command". The line stays lit while its menu is open. Lines with nothing to stop get no menu. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639 * fix(agent-pane): the PR stack reads ChangesSection from session-info after the base rename Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639 * test(agent-pane): a tray line that can stop keeps its focused node when 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 * fix(agent-pane): a tray line keeps its context menu host when nothing 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 * test(agent-pane): a subagent stopped, ended and resumed can be stopped 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 * fix(agent-pane): a taken Stop lasts one run; a resumed subagent can stop 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 * test(agent-pane): the short-dock Stop check gives the list a whole narrow 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 * Bottom stack: drop the "N PRs" control, keep the glass 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 --------- 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's words
On the latest NEXT nightly: "why is this still so ass in latest nightly". Earlier: "eg a lot of these subtitles are bad".
The finished subagent line he showed had two leading glyphs (a chat bubble, then the fork, the fork touching the title), a "general-purpose" subtitle, its duration and "Done" in two columns far right, inside a bordered card for one finished line. The running line had the spinner and the fork, a "Bash" subtitle, and its tokens and tool uses on a second line.
What changed
Every subagent, started-chat and command line in the running tray (
subagents/AgentLine.tsx) now has one anatomy, after the subagent and task rows in Claude desktop and Claude Code:data-settled). The card comes back as soon as something runs.cv-subagent__kind) does too.Unchanged: what a line opens and its content, Stop, the running spinner and wave, the narrow tray's two-line layout (stats wrap under the title there), and the transcript's "Subagent finished" line. That line already has one glyph and no subtitle, and its trailing column belongs to #28860, which this PR doesn't touch.
Gallery: 3 variants
agent-pane.subagent-row-anatomywith experimentsubagent-tray-row, across thedone-one,running-statsandmixedfixtures:trailing(shipped): stats muted before the time, on one line.below: stats on a second line under the title (closest to the earlier look).inline: stats and time right after the title, with no trailing column.I picked
trailing. It keeps every line to one row, lines the running line's time up with the finished lines' times, and matches the transcript's one row grammar (status, then duration, then chevron).inlinereads well for one line but loses the shared time column across several.belowdoubles the row height for two numbers.Before / after
Linux gallery (Chromium, 2x), synthetic fixtures
agent-pane.subagent-row-anatomy, captured bysubagent-tray-columns.test.ts; before is feat-cmux-next7ad4616221fa's components on the same fixtures.One finished subagent, nothing running
Running subagent with tokens and tool uses, over a finished one
Running, failed and finished (an Explore agent)
I viewed the after images.
Tests
subagent-tray-columns.test.ts"row anatomy" (real Chromium, light and dark, three fixtures): one leading glyph; title at least--ds-space-2after it; nogeneral-purpose/Explore/Done/Runningvisible on the line; the meta ends before the time; a settled tray has no shadow and no fill; a long state word is cut inside its meta.subagent-tray.test.tsx: one glyph (spinner while running, fork once ended), the name first in the text, the kind and the action in the tooltip, stats kept on the line, the screen-reader state word, settled vs not.subagent-progress.test.tsx: the group list's rows no longer carry the kind.cmux-ci (Blacksmith Linux, fast-checks) at
97a37b9(the head minus a format-only commit):subagent-tray.test.tsx,subagent-progress.test.tsx,running-wave,session-info-subagent-marks,chat-inspector77 pass 0 fail;subagent-tray-columns.test.ts16 pass 0 fail (the existing narrow/short-dock/columns geometry plus the six new anatomy tests);bun run checkgreen (design tokens, fmt, lint, types). run 41207645140.Spec
leo-workspace
design/chat-transcript.md"Subagent row anatomy" (teamleaderleo/leo-workspace#1912).Performance
useStateread of the experiment arm per tray mount, as the panel and motion arms already doRisk: low to medium. Markup and CSS for the tray's lines and the Subagents lists. The narrow (two-line) tray's grid gains a column for the meta. Its geometry tests (
subagent-tray-columns.test.ts) still run.Changelog
Changed: running and finished subagent lines show one icon, the title, muted stats and time; the agent type moves to the tooltip, and a tray with nothing running draws no card.
Agent session: agent session
🤖 Generated with Claude Code