# Capture round 2 reproduction

Before: detached base `0a9abddaee00ff1495e77a03dd4fafa73c3cd4cb`. After: `9197794bca566be1064d4bbdf52c02d1e9c8db7b`. No source changes, commits or pushes.

Run the real app separately in each checkout with `T3CODE_DEV_SEED=0 T3CODE_AUTO_BOOTSTRAP_PROJECT_FROM_CWD=0 vp run dev --home-dir <checkout>/.t3/capture-round2`. Read its ports from the runner. Pair a fresh incognito T3 Browser tab using the private startup link. Do not publish this link. Complete onboarding with imports unchecked. Run `seed.js` through the T3 tool runner. This sets only the base directory through Settings.

Synthetic fixture: create `/tmp/lead-32605-r1/capture/fixtures/demo-folder/`; leave `/tmp/lead-32605-r1/capture/fixtures/missing-destination` absent. No real database seeded, no agents started, no project added or clone performed.

For B0–B3 load `preview-driver-original-paths.js`, then call `runCapture(tools,{tabId,side:'before' or 'after',row:'B0' through 'B3'})`. Each run gets a unique timestamp directory. `preview-driver.js` is the shorter-path retake variant; its retake could not run after the tabs disappeared, so it is not the source of the delivered recordings. Original A/B/C/E/W use the round-1 driver and seed linked in evidence.md.

All runs: Chrome157 Linux, T3 Browser, desktop UA, no device emulation, DPR2, 100% zoom/font scaling, root16px, scroll0,0, browser Date frozen2026-11-10T12:00Z. Recordings1440×900 light. W stills retained from accepted round1 at1440×900 light and390×844 dark. Native reduced-motion override unavailable; W originally waited fonts/resource quiet and two identical screenshots500ms apart. No live data read.

`decode-media.py` decodes all video presentation frames with ffmpeg and maps sample times to the frame held on screen. `finalize.py` extracts the selected frames again using their exact ffprobe presentation timestamps, compares each extraction with the decoded reference at zero threshold, and creates whole-viewport contact sheets. `verified-media-index.json` records exact media timestamps, claims and filenames. Use these media timestamps, not the wall-clock DOM-sampling times in transcripts. The preview recorder is variable-frame-rate and UI paints can lag DOM focus samples; a naive `-ss` seek to an arbitrary sample time may return the next UI state.

Every selected full frame and contact sheet was visually reviewed. Supplementary step screenshots and activeElement transcripts are included. B1/B2 long destination text clips at the input edge: focus traversal is verified, presentation quality remains limited. Early exploratory helpers (`extract-verified.py`, `find-a-focus.py`, `inspect-browse.py`, `scan-browse-focus.py`) use approximate seeking and are retained solely to disclose every script written. Their outputs are not the authoritative verification evidence.

Upload: `upload-round2.py` uploads clips, transcripts, step screenshots, exact-PTS frames, contact sheets, scripts, manifest and bundle with `ghdrop upload -m`; verbatim output in uploads.md. Old accepted W assets/diffs and old clips keep their original immutable upload links. Cleanup: both owned server sessions stopped, ports confirmed closed, owned recovery tab closed, before worktree removed. Scratch remains for the lead.

AI-assisted; verified with the tests and tools listed above.
