# Reproduce this capture

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

The evidence tests only R01, R02, R07b, R09b of the supplied matrix. No production code is changed. Only the synthetic Replay transcript in each disposable checkout is replaced.

Create detached checkouts at `/home/user/wt/pr-32826-cap-before` (20c3dd3689782bfcb1a04332086d08017028c718) and `/home/user/wt/pr-32826-cap-after` (f57ff765d849ae3b730e7ccdc5bbd86a0219c97a). Install dependencies with `vp install` separately. Extract this bundle into `/tmp/lead-32826-r2/capture-1`. Every helper currently uses these explicit scratch/checkouts paths; adjust them together to relocate. Never use another checkout's database.

1. `python3 make-fixture.py long` writes the identical two-turn synthetic Replay fixture into both checkouts; fixtures are also included verbatim. `start-dev.py before` and `start-dev.py after` start separate real dev servers with `T3CODE_DEV_SEED=0` and record PIDs. Read the actual ports from their logs. Initial capture used web/server ports7399/15439 and6650/14690 respectively. No live database was read or copied. No VITE origin overrides.
2. Create the empty synthetic workspace at `scratch/workspace` and initialize git in it. `seed-clean-long.py <side>` starts a free Replay showcase turn through the checkout's CLI and isolated base directory. The app must finish that history before the next step. `setup.js` and `prepare-clean-long.js` navigate and prepare the UI. Select Supervised permissions, send again to repeat the history after provider reset, then once more to reach the pending edit approval. `prepare-clean-resume.js` handles the completion milestone. These helpers preserve the exploratory steps; the final invariant matters: content4048px, viewport848px, no anchor, following=true, working=true, held at approval.
3. Pair each browser with its own server: `node apps/server/src/bin.ts pair --base-dir <worktree>/.t3` from that checkout. Save each private one-time URL to `pair-<side>-private.txt`. `browser-driver.mjs` opens Playwright Chromium with both contexts and serves a local driver endpoint19827. Its Playwright/chromium paths reflect the actual installed1.60.0 build and can be adjusted to the local install. Pairing files and browser storage are intentionally excluded from uploads. Browser Date is frozen; performance clock and stream remain live. `save-private.js` can preserve private storage for `browser-driver-restart.mjs`.
4. `python3 run-final.py <side> R01` runs `prepare-stream.js` then `capture-r01.js`. It opens/closes toolbar and Ctrl+J, drags both directions, and reverses rapidly. Approval remains pending, so the real turn is quiet but working. `settled.js` takes the quiet screenshot control pair500ms apart. The accepted data is R01-before-result.json and R01-after-result.json.
5. `python3 run-final.py <side> stream` uses `capture-stream-final.js`: approve held edit; close/reopen tall drawer during the extended streamed markdown; continue observing after settle; then wheel away, click the actual end button, await physical distance<=1, close/reopen; repeat with resize121ms after end click. Accepted output is stream-before-result.json/stream-after-result.json. Both R02 and R09b run in the same uninterrupted real turn. The synthetic paragraph stream continues long after recording stops; stop it using the UI/stop-stream.js.
6. R07b needs the shorter history fixture. `make-fixture.py short`, `seed-short.py`, `prepare-short.js`, `prepare-short-resume.js`, `finish-short-setup.js` and `capture-short-setup.js` prepare another working approval with content762px, viewport848px. `capture-short.js` opens the180px drawer across first-overflow, approves, closes/reopens during streaming, observes continued text. Accepted data is R07b-before-result.json/after-result.json. The final geometry is the same on each side even though synthetic sidebar statuses from previous attempts differ.
7. Capture order used here was short R07b, then regenerate long fixture and create fresh active long-history threads for R01 and R02/R09b. Same actions and seeds on both sides. There are exploratory/rejected runs in the raw archive; only source paths in public metrics.json are accepted.
8. `process.py` constructs60fps H264 videos from timestamped CDP PNGs (not frame-index timing). `build-phases.py` produces exact painted-height matched stills, full-frame Diff0 and DiffT>16 (8bit max channel delta), and contact sheets. `build-worst.py` adds the worst recorded sampled-gap frame during the selected450ms resize window and nearest available painted-height after frame; R02 differs by33px and R07b by2px, explicitly reported. Because rAF may precede ResizeObserver and the PR's microtask, the sampled gap is not claimed to be the exact painted gap. Read observer deliveries together with videos.
9. `metrics.py` derives observer CSVs and continuation metrics; `build-charts.py` plots all post-mount RO deliveries. `install-current.js` walks the current React root to find ConversationTimeline, samples listRef.getState, and obtains **streamChars from the visible DOM text**, since individual message live subscriptions can grow while timeline fiber props remain unchanged. It preserves fiberStreamChars separately. `capture-lib.js`/`still-lib.js` wrap CDP frames and actions.
10. `record-source-archives.py` saves **all** CDP PNG source pixels, accepted and rejected, as lossless RGB H264 MKV frame-index archives. These are60fps frame-index containers, not the real-time evidence videos; JSON stores original PNG SHA256 and frame timestamps where available. Rejected aborted runs without timestamps cannot reconstruct time. `verify-archives.py` compares each original decoded PNG RGB frame MD5 with the decoded MKV RGB frame in order. Exact match is required for every frame. Raw archive metadata contains original PNG hashes; re-encoding RGB to PNG need not reproduce the PNG binary bytes.
11. `cleanup-processes.py` stopped only process groups captured at spawn. Both dev groups and browser were verified stopped. Remove only the two own capture worktrees using literal absolute `git worktree remove --force` commands. Upload artifacts first; then remove only scratch/capture-1.

The bundle includes abandoned helper iterations for provenance, not as independent passing tests. Timers are browser-action pacing for evidence recordings, not repository automated tests. No source test or implementation file was edited or committed. Public startup/debug logs have credential-bearing and model-metadata lines redacted; private auth/storage files are intentionally omitted.
