# N1 — touch — dark
Linux x86_64; Playwright Chromium 148.0.7778.96, headless; DPR 1; font scaling 100% (UI 16px, code 13px, terminal 12px); viewport/hasTouch only; dark 1280×800 (N1: 980×800, 700×800, 390×844, then 1280×800); reduced motion; fixed browser clock 2026-11-10T12:00:00Z. Touch: pointer:coarse=true and any-pointer:coarse=true; M1 mouse: both false.

Before [4c36119](https://git.cafe/pingdotgg/t3code/commit/4c361199f47f6ea32a2c14835df392640d0f7c63); After [30ab341](https://git.cafe/pingdotgg/t3code/commit/30ab3415f19f1c18e0ae2e6f0a86b302983a73a1).

Contact timestamps below are start–end, logged immediately before dispatch (never after the contact/wait). Video time is calibrated to the first visible pink marker at 25 fps; allow about 0.1s encoding precision.

| Step | Before contact / result | After contact / result |
|---|---|---|
| Chapter: 980: right sheet; outer absent, selected-file inner separator remains | 00:00.15 | 00:00.15 |
| Chapter: 980 bottom terminal remains a drawer | 00:06.13 | 00:06.92 |
| Chapter: 700 mobile sidebar sheet: inspect sm:flex rail target | 00:08.10 | 00:08.92 |
| Chapter: 390: sidebar rail hidden | 00:09.47 | 00:10.31 |
| Chapter: 390 open mobile sidebar: rail still hidden | 00:10.81 | 00:11.68 |
| Chapter: 1280 maximized: outer handle absent | 00:11.97 | 00:12.82 |
| Chapter: 1280 restored: outer handle returns | 00:14.91 | 00:15.75 |
| Chapter: right panel closed: handle inert | 00:15.53 | 00:16.38 |
| Chapter: drawer closed: handle not interactive | 00:19.52 | 00:20.37 |
| Chapter: drawer reopened | 00:23.37 | 00:24.22 |
| 980 inner at bounds | 00:01.10–00:02.12; 160→160px (Δ+0); pointercancel; terminal labels 0→0 | 00:01.10–00:02.11; 160→160px (Δ+0); pointerup; terminal labels 0→0 |
| 700 open sidebar sheet | 00:07.27–00:07.38; see size/target log; pointerup; terminal labels 0→0 | 00:08.09–00:08.20; see size/target log; pointerup; terminal labels 0→0 |
| 700 mobile rail tap | 00:08.62–00:08.73; see size/target log; pointerup; terminal labels 0→0 | 00:09.45–00:09.57; see size/target log; pointerup; terminal labels 0→0 |
| 390 open sidebar | 00:10.02–00:10.12; see size/target log; pointerup; terminal labels 0→0 | 00:10.85–00:10.97; see size/target log; pointerup; terminal labels 0→0 |
| maximized former outer boundary guard | 00:12.89–00:13.89; 1024→1024px (Δ+0); pointercancel; terminal labels 0→0 | 00:13.74–00:14.73; 1024→1024px (Δ+0); pointercancel; terminal labels 0→0 |
| closed former outer boundary guard | 00:16.45–00:17.44; see size/target log; pointercancel; terminal labels 0→0 | 00:17.31–00:18.29; see size/target log; pointercancel; terminal labels 0→0 |
| closed former drawer boundary guard | 00:20.44–00:21.43; see size/target log; pointercancel; terminal labels 0→0 | 00:21.30–00:22.28; see size/target log; pointercancel; terminal labels 0→0 |

| Before recording | After recording |
|---|---|
| [before-N1.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/cece8274dae1c2d9/before-N1.mp4)<br>[4c36119](https://git.cafe/pingdotgg/t3code/commit/4c361199f47f6ea32a2c14835df392640d0f7c63) | [after-N1.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f458a3aa0bfb413d/after-N1.mp4)<br>[30ab341](https://git.cafe/pingdotgg/t3code/commit/30ab3415f19f1c18e0ae2e6f0a86b302983a73a1) |

Narration is composited below the app viewport; stills and diffs contain only app pixels. Every still passed reduced motion, network idle, fonts ready and two pixel-identical screenshots 500ms apart.

| Before | After | Diff0 | DiffT (>5/255 maximum RGB channel difference) |
|---|---|---|---|
| ![Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/97e382ce0e04d616/before-N1.png) | ![After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5a8f5314ab732ab8/after-N1.png) | ![Diff0 ×255](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/80d8039eb3034c9d/N1-diff0.png) | ![DiffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/86277e9b23e0c1a2/N1-diff5.png) |

[Before full probe log](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c0eb449fffec211f/before-N1.jsonl) · [After full probe log](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/63d2ee7bb27988fb/after-N1.jsonl)

[Before matching video frame](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/28939bd7b468a635/before-N1-video-frame.png) · [After matching video frame](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7d403a014dacb4f4/after-N1-video-frame.png)

![Before / After / Diff0 / DiffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bac5af60a9186c59/N1-sheet.png)

Changed pixels: exact=0; threshold >5=0.

Viewport sequence: 980×800 → 700×800 → 390×844 → 1280×800. A 1280×844 recording canvas preserves the full narrow viewport without scaling; unused space is letterboxed. External narration adds 120px below the canvas, is wrapped, and cannot clip at 390px. The settled app still is 980×800.
