Skip to content

agent pane: a failed turn shows an error card with its cause and way out - #24312

Merged
teamleaderleo merged 15 commits into
feat-cmux-nextfrom
chat-error-card
Oct 23, 2026
Merged

teamleaderleo merged 15 commits into
feat-cmux-nextfrom
chat-error-card

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 22, 2026 •

Copy link
Copy Markdown
Collaborator

Leo-ask: ask-427cc7d8f5 (error card, relayed by claude-sr2)

Leo: "we need to have prettier errors" and "we also wanna make sure we have good recoverable/informative disk errors tailscale erros for acpmux".

What changes

A failed turn showed acpmux's bare agent process closed above an outlined Copy error button. Now a failed turn draws one card:

  • Cause: one human line (failureCopy.ts). The new kinds are:
    • Disk full: ENOSPC, no space left, disk quota exceeded.
    • Tailscale: tailscale, tailnet, *.ts.net.
    • Agent quit mid-turn: acpmux's agent process closed, an exit code or signal, a broken pipe.
    • Agent couldn't start: a spawn ENOENT, command not found.
    • Anything unnamed: reads " ran into a problem and stopped." The agent's raw words are never the sentence any more.
    • Precedence: stderr that names a cause (529, ECONNREFUSED) still wins over "it quit".
  • The way out first: a filled Retry for whatever may pass, or Switch model for capacity, key and proxy failures. Sign in again stays in the footer, as before.
  • Details opens the agent's own words, with Copy error.
  • Typed errors: acpmux's typed reason, the turn result's errorCode when it is a string, now reaches the row and wins over the text. The mapping matches words (disk/no_space, tailscale, peer/unreachable, spawn, exit/closed), so the codes acpmux-unify is adding (disk, tailscale, peer, spawn) map without a second change here.

Versions

There are three versions as the turn-error-card experiment: Glass card (ui-glass), Accent rail and Quiet note. They sit side by side in the gallery entry agent-pane.turn-error-card → Compare arms. The variants cover Leo's "agent process closed", disk full, Tailscale, a typed disk.full, spawn failure, rate limit, unknown, and Details open. I picked Glass card as the shipped default: it reads as the turn's answer, the way out is the one filled button, and it uses our glass. To dogfood the other arms, set localStorage["cmux.experiments"] = {"turn-error-card":"rail"}.

Follow-ups (not in this PR)

  • "Open Tailscale" and "Free space…" buttons. The pane has no native call to open an app or a Settings pane yet (app.action only runs New Tab omnibar actions), so those need a small native handler; that is its own PR. Until then the cause line says what to do and Retry is the way out.
  • The Continue button (Leo: "and we should add a continue button if things were stopped, just like codex") is the next PR, folded into this card.

Size

About 570 lines of code and tests. The 660 catalog lines (five strings × 21 locales, non-English marked needs_review) are split into #24529, which lands first. This PR's catalog lines are the same as #24529's, so once #24529 is in the base they drop out of this diff.

