# Re-capture reproduction

The downloaded previous-round drivers are byte-for-byte unchanged (see driver-download-sha256.json). Save them under `capture2/drivers/` and `run-previous.py` in `capture2/`. The runner only relocates `/tmp/lead-33512-r1/capture` to `/tmp/lead-33512-r1/capture2`, `-base` to `-base2`, and old short SHA labels to this round's short SHAs. It executes the original driver code. The generated scripted responder was also byte-identical to the downloaded previous fixture-agent.ts.

1. Create `/home/ubuntu/wt/pr-33512-base2` at bbdc7dca320ee4fbc7131498aaffef2fa1eb3d41. The existing lead checkout `/home/ubuntu/wt/pr-33512` must be bb8005d7d71765e9284f6be12076392ce749983b; leave its tracked files untouched. Install base dependencies with `vp install`.
2. Prepare each client with `vp run mobile:install ios --prepare`. Both returned fingerprint `edb0efb70b2f14145ebeef8b3124cd71a51f0c75`.
3. For each side, run `python3 run-previous.py setup-fixture.py <base|head>`, then `start-owned.py <side> backend` and `start-owned.py <side> metro` through the same runner. This sets T3CODE_DEV_SEED=0 and tracks process groups. Actual ports in this run were base 15805/8087 and head 15403/8088. Read actual backend ports from logs. Link scratch `node_modules` to the owning server package's node_modules so the RPC seed resolves its imports; run `python3 run-previous.py seed.mts <side>`.
4. From the lead checkout, connect proxy session `lead-33512-cap`, lease `iPad Pro 13-inch (M5)`, and install through `vp run mobile:install ios --session lead-33512-cap`. It took 59 seconds. Set appearance light; text size reads large.
5. Open the dev-client URL pointing at this VM's Tailscale hostname and that side's Metro port, with disableAutoLaunch=1 and disableFab=1. Accept the OS Open alert when shown. Wait until the bundle has mounted, then use `.agents/skills/test-t3-mobile/scripts/pair-client.sh` with that side's isolated state and reachable backend origin. Startup deep links arrived before JS mounted on both sides; fresh pairing links after mount worked. Pairing credentials and URLs are private and excluded from public evidence.
6. Open the seeded thread route with the environmentId/threadId from `<side>-fixture.json`. Maximize content through its accessible control. Run `python3 run-previous.py r01-driver.py <side>`, followed by `settled-frames.py <side> r01`. R01 sends `Draft` + newline + `Second line for the iPad composer.`.
7. Follow voice-attempts.md for exact setup. Run `python3 run-previous.py voice-attempt-driver.py <side> active`, then `settled-frames.py <side> r03-r04-active`. Copy/choose the same transcription package on head using the original configure scripts. Remove the base connection before switching bundles. No native source or production behavior was changed.
8. Package with `package-media.py <side> <row>` and `diff-frames.py <row>` through the runner; use contact-sheet.py for ten evenly spaced review frames. These preserve the whole native surface. Unit proof commands are in unit-proof-recipe.sh.
9. Remove disposable connections; close and disconnect the device session. Stop backend/Metro groups using the captured PID records through stop-owned.py, check all four ports closed, and remove the base worktree. package-round.py packages public drivers, sanitized logs and original videos. Upload with ghdrop; no state database/settings/token goes into uploads.

No frozen clock or reduced-motion override is exposed by the pool runbook. We retained actual clocks, reported their pixel differences, and required within-run stable final frames. Tool pacing differs across clips. Native race timing beyond the actual attempted steps is not claimed.
