# Native Settle / Undo capture driver

Surface: T3 Code development client on an iPhone 18 Pro simulator, iOS 27.2, 402×874 logical points, light appearance. Captures crop the 62-point status bar, leaving 402×812 app content. Each published still is checked against another screenshot taken 500 ms later; both cropped PNGs must be byte-identical. The status bar was excluded because its charging indicator animates.

Use one isolated checkout and fresh T3 home per commit. Install dependencies with `vp i`; prepare the native client with `vp run mobile:install ios --prepare`. Lease the named phone through the device pool, using session `settle-proof-native`. Install only with `vp run mobile:install ios --session settle-proof-native`.

The included `harness/scenarios/start-app.ts` is the repository's real scenario app launcher. From the target checkout, run it with `T3CODE_DEV_SEED=0` and arguments `mobile HOME SERVER_PORT METRO_PORT TAILNET_IP`. It creates a fresh home, disables paid providers and enables the free Replay provider. Its server binds all interfaces; Metro serves the checkout's own JavaScript. The harness imports use the dependencies of the scenario-runner checkout; link `harness/node_modules` to that checkout's `scripts/node_modules` and set `T3_SCENARIO_APP_DIR` to the target checkout.

Seed using `T3_SCENARIO_APP_DIR=CHECKOUT node harness/seed.ts HOME TAILNET_IP SERVER_PORT`. This creates a synthetic project and completed Alpha, Beta and Gamma threads through the real CLI and saves a local pairing credential. Never upload the generated `seed.json`.

Run `node native-driver.mjs launch SIDE HOME CHECKOUT SERVER_PORT TAILNET_IP METRO_PORT`, then `node run-native.mjs SIDE HOME CHECKOUT SERVER_PORT`. SIDE is `base` or `head`. The second command:

1. Pairs the native app, opens General settings, turns Working section off, returns to Chats.
2. Captures Gamma / Beta / Alpha; records a full left swipe to Settle Beta and immediate Undo, then captures the result.
3. Seeds fresh Delta, Epsilon and Zeta. Records long-press Zeta → More → Arrange → Move down, captures Epsilon / Zeta / Delta, then full-swipe Settle and immediate Undo. Captures the result.
4. Records long-press Zeta → Pin, captures the pinned state, full-swipe Settle and immediate Undo, then captures pin restoration.

Before switching commits, stop the old server, uninstall the development app, reinstall it from the other checkout, open its Metro URL, and repeat with that checkout's fresh home. iOS secure storage can retain the synthetic saved connections after uninstall; the old servers are stopped, so only the current isolated server supplies threads. The observed order JSON and the real screenshots/recordings are the proof; the driver does not replace the real client with assertions or mocks.

Expected base observations: automatic Beta moves to the top; manually placed Zeta moves to the top. Expected head observations: both stay in their saved positions. Pin restoration remains intact on both commits. Web scenarios separately cover snooze restoration and the manual position after waking the restored snooze.