Tests

  • New test/turn-error-card.test.tsx covers classification, the typed code, the human sentence, recovery order, and the card's DOM.
  • These tests still pass unchanged against the card: turn-error-details, turn-error-layout and signed-out-harness (.cv-turn-note, the Details chevron, Sign in again, Switch model, Copy error).
  • Tests run in PR CI (webview tests are not run on Leo's Macs).
  • Adopted from a session that died; ownership was claimed with pr-owner (comment 6363193552). Changes since the earlier review:
    • the current base brought in (no conflicts);
    • two fixes from Codex review (gpt-6.1-sol xhigh), each with a test:
      • Retry shows only when the turn has a prompt row to send again;
      • an agent that ran and quit, with a tool's "command not found" or "failed to start" in its stderr, reads as quit, not as "couldn't start".
  • On huge-blue, vp check and vp fmt --check add no errors. The only errors are three base type errors in test/thread-minimap-stream.test.tsx, red on base 4213444 too.
  • The turn-error-card, turn-error-details, turn-error-layout and signed-out-harness tests pass.

No capture: webview-only; the gallery entry above is the visual.

Original session: cosmic-gray

Agent session: cosmic-gray

🤖 Generated with Claude Code

…ay out

Leo: "we need to have prettier errors" and "we also wanna make sure we
have good recoverable/informative disk errors tailscale erros for acpmux".

A failed turn showed acpmux's bare "agent process closed" with an outlined
Copy error. It now draws a card: one human cause line, the way out first
(Retry, or Switch model for capacity and keys), and Details opening the
agent's own words with Copy error. New kinds: a full disk, a tailnet that
no longer reaches the chat's machine, an agent that quit mid-turn and one
that could not start; anything unnamed reads "<agent> ran into a problem
and stopped." acpmux's typed reason (the turn's errorCode, a string) wins
over the words when it names one. The surface is the turn-error-card
experiment (glass card, accent rail, quiet note); the glass card ships.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16162-34a1-7a20-bb81-72d00a8457c8&host=cosmic-gray
@github-actions

github-actions Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

cmux status (one comment, edited in place; each line is updated by the job that owns it)

Review e246f5e: HQ feed card · gallery before/after runs · checks

App of this head (app.zip, kept 1 day)

gh workflow run reload-build.yml -R manaflow-ai/cmux --ref feat-cmux-next -f tag=pr24312 -f ref=chat-error-card -f platform=macos -f backend_mode=local

Gallery before/after for e246f5e: 16 states rendered, 0 images differ, 1696 more touched states not rendered. Images are in the run's artifact, not on this public PR.

gh run download 39945578441 -R manaflow-ai/cmux -n gallery-advisory-24312-e246f5e78cb3129a83511be2250ddc6e057d29c2 (then read gallery-review.json)

States
State Theme Status Diff Picked by
agent-pane.chat-find-bar/empty Apple System Colors Light unchanged 0% own conversation.css
agent-pane.chat-find-bar/empty Apple System Colors unchanged 0% own conversation.css
agent-pane.chat-find-bar/matches Apple System Colors Light unchanged 0% own conversation.css
agent-pane.chat-find-bar/matches Apple System Colors unchanged 0% own conversation.css
agent-pane.chat-find-bar/next-match Apple System Colors Light unchanged 0% own conversation.css
agent-pane.chat-find-bar/next-match Apple System Colors unchanged 0% own conversation.css
agent-pane.chat-find-bar/no-results Apple System Colors Light unchanged 0% own conversation.css
agent-pane.chat-find-bar/no-results Apple System Colors unchanged 0% own conversation.css
agent-pane.composer/new-chat Apple System Colors Light unchanged 0% own icons.tsx
agent-pane.composer/new-chat Apple System Colors unchanged 0% own icons.tsx
agent-pane.composer/side-session Apple System Colors Light unchanged 0% own icons.tsx
agent-pane.composer/side-session Apple System Colors unchanged 0% own icons.tsx
agent-pane.composer/new-chat-suggest-open Apple System Colors Light unchanged 0% own icons.tsx
agent-pane.composer/new-chat-suggest-open Apple System Colors unchanged 0% own icons.tsx
agent-pane.composer/new-chat-suggest-failing Apple System Colors Light unchanged 0% own icons.tsx
agent-pane.composer/new-chat-suggest-failing Apple System Colors unchanged 0% own icons.tsx
agent-pane.composer/new-chat-suggest-draft Apple System Colors Light unchanged 0% own icons.tsx
agent-pane.composer/new-chat-suggest-draft Apple System Colors unchanged 0% own icons.tsx
agent-pane.composer/new-chat-reasoning Apple System Colors Light unchanged 0% own icons.tsx
agent-pane.composer/new-chat-reasoning Apple System Colors unchanged 0% own icons.tsx
agent-pane.composer/agent-home Apple System Colors Light unchanged 0% own icons.tsx
agent-pane.composer/agent-home Apple System Colors unchanged 0% own icons.tsx
agent-pane.composer/agent-home-path Apple System Colors Light unchanged 0% own icons.tsx
agent-pane.composer/agent-home-path Apple System Colors unchanged 0% own icons.tsx
agent-pane.diff-panel/last-turn Apple System Colors Light unchanged 0% own conversation.css
agent-pane.diff-panel/last-turn Apple System Colors unchanged 0% own conversation.css
agent-pane.diff-panel/toolbar Apple System Colors Light unchanged 0% own conversation.css
agent-pane.diff-panel/toolbar Apple System Colors unchanged 0% own conversation.css
agent-pane.diff-panel/tree-selection Apple System Colors Light unchanged 0% own conversation.css
agent-pane.diff-panel/tree-selection Apple System Colors unchanged 0% own conversation.css
agent-pane.diff-panel/open-file-error Apple System Colors Light unchanged 0% own conversation.css
agent-pane.diff-panel/open-file-error Apple System Colors unchanged 0% own conversation.css

Pick other states with a Gallery: entry.id, entry.id/variant line in the PR body.

Passes: CI passes on e246f5e78c.

CI passes on e246f5e78c (run 39945578697 attempt 1).

Written by scripts/ci/classify_failures.py (ci-failure-attribution.yml); signatures are its SIGNATURES table. A machine verdict is the runner's fault, not this PR's; yours means the failing file is one this PR changes, also red on main that main's latest full suite fails the same way, seen on other PRs that it failed on another pull request's run lately.

red: cmux-next checks (god files, concurrency, crash safety, l10n); NEW: red check: Checks job structure (+2 more) is not red on the base f8fbe14; do not merge until green; see lane-rules

Tour of e246f5e78c (run): no media. The tour did not run: only webview code changed (10 path(s)), which the gallery advisory run checks in Linux Chromium on the pull request (its artifact holds any captures); add the media-tour-mac label, then re-add media-tour, to tour it on a Mac.

@teamleaderleo teamleaderleo added the risk:low Risk tier (docs/ci/risk-tiers.md) label Oct 22, 2026
@blacksmith-sh

blacksmith-sh Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

Found 8 test failures on Blacksmith runners:

Failures

Test View Logs
/tmp/tmp60zhsay2/summary-fail.json (live):/summary-fail.json (live): View Logs
/tmp/tmpwt4gw11l/summary-missing.json (live):/summary-missing.json (live): View Logs
[tabs] debug.tab_switch timed 0 of 40 switches/
[tabs] debug.tab_switch timed 0 of 40 switches
View Logs
[tabs] debug.tab_switch timed 0 of 40 switches/
[tabs] debug.tab_switch timed 0 of 40 switches
View Logs
[tabs] the window draws no frames/[tabs] the window draws no frames View Logs
[tabs] the window draws no frames/[tabs] the window draws no frames View Logs
test_base_passes (main.NoticesPairTests.test_base_passes)/
test_base_passes (main.NoticesPairTests.test_base_passes)
View Logs
test_targets_outside_the_app_go_to_the_mac_canary (main.SwiftCanaryFleetCoverage.te
st_targets_outside_the_app_go_to_the_mac_canary)/
test_targets_outside_the_app_go_to_the_mac_canary (main.SwiftCanaryFleetCoverage.te
st_targets_outside_the_app_go_to_the_mac_canary)
View Logs

Fix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.

@github-actions github-actions Bot added risk:normal Risk tier (docs/ci/risk-tiers.md) and removed risk:low Risk tier (docs/ci/risk-tiers.md) labels Oct 22, 2026
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6.1-sol): BLOCK at 15fdf4f

