Issue 15243 — proof audit pass 1 Scope: read-only audit of /home/ubuntu/wt/issue-15243. Base: b5a226e49c52ecab4ddc2d678a7012d97e651a6a Head: a1bf1721b6fa7906bf5964188abeeb8c0c92ac55 Decision: server-only exception APPLIES. Visual matrix: ZERO ROWS. The complete diff changes only ClaudeAdapterV2.ts and ClaudeAdapterV2.test.ts. No renderer, style, navigation, client runtime, contract, or visible render surface changes. Existing success/error UI displays a different outcome because session opening is fixed; that does not create a changed visual surface. Screenshots or recordings are not mandatory. 1440/390 widths and light/dark combinations: not applicable; no visual rows to multiply. No browser, capture, dev server, source edit, push, comment, or tests run by this audit. Behavioral scope and required runtime proof 1. Imported conversation, FIRST T3 follow-up (critical before/after case). Seed: create a real terminal Claude conversation in a disposable project; import that project through /welcome in isolated T3 state. Keep its strong native ID, null native conversation head, and zero T3 provider turns. Send a unique follow-up exactly once. Expect: SDK options resume=, sessionId absent; successful response using imported history, same native ID, no Provider turn failed, no resend required. 2. Subsequent follow-up and fresh provider-runtime instance. Seed: reuse case 1, send another prompt; unload/restart only the isolated environment and send again. Expect same session resumed, preserved context, successful completion. 3. Fresh T3 Claude thread / fresh native ID after previous provider-thread turns. Seed: create a new Claude thread; separately exercise a fresh native binding after handoff/replacement with nativeThreadHasTurns=false. Expect sessionId for the new ID, not resume. Existing native session identity tests cover ordinal 4 with explicit false. 4. Empty metadata-only transcript guard. Seed: in disposable CLAUDE_CONFIG_DIR, make projects//.jsonl containing metadata but no user/assistant message, bind/resume that ID through isolated runtime. Expect resume rejection and existing fresh-session/context-handoff recovery. Preserve this behavior; never modify a real user's transcript. Existing resumeThread test covers it. 5. Missing/unreadable transcript fallback and live-query bypass. Seed: disposable config with absent ID or deliberately unreadable transcript; separately resume an already-live matching native query. Expect existing CLI-delegated behavior for unknown state; live process must not be rejected for an unsaved transcript. 6. Multiple copies / configured Claude home. Seed: disposable CLAUDE_CONFIG_DIR with the same ID in two project directories, one metadata-only and one containing conversation. Expect conversation to win and resume. Relative configured home resolves against session cwd; absent setting uses host home. Do not use production home for destructive fixture setup. Cases 1–2 are the concise real-app runtime transcript; cases 3–6 are regression guard branches suitable for focused adapter proof. No images or recordings required for any case. Caller/surface reasoning resumeThread is reached through provider turn start/session management; it now classifies saved transcripts as conversation/empty/missing and marks conversation IDs opened before startTurn selects SDK resume versus sessionId. ensureThread fresh creation is unchanged. The common server adapter covers web (hosted/local), Electron, mobile, agent-triggered turns, and local/remote/relay/tunnel access; no client-specific fixture matrix is needed. Other provider adapters are unchanged. Session loading also serves existing operations such as compaction; they inherit the corrected Claude session identity selection. Evidence assessment Before transcript inspected: https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b94090abf3c8592a/issue15243-before-runtime.txt It records baseline first follow-up failure, sessionId usage, direct CLI 'already in use', and resend success with resume. It is valid BEFORE evidence, not fixed-head evidence. History confirms test-only commit 56630f851c7d9d3cbd7e9bb6d0205564dc28ec45 precedes fix. The fix commit also amends the fixture to supply an isolated real conversation transcript. Final fixture proven red on baseline and 230 scoped tests green are supplied reports; this read-only pass did not rerun or independently inspect their execution logs. Remaining proof gate: attach fixed-head runtime transcript for case 1 (prefer also case 2), and retain red-baseline/final-green logs for the amended fixture. Do not call proof complete from the before transcript alone. FRICTION category|event|prevention proof|Only before runtime transcript supplied|Attach fixed-head first-send success and SDK resume fields fixture|Test fixture amended after initial red commit|Retain red baseline run of final fixture, not only initial test commit scope|Visual grids could overstate a server-only change|Keep zero visual rows and use behavioral transcript proof