# Rebuild the capture state

Exact real-app revisions: before 955e2bfbb5c092c54ad795c8d379fec99702a6b5; after 676ecd159aaa43ac22a9d066ad37d62c07f0620e. Neither checkout was edited. Both dev servers used T3CODE_DEV_SEED=0 and fresh checkout-local .t3 data; no live database was read or copied.

All scripts use /tmp/lead-28527-r1/capture as their scratch root. Download the script bundle into that directory. common.mjs records the actual emitted web ports (7439 before / 5847 after) and the installed Playwright import path; adjust those three machine-specific values when replaying elsewhere. Use the global vp command for each checkout's dependency installation and dev runner. Never set VITE_HTTP_URL or VITE_WS_URL.

1. Create the exact detached base checkout and install with vp install. Start each app with T3CODE_DEV_SEED=0 vp run dev in its own checkout. Keep its startup output private. common.mjs expects the before startup/pair output at before-pair.private.log and after output at after-dev.log. The fresh startup pairing URLs are consumed by authenticated() to save local browser cookies into private JSON files. Never upload these logs or cookies. Run this only against fresh isolated databases.
2. Run python3 seed.py to create the synthetic project-v3 Git project with 200 valid .agents/skills/<name>/SKILL.md files and 132 tracked search matches. The seed manifest and archive preserve exact fixture contents. The generator also writes optional agents/openai.yaml display names; native Codex ignores them, hence R04's labelled harness.
3. Run node seed-app.mjs. It creates the project, six stopped synthetic threads, configures the available Codex provider, enables skills in slash commands, and enables linked environments. It never starts a provider turn. This VM supplied 26 additional ambient skills, for 226 total skills and 230 slash entries (one built-in and three provider commands). The uploaded ordered inventory records their exact names/content.
4. Run ROWS=R01,R02,R03,R05,R06,R07,R08,R09,R10,R11,R14 node driver.mjs. The driver creates timestamped directories and saves full-viewport stable checkpoints, geometry, actions and all received CDP frames. R14 uses setAppearanceMode from the real app theme hook, which is also used by its appearance controls; it does not alter CSS. Pointer targets in R10 are fixed skills 079 and 129 on both sides. R11 explicitly Escape-dismisses before clearing and reopening.
5. Run HARNESS_R04=1 ROWS=R04 node driver.mjs. This imports each revision's production ComposerCommandMenu and stylesheet through its own Vite server. It is an isolated component harness, not a real-app capture. Real-app R04 remains unverified: Codex rejects invocation names longer than 64 characters. Four short-name real-app rows with long descriptions are also exercised in R11.
6. Run ROWS=R12 node driver.mjs while both dev servers remain running. Then run FOLDER_ONLY=1 ROWS=R12 node driver.mjs for the supplemental folder + TypeScript window (the broad query cap excludes the folder). machine-fixture.mjs pairs the other isolated dev server through the application's onboarding service and renames its saved profile. No fleet machine is contacted. Desktop sidebar collapse uses its normal Ctrl+B shortcut before recording, avoiding unrelated peer sidebar ordering. @ search supplies five local threads, one paired environment and the 80-file cap; file/thread/machine context is selected in separate reopenings.
7. Run node seed-prs.mjs with pr-fixture-metadata.json alongside it, then ROWS=R13 node driver.mjs. The script adds twelve local link/snapshot records obtained from read-only forge metadata. It performs no forge writes. Accepted R11/R14 and R12 retakes were captured after this seed and therefore display the same twelve PR links on their ordinary-thread/sidebar surfaces.
8. For each accepted run, run python3 encode.py <run-directory>, then python3 process.py <run-directory> and python3 review-sheets.py <run-directory>. Encoding uses variable frame timing, lossless VP9 and millisecond timebase, preserving every received PNG frame plus one duplicate terminal frame. R14's continuous video is padded to a fixed 1440x900 grey canvas; its checkpoint PNGs retain their exact viewport dimensions. The trace states each action's actual timestamp relative to the recording, not a synchronized animation timeline.
9. assemble.py identifies the accepted final run for each row/cell; superseded captures are excluded. package.py splits archives over 90 MB into numbered parts. Concatenate .part01, .part02, etc. in numeric order to reconstruct that row's gzip archive. Full-review pages show uncropped before/after and both uncropped diffs; supplementary detail-review pages crop only the diff area. All checkpoint originals remain full viewport.

Rendering: Playwright 1.60.0, headless Chromium on Linux x86_64, no device emulation, CSS viewports 1440x900 / 390x844 / 1440x450, DPR 1, 100% font scaling, 16px root, bundled Inter, reduced motion. Browser version is in every run environment.json. Chromium's default --hide-scrollbars was removed, so these recordings exercise actual scrollbar painting and thumb input. Client Date is frozen at 2026-11-03T09:48:00Z, while performance and CDP clocks continue for recording timestamps.

Before each checkpoint the driver waits for network idle and document.fonts.ready, then requires byte-identical full screenshots 500ms apart. Carets are hidden only for checkpoint screenshots. Initial compositor-frame excerpts are labelled recording excerpts, not settled checkpoints. CDP screencasts are a browser frame stream: they preserve first observed paints, but cannot establish an earlier physical display refresh that Chromium did not emit. DOM mutation-to-frame delays are included; do not treat a settled checkpoint as first-paint proof.

Only synthetic local data, public PR metadata, scripts, browser frames and geometry are uploaded. Authentication material, startup pairing logs, local databases and private cookie state are excluded. Do not upload any recreated private files.