Blocking findings:

  1. [P2] Process-exit wrappers suppress the actual authentication failure. webviews/src/agent-session/acpmux/failureCopy.ts:98 returns agent-exited before checking keys/login/auth. With a direct Claude route and agent process closed\nstderr: Invalid API key · Please run /login (no typed code), the previous classifier returns subscription-login; this head returns agent-exited. Consequently TurnFooter hides Sign in again, and the card hides Switch model, offering Retry against the same signed-out harness. Treat process termination as a fallback after the specific authentication classifiers, just as the new tests already require for 529 and ECONNREFUSED, and cover the wrapped login/key cases.

  2. [P2] A tailnet hostname is mistaken for a connectivity failure even when the endpoint returned an HTTP error. webviews/src/agent-session/acpmux/failureCopy.ts:92 runs the unconditional tailscale|tailnet|\.ts\.net match before capacity/authentication. For HTTP 401 Unauthorized from https://proxy.tail123.ts.net/v1/messages without a typed code, this changes proxy-auth into tailscale: the card incorrectly instructs the user to restore Tailscale and removes Switch model. A 529 response from the same URL likewise loses its capacity recovery. Require evidence of a tailnet connectivity failure, or preserve explicit HTTP cause precedence; merely naming the serving host does not show that Tailscale failed.

  3. [P2] The new capacity test cannot pass against this renderer. webviews/src/agent-session/acpmux/conversation/TurnRows.tsx:260 makes offersRetry false for rate-limited, because failureRecovery returns switch-model. With the test's 529 error and both callbacks wired, the card therefore contains only ["Switch model"]. webviews/test/turn-error-card.test.tsx:163 requires ["Switch model", "Retry"], then dereferences that absent Retry button at line 165. The footer's separate Retry cannot satisfy this card-scoped selector. Reconcile the recovery rendering and assertion; if retaining the documented secondary Retry, render it without primary styling. This is a static contradiction, not a claim that I ran CI.

