# Reproduce the evidence

Keep the downloaded scripts together under `/tmp/issue-lead-7700-r11/evidence-capture/`. The pinned revisions and desktop geometry are listed in each row sheet. Use each checkout's own empty home; never seed from the live VM database.

1. Create the baseline worktree at the pinned before revision beside the after checkout; run `vp install` there, then `node node_modules/electron/install.js` from its `apps/desktop`.
2. Run `python3 seed-project.py`, then `python3 start-fixture.py`. The fixture server generates the actual PDF and serves both resources on loopback port 39312.
3. Start one side with `python3 start-desktop.py before` or `after`. The script retains its process group and selects a separate home and CDP port. Do not run both sides together.
4. On its first launch run `node setup.mjs <side>`; if restarting the same synthetic home run `node resume.mjs <side>`. Close the automatically opened DevTools target before using `xwindow.py`. The X11 helper resizes the real native window; it does not emulate the guest viewport.
5. Run `node discard-drafts.mjs <side>` to remove only synthetic unsent drafts, then `node normalize-history.mjs <side>` and confirm Back is disabled. Run `node capture.mjs before R01 R02 R03 R04`. After-side HTML: `node capture.mjs after R01 R02 R03 R04 R05 R06 R07 R08 R09 R10 R11 R12 R14 R15`.
6. For the PDF, Escape the current annotation if present, run `node navigate.mjs after fixture.pdf`, then `EVIDENCE_GUEST=fixture.pdf node capture.mjs after R13`. Its transcript verifies MIME type and the focused input layer.
7. Every capture run creates a new timestamped directory. Run `make-sheets.py <run>` once for each adopted run, then `make-diffs.py <before-run> <after-run>`, `package.py` and `validate.py <package>`. Check every adopted image and contact sheet. `publish.py` uses only an allowlist of synthetic artifacts; it excludes app homes and startup/auth logs.
8. Stop each side using `python3 stop-desktop.py <side>` before starting another. Finally stop the fixture with `python3 stop-desktop.py fixture` and remove the baseline worktree. Retain all evidence and raw logs until uploaded.

The capture driver uses only trusted CDP mouse/key input for the tested interactions. Closed-shadow DOM reads and read-only tool telemetry accompany the visible behavior; no tool attribute is mutated, no overlay is replaced, and no isolated component harness is used.

## Scripts and synthetic fixtures

[build-report.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/244cd2e3b9ac8bc8/build-report.py)

[capture.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bc7e8fb6e11cf918/capture.mjs)

[cdp.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9689b7c604a2d8f2/cdp.mjs)

[discard-drafts.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6424ec9ec0adadb7/discard-drafts.mjs)

[fixture-matrix.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/651f1462ec2f3600/fixture-matrix.md)

[fixture-server.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f976f11c0ec6bf87/fixture-server.py)

[fixture.html](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4168d0d82f28eb21/fixture.html)

[fixture.pdf](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/19b461b2f4209542/fixture.pdf)

[make-diffs.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2329826c09c67afe/make-diffs.py)

[make-sheets.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bedba7f9ab77d0d1/make-sheets.py)

[navigate.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/421f57a28a1ea0d6/navigate.mjs)

[normalize-history.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4661ec902bd3cc26/normalize-history.mjs)

[package.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ba5cea633ef93b83/package.py)

[publish.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/08d349bf354f6919/publish.py)

[resume.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/929107fad29780d0/resume.mjs)

[seed-project.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6387775b707c9c4e/seed-project.py)

[setup.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c3c4e40e534bcaf0/setup.mjs)

[start-desktop.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a3da52687d954a2c/start-desktop.py)

[start-fixture.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/deea43730f55fe6a/start-fixture.py)

[stop-desktop.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e7c90bcfd48908ed/stop-desktop.py)

[validate.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5c58c29fccf6c9e0/validate.py)

[xwindow.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bb4273c84876e2fc/xwindow.py)

[reproduction-bundle.zip](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a903b0ad964a533f/reproduction-bundle.zip)

[pdf-runtime-transcript.log](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7e1fb9027337fe84/pdf-runtime-transcript.log)
