Repository navigation
Agent pane: an unreachable server's error card leads with Retry, never Switch model - #34588
Conversation
…h model Leo, 2026-11-03: "this ui is pretty awkward looking". A connection failure's card led with a filled Switch model where it had no Retry (an earlier turn, or one a retry went on from). Retry leads it where the chat has one; Switch model only follows, outlined. Gallery variants and tests per kind. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-fb75b7af9902231028aa
…r one Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-fb75b7af9902231028aa
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-fb75b7af9902231028aa
|
Review (subagent claude-opus-5-5 medium, correctness): SHIP at 9f3e8fa Checked the |
|
Owned by an agent session · session |
|
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 Unclear: CI failed on
Failures:
Matched log linesNot re-run automatically: Written by red: web / Web status; a job it gathers is red on this change (its line here); do not merge until green; see lane-rules Shipped in:
|
|
Review (codex gpt-6.1-sol xhigh, via router-review): SHIP at 9f3e8fa Visual verdict: no images; Leo tries the build. |
#34779) * Agent pane: Retry and its model switch on the last turn's reply footer Leo: "Today Retry is on your prompt bubble, and appears on the reply only after a failure. Put it, with the model switch, in the last turn's footer." The last turn's footer offers Retry right after Copy, failed or not, with its model chevron as one split control (shared hover pill, lit while the menu is open). Sent prompts and other agents' messages no longer draw Retry; a queued row keeps its own. The failure card (#34588) is unchanged. Agent-Ask: ask-78e15cc85d Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-24965ec0eac8f94c8bb5 * Agent pane: the Messages view keeps a sent prompt's Retry The Messages view draws no reply footer for a turn that ended well (messagesRows.ts), so moving Retry to the footer left it with none there. Its prompts keep their Retry, as on base. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-24965ec0eac8f94c8bb5 * Agent pane: a waiting steer's row draws no Retry either, so delivery moves nothing The queue row of a waiting steer still drew Retry while the sent row no longer did, so Send now changed the row's buttons (gallery health: composer steer-send-now-leaves past its layout-shift baseline). Retry is the reply footer's in the transcript; the Messages view's prompts keep it, sent or queued. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-24965ec0eac8f94c8bb5 * test: Retry's model menu keeps the footer and its split pill lit while open Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-24965ec0eac8f94c8bb5 * Agent pane: the waiting steer's comments name the buttons it draws Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-24965ec0eac8f94c8bb5 * Agent pane: a waiting steer's row draws no Retry after the base merge; its test, gallery and capture notes say so Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-66acd75c32cd891c3d93 * test: format the waiting steer's Retry check Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-66acd75c32cd891c3d93 * Agent pane: a tool-only last turn's footer shows, so its Retry is not lost (review F1) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-66acd75c32cd891c3d93 * Agent pane: format the footer mark's Retry check Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-66acd75c32cd891c3d93 * test: a folded stopped last turn with a prompt keeps the row its Retry sits on Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-66acd75c32cd891c3d93 * Agent pane: a read-only transcript keeps a tool-only last turn's empty footer, with no Retry to carry (review F1 at 9fceb0c) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-66acd75c32cd891c3d93 * Agent pane: Retry stays on the person's last prompt's footer when only notices and reminders follow it (review F2 at effbc47) turns.ts retryTargetAt picks the footer: the last turn whose prompt can be sent again. The reply footer keeps the one visible Retry the prompt bubble had in those chats. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-66acd75c32cd891c3d93 * Agent pane: type and format the retry target fixtures Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-66acd75c32cd891c3d93 * Agent pane: a task result's turn never offers Retry; the person's last prompt keeps it (review F1 at 83a3ecb) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-66acd75c32cd891c3d93 * Agent pane: one Retry placement for the transcript, turns.ts retryPlacement, read by the footer and the prompt The reply footer draws the chat's one Retry only when it shows and offers it; else the person's last prompt keeps it, as before. Footer layout is base's again. A table-driven test covers each turn shape the reviews named. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-66acd75c32cd891c3d93 * Agent pane: a steer with its queue controls is never the Retry target; format the placement table Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-66acd75c32cd891c3d93 * Agent pane: Retry eligibility is base's prompt predicate, isRetryablePrompt, extracted unchanged Only where Retry is drawn moved; which prompts can be retried is base's: the person's own prompt UserBubble drew Retry for. Another agent's message and a task result draw none, a waiting steer keeps its held Retry as on base, and the table test covers both as none. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-66acd75c32cd891c3d93 * test: another agent's message fixture names its sender Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-66acd75c32cd891c3d93 * test(gallery): the reply footer's Retry split control shares one hover pill The gallery control-surface audit flagged span.cv-turn-retry lighting when either half is hovered. Retry and its model switch are one split control by design (conversation.css .cv-turn-retry), so the pill is the control's own, not a row highlight. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-66acd75c32cd891c3d93 * test(acpmux): a waiting steer that is the latest prompt keeps its held Retry Pins that the bubbles' retry target (retryTargetIn) scans every row, so a waiting steer, which continues its turn rather than opening one, is still the prompt PendingSteer's held Retry belongs to. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-66acd75c32cd891c3d93 --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Summary
Leo, 2026-11-03, on a cmux NEXT agent pane: "this ui is pretty awkward looking".
One item from that screenshot: a turn whose model server could not be reached (a transport, network or API connection failure) showed an error card that led with a filled Switch model. That happened whenever the card had no Retry of its own: an earlier turn, or a turn that a retry had already gone on from. Switching model is not the fix for a server that can't be reached.
TurnRows.tsxTurnFailure: anunreachablefailure never makes Switch model the filled lead. If the chat has a Retry, Retry leads (filled). It runs acpmux's turn retry, the same path whose attempts Agent pane: a turn whose model can't be reached says so, not Thinking (acpmux turn_retrying) #34306's live line counts ("Can't reach the model · retrying (N of M)"). Retry stays disabled while the request is in flight, and Switch model follows it, outlined. If there is no Retry, Switch model stays on the card, outlined.Gallery:
agent-pane.turn-error-card, new variantsserver-unreachable: Retry first (filled), Switch model after itserver-unreachable-retrying: the retried attempt's live line says "Can't reach the model · retrying (2 of 10) · 503 server error", and the earlier card keeps Switch model outlinedmodel-error: a refused API key, with Switch model leading and Retry after itTesting
webviews/test/turn-error-card.test.tsxgets four new tests that check which action leads for each error kind:["Retry", "Switch model"], Retry filled["Switch model"], outlined. This one fails on base, where Switch model is filled.retryFailedwith the row and prompt, and stays disabled until it settles["Switch model", "Retry"], Switch model filledRan on the fleet (
cmux-ci test, Linux):vp fmton the changed files, with its change appliedbun testonturn-error-card,turn-error-continue,failureCopy,access-offer,signed-out-harnessandcloud-signin-card: 87 pass, 0 failbun run typecheckandbun run lint: the one error in each isCannot find name 'after'intest/transcript-spacing-kinds.test.ts:247. That is a base red from Agent pane: the live Thinking line starts on the icon column and stays the last row #34370, not a file this PR touches. These files report no errors.Observed / Not run
Risk: low. One condition in one component, and it only changes which button gets the filled style and the lead slot for
unreachablecards that have no Retry.Changelog
Fixed: An agent chat whose model server can't be reached no longer leads its error card with Switch model; Retry leads, and Switch model follows it.
Proof
No capture: webview UI. See gallery
agent-pane.turn-error-card(server-unreachable,server-unreachable-retrying,model-error).Agent session: agent session
🤖 Generated with Claude Code
Open in [code]smith · Need help on this PR? Tag
@codesmith-botwith what you need.Summary by cubic
Fixes the agent pane error card so an unreachable model server leads with Retry instead of Switch model. Previously, a connection failure without its own Retry showed a filled Switch model, which doesn't fix a server that can't be reached.
Bug Fixes
Written for commit 9f3e8fa. Summary will update on new commits.