Agent pane: a forced Stop reads as a plain stop, and a message sent after Stop shows below it
Relayed from Leo's look at a transcript capture: "Queued-message controls. 'Send now ×' and the copy icon float loosely under the bubble. Align them to the bubble's edge."
What I found
On the current base, a waiting steer's controls already sit exactly where a sent prompt's controls sit. #31683 made that change (merged 2026-11-02 02:51 UTC). Before it, the waiting steer's row stayed in flow (#27580), so it sat inset from the bubble and took its own height. A capture from a build before #31683 shows the loose row.
I measured base with the shared footer test and the gallery, in Chromium at 880px and 360px, with short and wrapping prompts:
| Copy glyph right minus bubble right | Glyph top minus bubble bottom | Icon button | |
|---|---|---|---|
| Waiting steer (Send now, ×, Copy) | 0 px | 8 px | 28×28 |
| Same prompt once sent (time, Copy, Retry) | 0 px | 8 px | 28×28 |
The two steers in agent-pane.composer/steer-waiting-stack measure the same.
What this changes
Tests and gallery only. No CSS change.
webviews/test/queued-user-footer.test.ts: the test checked only the outer row's box. It now also checks the controls in each width, length and theme case: Copy's glyph ends on the bubble's right edge, both while waiting and once sent. The glyphs keep the sent row's gap under the bubble. Every queued icon button and the sent Copy are thetranscript-action-controlsquare. If a change moved the controls inside a correct-looking row box, the old test would still pass, and this one fails.QueuedUserFooter.gallery.ts: adds a newstackvariant with two waiting steers. Only the newest one offers Send now. Thebalancedandstackplays now check the same glyph alignment against the sent prompt in the same frame.
Design spec: leo-workspace design/chat-transcript.md, "A queued personal prompt stays right-aligned in the sent-prompt bubble position. Send now and the withdrawal × occupy the same footer slot directly under the bubble's right edge." Nothing in the spec changes.
Observed / Not run
- Observed on fast checks at this tree:
CMUX_BROWSER_TESTS=1 bun test test/queued-user-footer.test.ts, 12 pass and 0 fail. Gallery plays foragent-pane.queued-user-footercompact,balanced,roomy,stackandreadpass in dark and light.acceptedfails its click step at base too, and this PR leaves it unchanged.vp lintand the type check are clean. One formatting fix was applied after that run. - Not run: the native app build. The native host draws SF Symbols in place of the browser fallback glyphs, so pixel positions in the app may differ slightly from this harness.
Changelog
none
Agent session: agent session
Agent session: agent session
🤖 Generated with Claude Code
![Autofix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/autofix-with-codesmith-dark-3x.png)
Open in [code]smith · Need help on this PR? Tag @codesmith-bot with what you need.
Summary by cubic
Makes a forced Stop (cmux ended the turn because the agent never answered) read as any other stop, and a message steered in right after it draw below the stop instead of above it.
- The transcript line "The agent didn't answer Stop, so cmux ended its turn." is gone; a muted Stopped word in the footer (new
stopped-turn-lookexperiment) replaces it, with the reason only in tooltips. - A message logged after the Stop never reached the agent: it draws below the stopped turn's line and gives way to acpmux's later run of it (same promptId) or its queued card; a re-queue drops only that late steer, by promptId, or by its words when it has none.
- Continue on a stopped turn now has a tooltip and hides when a queued prompt runs next anyway.
- Tests, gallery fixtures, and a mock session updated to cover the forced-stop, late-steer, and queued-next cases.