# Additional evidence reproduction

AI-assisted; verified with the tests and tools listed above.

Before checkout: [d313b2a](https://git.cafe/pingdotgg/t3code/commit/d313b2aff31991ab94c8ac80cdc38a54dd575604) at /home/user/wt/pr-32507-base; After: [bf3f9f0](https://git.cafe/pingdotgg/t3code/commit/bf3f9f0acfcbe39715d4d6b5d62a5da34b378530) at /home/user/wt/pr-32507. No source edits. Scratch root: /tmp/lead-32507-r1/evidence-capture-2. The inherited rebuild.md covers browser pairing and the original driver. Never use live T3 userdata. Every server launch used T3CODE_DEV_SEED=0 and fresh isolated state; no migrate-dev-db.

1. Create Before with `git -C /home/user/t3code worktree add /home/user/wt/pr-32507-base d313b2aff31991ab94c8ac80cdc38a54dd575604`; run `vp install` there. After was already installed. Run `python3 launch.py after-web /home/user/wt/pr-32507 vp run dev --home-dir /tmp/lead-32507-r1/evidence-capture-2/after-web-home` and the equivalent before-web/base/before-web-home. Actual ports from dev-runner: After server16602/web8562, Before server14698/web6658. Credentials stay private. Authenticate fresh browser storage as in inherited rebuild.md.
2. Use `PROOF_PORT=8562 node seed.cjs after` and `PROOF_PORT=6658 node seed.cjs before`, then `node prepare.cjs <side>` and `node state.cjs <side> defaults`. The seeder creates 30 real settled threads via RPC with distinct daily settlement timestamps, branch main. The shell returns proof-05..29, omitting 00/01. No CLI or fake provider turn is needed.
3. Run `node capture.cjs <side> R11` before R02, then `node capture.cjs <side> R02`. Both launch a fresh context with frozen clock, same sidebar/theme, font-ready/network-idle waits. R11 uses the sidebar's normal expanded 10-row shelf; do not click Show more, which independently mounts older pages. At Seed29 it saves the actual merged client shell, verifies the route mounts are released, and saves the visible sidebar text. Cached family rows remain in the merged shell after release; this is not proof of cache eviction. R02 mutates 00; `node state.cjs <side> reset` restores title/settlement/pinning if another take is needed. Each take has a new timestamp directory. Ready-view videos are trimmed from raw Playwright recording without altering interactions.
4. Electron: run `node node_modules/electron/install.js` in apps/desktop in each checkout. Normal desktop `build` failed in the unrelated browser-import helper because pkg-config could not find libsecret-1; `vp run --filter @t3tools/desktop build:bundle` succeeded and produced the real app bundle and bundled backend in both checkouts.
5. Launch `python3 launch.py after-desktop /home/user/wt/pr-32507 headless-desktop /tmp/lead-32507-r1/evidence-capture-2/desktop-launch.sh after /home/user/wt/pr-32507 8562 16612 9227`; equivalent Before: before-desktop, base checkout, 6658 14708 9228. `launch.py` sets private XDG directories before headless-desktop starts its keyring. `desktop-launch.sh` sets the isolated T3CODE_HOME and T3CODE_DEV_SEED=0, VITE_DEV_SERVER_URL (desktop loader URL; never VITE_HTTP_URL/VITE_WS_URL), and runs the real dist-electron/main.cjs with --no-sandbox --disable-gpu. Both bundled backends create fresh state independently of the browser dev servers.
6. Read DISPLAY/XAUTHORITY from each owned Xvfb child into the private side-xenv-private.json. Resize/focus the Electron window with xdotool (window2097155 on each independent X display) to1920x1080 at0,0; close detached DevTools. Complete onboarding with the app's completeOnboarding() exported helper. `node desktop-config.cjs <side>` registers the free Replay (dev) local scenario and sets default selection. `node desktop-seed.cjs <side>` creates the same S30 data against the desktop-owned backend. `node desktop-cold.cjs <side>` clears only that isolated Electron client's query/shell caches and reloads the Seed00 hash URL; otherwise seeding events leave all30 rows warm in the client.
7. `node desktop-capture.cjs <side>` drives physical X11 chevron/menu/right-click actions (native menus need focused xdotool input), records the entire Xvfb screen through ffmpeg x11grab20fps, and captures ImageMagick import -window root endpoint images. CDP only handles page setup and app assertions. Both successful runs use the same1920x1080 display/window/viewport, DPR1, zoom/font100%, dark app, fixed Date2026-11-10T12:00:00Z, reduced motion. GTK native menu styling is light on both sides. Before stops after proving both triggers do nothing; After chooses Pin, then opens the native context menu showing Unpin.
8. `package-new.py` and `package-desktop.py` copy accepted takes and calculate whole-frame amplified Diff0 and DiffT8. Two endpoint captures500ms apart must be pixel-identical before acceptance. Open every endpoint, diff and full-duration video contact sheet. Private raw logs, authentication state, rejected takes and operational model metadata are excluded. The fixture-and-release-proof.json contains only synthetic IDs, shell membership and release verification. `upload-new.py` uploads selected artifacts with ghdrop upload -m; `make-index.py` merges the inherited links with the new upload map. Nothing is committed or posted to the PR.
9. Stop captured process groups and their captured descendants; verify owned ports are closed. Remove Before with `git -C /home/user/t3code worktree remove --force /home/user/wt/pr-32507-base`. Preserve After and all scratch evidence. Verify After is clean and disk free>=5GB.
