# Evidence addendum reproduction

Synthetic data only. No live database or other lead worktree is read. AI-assisted; verified with the tests and tools listed above.

1. Create detached `/home/user/wt/pr-33262-before` at `4c361199f47f6ea32a2c14835df392640d0f7c63` and `/home/user/wt/pr-33262-after` at `89764a9450c32a124fd5b2bc51ef2a7065a61528`. Run `vp install`, then `node apps/desktop/node_modules/electron/install.js` in each.
2. Keep all scratch under `/tmp/lead-33262-r1/evidence-capture-2`. Initialize its `fixture-project` with `git init`. Run `python3 prepare.py`, then `python3 seed.py <side> project` and `python3 launch.py <side>`. Both use fresh worktree-local `.t3/evidence` state, isolated XDG config/data/cache directories, and `T3CODE_DEV_SEED=0`. The two servers migrate their own empty databases. Before CDP: 19326, main inspector: 19327. After: 19328 and 19329. Set `EVIDENCE_SIDE=after` for after CDP commands. Desktop native input/captures get DISPLAY/XAUTHORITY from the launch record.
3. When app loading completes, run `node cdp.mjs --close-tools`, `python3 seed.py <side> thread`, `node cdp.mjs --file setup-ui.js`. Wait until the Replay thread renders before collapsing the main sidebar and thread details. Those preferences survive restart, so toggle only open panels. Use `native.py <side> windows` to obtain the app window ID, then `native.py <side> xdo windowsize <id> 1440 900 windowmove <id> 240 90`. Confirm the restaurant link center is `(735,218)` and composer `(800,887)` on the full display. Only Replay scenario Showcase may be visible as a model label; reject diagnostic views showing private runtime model labels.
4. R01: close the Browser panel and any floating preview with its `Close floating preview` control; clear the composer with click, Ctrl+A, BackSpace; move pointer to `(50,50)`. Capture a settled ready frame and inspect it. Run `python3 capture-row.py <side> R01 735 218 <dismiss|copy>`. Before uses Escape, after clicks Copy Email Address. ffmpeg records the entire display at 15 fps; the driver holds the fully rendered menu, moves the pointer away after the action, clicks the composer, pauses, pastes with Ctrl+V, and holds the result. The earlier driver-clock step log is diagnostic only, never the source for narrated video time.
5. R06/R09: `python3 start-guest.py` serves the uploaded `guest.html` on loopback port 18762. Open the right panel with `open-browser.js`, then choose Browser in the surface picker, enter `http://127.0.0.1:18762/guest.html` into the address field and press Enter. Clear composer. Both sides must have guest scroll `[0,0]`, webview rect `[901,80,539,820]` relative to the 1440x900 app, and a loaded image with natural width 180. R06: `python3 capture-row.py <side> R06 1280 580 <dismiss|copy>`.
6. R09 uses real integrated spellchecking, no harness. Click `(1234,726)` in the editable linked word, then run `python3 capture-row.py <side> R09 1234 726 <dismiss|copy>`. The after Copy Email Address item is at y+116 because Chromium returns three suggestions. Optional read-only observation: `node cdp.mjs --main --file observe-context.js` before a native context-menu action; export `fixtureParams` afterward. This only observes Electron parameters and never replaces, intercepts, or emits the handler. Both actual captures report `recieve`, suggestions receive/relieve/reverie, mailto:speller@example.com, and the same editing flags.
7. Every retained still passes two whole-display captures 500 ms apart, AE=0. The driver keeps all attempts in timestamped directories. `python3 diffs.py` creates absolute differences amplified 255x at zero threshold and ImageMagick `compare -fuzz 2%` differences for full display, fixed crops, and supplemental pasted frames.
8. Run `python3 audit-video.py` after the final take. It uses ffprobe frame PTS and extracts exact encoded frames with ffmpeg by frame index. Inspect every narrated frame individually, then create and inspect the contact sheets using `finalize-audit.py`. Use actual duration from ffprobe, and final valid frame PTS for an end-of-recording image. No narrated step points at the initial native popup paint transient.
9. Inspect all retained full stills, crops and diffs; run `python3 verify-artifacts.py` for bounds/environment records. Stop all launched process groups using the recorded groups, collect PID/session cleanup proof with `cleanup.py`, then remove the two literal worktree paths with `git worktree remove --force`. Never stop by name or path pattern. Keep scratch and rejected diagnostic takes private.
10. `publish.py` uploads the explicit retained asset list with `ghdrop upload -m`, preserves stdout verbatim and writes a URL map. Build the addendum with `build-addendum.py`, then upload its markdown with `ghdrop upload -m`. Do not edit the PR body.