Non-blocking findings: None.

Checked: the complete diff; classification precedence/false positives and human fallback; Retry row/prompt wiring and footer Retry; existing .cv-turn-note, Details chevron and signed-out action tests; Copy error, three experiment arms/gallery, token-based CSS and five catalog keys; string errorCode propagation and function signatures. No checkout, builds, tests or tsc run; execution remains PR CI's responsibility. Head rechecked unchanged immediately before posting.

teamleaderleo and others added 2 commits October 22, 2026 01:08
…ot connect

Codex r1 at 15fdf4f:
- "agent process closed" with a login or key error in its stderr read as
  the agent quitting, hiding Sign in again and Switch model. Quit and
  could-not-start now come last, after every named cause.
- A tailnet host in a message that answered (a 401, a 529) read as
  Tailscale. Tailscale now needs a sign it did not connect.
- A capacity failure drew no Retry in the card, though the test and the
  docs promise one after Switch model: Retry follows it, unfilled.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16162-34a1-7a20-bb81-72d00a8457c8&host=cosmic-gray
@cursor

cursor Bot commented Oct 22, 2026

Copy link
Copy Markdown

Bugbot needs on-demand usage enabled

Bugbot uses usage-based billing for this team and requires on-demand usage to be enabled.

A team admin can enable on-demand usage in the Cursor dashboard.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Bead cx-rxabs created for this PR by the cmux coordinator.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6.1-sol): BLOCK at fac5aa6

Blocking findings:

  1. [P2] The tailnet-host/authentication false positive is only partially fixed. webviews/src/agent-session/acpmux/failureCopy.ts:96 still classifies a responding endpoint as a Tailscale outage when its authentication error contains ordinary logout text. Trigger: a failed row with no errorCode and error = "HTTP 401 Unauthorized from https://proxy.tail123.ts.net/v1/messages: user is logged out; please sign in again". TAILSCALE matches the hostname and TAILNET_DOWN matches logged out, so this returns tailscale before reaching the existing proxy-auth classifier. The previous classifier returns proxy-auth. The card consequently says it could not reach its machine over Tailscale and removes Switch model, offering Retry against the same unauthorized route. The new bare-401 regression case misses this because its body has no logout text. Preserve the explicit HTTP authentication cause, or scope the connectivity predicate to evidence that the tailnet connection itself failed, and add this body-bearing 401 case. This is the remaining form of r1 finding 2.

Non-blocking findings: None.

Checked: complete diff; r1 process-wrapper/auth precedence and secondary Retry fixes; classification false positives, typed-code precedence and human fallback; Retry row/prompt wiring, footer Retry, Sign in again, Switch model, Copy error and Details chevron against the three existing tests; experiment arms/gallery, token-based CSS, five catalog keys across 21 locales and string errorCode propagation/signatures. No checkout, builds, tests or tsc run; execution remains PR CI's responsibility. Head rechecked unchanged before posting.

