# Provenance and replay

Before: commit [616c426f5f](https://git.cafe/pingdotgg/t3code/commit/616c426f5f199865e34974777740dff678ffb7f5); after: commit [4b65d930a7](https://git.cafe/pingdotgg/t3code/commit/4b65d930a7312e350ab5b4a7ba8d2da87aea7c25). Tracked source files were never edited.

Run `vp install` in each checkout. Start one isolated backend with `T3CODE_DEV_SEED=0 vp run dev --host 0.0.0.0`; the two revisions have identical server and contract sources. Start each checkout's `apps/mobile` Metro with `REACT_NATIVE_PACKAGER_HOSTNAME=<VM-tailnet-IP> CI=1 vp run dev:client --port <8081-or-8082>`. Install the matching client using `vp run mobile:install ios --prepare`, then `--session <session>`. Both native fingerprints are 953468b560e21a2a7cfb6d86a69eda1e061efb8a.

The seed writes only synthetic files under this scratch directory. `seed-fixtures.py` creates root-overflow HTML, SVG and a 40-page PDF. `fixture-acp.mjs` is a deterministic fixture runtime that calls the actual HTML MCP tool and publishes real attachments; it is not a component harness and runs no model. `setup-seed.py` records the complete RPC seed procedure. The actual capture run also used incremental seed RPC inputs while correcting fixtures; the accepted IDs and references are in `ids.json`, `routes.json` and `html-references.json`. Replays generate fresh IDs and signed URLs. Mint a fresh pairing credential with the checkout's auth CLI into local `pairing-private.json`; credentials are intentionally not uploaded. `rpc.mjs` exchanges this credential and invokes the real typed WebSocket services.

`capture-driver.py` connects to the explicitly named pool session. Route entry uses actual native deep links backed by seeded project/thread/attachment state. It captures two pixel-identical PNGs separated by at least 500 ms before accepting each still. Raw recordings use the native simulator recorder at 30fps with touch overlay. Each flick follows 1s idle, identical `agent-device gesture pan x y dx dy duration`, then 8s coast. PDF-linked captures include link navigation, a PDF flick, Back to document, and a restored-document flick. Gesture telemetry reports event times and measured dispatch duration; no release velocity is reported. Requested gesture durations are identical across sides; dispatch overhead can differ. Use actual video and landmarks for physics conclusions.

`make-sheets.py` extracts 16 timestamp-labelled full-phone frames from each movie (uniformly spaced for normal-length clips; for the long F5 retry take, initial frame, samples around the sole successful flick, and final frame); these are review aids, not substitutes for recordings. `build-evidence-assets.py` computes whole-surface initial-frame absolute RGB diffs (x24, no threshold) and masks pixels with max channel delta >16. Neither masks the status bar. Initial and final stills retain the whole phone. Accepted files are enumerated by `capture-map.json`; older rejected attempts remain local and are not presented as proof.

P2FINAL-before artifacts are byte-for-byte copies of the accepted P2R3-before take under the final pairing stem; no movie editing or resampling was applied. The original telemetry and commands retain their timestamps. Supplemental F6 uses the actual New Task project picker and Files control, as recorded by draft-file-flow.py; its direct-link-only attempts were excluded.

Replay entry points: seed-fixtures.py → setup-seed.py (with fresh pairing credential and server/Metro ports) → seed-extra.py → capture-driver.py. after-core.py, capture-extras.py and draft-file-flow.py describe the accepted row flows. Other uploaded capture/upload helpers preserve incremental attempts and recovery operations; they are not all replay entry points and rejected takes are excluded by capture-map.json.
