# Stop-hook continuation proof

Each commit runs its own unmodified app from a separate checkout, with an empty T3 home (T3CODE_DEV_SEED=0). The seed script creates synthetic git projects and once-only Stop command hooks. No live database is copied.

1. Run `python3 proof-driver.py <scratch-directory> <base-or-head> <block-or-context>` from each checkout to create and register the projects.
2. Open the real web client in Chromium at 1280×800 in light theme. Create a new thread in the corresponding project. Select Claude Haiku (model alias `haiku`), Medium reasoning, full access.
3. Paste the exact prompt in the seed script, record from this new thread, and submit. Wait for completion. Leave Worked for closed.
4. On head, expand Stop hook asked Claude to continue to show `Reply exactly: The stop hook ran.`. Capture the final state and stop recording. On base, observe the original answer disappears at completion; there is no distinct Stop-hook notice.
5. Check two final screenshots taken at least 500 ms apart are identical. The still and recording use the same thread. Both sides' saved user and assistant texts compare identically; the uploaded JSON files contain those messages.
6. Install the matching cached iOS dev client and serve each checkout with its own Metro. Pair to the corresponding isolated server. Open the same completed conversation on iPhone 18 Pro / iOS 27.2 in light theme. Record from that conversation; on head expand the notice. Capture the original answer, notice details, and reply with Worked for closed. On base capture the collapsed state and then expand Worked for to show where the original answer went.

Web videos show the real turn streaming and settling. iOS videos inspect those same completed runs; they do not issue separate model calls. The model was live Claude via its configured CLI gateway, not generic ACP replay. The scenario runner's generic ACP replay cannot reproduce provider-specific Claude Stop-hook frames, so this uses the manual workflow.
