# Reproduce current-head evidence

Before [8ee7183e6c](https://git.cafe/pingdotgg/t3code/commit/8ee7183e6c8a1c22a6698f4909ef7e2a423bec3a); after [5ac4ccb47f](https://git.cafe/pingdotgg/t3code/commit/5ac4ccb47fd2888646f1776445d701c504b87e1f). Synthetic data only; no provider turn.

1. Create independent checkouts with `git -C /home/user/t3code worktree add /home/user/wt/pr-32471-cap2-before 8ee7183e6c` and the equivalent `pr-32471-cap2-after 5ac4ccb47f`. Run `vp install` in each. Do not touch the lead's PR checkout.
2. Start each with `T3CODE_DEV_SEED=0 vp run dev`. Track the spawned terminal sessions/PIDs. This run used before web7531/server15571, after web7702/server15742. For after, start under `strace -f -e trace=%file -s 300 -o /tmp/lead-32471-r2/evidence-capture-2/after-files-private.log vp run dev`, still with `T3CODE_DEV_SEED=0`. Each checkout creates its own database. Never copy the live database.
3. Open owned T3 Browser preview tabs; use the private startup pairing URLs. If the pairing page was already loaded when its fragment changed, type the token in its textbox and click Continue. Wait for the real UI and provider catalog before seeding. Use separate origins and isolated browser storage. No tokens go in public logs.
4. Run `python3 seed-fixture.py`; it creates a timestamped committed synthetic project under this scratch directory. Both sides use that SAME root. `fixture-main.tar` preserves main's exact files. In each paired app evaluate browser-driver.js, call `await evidenceSetup(checkout)` and `await evidenceSeed(root, branch)`, saving the returned fixture. This run used evidence-before-r3 and evidence-after-r3. These are real project.create, vcs.createWorktree and thread.create RPCs.
5. For R1.c, run `python3 branch-fixture.py <fixture.worktree.path>` for each fixture. This commits differing branch skill and command descriptions. In each app call and save `await evidenceSnapshot(fixture.worktree.path,true)` then `await evidenceSnapshot(fixture.root,true)`. Preserve the full request including cwd and fresh and the exact synthetic response excerpt. The first response must retain the worktree cwd, skill path, and Branch-only descriptions. The root response must retain root cwd and root skill path and Finalize descriptions. Slash command responses have no path field; pair their exact command description with root file contents and successful root openat evidence.
6. Remove only the two exact synthetic managed worktrees with `git -C <fixture.root> worktree remove <fixture.worktree.path>`. Branches and active threads remain. Call `evidenceSnapshot(worktree.path,true)` and save before/after responses. Reload each client onto its fixture route so the client cannot reuse intact inventory; reinstall driver, evidenceSetup and fixture after reload.
7. Resize T3 preview to1440x900, dark. This browser is Chromium157/Linux x86_64, DPR2, font100%/root16px, no device emulation, scroll0. Settings -> Chat -> Advanced confirmed Show skills in slash menu checked on both sides. Return explicitly to the fixture route after closing Settings (a full Settings navigation may close to a draft). Set matching sidebar state using current snapshot refs. Verify the fixture title before capture.
8. Evaluate `await evidencePrivacy()` then capture-setup.js on both sides. Model controls are identically blurred. Display Date is frozen2026-11-10T15:00:00Z; server clocks remain real. Native reduced-motion emulation is absent in preview; CSS disables animations/transitions and caret. Do not publish private runtime catalog data.
9. In functions.exec load capture-driver.js and call `capturePrimary(tools,tabId,side)`. The same driver records `$finalize`, Tab selection, `/finalize-command`, `/skill:finalize`. It checks expected result text and fonts/resource completion and takes screenshots at least500ms apart. Save the manifest; copy returned captures/video into a new timestamped captures directory under this scratch path. No message is submitted. This run retained before15.751s/after13.862s recordings. `collect-artifacts.py` copies media from saved manifests without deleting originals.
10. Call captureNarrow from capture-narrow.js on after; it uses390x844 light, same desktop browser/DPR2, no device emulation, same clock, font scale and scroll. Retain both500ms-separated frames. Narrow web is not native mobile.
11. Point final-run.txt at the timestamped capture directory. Install Pillow into scratch with `python3 -m pip install --target /tmp/lead-32471-r2/evidence-capture-2/pylibs Pillow`; use that path in PYTHONPATH. Run build-diffs.py (asserts stable pairs and zero outside-picker pixels), media-pack.py (per-second full-surface review frames), filesystem-state.py, extract-syscalls.py, assemble-runtime.py and runtime-controls.py. Scripts contain this run's paths: adjust them for a rerun. Inspect every retained still, diff and sheet; inspect recordings through the full-surface extracted frames. Reject and retake bad captures; never edit screenshot pixels.
12. Save exact synthetic RPC excerpts to actual-rpc-transcript.json with fixture, sha, intact, root, missing, selection and freshAfterSelection per side. Runtime assemblers preserve the requests and cwd keys, branch/root paths and filesystem checks. The full private syscall log is never uploaded. Both branches must remain and both folders must still be absent after scans/selection.
13. Run upload-artifacts.py (`ghdrop upload -m` explicit allowlist), then build-report.py; upload its Evidence.md with `ghdrop upload -m`. The stdout Markdown is preserved verbatim in upload-markdown.md. Upload every seed/driver and the synthetic main archive. No real database, runtime model catalog, credentials or private server log belongs in the allowlist.
14. Stop owned terminal sessions, close owned preview tabs, confirm the four ports have no listeners, remove exactly the two created capture checkouts. Keep scratch evidence and raw logs; do not edit the PR or push.

Scope: B1, F1, F2.on, F3, R1.a, R1.c plus F1.N. Other matrix rows stay historical.

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