# Android Fast selection proof

Environment for both sides: Android API 36, Pixel 9 emulator, 1080×2424 portrait,
light appearance, cached native development client, each commit's own Metro bundle
and real server. Fresh isolated databases; no live data was copied.

Seed through the server CLI (run from each checkout, with its own HOME and PORT):

```sh
export T3CODE_PORT="$PROOF_PORT"
node apps/server/src/bin.ts project add "$PROOF_PROJECT" --title 'Fast toggle demo' --base-dir "$PROOF_HOME"
# Enable the Cursor provider instance in the disposable environment's settings.
node apps/server/src/bin.ts thread start "$PROOF_PROJECT" 'Reply only ready.' --title 'Fast toggle check' --provider cursor --model composer-2.5 --base-dir "$PROOF_HOME" --json
node apps/server/src/bin.ts thread send "$PROOF_THREAD" 'Reply only second ready.' --base-dir "$PROOF_HOME" --wait
node apps/server/src/bin.ts thread send "$PROOF_THREAD" 'Reply only third ready.' --base-dir "$PROOF_HOME" --wait
```

No options were supplied in these model selections. The messages used the real
Cursor provider and completed. These are synthetic messages only.

Drive the native app with agent-device, using the same leased session throughout:

1. Clear mobile app data between commits, load that checkout's Metro URL, and pair
   with its isolated server using the repository's pair-client.sh helper.
2. Open Fast toggle check. Inspect the composer accessibility label.
3. Open Model and reasoning settings; search Composer 2.5 (search only, do not
   select another model), dismiss the keyboard, inspect Fast, and capture.
4. On base and current main the unset selection displays Fast/on. On head it
   displays Normal/off.
5. On base/current main, turn Fast off and close/reopen to check the original
   stuck-toggle sequence. It stays off. This preparatory click is unnecessary on
   head because the unset switch is already off.
6. Enable Fast, close and reopen settings, verify checked, close, and send
   'Reply only fast enabled.' Wait for the real turn to finish.
7. Reopen settings, search Composer 2.5, disable Fast, close and reopen, verify
   unchecked, close, and send 'Reply only fast disabled.' Wait for completion.
8. Inspect the Cursor protocol run.completed model params. Both sides return
   fast="true" and fast="false" for the corresponding turns.

The stills remove only the Android status bar. Their content was pixel-identical
in two captures separated by at least 500 ms (head's charging icon outside the
cropped content was animated). Enable clips are unbroken excerpts of the switch
interaction. Persistence recordings crop the app header for privacy and briefly
cover unrelated model catalog entries during reopening; no Fast switch state is
replaced. Long idle periods caused by device tooling remain in those recordings.

Base: [46afd69a8b](https://github.com/pingdotgg/t3code/commit/46afd69a8b6dd4149747fd04d86576af009f7eec)
Head: [ffda2cd8c2](https://github.com/pingdotgg/t3code/commit/ffda2cd8c2c3b43b1d05cef19d1325bfc9331ebd)
Additional current-main check: [e2a781477a](https://github.com/pingdotgg/t3code/commit/e2a781477afd2aea1741f720afa9067294e7a1b7) (same unset display error, usable toggle).

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