# Mobile deep-link evidence

Use two detached checkouts: base 17a6a01d84e3adf9f29df2639d6b6079a434e1b2 and head b8e8bb04d30f9638977072b16eb910c825aacd00.
Install dependencies and prepare each iOS client with `vp run mobile:install ios --prepare`.
Run each checkout's Metro on a different reachable port, with `vp run dev:client --port PORT` from apps/mobile.

For each side set REPO_ROOT to its checkout, RUN_DIR to a new timestamped scratch directory, DEVICE_HOST to the device-reachable host, and run `node seed.mjs`. This invokes that checkout's real server, with a new database, synthetic acme-app project and empty Notification example thread. It never reads a live database. The helper's scripted provider is not invoked: no agent turn is needed for this navigation bug.

Lease an iPhone 17 Pro and an iPad Pro 13-inch (M5) through agent-device's pool proxy; pass the session on every command. Install the client with `vp run mobile:install ios --session SESSION`. Set light appearance; keep phone portrait (402 x 874 logical points) and tablet landscape (1376 x 1032), with tablet columns at the default 28% sidebar width.

`drive.py launch --metro ORIGIN --connection CONNECTION_JSON --session SESSION` opens the selected bundle. Accept the iOS launch confirmation if present and wait for the real app to load. `drive.py pair` pairs the synthetic server; with REPO_ROOT set it mints a fresh credential. Never upload connection.json, credentials or raw device logs.

When both servers have been paired, `select-environment.py --index 0|1 --session SESSION` enables only base or head, ordered by pairing. On tablet there is no Back control on the Environments page: select Chats directly after toggling the connections.

`capture-flow.py --connection CONNECTION_JSON --session SESSION --out NEW_OUTPUT_ROOT` records Chats -> Usage -> thread deep link -> Back -> Usage. Add `--tablet` to record Chats -> Usage -> thread deep link -> Usage (tablet has no Back button in this layout). The same script drives each side. It saves the thread still only after two PNG captures at least 500 ms apart are byte-identical.

Observed on base: Usage remains selected, bottom navigation overlaps the phone composer, Back returns to Usage; on tablet the thread is full width and the navigation overlaps the composer. Observed on head: phone composer is clear, Back returns to Chats with Chats selected, Usage opens normally; tablet selects Chats and preserves sidebar and thread columns.

Public exports hide environment metadata using privacy masks. Video speed and event order are unchanged. Phone videos are 804 x 1748; tablet videos are 1376 x 1032. Stills retain logical-point resolution. Public images use localized masks over environment labels; videos use two horizontal privacy bands to cover labels during navigation transitions. All uploaded captures were inspected as images or decoded video contact sheets covering the full timeline.

The alternative deep-link reproduction was used. Push delivery, tapping an actual notification, and background/cold-start notification handling were not exercised. No claim about them is made.

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