# Evidence recapture

Only E2 recordings (WD, NL, WL, ND, both revisions) and E4-WD recordings (both revisions) are replaced. All earlier stills, diffs, E1/E3/E5 recordings and E4-NL recordings remain unchanged.

Before: [ac5e48c612](https://git.cafe/pingdotgg/t3code/commit/ac5e48c612061895511f549d363a2186a6a005ea). After: [5449da173a](https://git.cafe/pingdotgg/t3code/commit/5449da173ac11ec3c86f5786d265810d4eaac211).

Both detached worktrees were created for this recapture and installed with `vp install`. Servers started with `T3CODE_DEV_SEED=0 vp run dev`; ports from dev-runner were before 15745/7705 and after 15020/6980. Each revision created its own database and ran the same seed driver through the real app. No live database was used and no source file was changed. No agent turn or provider update was run. The only registered fixture was the synthetic project under this recapture's scratch directory, displayed as E4.

The browser was T3 Code preview's headless Chromium 157 on Linux x86_64, DPR 2, no device emulation, 100% zoom and font scale, 16 px root font. WD/WL are 1440×1000 CSS px; NL/ND are 390×844. Themes follow the matrix. Reduced-motion emulation is not exposed by preview; native preference remained no-preference. Settings/navigation scroll positions were zero and the main sidebar was collapsed.

Reuse `recapture-driver.js` after privately pairing each server. It loads the adjacent helper expressions and creates a fresh timestamped run directory under `/tmp/lead-32537-r1/evidence-capture-2`. The actual captures were executed in sequential preview-tool calls with these same helper functions; manifests identify the retained run paths. There are no pairing URLs in the published drivers or manifests.

`recapture-support.js` first navigates the owned tab to the same-origin JSON auth-session endpoint, which loads no app scripts. It fetches the unmodified app HTML, injects the fixed Date prelude as the first head script, sets the app route with history.replaceState, and writes the document. This freezes Date before app modules execute, without changing source files. Every app-document load during seeding uses this path. Date is 2026-12-01T12:00:00.000Z; timers and performance.now continue normally. E2 asserts the exact `Checked 20d ago` text before recording and at every step. The label is naturally hidden at narrow widths; its DOM text is checked there too.

E2 starts by focusing Enable Codex programmatically, then uses real Tab presses for Select Claude, Claude's naturally present update advisory, and Enable Claude. The advisory is a native tab stop between the select button and switch, so reaching the switch requires two Tab presses after the select button. Each key step asserts the active element and :focus-visible, then takes a preview snapshot to deliver the painted state before advancing. Selection stays on Codex and both providers remain enabled. The switch's focus ring is inset and subtle against its blue track.

E4 starts with an explicit Claude off override at project scope. It clicks the midpoint of the measured 4 CSS px reset/switch gap, resets selection to Codex, opens and dismisses inheritance, resets the override, then toggles Claude off and on. Both sides use the same action script. Every step waits for both select buttons' aria-pressed values, the editor heading, row opacity, transition completion and the selected background to agree. `visual-settle-driver.js` also reads the selected/unselected backgrounds from actual PNG pixels. Immediate preview snapshots after pointer actions avoid the delayed compositor paints observed in rejected takes. No frames were trimmed, spliced, substituted or retimed.

Frame review decoded every encoded frame at its presentation timestamp. Full frames and crops were inspected around every narrated step; contact sheets retain the provider rows, checked label, editor and relevant controls. The retained E4 after recording changes the editor, highlight and opacity together, and returns them together on Codex reset. All E2 final frames retain Enable Claude as the active focus-visible element. Published recordings retain full viewport frames: 2880×2000 wide and 780×1688 narrow. Inspection crops are supplemental only.

The earlier process-evidence.py and publish-evidence.py are unchanged and not rerun for the retained stills. `check-video-frames.py` is the supplemental recapture review helper. FFmpeg reports duplicate DTS values while decoding the variable-frame-rate preview videos; all encoded frames were decoded and counted successfully. Recordings are uploaded unchanged from preview output.

Uploads contain synthetic UI data only. No credentials, pairing URLs, raw server logs, or private runtime model identifiers are published. All servers/tabs/worktrees created for this recapture are removed after publication. The PR body is not edited.

AI-assisted; verified with the tools and checks above.
