# Proof audit pass1

Scope: base dd5b5401e1, head 44a07ece341013093385bc9454da7d8934966bbb, branch fix/issue-22198. Complete diff inspected: two files, 17 insertions and one deletion. Read-only audit; no tests, servers, captures, edits in checkout, forge writes, or subagents run. Reported red/green and two MERGE reviews are supplied evidence, not independently rerun here.

## Capture matrix

Empty. No render path, client caller, route, layout, theme, viewport, or UI interaction implementation changes. Minimum viewport/theme captures: none. Web/desktop/mobile share the affected server behavior; separate surface captures would not establish native-session identity. No seed route required.

## Behavioral fixture matrix

| Changed path / branch / interaction | Seed or harness | Required observable proof | Pass1 evidence / pass2 requirement |
| --- | --- | --- | --- |
| Nested Claude MCP registration timeout classified as refusal before prompt; normal startTurn failure restores pending handoff to unsent | ProviderSwitch.integration.test.ts, parameterized “keeps the native session after turns refused for an MCP registration timeout”; wrapped ClaudeAgentSdkQueryRunnerError(method=setMcpServers) with tagged cause | Initial run completes, next two fail, recovery completes; generation remains 1, native ID unchanged, recovery prompt includes Request 2 and Request 3 | Supplied red 03f9386dc8: expected generation 1, actual 2; green 44a07ece34. Preserve test output/command and commit attribution in final proof bundle. Fixture inspected and assertions confirm retention plus missed-prompt delivery. |
| Real adapter query-open registration timeout, including resumed-open retry, reaches orchestration classification through wrappers | Isolated real CLI fixture; baseline completed Claude turn, wrapper drops only mcp_set_servers control replies; two normal messages; remove wrapper fault | Two failed runs with actual registration-timeout logs, then successful recovery retaining baseline native ID; no uncertain_history_delivery replacement for these refused turns | Before transcript inspected at /tmp/triage-22198/before-runtime.txt: two 90-second timeouts per failed message, ordinals 2/3 failed, ordinal 4 completed, uncertain_history_delivery fallback and replacement. AFTER transcript pending pass2; same injection must reach genuine timeout, not a synthetic throw. |
| Shared start dispatch selects compactThread for /compact, otherwise startTurn; recovery after refused messages | Same real CLI fixture: remove fault, issue /compact as in BEFORE | Baseline and post-recovery nativeThreadRef.nativeId explicitly equal AFTER; compact run completed; handoff delivery has no stale pending marker attributable to refused attempts; failed messages remain recoverable | BEFORE /compact replaced native session. AFTER must record baseline and final IDs, run statuses, relevant handoff state and recovery result. Existing integration fixture covers normal recovery, not an injected compact failure; no separate compact-timeout fixture required for this classification-only diff. |
| Existing refusal tags; non-refusal errors and successful acceptance | Existing parameter rows for background-work and unreadable append file; unchanged generic-error and delivered bookkeeping paths | Existing refusal rows remain green; new tag does not change unrelated errors or successful delivery | No new render fixture or broad provider suite needed. Missing-value refusal and ordinary errors are unchanged branches, not new implementations. |

The only production change is adding ClaudeMcpRegistrationTimeoutError to recursive cause-tag classification. It invokes existing delivery.unsent error handling; normal success still marks delivery delivered. No contracts, transports, client entry points, provider capabilities or connection-mode-specific paths changed. Other providers do not emit the Claude-specific tag. Scope is prevention while a resumable native reference exists: no repair of previously lost references and no oversized-summary fix.

## Required final proof

Attach the focused red/green regression output with exact commits/command, the supplied BEFORE transcript, and the matching AFTER real-CLI transcript at the fixed head. AFTER must name CLI/version and isolated setup, identify baseline native ID before injection, show genuine timeout failures for both messages, removal of only the fault, successful /compact recovery, retained native ID, and relevant handoff/run state. The regression proves missed prompts are included in recovery; runtime should show recovered behavior without publishing prompt content or credentials. BEFORE already proves replacement but has no explicit baseline nativeThreadRef snapshot: its pending delta native ID and final replacement ID support the contrast; an explicit baseline ID in AFTER is essential. Capture absence is intentional and appropriate.

FRICTION evidence|Pass1 has supplied red/green results rather than raw execution output|Include command, commit and focused output in pass2 bundle.
FRICTION runtime|AFTER real-CLI timeout injection remains pending|Repeat the same fault and recovery sequence; include native identity and persisted state, not only successful response text.
FRICTION scope|Screenshots cannot prove native session retention|Use regression plus runtime transcript; capture matrix remains empty.

VERDICT: SUFFICIENT proof plan for this server-only diff; final proof acceptance requires the pending matching AFTER transcript and attributable red/green output, not screenshots.
