# Reproduce the captured fixture states

These are real web-app captures from isolated before and after checkouts with labelled simulated-server responses. No component harness was used. No live database or credentials are included.

Before: 49a9e80e0b30e3012412bcc564bb5e52e09d1c1d. After: 5d0b398fb0. The later project drop-learning fix is outside this evidence.

1. Recreate `/home/ubuntu/wt/pr-18361-cap-before` and `/home/ubuntu/wt/pr-18361-cap-after` as detached worktrees from `/home/ubuntu/t3code` at those commits. Run global `vp i` in each.
2. Start `T3CODE_DEV_SEED=0 vp run dev` in each and keep the process IDs. Never seed from live userdata. The captured path-derived ports were before web7403/server15443 and after web6918/server14958. If ports change, update `setup.cjs`, `fixture.cjs`, `capability.cjs`, and the exploratory scripts before use. Never set VITE_HTTP_URL/VITE_WS_URL.
3. Extract this bundle to `/tmp/lead-18361-r3/capture`. The scripts use Playwright 1.60.0 from the main checkout's pnpm store and installed Chromium; adjust that require path if needed.
4. Run `node setup.cjs`. This mints local pairing tokens and connects the two actual peers through the app onboarding service. Its generated `auth-*-private.json` files are credentials: keep local and never upload. `ids-*.json` map A/B. A is each side's own server and B is the other checkout's peer.
5. Run `node catalog.cjs` to derive a valid catalog reference from the local server. The included sanitized reference was used by the captured F10 fixture.
6. Run `node series.cjs F01:before:D F01:after:D F01:before:N F01:after:N F14:before:D F14:after:D F02:before:D F02:after:D F02:before:N F02:after:N`. Run `node capability.cjs` for F21. Every capture run makes a new timestamped directory.
7. `capture-v1.cjs` retains an abandoned conditional F10 attempt. The final selected F10 pair uses `capture.cjs` with the same action names on both sides, fixed scroll positions, and Escape only for an open popup. Unsupported before-side controls produce no-op attempts, while the after side opens the B catalog and traits. Earlier failed/partial runs are excluded.
8. `fixture.cjs` seeds with actual `server.updateSettings` RPCs, then intercepts WebSocket descriptors and requested patches. Unsupported A keys are removed from the forwarded patch, preserving real server success responses and subsequent config streams. F14 omits settingsKeys on A and drops reviewGuidesEnabled. F01 removes A's settings-write scope. F02 selects only A, omits the four writing/review keys, and preserves residual child values. Provider and source-control discovery responses are explicitly synthetic and do not run paid turns.
9. `projects.cjs`, `project-capture.cjs`, `devices.cjs`, and `priority-next.cjs` also include the retried F06/F17 drivers. The final index distinguishes completed project phases and partial device-host protocol coverage. F06d still lacks an interaction proving the environment-wide control inert; F17 still lacks the supported-holder-denied/all-unsupported/project-scope guard variants. `project-fixture.json` contains synthetic IDs from the attempted run; recreate them through RPC rather than reusing them. The synthetic repository used `t3.json` containing worktreeSubmodules:none and a synthetic [settings-fixture remote](https://github.com/example/settings-fixture), not an existing repository.
10. `finalize.py` produces zero-threshold differences amplified32, threshold8/255 differences, sheets, and trimmed MP4s. It pairs the latest completed manifests per row/viewport/theme. Original WebM recordings are also included; their manifest trimStart identifies recording time zero. The trimmed MP4 starts 0.5s before that zero. Scripts do not delete previous evidence.

Capture conditions: headless Linux x64 Chromium148.0.7778.96, Playwright1.60.0, no device emulation, DPR1, font scaling100%, reduced motion reduce, fixed Date2026-10-28T12:00:00Z, real timers, desktop1440x900 dark and narrow390x844 light. Each still waits for network idle and fonts, then requires byte-identical screenshots500ms apart. The same explicit settings scroll position is used in normalized pairs; manifests record actual top and maximum values. F01 desktop predates closing the blurred app sidebar, leaving a small unrelated background difference. The final F10 pair closes it identically on both sides.

No browser or server is left running, and both capture worktrees were removed after capture. No PR body, commit, or source file was changed by this evidence task.
