# Reproduce the five refreshed evidence rows

Before: [e5b0718a8a](https://git.cafe/pingdotgg/t3code/commit/e5b0718a8a297823920d1bf3a7d5cbacd57263ea). After: [dfdf1c7e6e](https://git.cafe/pingdotgg/t3code/commit/dfdf1c7e6ec922a535fddd92417905784b162676). No tracked source changes were made. All provider/account data is synthetic. No paid agent turn was run.

Scratch: `/tmp/lead-32534-r2/capture`. Before checkout: `/home/user/wt/pr-32534-before-r2`; after checkout: `/home/user/wt/pr-32534`. Create before with `git -C /home/user/t3code worktree add /home/user/wt/pr-32534-before-r2 e5b0718a8a297823920d1bf3a7d5cbacd57263ea`, then `vp install` there. The capture scratch directory has a `node_modules` symlink to the after checkout's web node_modules; harness server aliases fonts, React and React DOM to each server's own checkout.

Launch scripts with `python3 launch.py <name> <cwd> <command...>`. This preserves a spawned process-group PID and timestamped logs. It sets `T3CODE_DEV_SEED=0` for every server. Start the app instances with `vp run dev --home-dir /tmp/lead-32534-r2/capture/home-before` in before and the corresponding `home-after` in after. These homes were initially absent. Each own server created its own fresh database. Never seed from the live install. Read the resulting web ports; this run used 8267 before and 8210 after. Scripts must be adjusted if ports shift. Start `node mock-cliproxy.mjs` on 61436. Pair through the startup URL using `node pair-app.mjs before after` (startup tokens and resulting `auth-*.json` storage states are private and excluded from uploads), then `node seed-real-app.mjs`. It adds the synthetic source through Settings → Providers → Add hub. The capture driver sets Usage preferences to Limits, freezes Date to 2026-10-25T16:00:00Z, uses system theme with explicit media light/dark, and dismisses CPU-overload notification toasts through their real close controls. `node capture-real-app.mjs` produces I1: W light/dark and C light. It verifies real popover open/dismiss afterward. The final clean run is `integrated-2026-11-10T17-34-46-613Z`.

For combinations without a seed driver in this run (R1 and B2), use the labelled real-component harness: `node harness-server.mjs <checkout> 61435` before and port 61434 after. It imports each checkout's actual UsageLimitsPooled, WorkspacePageContainer, app CSS and Inter. Hot reload and file watching are disabled. No component markup or product logic is copied. The query fixtures create synthetic presentations. R1 uses the original A4/T1 long name and 12 reset credits at pool 672px (954px wrapper in a 1280×900 viewport), reset exactly at N. R1-near uses N+30s. B2 uses three accounts named Synthetic Work Account 1–3, two credits each, no reset pill text; all account labels and credit pills fit. `node capture-extra.mjs` produces the stills and R1 transition recording. Its first A1R/K1 recordings were superseded; use `capture-interactions.mjs` for the final A1R/K1 videos.

`capture-interactions.mjs` keeps the same mounted page for W → C → W. CDP Page.startScreencast records actual compositor frames, including the resize transitions. Each direction has 45 viewport increments, requesting 40ms per step; actual timing is in timeline.json and varies with host load. It additionally captures real endpoint screenshots after two byte-identical screenshots 500ms apart, and holds each endpoint. Those screenshot events are labelled in timeline.json; no resize interval is removed. The accepted final A1R/K1 run is `interactions-2026-11-10T17-39-07-214Z`. The final K1 driver verifies bar focus after Tab independently before Enter and Space. Escape is pressed twice to dismiss the focused email tooltip and then the popover. Hovering opens details; clicking the already hover-open trigger toggles it closed. The recording preserves this actual behavior.

All stills wait for network idle, Inter/fonts, reduced motion and two equal screenshots 500ms apart. Viewports are 1280×900 or 390×900, DPR 1, no device emulation, root font 16px, no font scaling, en-US/UTC; scroll is [0,0]. The supplied `now` changes only in R1's transition recording (N to N+31s); Date.now stays frozen at N. The expired R1 still uses reset at N and supplied now N.

Create a scratch Python venv with Pillow and NumPy. Run `process-evidence.py <capture-directory...>` with that Python: it writes amplified magenta diff masks at any channel delta >0 and >16, full-viewport Before/After/Diff0/DiffT sheets, timestamped MP4s, and contact sheets containing every actual screencast frame. MP4s pad real frames into a fixed 1280×964 canvas (64px narration header); compact viewport images retain their native size. The frames.ffconcat intervals preserve elapsed frame timing. Run `make-detail.py` for an additional R1 pill crop (full surfaces remain available), and `probe-layout.mjs` for pill geometry. Raw actual frames and timelines are preserved in the uploaded archive. Do not upload auth state, server logs, app homes, credentials or databases.

Stop only retained spawned process groups, remove the before checkout with `git -C /home/user/t3code worktree remove --force /home/user/wt/pr-32534-before-r2`. No PR comment, body edit, push or commit is part of this procedure.

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

Final full-app A1R/K1: restart both own dev servers against their existing isolated synthetic homes, then run `node capture-real-interactions.mjs`. Final run: `final-real-interactions-2026-11-10T17-52-54-520Z`. These supersede the component-harness A1R/K1 videos, which are retained only as supplementary captures. The driver tabs from the Codex heading to the bar and verifies actual keyboard focus before each activation. Escape is conditional on details remaining open, so it does not close the enclosing Usage dialog. `package-real.py` extracts the byte-stable live wide/compact endpoint screenshots for static diffs, encodes the actual screencast frames with their timestamps, and packages the final full-app recordings.

CDP packet validation: run `venv/bin/python filter-screencast.py` before packaging. It rejects PNG packets whose encoded dimensions disagree with CDP-reported viewport dimensions; accepted frames retain original elapsed timestamps, source IDs and recording duration. Rejected packets remain locally in the original capture directory, with dimensions listed in rejected-packets.json. Submitted A1R recordings each retain 13 distinct viewport widths and verified endpoints.
