# Native evidence reproduction

Pinned application revisions: base 79f1fadfc6020b820d541ca4691d2feebb15dd1b; head 2dc4772467a109a390af202e8d8ece29495d2c97. Production files were not edited. All runtime data is synthetic. The head checkout already had dependencies; the base checkout was separately installed. Both ran their own server and Metro. One cached native development-client fingerprint serves these JS-only revisions.

Use the final drivers below. `*-original.py`, `runtime-env.js`, `runtime-env-v2.js`, `paired-ios.py` and `paired-ios-original.py` are historical attempts retained to account for every written driver. **Do not use their Date override:** it advances authentication time and invalidates comparability. None of those takes is in the retained final recordings. `runtime-env-v3.js` keeps authentication time live. Android still screenshots normalize the system clock to 9:41. Final iOS stills keep the native clock live, capture both sides within one displayed minute, and require pixel-identical raw pairs. Frozen iOS time is unverified: normalization animates the charging glyph. Recordings keep native clocks live on both platforms.

1. Create the base worktree at the pinned base next to the head checkout and finish `vp install` before starting it. Prepare both native clients with `vp run mobile:install <platform> --prepare`, lease named Pixel 9 / iPhone 17 Pro devices with sessions `ev28135-android` / `ev28135-ios`, and install through `vp run mobile:install <platform> --session <session>`.
2. `python3 start.py` writes **seed-v2.json before the first server start**, starts both sides with `T3CODE_DEV_SEED=0`, isolated timestamped homes, separate Metro ports (8081/base; 8082/head), and records spawn PIDs. Never substitute live T3 state. Read actual backend ports from the logs; this checkout pair used 13796/base and 16332/head. Update configure.py if ports shift.
3. `python3 configure.py` writes only the public environment IDs, repo/home paths and ports to environment-config.json; it does not save credentials. The drivers use that file. The host/IP in cdp.mjs and the development-client URL target this VM; update them for another machine. Its WebSocket Origin must exactly match the advertised Metro origin.
4. Set Android animations off; set both OS text-size categories to `large` (measured React Native font scale 1.0). On iOS enable Reduce Motion through Settings → Accessibility → Motion. Font assets are DMSans compiled into the native client; there is no web-font fetch. For final iOS stills also enable Reduce Transparency and Increase Contrast (both true, same before/after). These two settings were false for recordings; Reduce Motion was true for both.
5. `python3 reset-and-pair.py <android|ios>` clears only the leased T3 development app's data (and the leased iOS simulator keychain) and pairs both disposable environments through the repository helper. It suppresses pairing output, which contains credentials. Never upload server homes or pairing logs.
6. Run `python3 run-record.py <platform> <before|after>` one side per platform. For simultaneous runs, use different backends (Android/head with iOS/base; then Android/base with iOS/head). The record driver awaits actual native expo-image memory/disk cache-clearing acknowledgements. It restores the shared seed, mounts the real Providers screen, records navigation and scrolling, changes the same `copilot` instance through valid A → real 404 → A → Gemini B → 404 → OpenCode C → local/absent URL, and presses the real Refresh providers control after mutations. The observer preserves original React commit callbacks and records actual helper state; it does not mock expo-image, its load/error callbacks, network replies, or provider snapshots.
7. Recording requests are not delayed by the driver. Native selective network throttling is unavailable (`Network.emulateNetworkConditions` returns method-not-found). Do not claim a controlled pending interval. Cache clearing and successful native decoding are established, while R4's held-pending and R6's delayed-B subcases remain unverified. A registry inspection error is not an image error; the real image error uses the official CDN's missing-agent 404 and is identified by native helper `status: failed`.
8. `python3 endpoints.py <before|after> android` produces additional normalized Android failure/absent-URL stills. `python3 paired-endpoint-native.py <failure|absent>` produces final iOS equivalents with live native time matched within the same displayed minute. Both wait for real helper state and exact pixel identity. These stills supplement recordings; they never replace them. Old normalized iOS endpoint attempts were discarded because of the charging animation.
9. Restore `static-patch-v2.json` through server.updateSettings on both backends; do not mutate either while static captures run. `python3 paired-static.py android` or `python3 paired-native-clock.py <light|dark>` (iOS) loads each side's own Metro, waits for the native helpers and real row data, scrolls to the exact bottom anchor, and captures both themes. `still.py` (Android) / `still-native-clock.py` (iOS) retain a frame only after two full-screen screenshots at least 500 ms apart are pixel-identical. Raw pairs and settled.jsonl identify the retained source frames.
10. `diffs.py` generates full-screen zero-threshold and threshold-8 RGB masks and comparison sheets. Every nonzero pixel is amplified to magenta, including one-level changes in Diff0. `runtime-transcripts.py` removes settings/config RPC payloads from public transcripts. `video-sheets.py` extracts the last native frame at/before a timestamp (not a future frame from a variable-frame-rate seek); captions record its actual PTS. Contact frames are recording excerpts, not settled still proof.
11. `verify-cdn.py` records HTTP status/content-type for the three actual icons and missing agent. `upload.py` invokes `ghdrop upload -m` and saves its output verbatim. All scripts/seed variants/transition patches are in the scripts archive. Capture directories, secrets and real databases are excluded.

The settings RPC driver issues a credential in memory, obtains a websocket ticket and calls the production typed RPC. CLI output remains private except explicitly sanitized native-state transcripts. No actual provider turn, authentication to a provider, managed provider install/update, source-control mutation, or live database access is part of this fixture.
