agent pane: one subagent row anatomy (one glyph, no type subtitle, quiet done)
Rebased on #29608 and #29264. Leo's later words in #29608 ("the leading icons ā just the stupid fork one", "why didn't you guys remove the icons nor the tokens") supersede two parts of this PR. A subagent line now leads with its harness mark or toned icon (the spinner while it runs) and never the fork. It shows no tokens or tool uses: the trailing meta holds only a workflow's agent counts and a state worth a word. Stop and the chevron keep #29264's tracks. The stills below predate both, so they still show the fork and the token meta. What this PR still adds: no agent-type subtitle (it moves to the tooltip), no Done or Running word (screen readers still get it), the meta before the time, and no card when nothing runs. Follow-up from review: #29616.
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:
- One leading glyph. The spinner while it works, otherwise the fork (subagent), the chat (started chat) or the terminal (command), or the harness mark. The second kind glyph (#28113) is gone, and so is the glyph touching the title: the title sits the row's gap after the one glyph.
- No agent-type subtitle. The kind (Explore, general-purpose) and what it does now move to the line's tooltip (Inspector: its hover card). Nothing is deleted.
- One muted trailing meta, then the time, then the chevron. Tokens and tool uses sit muted right before the time, lined up with finished lines' times. Done and Running are no longer words on the line, since the glyph says them; screen readers still read them. Waiting, Failed, Stopped and Retrying keep their word in the meta. The 96px status column shrinks to the chevron.
- No card when nothing runs. A tray holding only finished lines draws no fill or ring (
data-settled). The card comes back as soon as something runs. - Sibling rows that broke the rule: the Inspector's and Session Info's Subagents lists lose the kind subtitle (it moves to the hover card or tooltip), and the subagent group's open list (
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-anatomy with experiment subagent-tray-row, across the done-one, running-stats and mixed fixtures:
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). inline reads well for one line but loses the shared time column across several. below doubles the row height for two numbers.
Before / after
Linux gallery (Chromium, 2x), synthetic fixtures agent-pane.subagent-row-anatomy, captured by subagent-tray-columns.test.ts; before is feat-cmux-next 7ad4616221fa's components on the same fixtures.
One finished subagent, nothing running
| Before | After | |
|---|---|---|
| Light | ![]() | ![]() |
| Dark | ![]() | ![]() |
Running subagent with tokens and tool uses, over a finished one
| Before | After | |
|---|---|---|
| Light | ![]() | ![]() |
| Dark | ![]() | ![]() |
Running, failed and finished (an Explore agent)
| Before | After | |
|---|---|---|
| Light | ![]() | ![]() |
| Dark | ![]() | ![]() |
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-inspector 77 pass 0 fail; subagent-tray-columns.test.ts 16 pass 0 fail (the existing narrow/short-dock/columns geometry plus the six new anatomy tests); bun run check green (design tokens, fmt, lint, types). run 41207645140.
Spec
leo-workspace design/chat-transcript.md "Subagent row anatomy" (teamleaderleo/leo-workspace#1912).
Performance
| metric | before | after | delta | harness or run link |
|---|---|---|---|---|
| per-token work in tray lines | none | none | 0 | no new timers, observers, effects or state; one useState read of the experiment arm per tray mount, as the panel and motion arms already do |
Risk: 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