Codex r3 at fac5aa6: "HTTP 401 Unauthorized from https://proxy.tail123.ts.net/...:
user is logged out; please sign in again" matched the tailnet host and
"logged out", so it read as Tailscale and lost Switch model. A sign-in
refusal comes from a host that answered: it is never Tailscale now.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16162-34a1-7a20-bb81-72d00a8457c8&host=cosmic-gray
@cursor

cursor Bot commented Oct 22, 2026

Copy link
Copy Markdown

Bugbot needs on-demand usage enabled

Bugbot uses usage-based billing for this team and requires on-demand usage to be enabled.

A team admin can enable on-demand usage in the Cursor dashboard.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6.1-sol): BLOCK at 136f107

Blocking findings:

  1. [P2] An auth keyword is not evidence that the tailnet host answered. webviews/src/agent-session/acpmux/failureCopy.ts:98-100 sets answered using the whole-message AUTH regex, which also matches request URLs. Trigger: a failed row with no errorCode, route { name: "Claude Code", harness: "claude" }, and error = 'Post "https://proxy.tail123.ts.net/oauth/token": dial tcp 100.101.102.103:443: i/o timeout'. The URL's oauth sets answered = true, suppressing tailscale; UNREACHABLE does not match i/o timeout, so execution falls through to proxy-auth. The card reports a proxy authentication refusal with the fallback HTTP 401, although the connection timed out before any response, and makes Switch model primary instead of explaining the Tailscale connection failure. This regresses the preceding tailnet predicate, which recognizes this timeout. Restrict the answered guard to actual HTTP-response evidence; preserve connectivity classification when authentication is merely the requested operation. Add this URL-bearing timeout alongside the body-bearing 401 regression case.

Non-blocking findings: None.

Checked: full change and bounded head-pinned surrounding code; prior process-wrapper/auth precedence and secondary Retry fixes, the body-bearing 401 fix and remaining tailscale/unreachable/auth ordering, typed-code propagation/signatures and human fallback, card Retry row/prompt wiring and button order, the three existing Details/layout/signed-out tests and footer actions, experiment arms/gallery, token-based CSS and five catalog additions. No checkout, clone, fetch, builds, tests or tsc run; execution remains PR CI's responsibility. Head rechecked unchanged before posting.

Codex r4 at 136f107: a timed-out request to https://proxy.tail123.ts.net/oauth/token
read as answered (the URL says oauth), so it showed a proxy sign-in
refusal instead of Tailscale. Only words outside URLs and tailnet host
names count as a host's answer now.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16162-34a1-7a20-bb81-72d00a8457c8&host=cosmic-gray
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6.1-sol): BLOCK at cc4a073

Blocking findings:

  1. [P2] Auth operation text still suppresses a real tailnet connection failure. webviews/src/agent-session/acpmux/failureCopy.ts:101-103: with no errorCode, route { name: "Claude Code", harness: "claude" }, and error = 'OAuth token refresh failed: Post "https://proxy.tail123.ts.net/oauth/token": dial tcp 100.101.102.103:443: i/o timeout', removing the URL still leaves OAuth in the operation description. answered becomes true despite the explicit dial timeout, suppressing tailscale. UNREACHABLE does not recognize i/o timeout, so this falls through to proxy-auth. The card falsely reports a proxy authentication refusal and makes Switch model primary, rather than explaining the Tailscale connection failure and offering Retry first. The latest regression test covers an auth word only inside the URL; adding a normal operation prefix reproduces r4's underlying defect. An auth keyword outside an address still does not establish an HTTP response. Distinguish actual response evidence from the operation being attempted, and cover this prefixed timeout alongside the body-bearing 401 case.

Non-blocking findings: None.

