# Evidence S1 / U1 — capture 5

PR [#33680](https://git.cafe/pingdotgg/t3code/pull/33680). Before [633438d54f](https://git.cafe/pingdotgg/t3code/commit/633438d54f17b99f73f1a09466ecbe4a6aa0d545); head [06c360d934](https://git.cafe/pingdotgg/t3code/commit/06c360d934daf28b59cda4efc7616408f2458e32).

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

## Environment and method

Same pooled Pixel 9 lease for all six measured windows and both U1 sides: device 32e6c805-8acd-4e0f-9e35-b4386cee2880, emulator-5590, Android 16/API 36 per pool catalog, 1080×2424 screenshots. Logical viewport/DPR were not independently measured. OS font scale read back as 1.0. App text remained at its fresh-install default 16 pt (source default; a separate UI read-back of the numeric value was not obtained). S1 is dark; U1 is light.

Both detached worktrees were installed with vp install and verified clean at their exact SHAs. Backend ports 18351/18352; Metro 8185/8186, on fs-72. T3CODE_DEV_SEED=0; only the inspected synthetic seed driver supplied data. No live userdata, other capture worktree, real model turns, code edits, commits, or PR-body edits. Dev client prepared and installed only through mobile:install; identical native fingerprint 832d41716ea2dfac7350605db3fd07914f87d6ef. Metro ran in CI mode on both sides after the initial watcher-limit failure.

S1 reused pass 3’s exact diff payload: 400 +/- body lines, 120 ms per emitted line, SHA-256 cb9f3c7932d0a358e5d7fa7f7284f0e84600654173887c62b2ffd202cf71998f. Each trial uses a fresh synthetic thread. The perf read immediately before dispatch resets Android gfxinfo; no further frame read occurs until the final plain/coloured body and Done are visible, Thinking/Working are absent, and two status-bar-normalized whole screenshots are pixel-identical with >=500 ms between capture requests. Per-trial manifests preserve both screenshots, times, trees, and frame reads. The device tool reported 60 Hz at reset and final read for every trial; no refresh-setting change was made.

## S1 repeated measurements

| Order | Side/trial | Window s | Frames | Janky | Janky % | Worst reported ms* | Hz reset/end |
|---|---|---:|---:|---:|---:|---:|---|
| 1 | before 1 | 201.111 | 365 | 210 | 57.5 | 266.8 | 60/60 |
| 2 | after 1 | 66.648 | 332 | 209 | 63.0 | 583.9 | 60/60 |
| 3 | before 2 | 74.137 | 380 | 205 | 54.0 | 77.2 | 60/60 |
| 4 | after 2 | 70.329 | 345 | 190 | 55.1 | 1076.9 | 60/60 |
| 5 | before 3 | 64.907 | 362 | 224 | 61.9 | 135.0 | 60/60 |
| 6 | after 3 | 124.198 | 365 | 213 | 58.4 | 1183.6 | 60/60 |

| Side | Window s mean [range] | Frames mean [range] | Janky mean [range] | Janky % mean [range] | Worst reported ms mean [range] |
|---|---|---|---|---|---|
| before | 113.38 [64.91–201.11] | 369.00 [362.00–380.00] | 213.00 [205.00–224.00] | 57.80 [54.00–61.90] | 159.67 [77.20–266.80] |
| after | 87.06 [66.65–124.20] | 347.33 [332.00–365.00] | 204.00 [190.00–213.00] | 58.83 [55.10–63.00] | 948.13 [583.90–1183.60] |

Jank percentage does **not** show the head worse beyond trial-to-trial variation: the mean rises 1.03 percentage points and the ranges overlap (before 54.0–61.9%; head 55.1–63.0%). The tool’s reported worst frames **are worse beyond the observed before range** on all three head trials (head 583.9–1183.6 ms versus before 77.2–266.8 ms). This is a tail-latency concern, not a performance pass.

*The API returns three selected worst windows, each with worstFrameMs. This column is the maximum among those returned windows, not an independently verified global worst frame from the raw gfxinfo dump. The sampling method and tool JSON are preserved.

B1 includes a 201.111 s window: pool retries, a missing local image dependency, and a capture helper serialization error delayed final read. A3 includes 124.198 s: its first guard correctly refused to read while Thinking remained, and its first screenshot pair differed by a thin top-content strip; the next pair matched. These long idle tails and debug-client/emulator scheduling limit causal inference. No unsuccessful pre-send navigation attempt is counted as a measured trial. Means include all six requested windows without silently dropping the awkward samples.

S1 before video steps (seconds from record start): 0–2 reset/send; approximately 2–51 synthetic replay and Working; approximately 51 onward final plain body and Done; delayed settled checks and read near 201 s after reset. Android screenrecord produced two consecutive chunks; the supplied whole-screen file concatenates them without spatial or speed changes.

[S1-before-whole-screen.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4e73866c989686a7/S1-before-whole-screen.mp4)

S1 head video steps: 0–2 reset/send; approximately 2–53 replay; final coloured body near 53–60; settled screenshots then final read near 67 s after reset. Android sparse encoding ends at 65.5 s of a 70 s recording window; the last encoded frame was decoded and checked to show the coloured body and Done.

[S1-after-whole-screen.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/402f48c726949c34/S1-after-whole-screen.mp4)

![S1 repeated janky-frame percentages](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/29e62d08c72aab02/S1-trials.png)

## U1 interaction

The user’s own narrow bubble contains the same wide Kotlin fence plus a Diff fence on both sides. The interaction script pans the Kotlin body sideways/back, long-presses its body, chooses Copy from the menu, enables wrap, disables wrap, and pans sideways/back again. The Diff sibling remains visible; it is not a second independent gesture target. Copy is corroborated by Android’s copied-text overlay containing the fixture text.

### before

Steps/timestamps above the recording (seconds relative to record start):

- 0.0–2.8s: Pan the own Kotlin body sideways.
- 6.5–8.7s: Pan back across the own Kotlin body.
- 8.7–11.1s: Long-press the own Kotlin body to open its menu.
- 16.7–18.2s: Choose Copy from the menu.
- 20.0–21.5s: Enable line wrap.
- 26.0–27.5s: Disable line wrap.
- 27.5–29.7s: Pan the own Kotlin body sideways.
- 29.7–31.9s: Pan back across the own Kotlin body.

[U1-before-whole-screen.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3314073e6fb87652/U1-before-whole-screen.mp4)

### after

Steps/timestamps above the recording (seconds relative to record start):

- 0.0–2.6s: Pan the own Kotlin body sideways.
- 10.0–15.8s: Pan back across the own Kotlin body.
- 15.8–18.3s: Long-press the own Kotlin body to open its menu.
- 24.5–26.2s: Choose Copy from the menu.
- 28.9–30.5s: Enable line wrap.
- 37.7–39.4s: Disable line wrap.
- 39.4–41.7s: Pan the own Kotlin body sideways.
- 41.7–44.8s: Pan back across the own Kotlin body.

[U1-after-whole-screen.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6e2fd879dc5a85b1/U1-after-whole-screen.mp4)

U1 outcome: the scripted interaction completed on both sides. Menu Copy, wrap on/off, and subsequent horizontal panning were verified through screenshots, accessibility state, copied-text overlay, and decoded video review.

![Before and after — U1 own-message wrapped state](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5412d076a4746c0e/U1-before-after-wrapped.png)

## What else changed

- Head adds token colours to these fallback Kotlin/Diff bodies and changes their shared header, border, glyph, and body geometry. The PR also changes anchored-menu placement and lets headers grow with large text; T1 was deliberately left to the separate capture step.
- Same emulator lease, native client, OS scale, themes per row, synthetic payload, debug mode, and Metro CI configuration were retained across sides. Backend and Metro ports differ by checkout.
- Only trial 1 on each side was screen-recorded; both sides of that pair include recording overhead, while later pairs have no recording. Window lengths vary as listed.
- Pool recovery consumed substantial time. The initial root/worktree lease mismatch was corrected before the successful lease/install. Failed navigation happened before resets.

## Uploads

[S1-before-whole-screen.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4e73866c989686a7/S1-before-whole-screen.mp4)
[S1-after-whole-screen.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/402f48c726949c34/S1-after-whole-screen.mp4)
[U1-before-whole-screen.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3314073e6fb87652/U1-before-whole-screen.mp4)
[U1-after-whole-screen.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6e2fd879dc5a85b1/U1-after-whole-screen.mp4)
![S1-trials.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/29e62d08c72aab02/S1-trials.png)
![U1-before-after-wrapped.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5412d076a4746c0e/U1-before-after-wrapped.png)
[capture-5-drivers-and-raw-evidence.zip](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ee834e35469ef556/capture-5-drivers-and-raw-evidence.zip)
[capture-5-sanitized-command-logs.zip](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9aa64c0cfb9a814c/capture-5-sanitized-command-logs.zip)


## Cleanup

All three sessions used during pool recovery were closed. Both backends and both Metro servers were stopped by their captured process groups; the initial failed Metros had already exited. No listener remains on 18351/18352/8185/8186. Both capture worktrees were removed. No PR or source changes were made.

## Friction

tool | Remote-daemon/worker failures, snapshot-helper failure, and slow transfers | A healthy connected pool worker and bounded commands.
model | Initial lease opened from a different workspace than installer; missing Pillow and Path JSON serialization delayed B1 | Keep all commands in the lease workspace and preflight the capture helpers.
infra | Metro exhausted 65,536 file watches | Run both capture Metros with CI=1 from the start.
