# Reproduce the A–D evidence for issue 24067

Before: [28286d523f](https://git.cafe/pingdotgg/t3code/commit/28286d523f). After: [f651bd79c4](https://git.cafe/pingdotgg/t3code/commit/f651bd79c4). No application source changes were made by the capturer.

1. Create the two detached worktrees named in the brief and run `vp install` in each.
2. Put the downloaded scripts together in one empty scratch directory outside the worktrees and outside T3 home. Run `python3 make-capture-fixtures.py before` and `python3 make-capture-fixtures.py after`. The generator creates fresh run directories and one shared synthetic Git project. The transcript timestamps and source mtimes are pinned to 2026-10-27 for this evidence; reproduce on that date or update the pinned date/mtime together to remain inside the 30-day discovery window. The same A–D transcript bytes are used on both sides except their enclosing home paths.
3. Run `python3 run-capture-app.py before` and `python3 run-capture-app.py after`. It sets `T3CODE_DEV_SEED=0`, `CODEX_HOME`, and `CLAUDE_CONFIG_DIR`; launches each real checkout with its own isolated state; records its process-group PID. It does not set VITE_HTTP_URL/VITE_WS_URL.
4. Read the actual web ports and one-time pairing links from each server log. Open each app in the T3 Browser panel and pair. A reused tab may require explicitly pasting its new one-time token in the Pairing token input.
5. Use the exported `onboard` helper from browser-driver.mjs: /welcome → Continue → Continue → Projects. Select none, Select all, Import 1 project. Wait for import completion and Settled 4, then expand Settled only if its rows are hidden. Open A–D by the driver selectors. The source session IDs are in the generated manifest.
6. Set dark/light via preview_set_appearance and freeform viewport 1440×1000 or 390×844. These are responsive web layouts, with no native device/UA emulation. DPR=2, root font=16px, zoom/font scale=100%. Keep sidebar visible at 1440. At 390 close it for thread pictures and capture it separately once per theme.
7. Freeze the browser Date to 2026-10-27T12:00:00Z using frozenClock after each full navigation. The driver’s exact prepareExpression waits for document.fonts.ready and 700ms with no new resource entries, clears focus, dismisses the same provider error on both sides, closes thread details, sets the requested scroll boundary, and settles 700ms. The browser has no reduced-motion override; actual prefers-reduced-motion remained false. No continuous animation appears in accepted frames.
8. Use captureSource in functions.exec with its tools/load/store/text bindings. It moves the pointer away, takes two full-viewport snapshots ≥500ms apart, and calls accept-frame.py. It accepts only identical pixels, without modifying the source screenshots. Capture A/C at top and bottom in all four profiles; B at top in all four and bottom in narrow profiles; D at top in all four. Capture the shared narrow sidebar in both themes. Top means scrollTop=0; bottom means the maximum scroll boundary on each side, whose numeric offsets differ when history becomes shorter. Exact offsets and page text are in capture-manifest.json.
9. Run make-diffs.py. Diff0 marks every nonzero RGB-channel delta magenta at full intensity (binary amplification ×255); black means no changed pixels. DiffT16 overlays red for max channel delta >16/255 on a faded grayscale after frame. Both compare the whole exported frame with no masking/cropping. The sheets contain the four unmodified images, plus labels outside their bounds.
10. Start a fresh after server with `python3 run-capture-app.py after /absolute/new-isolated-home` for recording the real first import again. Start preview_recording_start on Projects, run importAndOpen, hold the final control view several seconds and force a final snapshot before preview_recording_stop so the recorder flushes its last frames. The exported driver is the actual tool sequence, including observational waits and provider-banner dismissal. No provider turn is started.
11. Focused verification: `vp test run apps/server/src/project/AgentSessionScanner.test.ts` (64 passed) and `vp test run apps/server/src/project/AgentSessionImporter.test.ts` (3 passed), executed in the after checkout. No repo-wide check was run.
12. Upload with upload-assets.py, retain its stdout verbatim, then stop only captured process groups, close owned browser tabs, remove the two capture worktrees and this scratch directory. Never seed from or write a server against live userdata.

Rendering: Linux fs-11; T3 Browser panel, Chrome 156.0.0.0; DPR 2. Wide source CSS viewport 1440×1000 exports a full-surface 1280×889 PNG because the Browser screenshot tool downsamples it. Narrow CSS viewport 390×844 exports 780×1688. No screenshot is cropped to fake the viewport.

The seed archive contains only four synthetic provider rollouts per side and their manifests. It contains no T3 databases, credentials, pairing links, real conversations, or authentication files.