Checked: complete diff and six targeted head-pinned source/test files; r1 process-wrapper/auth precedence and secondary Retry fixes; r3 body-bearing 401 and r4 URL-only timeout cases; remaining tailscale/unreachable/auth ordering, typed-code propagation/signatures and human fallback; Retry row/prompt wiring, footer Retry, Sign in again, Switch model, Copy error and Details chevron against the three existing tests; experiment arms/gallery, token-based CSS, and five catalog keys across 21 locales with intact placeholders. No checkout, clone, fetch, builds, tests or tsc run; execution remains PR CI's responsibility. Head rechecked unchanged before posting.

An auth word outside an address ("OAuth token refresh failed: … dial tcp …: i/o timeout") named
the operation, not a reply, so the card said proxy sign-in. Only an HTTP status or its reason
phrase counts as an answer, and a failed dial outranks it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16162-34a1-7a20-bb81-72d00a8457c8&host=cosmic-gray
@cursor

cursor Bot commented Oct 22, 2026

Copy link
Copy Markdown

Bugbot needs on-demand usage enabled

Bugbot uses usage-based billing for this team and requires on-demand usage to be enabled.

A team admin can enable on-demand usage in the Cursor dashboard.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6.1-sol): BLOCK at 2f1c67d

Blocking findings:

  1. [P2] Address stripping deletes actual response evidence in compact JSON errors. webviews/src/agent-session/acpmux/failureCopy.ts:49 (used at lines 106–112): with no errorCode, route { name: "Claude Code", harness: "claude" }, and error = '{"url":"https://proxy.tail123.ts.net/v1/messages","status":401,"message":"logged out"}', ADDRESSES consumes beyond the URL's closing quote through the adjacent status field and up to the space in logged out. Consequently the stripped text contains no 401, answered is false, and TAILNET_DOWN still matches logged out in the original text. This returns tailscale instead of the existing proxy-auth result: a responding endpoint's authentication refusal becomes “couldn't reach its machine over Tailscale,” with Retry primary and Switch model removed. Stop address matches at serialization delimiters and cover this compact serialized HTTP error; the current regressions only cover whitespace-delimited messages. The r5 OAuth-prefix timeout is fixed, but the body-bearing 401 false positive remains in this form. Finding supported by static tracing; no test executed.

Non-blocking findings: None.

Checked: complete diff and six targeted head-pinned source/test files; r1 process-wrapper/auth precedence and secondary Retry, r3 body-bearing 401, r4 URL-only timeout and r5 OAuth-prefix timeout; remaining classification ordering, human fallback, Retry row/prompt wiring, footer Retry, Sign in again, Switch model, Copy error and Details chevron against the three existing tests; experiment arms/gallery, shared glass class and token-based CSS, five catalog keys across 21 locales with intact placeholders, and string errorCode propagation/signatures. No checkout, clone, fetch, builds, tests or tsc run; execution remains PR CI's responsibility. Head rechecked unchanged before posting.

In a compact JSON error the address pattern ran on through `","status":401`, so the 401 a tailnet
proxy answered was stripped with the URL and its "logged out" body read as Tailscale.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16162-34a1-7a20-bb81-72d00a8457c8&host=cosmic-gray
@cursor

cursor Bot commented Oct 22, 2026

Copy link
Copy Markdown

Bugbot needs on-demand usage enabled

Bugbot uses usage-based billing for this team and requires on-demand usage to be enabled.

A team admin can enable on-demand usage in the Cursor dashboard.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6.1-sol): BLOCK at d957826

Blocking findings:

  1. [P2] Timeout words inside a URL still override a real HTTP auth response. webviews/src/agent-session/acpmux/failureCopy.ts:107-111: with no errorCode, route { name: "Claude Code", harness: "claude" }, and error = 'HTTP 401 Unauthorized from https://proxy.tail123.ts.net/v1/messages?error=ETIMEDOUT', DIAL_FAILED.test(message) matches the query parameter. This forces answered false and satisfies the tailnet-failure branch, returning tailscale instead of the existing proxy-auth result. The endpoint explicitly answered 401; a URL parameter is not evidence that its connection failed. The card consequently tells the user to check Tailscale and removes Switch model. Address stripping currently protects only ANSWERED, while both DIAL_FAILED calls still inspect addresses. Apply the same address exclusion to connection-failure evidence and add this regression alongside the actual dial-timeout cases. This follows directly from static tracing; no test was executed.

