# Evidence pass 2

PR [#33680](https://git.cafe/pingdotgg/t3code/pull/33680). Before [633438d54f](https://git.cafe/pingdotgg/t3code/commit/633438d54f17b99f73f1a09466ecbe4a6aa0d545); after [63069af964](https://git.cafe/pingdotgg/t3code/commit/63069af9644a7b85993ad6fee73de314efac088e). No commits or PR edits. Synthetic data only.

**Observed failure at requested head:** K1 opens the body copy menu but closes the visible Gboard keyboard. Fresh-node and coordinate long-press takes both reproduce it. K2 also closes Gboard. K3's existing attachment menu preserves it. These observations are failing evidence, not a claim that the requested keyboard fix passed.

Before source: [633438d54f](https://git.cafe/pingdotgg/t3code/commit/633438d54f17b99f73f1a09466ecbe4a6aa0d545). After source: [63069af964](https://git.cafe/pingdotgg/t3code/commit/63069af9644a7b85993ad6fee73de314efac088e). Each is a detached, task-created checkout; neither reads the lead's checkout or live T3 data. Dependencies installed independently with vp install. Backends started with T3CODE_DEV_SEED=0 against their own .t3, then seeded through authenticated server RPC and a synthetic ACP replay. No direct database writes or migration command.
Android native fingerprint (both revisions): 832d41716ea2dfac7350605db3fd07914f87d6ef, x86_64. iOS native fingerprint (both): 5fa891c99bf29870cc7d56112e3458d95a948393. Prepared through mobile:install --prepare; installed through mobile:install --session only. No manual cache download.
Android original captures: pooled Pixel 9, Android 16 / API 36 (Metro descriptor Google sdk_gphone64_x86_64), full screenshot 1080x2424. Gboard is the real visible keyboard; settings text-size reads large (the CLI's label for the default; multiplier not independently read back in the original lease). iOS: pooled iPhone 18 Pro, pool catalog iOS 27.2, full screenshots 1206x2622 at 3x and inspection images 402x874 at 1x; text-size large. Both OS appearances are dark. App uses the T3 Code theme; Android Appearance was read back as System, resolving to dark. iOS effective theme is dark; its preference was not independently read back. App text size is the 16-point source default; not independently read back through Settings. Same original iOS simulator lease used for both sides. Original Android lease closed after pool outage; replacement-device observations must be labelled separately. No claim of matching the original and replacement physical emulator.
Both clients reach this VM over Tailscale; Metro after on port 8081, before on 8082, with backend after 16325 and before 15216 bound to 0.0.0.0. No VITE_HTTP_URL or VITE_WS_URL set. These are real dev-client apps and server-to-client protocol streams, not component harnesses.
Still acceptance requires two pixel-identical full screenshots >=500 ms apart. Each accepted pair has a manifest plus both raw frames. Android status chrome normalized to 9:41 for accepted stills. iOS signal pixels initially changed continuously; accepted W1 samples followed agent-device settings wifi on / airplane on overrides, retaining network access. Natural iOS clocks differ (2:30 before, 2:28 after). No frozen-clock or whole-screen equivalence claim.
AI-assisted; verified with the tests and tools listed above.


## K1 — Android Pixel 9, dark, original lease

Steps and recording timestamps: Baseline coordinate take: focus composer, confirm visible Gboard, first body long-press at (540,1110), native menu opens and keyboard closes; different physical Pixel 9 emulator from head. After take 2, 0.02s focus composer; Gboard visibly opens; 55.54s FIRST long-press on fresh code-body ref; 63.04s keyboard probe reports hidden; 103.04s Copy as Markdown. Coordinate confirmation: 0.04s focus; 5.95s keyboard probe visible; 8.19s body long-press (540,1110); 13.86s probe hidden. Clipboard continuation: 0.03s tap Gboard clipboard suggestion; get-text subsequently reads the exact payload shown below. All recordings cover the whole device. Android screenrecord can end at its last changed frame; coordinate take covers 13.6s of 22.2s wall window.

| Device/theme | Before [633438d54f](https://git.cafe/pingdotgg/t3code/commit/633438d54f17b99f73f1a09466ecbe4a6aa0d545) | After [63069af964](https://git.cafe/pingdotgg/t3code/commit/63069af9644a7b85993ad6fee73de314efac088e) |
|---|---|---|
|Pixel 9 / dark|[K1-android-dark-before-replacement.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d1d1de4130b65619/K1-android-dark-before-replacement.mp4) (replacement Pixel 9; different physical emulator from original head)|[K1-android-dark-after-take2.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/dad5cedb0b334121/K1-android-dark-after-take2.mp4)<br>[K1-coordinate-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a4d5f424cc766578/K1-coordinate-after.mp4)<br>[K1-pasted-clipboard-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d446d2364ace1a95/K1-pasted-clipboard-after.mp4)|

Result: **FAIL** keyboard retention. Menu opens; Markdown copy works for this short fixture. Clipboard, pasted into an unsent draft and then cleared:

````text
```kotlin
val keyboard = "FIRST_LONG_PRESS"
val copy = 42
```
````

## K2 — Android Pixel 9, dark, original lease

Baseline repeat: 0.02s focus; 5.11s keyboard probe; 6.76s vertical pan +1600; 12.12s middle hold; 20.03s keyboard probe hidden; 27.45s dismiss; 29.03s second hold. No menu becomes visible. Head steps/timestamps: 0.03s focus composer; 6.67s vertical pan +1600 so the 90-line Kotlin block crosses both viewport edges; 19.00s long-press its middle; 24.84s keyboard probe hidden; 48.20s tap Copy; 51.83s repeat long-press with keyboard closed; 62.58s tap Copy as Markdown. Menu text is on screen and both actions respond. The requested keyboard-open presentation is **not established**, because long-press closes Gboard.

| Device/theme | Before [633438d54f](https://git.cafe/pingdotgg/t3code/commit/633438d54f17b99f73f1a09466ecbe4a6aa0d545) | After [63069af964](https://git.cafe/pingdotgg/t3code/commit/63069af9644a7b85993ad6fee73de314efac088e) |
|---|---|---|
|Pixel 9 / dark|[K2-android-dark-before-matched.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/517d75158980296d/K2-android-dark-before-matched.mp4) — corrected repeat holds show no visible menu. Video covers 15.4s of 38.0s wall window because static frames are not encoded. First baseline export was lost; the earlier Back recovery was rejected.|[K2-android-dark-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/983e462fc6839924/K2-android-dark-after.mp4)|

## K3 — Android Pixel 9, dark, same replacement lease

Same steps: focus the empty composer, confirm visible Gboard, tap Add attachment. Baseline: 0.02s focus; 5.64s keyboard probe visible; 7.32s Add attachment; 14.85s probe visible. Head: 0.02s focus; 5.12s probe visible; 6.84s Add attachment; a subsequent snapshot call failed, but the exported recording visibly includes the open menu and keyboard. Later successful snapshot and settled still confirm the state.

| Device/theme | Before [633438d54f](https://git.cafe/pingdotgg/t3code/commit/633438d54f17b99f73f1a09466ecbe4a6aa0d545) | After [63069af964](https://git.cafe/pingdotgg/t3code/commit/63069af9644a7b85993ad6fee73de314efac088e) |
|---|---|---|
|Same replacement Pixel 9 / Android 16 / dark|[K3-android-dark-before-replacement.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/13b7aee8faf25854/K3-android-dark-before-replacement.mp4)|[K3-android-dark-after-matched.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6d78230e37581105/K3-android-dark-after-matched.mp4)|

Result: **PASS — placement unchanged**. Menu interior rectangle `(32,1100)–(685,1387)` is pixel-identical at zero threshold, as is the entire keyboard region `(0,1541)–(1080,2424)`. Full-screen diff includes the expected new code rendering, changed feed height, and the composer caret being visible only in the after still. Both accepted stills independently passed pixel equality >=500ms apart.

| Device/theme | Before [633438d54f](https://git.cafe/pingdotgg/t3code/commit/633438d54f17b99f73f1a09466ecbe4a6aa0d545) | After [63069af964](https://git.cafe/pingdotgg/t3code/commit/63069af9644a7b85993ad6fee73de314efac088e) | Diff0, amplified 8x | Diff2% |
|---|---|---|---|---|
|Same Pixel 9 / dark|[K3-android-dark-before-valid.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2fb686c93be99e70/K3-android-dark-before-valid.png)|[K3-android-dark-after-matched.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/15f832b1114a0ecb/K3-android-dark-after-matched.png)|[K3-android-dark-diff0-amplified.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/02dbc5c844bebdc4/K3-android-dark-diff0-amplified.png)|[K3-android-dark-diff2percent.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e4e59cdda83beaae/K3-android-dark-diff2percent.png)|

![Before and after — attachment menu retains keyboard and placement](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7366a124be3b6a53/K3-android-dark-before-after.png)

## L1 — Android Pixel 9, dark, same replacement lease

Same driver on both sides: long-press first horizontal code body → Copy → wait for transient Android clipboard overlay → focus composer → tap Gboard clipboard suggestion → read and clear unsent draft → repeat with Copy as Markdown. Baseline steps/timestamps: 6.29s longpress @e18 800; 11.32s press label="Copy"; 20.60s press label="Ask anything"; 32.03s press 420 1600; 36.72s get text role="text-field"; 42.22s fill role="text-field" ; 48.19s longpress @e18 800; 52.99s press label="Copy as Markdown"; 61.99s press label="Ask anything"; 72.02s press 420 1600; 75.96s get text role="text-field"; 80.41s fill role="text-field" . Head steps/timestamps: 13.63s longpress @e20 800; 18.69s press label="Copy"; 28.13s press label="Ask anything"; 41.60s press 420 1600; 46.76s get text role="text-field"; 52.88s fill role="text-field" ; 60.27s longpress @e20 800; 65.65s press label="Copy as Markdown"; 75.51s press label="Ask anything"; 87.53s press 420 1600; 92.10s get text role="text-field"; 97.71s fill role="text-field" . Timings differ because device/transport calls take longer at head, but the script and semantic steps are identical. Both recordings are whole-screen and were inspected throughout.

| Device/theme | Before [633438d54f](https://git.cafe/pingdotgg/t3code/commit/633438d54f17b99f73f1a09466ecbe4a6aa0d545) | After [63069af964](https://git.cafe/pingdotgg/t3code/commit/63069af9644a7b85993ad6fee73de314efac088e) |
|---|---|---|
|Same replacement Pixel 9 / Android 16 / dark|[L1-android-dark-before-take3.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ca3f80a5a79df880/L1-android-dark-before-take3.mp4)<br>[L1-before-raw-clipboard.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c7f2c42b67cd6654/L1-before-raw-clipboard.txt)<br>[L1-before-markdown-clipboard.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5d27814f88594bcd/L1-before-markdown-clipboard.txt)|[L1-android-dark-after-take2.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f2c53af2387ea876/L1-android-dark-after-take2.mp4)<br>[L1-after-raw-clipboard.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5ea13d8c3f647d33/L1-after-raw-clipboard.txt)<br>[L1-after-markdown-clipboard.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ef5f1b992072a155/L1-after-markdown-clipboard.txt)|

Result: **PASS — longer Markdown fence at head**. Baseline readback starts/ends with three backticks and therefore collides with the triple run inside the body; head starts/ends with four. Raw body readback is the same on both sides. Both paths normalize the source tab into four spaces. The source messages themselves are byte-verified against the identical fixture. Readback was obtained by pasting the actual clipboard into the app, not by inferring from source.

Head Markdown clipboard readback:

``````text
````SQL
SELECT 'héllo 👋 漢字 ``` END_SENTINEL' AS value;

    -- indented marker
SELECT 42;
````
``````

Raw body readback, both sides:

````text
SELECT 'héllo 👋 漢字 ``` END_SENTINEL' AS value;

    -- indented marker
SELECT 42;
````

## W1 — iOS iPhone 18 Pro, dark, one simulator lease

Same semantic steps on both sides: pan the first unwrapped Kotlin body sideways and back; enable wrap on first block; disable wrap; pan again. Adjacent second block stays unwrapped. Before recording: 0.03s pan left, 2.95s pan right, 5.66s enable wrap at native header (334,490), 33.74s disable at relocated native header (334,398), 41.05s pan left, 44.68s pan right. After recording: 0.00s pan left, 3.74s pan right, 8.32s enable first Wrap lines, 11.94s exact `Disable line wrap` selector, 15.62s pan left, 19.08s pan right. Exact command timings are in the uploaded actions. Native before header controls are not accessibility nodes, so coordinates were visually verified. The baseline includes a longer pause while the wrapped header location was inspected. Header-copy and additional L1 variants are outside this narrowed W1 request and unverified.

| Device/theme | Before [633438d54f](https://git.cafe/pingdotgg/t3code/commit/633438d54f17b99f73f1a09466ecbe4a6aa0d545) | After [63069af964](https://git.cafe/pingdotgg/t3code/commit/63069af9644a7b85993ad6fee73de314efac088e) |
|---|---|---|
|iPhone 18 Pro / dark|[W1-ios-dark-before.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a56bc3de6d9b9980/W1-ios-dark-before.mp4)|[W1-ios-dark-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/be76343884ea5802/W1-ios-dark-after.mp4)|

Settled still comparison: same bottom feed anchor, identical synthetic content, same device/theme/text-scale. Header/body total-height changes move upper content; clocks differ. Each side independently has an identical full-screen screenshot pair >=500ms apart; this does not mean before equals after.

| Device/theme | Before [633438d54f](https://git.cafe/pingdotgg/t3code/commit/633438d54f17b99f73f1a09466ecbe4a6aa0d545) | After [63069af964](https://git.cafe/pingdotgg/t3code/commit/63069af9644a7b85993ad6fee73de314efac088e) | Diff0 (8x amplification) | Diff2% |
|---|---|---|---|---|
|iPhone 18 Pro / dark|[W1-ios-dark-before-airplaneoverride.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6074c8be055615d5/W1-ios-dark-before-airplaneoverride.png)|[W1-ios-dark-after-airplaneoverride.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d1cf27b02a018c11/W1-ios-dark-after-airplaneoverride.png)|[W1-ios-dark-diff0-amplified.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a18669beb13874da/W1-ios-dark-diff0-amplified.png)|[W1-ios-dark-diff2percent.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f391dc4f7ded1c3b/W1-ios-dark-diff2percent.png)|

![Before and after — iOS wide Kotlin fence](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4b36d0d21477dfdb/W1-ios-dark-before-after.png)

## S1 — Android Kotlin and 400-line diff streams

Exact synthetic replay: short first Kotlin fence plus 60 progressively emitted `val item` lines (1s/line); diff has 400 deletion/addition lines (120ms/line). Baseline Kotlin steps: 0.00s RPC send, 6.24s Wrap lines on the first fence, wait while second fence grows, 90.22s collect gfxinfo window, 91.96s return to top, 97.73s inspect full screen. Full timestamps survive in driver actions. The recording export reset after 72 seconds and the local MP4 has no readable container index. It is rejected and excluded from public video evidence. The surviving end image is inspection only, with no settled still claim.

The pool offers no direct adb endpoint, but its `agent-device perf frames` uses **adb-shell-dumpsys-gfxinfo-framestats** against the current app, `com.t3tools.t3code.dev`. Valid baseline stream-window metrics: 1322 rendered frames, 349 missed-deadline frames, **26.4%**, 94,994ms window, 60Hz / 16.7ms deadline. Worst reported frame 50.2ms. Head recovery window: 1169 frames, 321 missed-deadline frames (**27.5%**) over 120,725ms. These are different-length windows with pool disruptions, so their percentages do not establish a performance change. [S1-kotlin-after-framestats-public.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c873fba71d9bd033/S1-kotlin-after-framestats-public.json). The tool resets gfxinfo after each read. These stats include wrapping/automation and idle tail; they are not recording FPS or a controlled regression benchmark. [S1-kotlin-android-dark-before-20261110T105448-framestats.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/15aaf722f3725149/S1-kotlin-android-dark-before-20261110T105448-framestats.json).

| Device/theme | Before [633438d54f](https://git.cafe/pingdotgg/t3code/commit/633438d54f17b99f73f1a09466ecbe4a6aa0d545) | After [63069af964](https://git.cafe/pingdotgg/t3code/commit/63069af9644a7b85993ad6fee73de314efac088e) |
|---|---|---|
|Replacement Pixel 9 / dark — Kotlin|Partial: real stream and gfxinfo collected; playable video lost during export|Partial: real Kotlin stream and recovery gfxinfo collected; both export attempts reset and final retry returned no active recording. No playable video.|
|Replacement Pixel 9 / dark — ~400-line diff|Unverified — pool failures and narrowed time budget|[S1-diff-android-dark-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/abf04b119bdb053c/S1-diff-android-dark-after.mp4)<br>[S1-diff-after-framestats-public.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/429915df7d75eeb8/S1-diff-after-framestats-public.json) — partial: body appears near completion, not progressive growth|

Head diff recording steps/timestamps: 0.00s RPC send of 400 `-/+` source lines (120ms/line); no further app interaction while it runs; 69.13s collect gfxinfo; 70.85s end inspection. Video inspection shows Working/Thinking with no visible diff body until roughly 51s, followed by the complete colored 400-line diff. Therefore this is **not proof of smooth incremental diff growth**. The gfxinfo window contains 357 frames, 205 missed-deadline frames (**57.4%**) over 72,975ms, at 60Hz. No baseline long-diff video exists, so no regression percentage is claimed. The whole-screen clip is provided to inspect that behavior.

## N2 / S2 — Android, dark, head

Prepared `cases` fixture has lowercase/uppercase math and Mermaid controls, and `specialstream` emits partial Mermaid source then math. Intended N2: Settings→Appearance→Render math off/on/off, returning to the same fixture after each toggle. Intended S2: record before sending progressive special source. N2 attempts reached the math-off fixture and Appearance settings, but the first selector matched both label and switch; the second scrolled before the destination finished opening. The final retry added route readiness and a fresh switch reference, but failed with Remote daemon is unavailable at 11:16:27 UTC before a recording started. No off/on/off sequence is claimed. S2 remains unverified because the 70-minute budget is reserved for cleanup and uploads after repeated pool recovery. No Mermaid stream is sent or claimed.

| Device/theme | Before [633438d54f](https://git.cafe/pingdotgg/t3code/commit/633438d54f17b99f73f1a09466ecbe4a6aa0d545) | After [63069af964](https://git.cafe/pingdotgg/t3code/commit/63069af9644a7b85993ad6fee73de314efac088e) |
|---|---|---|
|Pixel 9 / dark — N2 off/on/off|Not requested for this head-only row|Unverified|
|Pixel 9 / dark — S2 Mermaid stream|Not requested for this head-only row|Unverified|

## What else changed

- W1 fallback Kotlin gains token colors, new wrap/copy glyphs, different frame/header/border geometry, and different total heights. The first header and user bubble move upward at the same bottom anchor. The second block remains unwrapped throughout both recordings.
- W1 status clocks differ (2:30 before, 2:28 after in the settled pair). Message times happen to match at 2:12 AM. Status overrides were used only for still stability; no artificial clock was injected.
- K1/K2 long-press closes Gboard and changes feed height and scroll positioning. Menus use native popup placement after the keyboard closes. These are material failures of the requested state, not a harmless capture discrepancy.
- K3 matched-device menu interior and keyboard pixels are unchanged. The underlying Kotlin block is colored and shorter; the composer caret is visible in the head still only.

## Retained and skipped matrix

Retain first-pass C1, C2, E1, E2, M2, M4, R1 stills at their documented revision, as authorized: [first-pass Evidence.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6ef4f4fe312ae656/Evidence.md). They were not recaptured at this head.

U1, P1, T1, M1, M3, F1: skipped by this narrowed brief and remain unverified. P2/N1 retain only historical unchanged-path controls from first pass, not refreshed proof. Q1/Q2/H1/H2/H3 are supplementary/code-only and not captured. Android W1 beyond the requested iOS row, iOS L1 beyond this Android row, additional themes/form factors and providers are unverified and excluded by this brief.

## Capture inspection and rejected attempts

Opened accepted images, W1 and K3 diffs and decoded contact sheets spanning every exported recording. Opened raw screenshot review grids as well. Rejected: K1 stale-ref take typed G; initial Android launcher/unpaired screen; iOS launch-prompt/splash states; L1 Quick Share detour; iOS still samples with changing signal pixels. These are in the raw archive only, never used as settled proof. No clipped or blank target body is accepted. Long tall block clipping at viewport edges is deliberate K2 fixture state.

## Uploads, drivers and cleanup

Upload manifest and safe synthetic driver/seed bundle accompany this document. No credentials, runtime logs, private model identifiers or real user data are published. Public attribution: AI-assisted; verified with the tests and tools listed above.

Earlier driver bundle (superseded by the final bundle below): [capture-drivers-pass2.zip](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/fcf659e5a4b2fdbe/capture-drivers-pass2.zip).

Cleanup: all four leases opened by this task were closed. Final replacement lease `cap2c-android` returned `Closed` at 11:18 UTC. All task-owned backend and Metro groups stopped; ports 15216, 16325, 8081 and 8082 have no listeners. Both task-created worktrees were removed and absence verified in git worktree list. The lead worktree was untouched. No PR edits, commits or live database access.

## ghdrop output (verbatim)


upload-W1-extra.md:

![W1-ios-dark-diff0-amplified.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a18669beb13874da/W1-ios-dark-diff0-amplified.png)
![W1-ios-dark-before-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4b36d0d21477dfdb/W1-ios-dark-before-after.png)

upload-W1.md:

![W1-ios-dark-before-airplaneoverride.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6074c8be055615d5/W1-ios-dark-before-airplaneoverride.png)
![W1-ios-dark-after-airplaneoverride.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d1cf27b02a018c11/W1-ios-dark-after-airplaneoverride.png)
![W1-ios-dark-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/489a0760e2f70827/W1-ios-dark-diff0.png)
![W1-ios-dark-diff2percent.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f391dc4f7ded1c3b/W1-ios-dark-diff2percent.png)
[W1-ios-dark-before.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a56bc3de6d9b9980/W1-ios-dark-before.mp4)
[W1-ios-dark-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/be76343884ea5802/W1-ios-dark-after.mp4)

upload-baseline-k1.md:

[K1-android-dark-before-replacement.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d1d1de4130b65619/K1-android-dark-before-replacement.mp4)
![K1-android-dark-before-replacement-review.jpg](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5e853c2b2d22976f/K1-android-dark-before-replacement-review.jpg)

upload-drivers.md:

[capture-drivers-pass2.zip](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/fcf659e5a4b2fdbe/capture-drivers-pass2.zip)

upload-k2before-stats.md:

[K2-android-dark-before-matched.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/517d75158980296d/K2-android-dark-before-matched.mp4)
[S1-kotlin-android-dark-before-20261110T105448-framestats.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/15aaf722f3725149/S1-kotlin-android-dark-before-20261110T105448-framestats.json)

upload-k3-before.md:

[K3-android-dark-before-replacement.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/13b7aee8faf25854/K3-android-dark-before-replacement.mp4)
![K3-android-dark-before-valid.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2fb686c93be99e70/K3-android-dark-before-valid.png)

upload-k3-matched.md:

[K3-android-dark-after-matched.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6d78230e37581105/K3-android-dark-after-matched.mp4)
![K3-android-dark-after-matched.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/15f832b1114a0ecb/K3-android-dark-after-matched.png)
![K3-android-dark-diff0-amplified.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/02dbc5c844bebdc4/K3-android-dark-diff0-amplified.png)
![K3-android-dark-diff2percent.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e4e59cdda83beaae/K3-android-dark-diff2percent.png)
![K3-android-dark-before-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7366a124be3b6a53/K3-android-dark-before-after.png)

upload-l1-after.md:

[L1-android-dark-after-take2.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f2c53af2387ea876/L1-android-dark-after-take2.mp4)
[L1-after-raw-clipboard.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5ea13d8c3f647d33/L1-after-raw-clipboard.txt)
[L1-after-markdown-clipboard.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ef5f1b992072a155/L1-after-markdown-clipboard.txt)

upload-l1-before.md:

[L1-android-dark-before-take3.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ca3f80a5a79df880/L1-android-dark-before-take3.mp4)
[L1-before-raw-clipboard.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c7f2c42b67cd6654/L1-before-raw-clipboard.txt)
[L1-before-markdown-clipboard.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5d27814f88594bcd/L1-before-markdown-clipboard.txt)

upload-original-android.md:

[K1-android-dark-after-take2.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/dad5cedb0b334121/K1-android-dark-after-take2.mp4)
[K1-coordinate-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a4d5f424cc766578/K1-coordinate-after.mp4)
[K1-pasted-clipboard-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d446d2364ace1a95/K1-pasted-clipboard-after.mp4)
[K2-android-dark-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/983e462fc6839924/K2-android-dark-after.mp4)
[K3-android-dark-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c7057f0cc816dba5/K3-android-dark-after.mp4)
![K3-android-dark-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7e6246e3f61c152e/K3-android-dark-after.png)

upload-reviews.md:

![K1-coordinate-after-review.jpg](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bbea6ee7debe8e3d/K1-coordinate-after-review.jpg)
![K1-android-dark-after-take2-review.jpg](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a70aa36565dace56/K1-android-dark-after-take2-review.jpg)
![K1-pasted-clipboard-after-review.jpg](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/45daa626988f9155/K1-pasted-clipboard-after-review.jpg)
![K2-android-dark-after-review.jpg](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9fa491e2404161b8/K2-android-dark-after-review.jpg)
![K3-android-dark-after-review.jpg](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/681353cb845d24cb/K3-android-dark-after-review.jpg)
![W1-ios-dark-before-review.jpg](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/16350f608e21538c/W1-ios-dark-before-review.jpg)
![W1-ios-dark-after-review.jpg](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b658f899689d5ee2/W1-ios-dark-after-review.jpg)

upload-s1-diff-after.md:

[S1-diff-android-dark-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/abf04b119bdb053c/S1-diff-android-dark-after.mp4)
[S1-diff-after-framestats-public.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/429915df7d75eeb8/S1-diff-after-framestats-public.json)

upload-stats-after.md:

[S1-kotlin-after-framestats-public.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c873fba71d9bd033/S1-kotlin-after-framestats-public.json)

FRICTION:
- runbook | Downloaded drivers hardcoded capture-1 and the prior checkouts; adapted copies into capture-2 after reading. Pillow absent; installed only in a scratch venv. | Parameterize driver roots and list Python dependencies.
- model | Initial backends bound to loopback; restarted only task-owned processes on 0.0.0.0 before capturing. | Use --host 0.0.0.0 in the initial launch.
- tool | Native Android install took 231 seconds. Initial snapshot helper failed while installation was running; the minute-later retry succeeded. | Stable/prewarmed install and helper readiness.
- tool | iOS launch confirmation watchdog timed out; inspected the system prompt and accepted it by coordinates. | Responsive system-alert bridge.
- model | First K1 take used a stale code ref while Gboard was opening and typed a G. Rejected it; used fresh snapshots and keyboard checks. | Wait for keyboard geometry before resolving touch targets.
- tool | Android 16 exposes no shell clipboard implementation. Copied values must be pasted into an unsent draft. | Supported clipboard API or a native paste action.
- model | L1's first paste tap hit Android's transient clipboard share overlay and opened Quick Share. Rejected the take; added an overlay-expiry wait and keyboard visibility checks. | Verify the current keyboard and paste target before tapping.
- tool | iOS signal icon pixels changed continuously, rejecting five still pairs at both densities. OS status overrides finally yielded pixel-identical pairs. | Deterministic simulator status chrome.
- model | A redundant before-native install was called from the before workspace, which did not own the lease; it correctly refused DEVICE_IN_USE. Re-ran from the lease-owning after workspace. Both revisions have the same native fingerprint. | Keep device-command cwd fixed to the lease workspace.
- tool | Pool gateway returned Remote daemon is unavailable during L1 recovery at 10:30:52–10:31:05 UTC. | Stable gateway; required retry after one minute follows.
- tool | Both original leases closed once gateway recovered. A replacement Pixel 9 allocated, but install failed after the required minute retry: worker holding device is not connected to gateway; screenshot connection reset. | Healthy pool worker allocation.
- tool | Fresh Pixel 9 native install succeeded in 131s, baseline K1 exported. The worker disconnected again at 10:44:54 UTC during K2 export (ECONNRESET), blocking baseline K3 and streams. | Stable pool worker/gateway connection across the capture session.
- model | A K2 baseline recovery pressed Back after no menu appeared; it navigated out of the thread, and the next coordinate hold opened the thread menu. Rejected that keyboard-closed sub-take. | Branch on the observed menu state before using Back.
- tool | Replacement worker disconnected repeatedly during L1 and initial streaming navigation (10:49–10:54 UTC); required minute-later retry recovered. A completed L1 export took about a minute and the initial probe saw an incomplete MP4. | Stable worker and explicit export-completion acknowledgement.
- model | Started one stream-navigation attempt while L1 export was still finishing; navigation failed during the pool outage and no stream was sent. Subsequent device actions wait for the prior process to complete. | Gate device actions on export completion.
- tool | Baseline Kotlin recording export reset with ECONNRESET after 72 seconds, leaving an MP4 without a readable container index. Frame statistics and the inspected end-frame survive; no playable video is claimed. | Retryable/resumable artifact downloads and stable gateway streaming.
- tool | Head stream navigation failed at 11:05:47 UTC; minute-later retry started real Kotlin deltas. Gateway failed again during the capture at 11:07:34 and recovery export reset at 11:10:13. Both gfxinfo windows survive. | Stable gateway and resumable video transport.
- tool | K3 head snapshot failed after opening the menu, but record-stop export succeeded; later snapshot and a settled identical screenshot pair verified the state. | Stable snapshot transport.
- model | N2 first attempt matched both the Render math label and switch. Second attempt scrolled before Appearance completed opening. Rejected both; final retry waits for the route and uses a fresh switch ref. | Resolve the actual switch and await destination readiness before scrolling.
- tool | Random-access ffmpeg seeks missed a late diff-video frame despite a valid MP4. Sequential decoding inspected the complete timeline successfully. | Sequential decoding for sparse Android screenrecord timestamps.
- tool | Final N2 retry failed with Remote daemon is unavailable at 11:16:27 UTC before recording. Final lease close after the required minute returned Closed. | Stable gateway through the whole capture session.


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

Final artifact/driver archive links are provided in the capture handback when their upload completes; the verbatim individual-media uploads above are complete.
