## Evidence — capture run 4

For [#33496](https://git.cafe/pingdotgg/t3code/pull/33496). Three of four capture groups complete: A5/A6 initial stills, A2 motion comparison, B4 route pane. B5 has comparable initial stills and maximize/close/Git-return recordings, but populated conversation scrolling remains unverified. A5 has 11 one-level antialiasing pixels; the exact count is retained below.

BASE [ee59ab22a8](https://git.cafe/pingdotgg/t3code/commit/ee59ab22a819acb0544d85cd6cca0e4aa8c7c444); every HEAD capture is [d532013f5b](https://git.cafe/pingdotgg/t3code/commit/d532013f5b11e3be6791ac70f69f806c57e73677). Both were served from one isolated detached checkout, switched sequentially with the server and Metro stopped between revisions, and Metro restarted with a cleared cache. No HEAD capture used the lead checkout or the newer merge present around 02:21–02:27 UTC. The lead checkout remained clean at the requested HEAD when checked at cleanup.

Environment: shared-pool Pixel 9 / Android 16 API 36, 1080×2424, density 2.625, fontScale 0.94; Pixel Tablet / Android 16 API 36, landscape 2560×1600, density 2, fontScale 1; iPhone 17 Pro / iOS 27.2, 1206×2622 (402×874 points), density 3, fontScale 0.941. Light appearance throughout. Application clock frozen to 2026-11-10 09:41:00 UTC. Independent fresh BASE/HEAD databases were seeded with the same two idle synthetic threads, 60 files, one dirty file and 12 linked PR references (six pending host metadata); no provider turn was started and no live database was copied. Linked PR metadata uses public records; workspace and conversation data are synthetic.

Installed cache fingerprints, recomputed equal on both revisions: Android `3445feafb89121f3f1b8190fdec01d545f6faa1d`; iOS `edb0efb70b2f14145ebeef8b3124cd71a51f0c75`. PDF JSI 6.1.0, gesture-handler 3.5.0, keyboard-controller 1.23.0 verified installed. No native build was run.

Each accepted still passed a pair of pixel-identical screenshots separated by at least 500 ms. Android stills use AgentDevice status normalization; no image mask. iOS normalization animates the battery, so every compared iOS still has the identical white rectangle `(x=0,y=0,width=1206,height=180)` applied before settling and diffing; unmasked originals are in the artifact archive. The image keeps its full dimensions. This masks only the status band, not the app header or sheet. Videos are original full-surface recordings and do not have this mask; the Android OS clock changes when still capture temporarily normalizes the status bar. The app clock stays frozen. The iOS Expo development gear overlay is visible in both sides at the same position.

Diff0 marks every changed RGB pixel red; DiffT marks pixels whose maximum channel delta exceeds 25.5/255 (10%). Underlying frames are greyed for context. Counts compare RGB pixels, not image metadata. All primary stills, diff images and sampled movie start/middle/end frames were opened and inspected before upload.

### A5 — iPhone 17 Pro, light, inspector sheet initial

BASE accepted 02:52:30–33 UTC; final HEAD 02:56:41–43 UTC on the same fresh lease. Open the long thread, Git controls → More; close button on the right identifies the inspector presentation.

| Before — [ee59ab22a8](https://git.cafe/pingdotgg/t3code/commit/ee59ab22a819acb0544d85cd6cca0e4aa8c7c444) | After — [d532013f5b](https://git.cafe/pingdotgg/t3code/commit/d532013f5b11e3be6791ac70f69f806c57e73677) | Diff0 — [ee59ab22a8](https://git.cafe/pingdotgg/t3code/commit/ee59ab22a819acb0544d85cd6cca0e4aa8c7c444) → [d532013f5b](https://git.cafe/pingdotgg/t3code/commit/d532013f5b11e3be6791ac70f69f806c57e73677) | DiffT (10%) — [ee59ab22a8](https://git.cafe/pingdotgg/t3code/commit/ee59ab22a819acb0544d85cd6cca0e4aa8c7c444) → [d532013f5b](https://git.cafe/pingdotgg/t3code/commit/d532013f5b11e3be6791ac70f69f806c57e73677) |
|---|---|---|---|
| ![A5-initial.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ae1f10efae4c3f13/A5-initial.png) | ![A5-initial.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e8bd6b06eb3193dd/A5-initial.png) | ![A5-retry-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/906619b3fe667e7e/A5-retry-diff0.png) | ![A5-retry-diff10.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/074f7544d8b6899a/A5-retry-diff10.png) |

Diff0 **11 pixels**, maximum channel delta **1**; DiffT **0**. All 11 pixels lie along the disabled “Push” text at physical y=1630, x=197…254. This is residual raster antialiasing, not a layout displacement. Two HEAD retakes were evaluated: initial fresh-lease capture had a 391-pixel background back-chevron raster difference; a fresh cleared HEAD Metro reduced it to the accepted 11; one further inspector reopen produced 89 one-level text pixels and was retained as a rejected retake. The accepted pair is the least-different settled pair, and is not claimed exact.

Additional enlarged crop (the full images above remain primary): ![A5-aa-crop.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4e3d63e219922a36/A5-aa-crop.png)

### A6 — iPhone 17 Pro, light, routed sheet initial

BASE accepted 02:52:39–41 UTC; final HEAD 02:56:49–51 UTC, same lease as A5. Close inspector and open `/threads/<environment>/<thread>/git`; close button on the left identifies the routed presentation.

| Before — [ee59ab22a8](https://git.cafe/pingdotgg/t3code/commit/ee59ab22a819acb0544d85cd6cca0e4aa8c7c444) | After — [d532013f5b](https://git.cafe/pingdotgg/t3code/commit/d532013f5b11e3be6791ac70f69f806c57e73677) | Diff0 — [ee59ab22a8](https://git.cafe/pingdotgg/t3code/commit/ee59ab22a819acb0544d85cd6cca0e4aa8c7c444) → [d532013f5b](https://git.cafe/pingdotgg/t3code/commit/d532013f5b11e3be6791ac70f69f806c57e73677) | DiffT (10%) — [ee59ab22a8](https://git.cafe/pingdotgg/t3code/commit/ee59ab22a819acb0544d85cd6cca0e4aa8c7c444) → [d532013f5b](https://git.cafe/pingdotgg/t3code/commit/d532013f5b11e3be6791ac70f69f806c57e73677) |
|---|---|---|---|
| ![A6-initial.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/fe1d6bc1f9b53aa8/A6-initial.png) | ![A6-initial.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/dac99cbd61798c02/A6-initial.png) | ![A6-retry-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a2e894078bbac55a/A6-retry-diff0.png) | ![A6-retry-diff10.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c9a6d4924d6000bc/A6-retry-diff10.png) |

Diff0 **0 pixels**; DiffT **0** outside the stated status mask. A settled BASE retake before restarting HEAD reproduced the earlier chevron mismatch; the final cleared HEAD bundle eliminated it. The first iOS lease expired before HEAD, so its BASE images were rejected and both sides were redone on this fresh lease. These rows cover initial stills only; no new iOS pull-to-refresh claim is made.

### A2 — Pixel 9, light, routed Git sheet

Both recordings use the same physical-pixel gesture script. Times below are wall seconds relative to record start (BASE 02:33:58 UTC; HEAD 02:43:28 UTC); encoder durations are 44.52 s and 44.10 s while command windows are 45.49 s and 46.60 s, so exact command timestamps are in the linked timeline.

| Step | Gesture | BASE time | HEAD time |
|---|---|---:|---:|
| Expand | header `(540,1175)`, dy −950 / 1200 ms | 0.90 s | 1.47 s |
| A | actions `(540,1150)`, dy −450 / 1200 ms | 12.88 s | 11.32 s |
| B | `(540,850)`, dy +450 / 1200 ms | 20.87 s | 21.05 s |
| C | PR rows `(540,1750)`, dy −650 / 1400 ms | 29.80 s | 30.83 s |
| D | fling up `(540,1800)`, 1200 | 40.56 s | 40.58 s |

BASE [ee59ab22a8](https://git.cafe/pingdotgg/t3code/commit/ee59ab22a819acb0544d85cd6cca0e4aa8c7c444): [A2-base-accepted.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7a5de7f9f10d18fb/A2-base-accepted.mp4)

HEAD [d532013f5b](https://git.cafe/pingdotgg/t3code/commit/d532013f5b11e3be6791ac70f69f806c57e73677): [A2-head.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/48054a18c4938510/A2-head.mp4)

| Before — [ee59ab22a8](https://git.cafe/pingdotgg/t3code/commit/ee59ab22a819acb0544d85cd6cca0e4aa8c7c444) | After — [d532013f5b](https://git.cafe/pingdotgg/t3code/commit/d532013f5b11e3be6791ac70f69f806c57e73677) | Diff0 — [ee59ab22a8](https://git.cafe/pingdotgg/t3code/commit/ee59ab22a819acb0544d85cd6cca0e4aa8c7c444) → [d532013f5b](https://git.cafe/pingdotgg/t3code/commit/d532013f5b11e3be6791ac70f69f806c57e73677) | DiffT (10%) — [ee59ab22a8](https://git.cafe/pingdotgg/t3code/commit/ee59ab22a819acb0544d85cd6cca0e4aa8c7c444) → [d532013f5b](https://git.cafe/pingdotgg/t3code/commit/d532013f5b11e3be6791ac70f69f806c57e73677) |
|---|---|---|---|
| ![initial.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/cc1f36e6fb4f2020/initial.png) | ![initial.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bc927e4097f9fac9/initial.png) | ![A2-initial-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e103608a36fd3dc4/A2-initial-diff0.png) | ![A2-initial-diff10.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/02434b6c68bcd011/A2-initial-diff10.png) |

Initial Diff0 **6 pixels**, max delta **1**, at x=398…400/y=2388…2397 on the bottom gesture-bar edge; DiffT **0**. No application-content difference in the initial frame.

BASE within-run expanded → D (the column labels below refer to these two moments, both on BASE):

| Before — [ee59ab22a8](https://git.cafe/pingdotgg/t3code/commit/ee59ab22a819acb0544d85cd6cca0e4aa8c7c444) | After — [ee59ab22a8](https://git.cafe/pingdotgg/t3code/commit/ee59ab22a819acb0544d85cd6cca0e4aa8c7c444) | Diff0 — [ee59ab22a8](https://git.cafe/pingdotgg/t3code/commit/ee59ab22a819acb0544d85cd6cca0e4aa8c7c444) → [ee59ab22a8](https://git.cafe/pingdotgg/t3code/commit/ee59ab22a819acb0544d85cd6cca0e4aa8c7c444) | DiffT (10%) — [ee59ab22a8](https://git.cafe/pingdotgg/t3code/commit/ee59ab22a819acb0544d85cd6cca0e4aa8c7c444) → [ee59ab22a8](https://git.cafe/pingdotgg/t3code/commit/ee59ab22a819acb0544d85cd6cca0e4aa8c7c444) |
|---|---|---|---|
| ![expanded.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6842359124311482/expanded.png) | ![D.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5b4b4fc53a1f6077/D.png) | ![A2-base-accepted-motion-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/cb3cdd6700809f8c/A2-base-accepted-motion-diff0.png) | ![A2-base-accepted-motion-diff10.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7df640048cce8a19/A2-base-accepted-motion-diff10.png) |

BASE motion mask: **0 pixels at both thresholds**. During the sequence BASE moves the sheet between detents on the down gesture; it ends at the expanded starting content position, with the lower PR rows still unreachable by content scrolling. Thus the endpoint equality does not claim that the sheet never moved during the movie. One earlier BASE attempt grabbed above the actual header and dismissed the sheet; it is retained as rejected and is not this proof.

HEAD within-run expanded → D:

| Before — [d532013f5b](https://git.cafe/pingdotgg/t3code/commit/d532013f5b11e3be6791ac70f69f806c57e73677) | After — [d532013f5b](https://git.cafe/pingdotgg/t3code/commit/d532013f5b11e3be6791ac70f69f806c57e73677) | Diff0 — [d532013f5b](https://git.cafe/pingdotgg/t3code/commit/d532013f5b11e3be6791ac70f69f806c57e73677) → [d532013f5b](https://git.cafe/pingdotgg/t3code/commit/d532013f5b11e3be6791ac70f69f806c57e73677) | DiffT (10%) — [d532013f5b](https://git.cafe/pingdotgg/t3code/commit/d532013f5b11e3be6791ac70f69f806c57e73677) → [d532013f5b](https://git.cafe/pingdotgg/t3code/commit/d532013f5b11e3be6791ac70f69f806c57e73677) |
|---|---|---|---|
| ![expanded.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f80d61b56da58940/expanded.png) | ![D.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/98a93bcd9e352a89/D.png) | ![A2-head-motion-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/940f57335203790b/A2-head-motion-diff0.png) | ![A2-head-motion-diff10.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/32e9739e2769da3b/A2-head-motion-diff10.png) |

HEAD motion mask: **409,165 pixels** at Diff0; **234,972** at DiffT. Actions scroll away and the lower PR rows become visible. The broad highlighted region is the intended content movement in this within-run comparison, not a claim that the initial layout changed.

### B4 — Pixel Tablet landscape, light, ThreadFiles route pane

Navigate to the actual ThreadFiles route, with prewarmed Files and Git siblings. Runtime host inspection identifies `active: route`, `files prewarm: true`, `git prewarm: true`; this is not the normal Files pane selected by its key. Scroll the visible route list, switch to Git and scroll it, return to Files route, then tap `example-20-synthetic-file.txt`. It opens “Synthetic file 20” in the main content, proving taps land on the visible route pane.

BASE action times: route scroll **6.83 s**; Git controls/More **64.69/67.36 s**; confirmed Git scroll **71.68 s**; return route **89.26 s**; tap file **97.44 s**. An earlier Git scroll at 25.27 s failed because the popup viewport was still active; it is visible in the uncut movie and was repeated after waiting for the pane. HEAD: route scroll **1.32 s**; Git controls/More **13.54/16.20 s**; Git scroll **20.80 s**; return **30.22 s**; tap file **39.65 s**. Record starts: BASE 02:32:29 UTC, HEAD 02:43:27 UTC. Durations 104.32/46.94 s.

BASE [ee59ab22a8](https://git.cafe/pingdotgg/t3code/commit/ee59ab22a819acb0544d85cd6cca0e4aa8c7c444): [B4-base.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d9b8b0d98e10dda8/B4-base.mp4)

HEAD [d532013f5b](https://git.cafe/pingdotgg/t3code/commit/d532013f5b11e3be6791ac70f69f806c57e73677): [B4-head.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ac87a707e63dcc61/B4-head.mp4)

| Before — [ee59ab22a8](https://git.cafe/pingdotgg/t3code/commit/ee59ab22a819acb0544d85cd6cca0e4aa8c7c444) | After — [d532013f5b](https://git.cafe/pingdotgg/t3code/commit/d532013f5b11e3be6791ac70f69f806c57e73677) | Diff0 — [ee59ab22a8](https://git.cafe/pingdotgg/t3code/commit/ee59ab22a819acb0544d85cd6cca0e4aa8c7c444) → [d532013f5b](https://git.cafe/pingdotgg/t3code/commit/d532013f5b11e3be6791ac70f69f806c57e73677) | DiffT (10%) — [ee59ab22a8](https://git.cafe/pingdotgg/t3code/commit/ee59ab22a819acb0544d85cd6cca0e4aa8c7c444) → [d532013f5b](https://git.cafe/pingdotgg/t3code/commit/d532013f5b11e3be6791ac70f69f806c57e73677) |
|---|---|---|---|
| ![B4-initial.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/06b798dda95e377f/B4-initial.png) | ![B4-initial.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7c56269583176286/B4-initial.png) | ![B4-initial-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/75ffb611972d2a84/B4-initial-diff0.png) | ![B4-initial-diff10.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d65b502b35444caa/B4-initial-diff10.png) |

Initial Diff0 **0 pixels**; DiffT **0**. Route position is retained after switching through Git: the same visible file range/offset returns and file 20 is tappable. HEAD route-scrolled → returned is exactly equal (0 pixels); BASE has 10,454 pixels at delta ≤3 (0 at 10%), distributed over raster text/edges after compositor switching; no visible list displacement. Raw images, snapshots and these optional retention diffs are in the archive.

### B5 — Pixel Tablet landscape, light, thread preview (partial)

The Android user-entry helper is gated to iOS, so the preview was activated with the explicitly labelled native runtime harness `open-preview.js`: dispatch inspector route params for the second synthetic thread while on ThreadFiles. Source code and rendered components were unchanged. Runtime inspection confirms the real `ThreadInspectorPreview`, active `preview`, prewarmed Files/Git and the route pane. This is a harness-assisted runtime capture, not proof of an Android user entry point.

Preview up-pan: BASE **1.05 s**, HEAD **1.29 s**; maximize **13.29/13.34 s**; close **18.44/20.08 s**; Git controls/More **21.76/24.16 s** and **24.93/27.77 s**; Git scroll **27.62/30.97 s**. BASE start 02:37:32 UTC, HEAD 02:47:35 UTC. Durations 37.54/39.34 s. Maximize opens the second thread full-screen, close returns to the preview, and Git then scrolls to its lower rows on both sides.

BASE [ee59ab22a8](https://git.cafe/pingdotgg/t3code/commit/ee59ab22a819acb0544d85cd6cca0e4aa8c7c444): [B5-base-accepted.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4bf6f1e2135459fa/B5-base-accepted.mp4)

HEAD [d532013f5b](https://git.cafe/pingdotgg/t3code/commit/d532013f5b11e3be6791ac70f69f806c57e73677): [B5-head-accepted.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5edba162322d26b0/B5-head-accepted.mp4)

| Before — [ee59ab22a8](https://git.cafe/pingdotgg/t3code/commit/ee59ab22a819acb0544d85cd6cca0e4aa8c7c444) | After — [d532013f5b](https://git.cafe/pingdotgg/t3code/commit/d532013f5b11e3be6791ac70f69f806c57e73677) | Diff0 — [ee59ab22a8](https://git.cafe/pingdotgg/t3code/commit/ee59ab22a819acb0544d85cd6cca0e4aa8c7c444) → [d532013f5b](https://git.cafe/pingdotgg/t3code/commit/d532013f5b11e3be6791ac70f69f806c57e73677) | DiffT (10%) — [ee59ab22a8](https://git.cafe/pingdotgg/t3code/commit/ee59ab22a819acb0544d85cd6cca0e4aa8c7c444) → [d532013f5b](https://git.cafe/pingdotgg/t3code/commit/d532013f5b11e3be6791ac70f69f806c57e73677) |
|---|---|---|---|
| ![B5-initial.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/35b31e70a64312e4/B5-initial.png) | ![B5-initial.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e5b7d7718b2961c2/B5-initial.png) | ![B5-initial-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ebe9fad914dd0b25/B5-initial-diff0.png) | ![B5-initial-diff10.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9354aad964ae6070/B5-initial-diff10.png) |

Initial Diff0 **0 pixels**; DiffT **0**. **Unverified: populated conversation scrolling.** The second thread is empty; its “No conversation yet” prompt remains unchanged under the scroll gesture, so the movie does not prove a populated conversation can scroll. The first long BASE preview recording hit the Android recording limit; the short accepted retake above includes the complete interaction.

**Unverified: device preview.** The isolated environment advertises no real usable device target; the leased capture emulators are automation devices, not an app-advertised preview target. No placeholder target was substituted. Optional Pixel 9 preview was not attempted.

### What else changed; limits

- A5: 11 one-level pixels in disabled Push text outside the mask, after retakes. A2 initial: six one-level pixels at the bottom gesture bar. These are the only nonzero cross-revision initial comparisons; A6, B4 and B5 initial frames are exact outside the disclosed iOS status mask.
- A2 within-run content scrolling differs intentionally: BASE ends at its expanded start content; HEAD reaches lower PR rows. BASE also changes sheet detent during step B. Videos show this behavior rather than just an endpoint mask.
- iOS status band is uniformly masked; system clock/battery changes in unmasked originals and Android movies are capture conditions. The development gear overlay remains visible on iOS.
- B5 uses a route-param harness and empty data; conversation scrolling and device preview remain unverified. No other matrix row is newly claimed by run 4. B2 remains assigned to the lead/separate Files issue.
- D1 was not rerun in this scope. These artifacts do not establish whether BASE Android sheet pull-to-refresh fires; retain the prior run's refresh finding and its limitations, not a new result from this run.

### Reproduction and artifacts

[seed.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3191961a3deffe44/seed.mjs)

[capture-driver.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f60f6bbfccfc01c1/capture-driver.py)

[route-sequence.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/29f80a385d8cf591/route-sequence.py)

[preview-sequence.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7abfc35e461b170e/preview-sequence.py)

[ios-sequence.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2743da0097f558fb/ios-sequence.py)

[runtime-conditions.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b1211e9342d03adb/runtime-conditions.mjs)

[open-preview.js](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/df63543f4bd08c16/open-preview.js)

[run4-setup.sh](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8fedf3c905819f18/run4-setup.sh)

[make-diffs.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/658b0780cd52b516/make-diffs.py)

[native-audit.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/76d85d40f13ecd75/native-audit.mjs)

[action-timeline.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d4d83bbf40678dbc/action-timeline.txt)

[base-native-audit.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ac695fd243c6c558/base-native-audit.txt)

[head-native-audit.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/947aa77c1739209c/head-native-audit.txt)

[capture4-artifacts.tar.gz](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7d90909ef2493c7d/capture4-artifacts.tar.gz)


The archive includes all seed/driver scripts (including unsuccessful read-only fixture probes), accepted/rejected capture directories, unmasked iOS originals, settled pairs, snapshots, host inspections, diff counts, full timestamped logs and sanitized launch/server logs. Pairing credentials and session identifiers were removed from public logs. Downloaded run-3 setup recipes are retained as references; `run4-setup.sh` documents actual run-4 paths and revision switching. No PR body or source file was edited. AI-assisted; verified with the tests and tools listed above.

Cleanup: own Metro, isolated server/watcher and relay stopped; ports 8081/14185/14186 verified closed. Tablet and fresh iOS lease explicitly closed. Original iOS and phone leases had already expired; close attempts returned expired/absent-lease errors. Own detached checkout removed; lead checkout retained clean at requested HEAD. Large scratch files removed after successful upload; this report and upload manifests retained for the lead.

FRICTION:
- tool | iOS status normalization reanimates battery, preventing raw settled pairs | expose persistent status override; used equal 1206×180 white mask instead.
- tool | original iOS and phone leases expired despite the longer capture task | surface remaining lease TTL and refresh it on active capture commands; redo both iOS sides on one fresh lease.
- tool | cold pairing returned before connection ready; revision swap retained mismatched environment state | wait for connected fixture data and clear stale app state before pairing.
- tool | iOS dev-menu controls reported covered; system Open prompt did not respond reliably | coordinates dismissed the dev menu; reopen native app and pair after bundle readiness.
- model | first A2 header coordinate landed above the actual sheet and dismissed it | inspect the real physical header position before gesture scripting; rejected and recaptured.
- tool | Git popup temporarily left a narrow viewport; first tablet pan was rejected | wait for Commit control after More before issuing the pan.
- tool | first long Android preview recording reached the recorder limit | use short deterministic per-row recordings and verify duration before accepting.
- brief | empty thread fixture cannot establish conversation scrolling; Android preview entry helper is iOS-gated | supply an approved populated synthetic conversation fixture and explicit entry method.
- tool | iOS background chevron raster differed after first revision swap | fresh cleared HEAD Metro and same-lease retakes eliminated that difference; residual text AA counted explicitly.
CAPTURE_PARTIAL B5 (populated conversation scrolling; device preview)