Non-blocking findings: None.

Checked: complete diff and six targeted head-pinned source/test files; r1 process-wrapper/auth precedence and secondary Retry, r3 body-bearing 401, r4 URL-only timeout, r5 OAuth-prefix dial timeout, and r6 compact-JSON delimiter fix; remaining classification ordering, human fallback, Retry row/prompt wiring, footer Retry, Sign in again, Switch model, Copy error and Details chevron against the three existing DOM tests; experiment arms/gallery, token-based CSS/shared glass class, five catalog keys across 21 locales with intact placeholders, and string errorCode propagation/signatures. No checkout, clone, fetch, builds, tests or tsc run; execution remains PR CI's responsibility. Head rechecked unchanged before posting.

…ction

A 401 from https://…ts.net/v1/messages?error=ETIMEDOUT read as a failed dial, so the card said
Tailscale. Every connection check now reads only the words outside addresses.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16162-34a1-7a20-bb81-72d00a8457c8&host=cosmic-gray
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6.1-sol): SHIP at 1a9acbb

Blocking findings: None found.

Non-blocking findings: None.

Checked: complete diff and six targeted head-pinned source/test files; independently traced the earlier process-wrapper/auth, secondary Retry, body-bearing 401, URL-only timeout, OAuth-prefix dial timeout, compact-JSON delimiter, and URL-embedded ETIMEDOUT regressions. Address exclusion now applies consistently to connection and answer evidence while preserving tailnet identification. Reviewed classification order/false positives, string errorCode propagation and signatures, human fallback, Retry row/prompt binding and button order, footer Retry/Sign in again/Switch model, Details chevron/Copy error against the three existing DOM tests, experiment arms/gallery, token-based CSS/shared ui-glass class, and five catalog keys across 21 locales with intact placeholders. No checkout, clone, fetch, builds, tests or tsc run; test execution and typechecking remain PR CI's responsibility. Head rechecked unchanged immediately before posting.

@teamleaderleo teamleaderleo added the ready-to-land Reviewed at this head; next-autoland merges it into feat-cmux-next when its only reds are base reds label Oct 22, 2026
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

gallery health / health (2) is red on 11 of 16 fresh feat-cmux-next PR heads in the last 2:00:00, so it is most likely a base red, not this PR's. The base-reds lane has it; a base merge picks up the fix once it lands.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next guards / nightly-guards / workflow-guard-tests / release-notary is red on 19 of 19 fresh feat-cmux-next PR heads in the last 2:00:00, so it is most likely a base red, not this PR's. The base-reds lane has it; a base merge picks up the fix once it lands.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

gallery health / health (1) is red on 9 of 14 fresh feat-cmux-next PR heads in the last 2:00:00, so it is most likely a base red, not this PR's. The base-reds lane has it; a base merge picks up the fix once it lands.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

gallery health / health (0) is red on 8 of 11 fresh feat-cmux-next PR heads in the last 2:00:00, so it is most likely a base red, not this PR's. The base-reds lane has it; a base merge picks up the fix once it lands.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next guards / cmux-next page strings generate is red on 11 of 15 fresh feat-cmux-next PR heads in the last 2:00:00, so it is most likely a base red, not this PR's. The base-reds lane has it; a base merge picks up the fix once it lands.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next / cmux-next checks (god files, concurrency, crash safety, l10n) › Checks job structure is red on 12 of 12 fresh feat-cmux-next PR heads in the last 2:00:00, so it is most likely a base red, not this PR's. The base-reds lane has it; a base merge picks up the fix once it lands.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next / cmux-next checks (god files, concurrency, crash safety, l10n) › No fleet host names in gallery fixtures is red on 12 of 12 fresh feat-cmux-next PR heads in the last 2:00:00, so it is most likely a base red, not this PR's. The base-reds lane has it; a base merge picks up the fix once it lands.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next / cmux-next checks (god files, concurrency, crash safety, l10n) › No new SwiftUI (macOS UI is AppKit) is red on 12 of 12 fresh feat-cmux-next PR heads in the last 2:00:00, so it is most likely a base red, not this PR's. The base-reds lane has it; a base merge picks up the fix once it lands.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

