# Replaying the evidence

Pinned baseline: [083c903950](https://github.com/pingdotgg/t3code/commit/083c9039505fc9207b88343e19d0a3de4a5e622d). Pinned head: [d3e3620310](https://github.com/pingdotgg/t3code/commit/d3e3620310e8489e1cee5776e79d64ad7173bc63).

All data is synthetic. Nothing is copied from live T3 userdata. No provider turn, guide generation, hosted mutation, comment, push, or source modification is needed.

1. Put the downloaded scripts in `/tmp/lead-28056-r1/evidence-capture/`. The capture drivers use Playwright installed in `/home/ubuntu/wt/pr-28056/apps/web` and import the actual application modules through each checkout's Vite server.
2. Use separate checkouts at the two pinned commits, at `/home/ubuntu/wt/pr-28056-base` and `/home/ubuntu/wt/pr-28056`. Install each checkout's dependencies with `vp install`.
3. Create the synthetic repository once: `python3 seed.py /tmp/lead-28056-r1/evidence-capture/repo`. Use a new scratch directory for a repeated seed; do not overwrite an existing Git fixture. The driver resets dirty contents between runs, but does not recreate Git history.
4. Start each checkout with `T3CODE_DEV_SEED=0 vp run dev`, saving its stdout privately as `before-server.log` / `after-server.log` in the scratch directory. Use fresh isolated dev state at that checkout's migration level. Never seed from the VM's live database. Read the actual ports from `[dev-runner]`; this run used web 6200 / 5760 and server 14240 / 13800. The capture drivers accept `BEFORE_PORT` / `AFTER_PORT` overrides if those ports shift. No Vite origin override is used.
5. Run `node capture-app.mjs before D1`, then `node capture-app.mjs after D1`. On the first run the driver reads that side's private startup pairing token, pairs through the normal UI, and creates one project and thread through the real RPC. Its saved `private-*-auth.json` files and server logs contain credentials and must never be uploaded. Later runs reuse this isolated dev session. The selected scope and wrapping/whitespace settings are normalized before interaction timing begins.
6. Run `CAPTURE_EXTRA=0 node capture-app.mjs before D2`, then the same command with `after`. These are the primary 1440×1000 light recordings. The driver externally mutates each tracked file only after recording its cached patch hash, then clicks a context separator without focus or refresh. The baseline's truncation crashes the app; it must reload before the remaining cases. Append/branch refresh can also reach the baseline error boundary. The fixed build refreshes and renders numbered context.
7. Run `D2_CASE=D2a-truncate node capture-app.mjs before D2`, then `after`, for the additional settled end-state stills at 1440 and 390 CSS pixels, light and dark. The 390-wide stills select stacked view to keep the separator label legible; 1440 uses split. The baseline root error prevents either control from being reached, so it retains the same error screen. These recordings are supplemental; primary clips do not change viewport or theme.
8. Run `node capture-harness.mjs before <row>` and `after <row>` for P1, P2, G1, G2, G3, G4. These visibly labelled harnesses mount the pinned production components and the real shared PR contents loader. P1 controls query/RPC hooks; the guide harness returns controlled successful RPC results. No hand-thrown stale error is substituted. G2 changes a source hunk outside the excerpt, then changes the parsed patch and cache key on refresh. The harness does not prove hosted authentication, routing, persistence, or guide generation.
9. Every driver creates a new timestamped output directory, captures video, logs interaction timestamps and synthetic contents requests, freezes Date at 2026-11-03T12:00:00Z, and waits for network idle, fonts, and two identical screenshots 500 ms apart. Reduced motion is enabled. The primary viewport is 1440×1000, DPR 1, 100% zoom/font scale, no device emulation, headless Chromium 148.0.7778.96 on Linux x86_64.
10. `runs.json` names the selected runs. `package-evidence.py` creates full-size captures, binary amplified Diff0 / Diff16 images, labelled sheets, raw recordings, trimmed MP4s, and transcript copies. Diff0 marks any nonzero RGB channel change in magenta; Diff16 marks max-channel differences above 16/255 in orange. Counts are in `manifest.json`. The D2a refresh-outcome comparison reuses the baseline's unchanged error screen because it has no Refresh control, against the fixed build's actual refreshed context.

The normal Collapse all / Expand all cycle in the recordings remounts the diff viewer before loading context. It avoids a pre-existing metadata-identity problem observed on both pins, where a successful contents read could otherwise leave context collapsed. The driver scrolls the file list to collapse virtualized offscreen files, then returns to the top. Diagnostic drivers are included in `all-driver-scripts.tar.gz`; they are exploratory, not the evidence capture path.

The normal theme worker also logs `Theme "pierre-dark" has not been resolved` on both builds. Those logs are retained in transcripts. Expected stale-content rejections, renderer failures, and uncaught errors are reported separately. No zero-console-error claim is made.

Stop only the processes started for this run. Remove the temporary baseline checkout after capture; leave the maintainer's head checkout untouched. No evidence is committed.
