# Reproduce this evidence (simulated WSL)

This bundle drives real Vite clients and real server RPCs. It does not mock components, asset URLs, or provider output.

1. Check out the before merge-base and after head from the evidence index; install each with `vp install`. Keep the before checkout at `/home/ubuntu/wt/pr-26030-before` and after at `/home/ubuntu/wt/pr-26030` or adjust the scripts' explicit paths.
2. Put these scripts in `/tmp/lead-26030-r1/evidence-capture`. Run `python3 setup.py`. It creates a fresh timestamped run, synthetic project, C and X drives under a custom mount, and executable `wslpath`. Linux symlink case aliases model Windows case-insensitive drive lookup, because metadata canonicalizes drive paths to lowercase.
3. Run `python3 start.py before`, wait for its `[dev-runner]` readiness line, then `python3 start.py after`, wait, then `python3 start.py control`. Each uses `T3CODE_DEV_SEED=0`, `--no-seed`, and a distinct explicit `--home-dir`. Before/after have `WSL_DISTRO_NAME=Ubuntu`; control has both WSL variables unset. The clock preload only freezes the server and CLI, never Vite. Read real ports from the logs and replace port literals in the drivers if occupied ports shift them. This run used 7006 / 7650 / 7651 for web and 15046 / 15690 / 15691 for server.
4. Start `node browser-host.mjs` as an owned background process, retaining its PID. It uses repository Playwright 1.60 and headless Chromium. Run `node send.mjs bootstrap-before.js`, then the after/control variants. They pair through the normal UI, create the synthetic project using configured Codex `gpt-6.1-sol`, and defer/stop fixture messages so no provider starts. Do not upload startup pairing URLs or browser storage.
5. Run through `send.mjs`: `observe-rpc.js`, `seed-combined.js`, `published-helpers.js`, `published-r1.js`, `published-r2.js`, `combined-c1.js`. The combined fixture has text first and image second in the same persisted thread. The older R1/R2 fixture threads are unused by the final R1/R2/C1 evidence.
6. `r3-stills.js` creates a new unsent project draft, inserts `@X:/Users/me/Documents/wide.png ` and reopens it so the app parser materializes the mention chip, then clicks the real chip. This is a real local draft, never sent. That original R3 capture was retained; copy those four R3 PNGs into the current still directory before diffing. `record-reviewed.js` repeats the same real draft workflow in fresh browser contexts and records every row. Its draft reopens with browser Back/Forward through the real SPA, avoiding a full-page reload in the recording. In its current form it writes the videos and manifest sequentially; wait for all eight manifest entries. All dates are fixed at 2026-10-27 18:00 UTC. Recordings run at 1440x1000 dark; still sizes/themes are in their names.
7. Run `environment.js` and `save-rpc.js` through `send.mjs`; run `runtime-proof.py` directly. The runtime proof opens only the synthetic isolated databases read-only and asserts/report zero provider sessions/turns. The request log stores request payloads only, including `draft-workspace-file`, never grant URLs, auth cookies, or responses.
8. Run `published-diff.py`, `make-sheets.py`, `finalize-videos.py` and `inspect-final.py`. Published video time zero is 0.5 seconds after ready; the manifest converts every step timestamp to that video origin. Each still waits for network idle and fonts with reduced motion, then requires two identical screenshots 500 ms apart. Diff0 maps every nonzero RGB difference to full magenta; DiffT maps max-channel differences greater than 8/255. Both use a quarter-bright grayscale baseline. Open every source and diff cell before upload. The row sheets are scaled overviews; all original PNGs are full surfaces at the named viewport.
9. Stop the exact captured server and browser host PIDs, verify ports closed, remove only the before checkout and this evidence subdirectory after upload. Never touch the lead checkout or live T3 userdata.

Accepted stills are in stills-20261027T181600Z; accepted raw recordings are in recordings-20261027T182800Z, and their final MP4s are in public-videos-20261027T183500Z. Earlier takes in the sanitized run archive are diagnostic/superseded, not the evidence selected by Evidence.md.

The capture paths in the diagnostic scripts name this specific original run. To rebuild in a new run, replace that run-directory literal with the path emitted by setup.py and update output-directory literals; create new output directories rather than overwriting an earlier attempt. Private pairing/storage files and auth-containing bootstrap videos are intentionally excluded from the upload.
