### N1 — New task → first send, iOS 18 iPhone

Environment for every capture: real T3 Code Dev native app; same leased iPhone Xs simulator, iOS 18.6; portrait; 375×812-point viewport; light theme; whole-screen 375×812 PNGs. Recordings preserve the whole screen and original timeline at 750×1624, 30 fps. Fresh synthetic single-project databases, same prompt, free Replay (dev) provider, same scenario, initial feed position. Before [80e1e4d14d](https://git.cafe/pingdotgg/t3code/commit/80e1e4d14dddae107d017ed8a1baf0acd3389f17); after [4980e33628](https://git.cafe/pingdotgg/t3code/commit/4980e3362893ef185de653a8c2350e3b034f9013).

The same driver performs these steps on both sides. Approximate clip timestamps are shown **above the recording pair**:

| Interaction | Before | After |
| --- | --- | --- |
| Open New task (New chat in this client) | 00:01 | 00:01 |
| Pick Capture Fixture project | 00:04 | 00:04 |
| Open model picker; choose Replay (dev), select scenario, save | 00:07–00:19 | 00:07–00:19 |
| Type `Check the header spacing.` with software keyboard up | 00:19 | 00:19 |
| Send with keyboard up; switch from draft to live thread | 00:23 | 00:23 |
| Immediately refocus live composer | 00:26 | 00:25 |
| Reply streams, then completes | about 00:26–00:29 | about 00:26–00:29 |
| Accepted pixel-identical keyboard-up frame pair | 00:59–01:05 | 00:34–00:40 |
| Tap reply to dismiss keyboard | 01:06 | 00:42 |
| Accepted pixel-identical keyboard-down frame pair; settle | 01:08–01:16 | 00:44–00:51 |

[Before recording](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/12827fbb2eeff5a0/before-N1.mp4) · [After recording](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0daa5575a2eef8a3/after-N1.mp4)

Send explicitly blurs the draft input in `NewTaskDraftScreen.handleStart`, so the app closes the keyboard on both sides. The driver immediately refocuses the live composer for the keyboard-up still. The recordings retain that dismissal/refocus; the still is the first accepted fully settled pair after refocusing, rather than a claim that the keyboard remains open automatically. Cursor-blink mismatches were rejected.

Every final still has two **pixel-identical whole-screen captures** with a 500 ms pause between screenshot operations (remote command latency makes the capture interval longer). No cropping, registration, or cursor masking. The clock is normalized for stills. [Stability proof](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9a3184647751a742/N1-stability-proof.zip) · [Hashes and timestamps](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ade37afe81f63882/stability.json).

Diff0: every nonzero maximum RGB-channel difference, amplified to magenta. DiffT: maximum RGB-channel difference **over 5% (12.75/255)**, amplified to magenta. Unchanged pixels are black. The diff covers the entire viewport. Model rows and picker transitions are greyed out in recordings; no model label appears in the stills.

| State / rendering environment | Before | After | Diff0 | DiffT >5% |
| --- | --- | --- | --- | --- |
| Revision | [80e1e4d14d](https://git.cafe/pingdotgg/t3code/commit/80e1e4d14dddae107d017ed8a1baf0acd3389f17) | [4980e33628](https://git.cafe/pingdotgg/t3code/commit/4980e3362893ef185de653a8c2350e3b034f9013) | [80e1e4d14d](https://git.cafe/pingdotgg/t3code/commit/80e1e4d14dddae107d017ed8a1baf0acd3389f17) → [4980e33628](https://git.cafe/pingdotgg/t3code/commit/4980e3362893ef185de653a8c2350e3b034f9013) | [80e1e4d14d](https://git.cafe/pingdotgg/t3code/commit/80e1e4d14dddae107d017ed8a1baf0acd3389f17) → [4980e33628](https://git.cafe/pingdotgg/t3code/commit/4980e3362893ef185de653a8c2350e3b034f9013) |
| **N1a: first-send settled, keyboard up after immediate refocus** · iPhone Xs / iOS 18.6 · 375×812 · light | ![Before: keyboard up](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/11832851b0d1ce23/before-keyboard-up.png) | ![After: keyboard up](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/82f35ac00186149e/after-keyboard-up.png) | ![N1a Diff0, all changed pixels amplified](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/55c7ceea8491d862/N1-keyboard-up-Diff0.png) | ![N1a DiffT, over 5 percent RGB difference](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2fbf6b9c8385430e/N1-keyboard-up-Diff5.png) |
| **N1b: reply complete, keyboard dismissed, settled** · iPhone Xs / iOS 18.6 · 375×812 · light | ![Before: keyboard dismissed](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4ac1edb11a5ca068/before-keyboard-down.png) | ![After: keyboard dismissed](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0c9fb587705aff41/after-keyboard-down.png) | ![N1b Diff0, all changed pixels amplified](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/44514e7d0ae369fd/N1-keyboard-down-Diff0.png) | ![N1b DiffT, over 5 percent RGB difference](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b2af92eee3c65bec/N1-keyboard-down-Diff5.png) |

**Observed result:** before hides the sent bubble under the bar after switching to the live thread. After keeps it fully below the bar, during Pending, streaming, and both settled keyboard states. The reply moves down 88 points, one header height. No doubled gap, bubble under the bar, or additional feed jump was observed after. Both versions deliberately dismiss the keyboard on Send; the driver restores it for N1a.

**What else changed:**

- Automatic thread title: before shows `Review Heade…`; after shows `Header Spaci…`.
- Message timestamps: before 6:46 AM; after 6:51 AM. Still clock is 9:41; recordings show the brief clock normalization while stills are captured.
- Accepted stills occur at different clip times because cursor-blink frame pairs are rejected until identical. The scripted interaction order and Send timing match.
- Grey boxes cover model choices and sheet transitions in both recordings. The thread view is unobscured. Composer, keyboard, native bar, theme, and viewport remain aligned in the whole-frame diffs.

[seed.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/901ca3f3d9d71b62/seed.mjs)
[action.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/82a146a6aeb00b7e/action.py)
[capture.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/49761a3a640d08ca/capture.py)
[make-video.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/aa053893675ada23/make-video.py)
[matched-driver.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/dad08ef9e2cbdd05/matched-driver.py)
[make-diffs.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9d89b00fa4833bea/make-diffs.py)
[process-video.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b3b270cfe7add2b6/process-video.py)
[export-proof.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b0c5c7ad2b73909f/export-proof.py)
[driver.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1b0b9b8cda321612/driver.md)

[Before action timestamps](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ef5d3f88a0bc4580/before-actions.json) · [After action timestamps](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/706efa8c59fa5e22/after-actions.json).

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

<details>
<summary>ghdrop output (verbatim)</summary>

```markdown
![before-keyboard-up.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/11832851b0d1ce23/before-keyboard-up.png)
![after-keyboard-up.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/82f35ac00186149e/after-keyboard-up.png)
![N1-keyboard-up-Diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/55c7ceea8491d862/N1-keyboard-up-Diff0.png)
![N1-keyboard-up-Diff5.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2fbf6b9c8385430e/N1-keyboard-up-Diff5.png)
![before-keyboard-down.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4ac1edb11a5ca068/before-keyboard-down.png)
![after-keyboard-down.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0c9fb587705aff41/after-keyboard-down.png)
![N1-keyboard-down-Diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/44514e7d0ae369fd/N1-keyboard-down-Diff0.png)
![N1-keyboard-down-Diff5.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b2af92eee3c65bec/N1-keyboard-down-Diff5.png)
[before-N1.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/12827fbb2eeff5a0/before-N1.mp4)
[after-N1.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0daa5575a2eef8a3/after-N1.mp4)
[N1-stability-proof.zip](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9a3184647751a742/N1-stability-proof.zip)
[stability.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ade37afe81f63882/stability.json)
[before-actions.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ef5d3f88a0bc4580/before-actions.json)
[after-actions.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/706efa8c59fa5e22/after-actions.json)
[seed.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/901ca3f3d9d71b62/seed.mjs)
[action.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/82a146a6aeb00b7e/action.py)
[capture.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/49761a3a640d08ca/capture.py)
[make-video.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/aa053893675ada23/make-video.py)
[matched-driver.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/dad08ef9e2cbdd05/matched-driver.py)
[make-diffs.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9d89b00fa4833bea/make-diffs.py)
[process-video.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b3b270cfe7add2b6/process-video.py)
[export-proof.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b0c5c7ad2b73909f/export-proof.py)
[driver.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1b0b9b8cda321612/driver.md)
```

</details>
