# Issue 22796 backend proof matrix — pass 1

Audited head: c0fdbfd6b9b6173a0adaf25aeb7e7f43f0f6b185. Before/fork-point: 1688f965682d331da16a8c39f049592361f69c8d.

## Finding

The complete diff changes only Claude native fork session lookup, plus its focused test. No component, rendering path, fork dialog, wire schema, or MCP contract changes. Runtime proof must include the child's **first turn**: creating the app fork alone does not invoke native forkSession. ProviderTurnStartService.ts:647 performs the native fork when starting that turn.

The source transcript is located by the source provider thread's native session ID. Previously ClaudeAdapterV2.ts:10260 restricted lookup to runtimePolicy.cwd, which becomes B after the project root update even though the transcript remains beneath Claude home's project-A directory. Omitting dir searches by ID within the selected Claude home; the child still starts with the resolved current cwd B. This is not a change to workspace resolution.

## Matrix

| Row | Affected | Fixture / seed | Minimum proof |
|---|---|---|---|
| C1: Claude baseline, UI | Yes, lookup now searches | Isolated app/home; project A; complete Claude turn with unique A marker; fork through existing UI while root remains A; send child turn | Before and after transcript with SHA, source/fork session IDs, cwd A, inherited marker, completed child response |
| C2: Claude root update, UI | Yes, regression | Same source; update project root A to existing B; source transcript remains under A; UI fork selected completed run; send child turn | Before exact native fork error naming B; after successful child first turn at B and inherited A marker. Record root update and selected source run |
| C3: Claude root update, MCP | Yes, regression through second entry point | Same moved-root source; t3_thread_fork with sourcePoint; send child turn | Before/after MCP request/result plus child turn outcome. Before failure may occur after successful fork RPC; after child completes at B |
| C4: Original parent continues at B | Context/control | Resume original Claude parent after root update | Runtime response and cwd B; distinguish this from child evidence; proves original session remains resumable |
| C5: Cursor inheritance | Yes, options retain cursor | Source has known assistant message cursor; preferably add a later distinguishable turn and fork earlier run | Scoped adapter test or transcript shows upToMessageId preserved, inherited selected answer, child uses returned fork ID. Existing focused test covers cursor forwarding and inheritance at latest turn; earlier-turn exclusion can be established by existing cursor tests/SDK behavior, with limit stated |
| C6: Custom Claude home | Yes, worker dispatch | Temporary selected CLAUDE_CONFIG_DIR; real SDK JSONL under old-workspace; current runtime cwd /workspace | Focused test fails at before SHA and passes at head; generated fork transcript stays within selected temp home, inherited text exists, first query resumes fork ID at /workspace |
| C7: Host Claude home | Yes, direct SDK dispatch | Real app uses host-selected Claude home, source at A, root now B | One C2/C3 runtime with home-selection mode recorded; direct SDK call omits dir and subsequent inherited-head lookup searches by ID. If all runtime uses custom home, list direct-host path as unverified |
| C8: No cursor fallback | Yes, empty fork options | Source provider fork has no supplied provider turn/source turn list, or latest turn lacks native cursor with no later terminal turn | Existing scoped test or inspected existing branch proves forkOptions={} and complete-session fork succeeds; no new product behavior. If not executed, label this branch unverified |
| X1: Codex comparison | No, control | Same isolated project-root A→B procedure with completed Codex parent and child | Runtime fork/first-turn result at both roots with SHA; report observed behavior, not an inferred guarantee |
| X2: Mobile / remaining providers | No production change | Mobile fork and Cursor/Grok/OpenCode/Antigravity not required to establish Claude regression | Explicitly list unverified; do not claim cross-provider or mobile runtime coverage |

## Minimum combined evidence set

C1–C4 and X1 can share one scripted app session, but each attempt needs a labelled log excerpt and actual commit SHA. C2/C3 must distinguish fork request acceptance from deferred native fork failure/success. Record before/after project roots, source native ID, fork native ID where created, first-turn cwd, completed response or exact error. A single runtime using the host-home path plus the isolated custom-home scoped regression test covers both query-runner paths. Provider home must be recorded only as a sanitized selection label or synthetic test path; never publish credentials or personal transcript content.

C5/C6 need the focused existing test plus its revert/before failure and after pass. C8 can be scoped existing coverage or a declared unverified low-level branch. No screenshots, themes, viewports, pixel diffs, fixture commits, or UI captures are warranted because the production diff has no render change. A directory rename and a settings root update collapse to the same backend fixture (transcript in A, runtime cwd B); report which was actually run.

## Source coverage and limits

Read complete two-file diff, Claude query-runner host/worker dispatch, source cursor resolver, native fork adapter, MCP fork handler, ProviderTurnStartService native fork call, and UI fork caller locations. This pass derives required evidence; it does not certify existing logs or execute tests. Review already-established active-turn rejection and invalid cursor failure are unchanged and do not require new regression fixtures. No browser, server, forge mutation, gh command, or code edit was performed.

VERDICT: SUFFICIENT
