cmux NEXT agent pane: transcript spinners turn again (compaction, tool runs)
Leo (2026-10-20), on "Compacting the conversation…" and other running rows: "why do these things not spin?"
Cause
The transcript's Spinner icon (compaction, tool groups, MCP calls, message cards, command and shell rows) never had an animation rule, so it drew an open ring that never moved.
Fix
Spinneralways carriescv-spinner. conversation.css turns it with the sharedcmux-spinkeyframes, soui/spinnerClock.tskeeps it in phase with every other page and native spinner. It holds still under Reduce Motion and the static status look.- The todo plan's spinner and the started-session status line's spinner drop their own keyframes (
cv-plan-spin,acpmux-session-status-spin) and use the same shared turn. The status line also gains the static-look gate it was missing.
This is part 1 of the activity-indicators lane: the bug fix. Part 2, a calmer default "working" signal, comes in its own PR.
Changelog
Fixed: Running rows in the agent transcript (compaction, tool runs) show a spinner that turns again.
Test
bun test src/agent-session/acpmux/conversation/spinnerTurns.test.tsx (from webviews/)
- Base (761af9ad47a5, test only): 0 pass, 3 fail. The running compaction has no
cv-spinner, and no rule animates it. - Head: 3 pass.
Observed / Not run
- Ran: the test above (red on the test-only commit, green on the head),
bun test src/agent-session/acpmux/started(28 pass),scripts/web-lint.sh, andprepush-gate.py(no new violations).web-lint.shreports one warning, inUserBubble.tsx:191, which this PR doesn't touch and which is on base 184c4e5c16d0. - Not run: no Mac build. The spin itself is plain CSS, so I didn't watch it turn in the app.
Agent session: huge-blue
🤖 Generated with Claude Code
Need help on this PR? Tag @codesmith-bot with what you need.
Summary by cubic
Running rows in the agent transcript — compaction, tool runs, MCP calls, message cards, command and shell rows — get a spinner that turns again, instead of a static ring that never moved.
The Spinner icon now always carries cv-spinner, and conversation.css animates it with the shared cmux-spin keyframes so all page spinners stay in phase via ui/spinnerClock.ts. The todo plan and started-session status line spinners drop their own keyframes for the same shared turn; the status line also gains the static-status-look gate it was missing. Spinners hold still under Reduce Motion and the static look.