# Rebuild the synthetic fixture

No live userdata was read or copied. Both checkouts used T3CODE_DEV_SEED=0 and independent fresh .t3 homes. Source = mock Grok; target = mock Codex. This is a seeded real-app null-ref fixture, not a naturally omitted provider ref.

1. Use the exact base/head revisions in Evidence.md; vp install in each. The mobile installer script was absent at these revisions. mobile-native-client.ts is the current-main installer copied to scratch with CAPTURE_CHECKOUT controlling repo root. The scratch package.json exposes vp run mobile:install, without editing the after checkout.
2. Create scratch/project as an empty git repository. Run setup-fixtures.py, then restore the uploaded grok-source, codex-target, grok-text-mock-agent.mjs and codexCollabMockPeer.mjs verbatim (the uploaded versions include the final mock version strings). Keep codexMultiAgentWire.json beside the Codex mock.
3. Start each checkout with T3CODE_DEV_SEED=0 vp run dev. Read actual web/server ports. No VITE_HTTP_URL or VITE_WS_URL. Seed driver speaks the actual Effect JSON RPC protocol and acknowledges streaming chunks.
4. Mint separate pairing credentials through node apps/server/src/bin.ts pair --base-dir <checkout>/.t3 --ttl 2h. Keep credential files private. Run node seed.mjs <server-origin> <private-credential-file> before|after W|N|A|I on each side. Each invocation writes a fresh timestamped run directory. Source turn is dispatched, completed, captured, then its real provider session detached. The RPC snapshots and command/event logs are in synthetic-fixtures.tar.gz.
5. Stop only the owned server PID. Apply null-ref-all.sql to the isolated .t3/userdata/statev2.sqlite. This changes active source provider-thread payload_json.nativeThreadRef only. Restart and verify getThreadProjection: no sessions, one completed run, matching source association, null ref. Startup recovery reported zero terminalized runs/stopped sessions/requeued effects.
6. The final target-script.json produces a visible completed agent message. Use real app controls to select target and send; do not dispatch the after-side message with a driver. F01-W-target-transport.json shows the prior-history injection, and F01-W-v2-completed.json proves the completed Codex run. N completed as well; its clip includes the final mock reply at about 19.5s, with JSON completion as supplemental proof.
7. Follow browser-capture-driver.js for UI actions; settled-still.js for identical-frame checks. Before/after W composer stills were retaken using duplicate synthetic source thread 006 on head, 004 on base. History/title/model/theme match; only internal synthetic IDs differ. Main recordings use 004 W and 005 N on both sides.
8. policy-proxy.mjs is an attempted client-policy harness for F03-F06 and is NOT evidence of those rows. It was not accepted for capture. No fake adapter negotiation or backend acceptance is claimed.

The browser tool has no reduced-motion emulation; fonts.ready + network-settled state + two identical screenshots 500 ms apart were used. See per-file manifest for hashes and exact rendering sizes.