gallery health / health (3) is red on 8 of 9 fresh feat-cmux-next PR heads in the last 2:00:00, so it is most likely a base red, not this PR's. The base-reds lane has it; a base merge picks up the fix once it lands.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Orphaned: no activity for 13 h, and no lane holds a lease on it. The orphan sweep could not merge feat-cmux-next in: conflicts in webviews/src/agent-session/acpmux/conversation/TurnRows.tsx, webviews/src/experiments/registry.ts. Listed for a lane to resolve.

…card-merge

# Conflicts:
#	webviews/src/agent-session/acpmux/conversation/TurnRows.tsx
#	webviews/src/experiments/registry.ts
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex xhigh, correctness first): BLOCK at 61953c2

Blocking findings:

  • webviews/src/agent-session/acpmux/failureCopy.ts:109: An answered host can still be classified as unreachable. For peer build-box unreachable: HTTP 401 Unauthorized from https://proxy.tail123.ts.net/v1/messages, address stripping leaves both unreachable and HTTP 401; answered is true, but the following UNREACHABLE check returns "unreachable" before authentication classification. This should be proxy-auth/auth, since the host answered.

  • webviews/src/agent-session/acpmux/failureCopy.ts:60-64: AGENT_EXITED and SPAWN_FAILED match ordinary command output without requiring agent-process context. Inputs such as process exited with code 1, failed to start the dev server, or command not found: rg become agent-exited/spawn-failed, causing the card to falsely say the harness quit or could not start. These patterns need explicit ACP/agent context or typed-reason support.

Non-blocking findings: None.

Checked classification precedence and URL masking, recovery/button wiring, Details/Chevron/Copy behavior, footer actions, errorCode propagation, experiment registration, localization, and CSS; tests and tsc are CI-only here.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Owned by transcript-parity on cosmic-gray · took over from session 01a16162 · session

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

rust workspaces / plan (changed Cargo workspaces) is red on 20 of 20 fresh feat-cmux-next PR heads in the last 2:00:00, so it is most likely a base red, not this PR's. The base-reds lane has it; a base merge picks up the fix once it lands.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

rust workspaces / rust workspaces is red on 20 of 20 fresh feat-cmux-next PR heads in the last 2:00:00, so it is most likely a base red, not this PR's. The base-reds lane has it; a base merge picks up the fix once it lands.

teamleaderleo and others added 2 commits October 23, 2026 11:13
…quit; Retry needs its row

Codex review: "pnpm: command not found" in the stderr of an agent that ran
read as the agent failing to start, and the card offered Retry for a turn
with no prompt row.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
teamleaderleo added a commit that referenced this pull request Oct 23, 2026
…24312) (#24529)

* Agent pane: localized strings for the failed-turn causes (split from #24312)

Five turn.failure keys in 21 languages: diskFull, tailscale, agentExited,
spawnFailed, generic. #24312 uses them; landing them first keeps that PR
under the size rule.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Agent pane strings: Japanese disk-full line says the agent could not go on

Codex review nit: the line read as "could not continue {harness}".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex xhigh, correctness first): SHIP at e246f5e

gpt-6.1-sol xhigh on cmux16, diff-only, after adopting this PR:

@teamleaderleo
teamleaderleo merged commit 9e8f6d9 into feat-cmux-next Oct 23, 2026
133 of 137 checks passed
@teamleaderleo
teamleaderleo deleted the chat-error-card branch October 23, 2026 11:40
teamleaderleo added a commit that referenced this pull request Oct 23, 2026
registry.ts conflicted with #24312, which registered turnErrorCard where this
branch registered threadMinimapLit; both stay registered.

Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16030-bf28-7072-b1f6-b83bbd0beacc&host=cosmic-gray
@github-actions

github-actions Bot commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ready-to-land Reviewed at this head; next-autoland merges it into feat-cmux-next when its only reds are base reds risk:normal Risk tier (docs/ci/risk-tiers.md)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant