Agent pane: a forced Stop reads as a plain stop, and a message sent after Stop shows below it

Merged
TE
3d ago
+426-38

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 rightGlyph top minus bubble bottomIcon button
Waiting steer (Send now, ×, Copy)0 px8 px28×28
Same prompt once sent (time, Copy, Retry)0 px8 px28×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 the transcript-action-control square. 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 new stack variant with two waiting steers. Only the newest one offers Send now. The balanced and stack plays 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 for agent-pane.queued-user-footer compact, balanced, roomy, stack and read pass in dark and light. accepted fails its click step at base too, and this PR leaves it unchanged. vp lint and 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
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-look experiment) 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.