# Evidence corrections, round 3

For [#29013](https://git.cafe/pingdotgg/t3code/pull/29013), after [77041abe04](https://github.com/pingdotgg/t3code/commit/77041abe0468bbb5b91c485bafb5a6df1b26385f), before [dd6c05ec31](https://github.com/pingdotgg/t3code/commit/dd6c05ec313c6c870c7a7688e87143da5084031d).

The round-1 and round-2 directories remain untouched. R1/R7/P1 and the accepted R2-extra recording retain their URLs. R2/R3/R5/R6 reuse their round-2 recordings and final stills. Every one of round 2's 58 narrated milestones was independently extracted and inspected; round2-retimed.json records the first video frame whose milestone label matches the already-settled state. This includes the superseded R4/R3-extra recordings. All published narration uses exact hundredths at the 25 fps frame grid. Burned-in t= is the original driver mark and can differ slightly from the video presentation timestamp; driverElapsed preserves it.

## Head-only recapture

Run `node rebuild.mjs` with the existing head checkout at /home/ubuntu/wt/pr-29013 and its Playwright 1.60.0 dependency. This captures only R4 and R3-extra. The server creates a fresh database in a unique scratch --home-dir with T3CODE_DEV_SEED=0; it never reads live userdata. VITE_HTTP_URL and VITE_WS_URL are removed from the child environment. The synthetic fixture is unchanged: twenty Replay turns and two real Cite/Save/Send quote turns in a synthetic git project. No product source is changed.

Chromium 148.0.7778.96 on Linux fs-21, dark, DPR 1, 100% scale, reduced motion, fixed clock 2026-11-04T12:00:00Z. R4 is responsive web 390×844; R3-extra is web 1280×800. No mobile/touch emulation.

R4 diagnostics are entirely hidden. Its full product viewport remains unobscured, including both sent quotes, transcript, Usage/X, PR/Back, and sidebar controls. Per-step route/hash/scroll values come from the driver event JSON and are written next to the linked review frame in the index. The sheet's external header identifies the SHA. Its narrated times select inspected frames 0.7 seconds after the settled driver mark, snapped forward to the 25 fps grid. No stale visible label exists.

R3-extra retains the right utility-area overlay and adds overflow-wrap:anywhere and word-break:break-all, so the exact URL's full query wraps inside the panel. Its narration selects the first video frame matching the new label and rendered state, including the exact saved PR URL both before and after Usage.

Before every mark and still, driver.mjs waits for concrete destination content, no visible skeleton/spinner/loading status, network idle, fonts, and two pixel-identical screenshots 500 ms apart. The driver never corrects a return scroll position. Process descendants are recorded with Linux start IDs. This run also captured and verified the Vite/server port owners and their ancestor/descendant tree before teardown; cleanup-verification.json confirms ports 7992, 16032, and the recovery controller 19315 were free. Chromium and the temporary preview tab were closed. Updated reproduction tracking also records listening owners in case vp reparents a child.

## Frame selection and publication

process-evidence.py trims the raw WebM by videoStartOffset and encodes H.264 CRF 18. retime.py checks all nine immutable round-2 MP4s against their original settled milestone screenshots using ffmpeg frame extraction. finalize-frames.py merges the retained retimed metadata with the two new captures and creates exact-time review frames and storyboards. Index narration distinguishes MP4 presentation times from driver marks. It writes all R4 metrics alongside each frame because diagnostics are hidden.

All 58 original timestamp selections and all 18 replacement frames were opened and visually checked before upload, including every published frame. The two replacement final stills, nine updated storyboards, and two replacement final sheets were inspected. R2/R3 final stills, Diff0, DiffT32, and their pixel/unchanged-region statistics are retained from the accepted round-2 audit; only SHA labels beneath their four Markdown image columns change.

Uploads contain synthetic images/video, public forge list metadata, driver sources, and synthetic route/scroll measurements. Homes, databases, auth state, pairing URLs, private logs and process records are excluded. ghdrop's exact Markdown output is retained in upload-manifest.md. The PR body is unchanged.
