# Round 2 reproduction

This follows the archived fixture and driver. All data is synthetic. Do not seed from the VM preview database. Do not use the lead's existing worktree.

1. Create detached checkouts at `/home/ubuntu/wt/pr-28527-cap2-before` (955e2bfbb5c092c54ad795c8d379fec99702a6b5) and `/home/ubuntu/wt/pr-28527-cap2-after` (676ecd159aaa43ac22a9d066ad37d62c07f0620e). Run global `vp install` in each.
2. Run `T3CODE_DEV_SEED=0 vp run dev` in each. Read real ports from `[dev-runner]`; this run used web 5846/6467 and server 13886/14507. Adjust `sides` in archive/common.mjs and seed-app.mjs if ports differ. Never set VITE_HTTP_URL or VITE_WS_URL.
3. Keep scratch under `/tmp/lead-28527-r1/capture2`. Extract the archived original scripts into an empty `archive` directory, then overlay the round-2 scripts. Playwright imports the after checkout's Playwright 1.60.0 package. Save the before startup pairing URL log privately as before-pair.private.log, and after startup log privately as after-dev.log. These and auth.private.json are never public evidence.
4. Run `python3 archive/seed.py`, `node archive/seed-app.mjs`, and `node archive/seed-prs.mjs`. The last script reads the original public pr-fixture-metadata.json. Both databases start fresh using their own revision's migrations. No provider turn is started.
5. Run `ROWS=R07,R08,R11,R14 node archive/gap-driver.mjs`. Every run creates a timestamped directory. Accepted cells are in selection.json. R11 preserves the dollar and edits via typing/backspacing; drawer audit asserts no remount. R14 wheel pointer is inside the visible clipped list; ArrowDown count is 225.
6. Run `node archive/seed-long-labels.mjs`, then `ROWS=R04 node archive/gap-driver.mjs`. Four skill names are exactly 64 Unicode codepoints. The supported accents café/résumé/naïve remain visible at 390 CSS pixels. Descriptions are long. Capture all four DD/ND cells. Run `node archive/restore-short-labels.mjs` afterward so all other rows use the original fixture.
7. Run `node archive/frame-control-validation.mjs` and `node archive/earliest-driver.mjs`. Bundled headless shell 148.0.7778.96 is launched with `--enable-begin-frame-control --deterministic-mode --run-all-compositor-stages-before-draw`. CDP Input.insertText dispatches each trigger. Each HeadlessExperimental.beginFrame returns a full-viewport PNG; rAF samples the matching atPaint geometry. Frames advance by 16.666667ms. All 13 produced frames per cell, plus the closed baseline, are retained. A normal helper browser pairs the synthetic second environment for R12, because a frame-controlled helper otherwise cannot complete its automatic screenshot. R06 was independently retaken with `ROWS=R06 node archive/earliest-driver.mjs` after visual review; its clean retake replaces the earlier R06 pair.
8. Encode with `python3 archive/encode-native.py <run-dir>`. Native viewport dimensions are preserved; lossless VP9 VFR includes every CDP frame plus a terminal duplicate. Verify source count equals decoded count. Assemble accepted runs, process both diff variants, and open every still, diff, recording checkpoint and controlled-frame filmstrip. Settled captures require networkidle/fonts and two byte-identical screenshots 500ms apart. First-paint PNGs are frame excerpts, not settled stills.
9. Upload with `ghdrop upload -m <files>`. Raw archives exceeding 100MB are split into ordered 50MB binary parts. Concatenate `.part00`, `.part01`, etc. in numerical order to recreate the named tar.gz; verify SHA256 from artifact-checksums.json before extracting. No original evidence is deleted.
10. Stop only captured server/browser PIDs; remove only the two created worktrees with `git worktree remove --force`. Do not remove or inspect the lead's worktree. This run stopped both servers, closed all browser contexts, and removed both created checkouts.

Rendering environment: Linux x86_64, Playwright 1.60.0, Chromium 148.0.7778.96, headless, DPR1, no device emulation, native scrollbars enabled, bundled Inter, 16px root, font scaling100%, reduced motion, Date frozen2026-11-03T09:48:00Z. Profiles DL1440×900light, DD1440×900dark, ND390×844dark, SL1440×450light. CDP/performance clocks remain live. No speed benchmark, native mobile, desktop shell or physical monitor refresh claim.

Rejected diagnostics/pilots: Browser.getBrowserCommandLine returned a protocol error because --enable-automation was absent; removing that nonessential call allowed beginFrame. A controlled peer helper timed out at page.screenshot after30000ms; a separate normal helper fixed it. Post-screenshot DOM geometry raced async R12 results; atPaint rAF geometry fixed the transcript and all cells were retaken. An earlier R06 first frame had overlapping text and was retaken. CJK glyphs were unavailable in the unchanged VM font environment; accented Unicode was used for the final R04 fixture. No pilot replaces accepted evidence.
