# Android evidence addendum, round 2

For [#33021](https://git.cafe/pingdotgg/t3code/pull/33021). Before [bcee0f5](https://git.cafe/pingdotgg/t3code/commit/bcee0f5d2872ba193c66ed9ba979bbe424f89ff9); after [bd8781c](https://git.cafe/pingdotgg/t3code/commit/bd8781c7efac1a9a6f453e671344ea4382028646). No source changes, commits, pushes, or PR mutations were made.

**Rows captured: 2/3 continuous before/after recording pairs (C4, C5); 1/3 fully verified against the fixture matrix (C4).** C1 has matched settled stills but no usable traversal recording. C5 has the requested physical posture sequence but no usable vertical hinge report, so its hinge branch remains incomplete.

Environment: fs-82 Linux x86_64; pooled Android 16/API 36 Pixel 9 and Pixel 9 Pro Fold; same dev-client native fingerprint `832d41716ea2dfac7350605db3fd07914f87d6ef`; Material, light, app text 16, system fontScale 1, system animations 1x; real Gboard, no test IME. Only fresh isolated databases and synthetic Replay (dev) showcase fixtures; `T3CODE_DEV_SEED=0`; no real userdata read or copied. One fixture project, Alpha/Beta threads, identical prompts and response content. Backend/Metro before 14022/8082, after 15275/8081, tailnet-accessible wildcard bind.

## Findings and limits

- C4: Candidate reserves the rail width after both keyboard dismissals, and the warmed Home/list returns without the baseline's extra rail-width gap. Baseline content is visibly under the rail in the thread. These stable baseline defects are the comparison target, rather than capture clipping. Real Gboard is visible in each recording. The RN window remains 693.975914×1557.590385dp before, with, and after the keyboard on both revisions: this environment insets content rather than shrinking the reported window below 600dp. The keyboard-induced compact branch was therefore not exercised.
- C1: Started medium with a thread and floating sidebar, then Settings smallest width 411 →720 →692dp, returning to the app after each change. The app returns to Home on density changes; OS process/activity lifecycle was not instrumented, so continuously mounted floating state cannot be established. The settled Home frames show alignment at the new sizes, but do not prove stale-style clearing in an uninterrupted mounted transition. Both record exports failed with `Error (UNKNOWN): aborted; Cause: ECONNRESET aborted`; stop retry returned no active recording. Candidate's partial MP4 also fails ffprobe with `moov atom not found`. No broken or truncated C1 recording is published. Exact 599/600/719 boundaries, short-height resize, rapid in-flight resize and compact Usage/Settings traversal remain outside this capture.
- C5: Exact named Pixel 9 Pro Fold leased; emulator commands confirm open 180°, half-open 90°, closed 0°. Re-snapshotted after every fold. Display size was increased twice to reach an inner medium viewport: 2076×2152px / 677.877551×702.693878dp at 490dpi; cover 1080×2424px / 352.653061×791.510204dp. Both revisions use those same dimensions. Floating state persists at half-open; closing shows the compact cover thread; reopening restores the medium thread, then Back returns Home. Read-only RN inspection reports native metrics null and no x/width hinge state (`layoutHingeStates: []`), with the layout fiber found. Thus the app received no usable vertical hinge; accepted/rejected hinge geometry branches remain **unverified**, per the fixture matrix. One UI hinge acceptance was not claimed. Baseline half-open metric collection initially hit a Python NameError; the supplemental half-open measurement was collected before tearing down the baseline, and is included in observations.

## Still comparisons

All source screenshots are whole-device captures. Each selected still came from two pixel-identical screenshots at least 500ms apart (ImageMagick AE=0); screenshots were opened for review. Diff0 amplifies any changed channel to white; DiffT uses 2% ImageMagick fuzz. Black means unchanged. No masking, cropping, registration, or clock suppression. Clock, relative ages, timing text, and antialiasing therefore contribute to diffs. Each recording was decoded fully, reviewed through a full-duration contact sheet and final frame; ffprobe confirmed valid streams. Source recordings are unedited device scope with touches hidden.

### C1

| Device / size / posture / theme / settled step | Before<br>[bcee0f5](https://git.cafe/pingdotgg/t3code/commit/bcee0f5d2872ba193c66ed9ba979bbe424f89ff9) | After<br>[bd8781c](https://git.cafe/pingdotgg/t3code/commit/bd8781c7efac1a9a6f453e671344ea4382028646) | Diff0<br>[bcee0f5](https://git.cafe/pingdotgg/t3code/commit/bcee0f5d2872ba193c66ed9ba979bbe424f89ff9) → [bd8781c](https://git.cafe/pingdotgg/t3code/commit/bd8781c7efac1a9a6f453e671344ea4382028646) | DiffT (2%)<br>[bcee0f5](https://git.cafe/pingdotgg/t3code/commit/bcee0f5d2872ba193c66ed9ba979bbe424f89ff9) → [bd8781c](https://git.cafe/pingdotgg/t3code/commit/bd8781c7efac1a9a6f453e671344ea4382028646) |
|---|---|---|---|---|
| Pixel 9 / 693.976×1557.590dp / 249dpi / portrait / Material light / C1-medium-start | ![C1-medium-start-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5e465a58a668a1d8/C1-medium-start-before.png) | ![C1-medium-start-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d592cd3fe3e35000/C1-medium-start-after.png) | ![C1-medium-start-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5a769dfcec6b01e7/C1-medium-start-diff0.png) | ![C1-medium-start-diff2pct.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/30a9265da2946c2c/C1-medium-start-diff2pct.png) |
| Pixel 9 / 411.429×923.429dp / 420dpi / portrait / Material light / C1-width-411 | ![C1-width-411-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/07bb846c72ace96f/C1-width-411-before.png) | ![C1-width-411-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e66ca7fb104f3e57/C1-width-411-after.png) | ![C1-width-411-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9942ce251cee7a34/C1-width-411-diff0.png) | ![C1-width-411-diff2pct.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/822fd526bea48896/C1-width-411-diff2pct.png) |
| Pixel 9 / 720×1616dp / 240dpi / portrait / Material light / C1-width-720 | ![C1-width-720-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/09d1ad73aafb60de/C1-width-720-before.png) | ![C1-width-720-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/25df4cefe37e6218/C1-width-720-after.png) | ![C1-width-720-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/793e94b3acb23d6c/C1-width-720-diff0.png) | ![C1-width-720-diff2pct.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d464ab6324126f57/C1-width-720-diff2pct.png) |
| Pixel 9 / 693.976×1557.590dp / 249dpi / portrait / Material light / C1-width-692 | ![C1-width-692-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4b123369679fd10b/C1-width-692-before.png) | ![C1-width-692-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1e05cdf4ef6cf2f8/C1-width-692-after.png) | ![C1-width-692-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/fe9410eea0e7c1cd/C1-width-692-diff0.png) | ![C1-width-692-diff2pct.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/005f4537307539b7/C1-width-692-diff2pct.png) |
| Pixel 9 / Settings smallest width 692dp / 249dpi / portrait / Material light / final Home / C1-list | ![C1-list-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/90acae1a40e047d8/C1-list-before.png) | ![C1-list-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d57890608728fd6e/C1-list-after.png) | ![C1-list-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/56496099295491bd/C1-list-diff0.png) | ![C1-list-diff2pct.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e9c5803400f964df/C1-list-diff2pct.png) |

### C4

| Device / size / posture / theme / settled step | Before<br>[bcee0f5](https://git.cafe/pingdotgg/t3code/commit/bcee0f5d2872ba193c66ed9ba979bbe424f89ff9) | After<br>[bd8781c](https://git.cafe/pingdotgg/t3code/commit/bd8781c7efac1a9a6f453e671344ea4382028646) | Diff0<br>[bcee0f5](https://git.cafe/pingdotgg/t3code/commit/bcee0f5d2872ba193c66ed9ba979bbe424f89ff9) → [bd8781c](https://git.cafe/pingdotgg/t3code/commit/bd8781c7efac1a9a6f453e671344ea4382028646) | DiffT (2%)<br>[bcee0f5](https://git.cafe/pingdotgg/t3code/commit/bcee0f5d2872ba193c66ed9ba979bbe424f89ff9) → [bd8781c](https://git.cafe/pingdotgg/t3code/commit/bd8781c7efac1a9a6f453e671344ea4382028646) |
|---|---|---|---|---|
| Pixel 9 / 693.976×1557.590dp / 249dpi / portrait / Material light / C4-recovered-cold | ![C4-recovered-cold-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/506d78ec1ecdcf20/C4-recovered-cold-before.png) | ![C4-recovered-cold-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8c648025cf998651/C4-recovered-cold-after.png) | ![C4-recovered-cold-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3db9026f681b3f37/C4-recovered-cold-diff0.png) | ![C4-recovered-cold-diff2pct.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/32a7b030892fd497/C4-recovered-cold-diff2pct.png) |
| Pixel 9 / 693.976×1557.590dp / 249dpi / portrait / Material light / C4-recovered-warm | ![C4-recovered-warm-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5149fa0858d286bb/C4-recovered-warm-before.png) | ![C4-recovered-warm-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/105d6de743368646/C4-recovered-warm-after.png) | ![C4-recovered-warm-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/79929135ad646fdd/C4-recovered-warm-diff0.png) | ![C4-recovered-warm-diff2pct.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c250782e14515429/C4-recovered-warm-diff2pct.png) |
| Pixel 9 / 693.976×1557.590dp / 249dpi / portrait / Material light / C4-list | ![C4-list-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/cbc2e34107ddc62c/C4-list-before.png) | ![C4-list-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/fe2b52cfd7ac3371/C4-list-after.png) | ![C4-list-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a45b32781f29952c/C4-list-diff0.png) | ![C4-list-diff2pct.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/cd8228f05de1f273/C4-list-diff2pct.png) |

### C5

| Device / size / posture / theme / settled step | Before<br>[bcee0f5](https://git.cafe/pingdotgg/t3code/commit/bcee0f5d2872ba193c66ed9ba979bbe424f89ff9) | After<br>[bd8781c](https://git.cafe/pingdotgg/t3code/commit/bd8781c7efac1a9a6f453e671344ea4382028646) | Diff0<br>[bcee0f5](https://git.cafe/pingdotgg/t3code/commit/bcee0f5d2872ba193c66ed9ba979bbe424f89ff9) → [bd8781c](https://git.cafe/pingdotgg/t3code/commit/bd8781c7efac1a9a6f453e671344ea4382028646) | DiffT (2%)<br>[bcee0f5](https://git.cafe/pingdotgg/t3code/commit/bcee0f5d2872ba193c66ed9ba979bbe424f89ff9) → [bd8781c](https://git.cafe/pingdotgg/t3code/commit/bd8781c7efac1a9a6f453e671344ea4382028646) |
|---|---|---|---|---|
| Pixel 9 Pro Fold / 677.878×702.694dp inner / 490dpi / open / Material light / C5-open | ![C5-open-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/786813e6a4ea600d/C5-open-before.png) | ![C5-open-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/131ce8198dbb36a2/C5-open-after.png) | ![C5-open-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5381cab12c21b3de/C5-open-diff0.png) | ![C5-open-diff2pct.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/864a00948f7eae4c/C5-open-diff2pct.png) |
| Pixel 9 Pro Fold / 677.878×702.694dp inner / 490dpi / half-open / Material light / C5-half-open | ![C5-half-open-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/cf4a594d7697acae/C5-half-open-before.png) | ![C5-half-open-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bc721783ddb50963/C5-half-open-after.png) | ![C5-half-open-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/fa4c7d9b560560d3/C5-half-open-diff0.png) | ![C5-half-open-diff2pct.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/303c6c6fe240b903/C5-half-open-diff2pct.png) |
| Pixel 9 Pro Fold / 352.653×791.510dp cover / 490dpi / closed / Material light / C5-closed | ![C5-closed-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1a012b46f0442a6e/C5-closed-before.png) | ![C5-closed-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f29b5103a38bd37d/C5-closed-after.png) | ![C5-closed-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/73d1296c8dd4c3a6/C5-closed-diff0.png) | ![C5-closed-diff2pct.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a6765ae6f4169dcd/C5-closed-diff2pct.png) |
| Pixel 9 Pro Fold / 677.878×702.694dp inner / 490dpi / list / Material light / C5-list | ![C5-list-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1e6a2da99eefceae/C5-list-before.png) | ![C5-list-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/745a53f60c3c691e/C5-list-after.png) | ![C5-list-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d3b295211483caf7/C5-list-diff0.png) | ![C5-list-diff2pct.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/33545be9780c71be/C5-list-diff2pct.png) |

C1 compact/expanded labels reflect the Settings density recipe; medium RN measurement was read directly. C1's final width-692 and Home/list are separate settled captures of the same route. The fold open still is the final reopened thread; half-open has the deliberate floating scrim.

## Recordings and timestamped narration

Times below are host command offsets from record-start, rounded to 0.1s. Device VFR encoding and command latency can shift visible changes by several seconds. Android screenrecord ends at its last changed frame, rather than preserving a static tail. There are no edits or cuts.

**C4 before** — [C4-keyboard.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/dbed78275454905c/C4-keyboard.mp4)

123.712s / 321 decoded frames. 00:02.0 select Alpha; 00:19.2 focus composer; 00:24.7 keyboard-status query fails, but keyboard is visibly up; 00:53.2 dismiss; capture cold recovered state; 01:07.0 open floating sidebar through existing app keyboard-command dispatcher; 01:12.2 Back closes sidebar; 01:16.2 focus again; 01:21.3 keyboard status confirms visible; 01:25.5 dismiss; capture warmed recovered state; 01:36.9 Back to Home; settle and capture list.

**C4 after** — [C4-keyboard.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/facfdafe587fe508/C4-keyboard.mp4)

125.918s / 208 decoded frames. 00:02.0 select Alpha; 00:27.1 focus; 00:31.1 keyboard status confirms visible; 00:34.7 dismiss; capture cold recovered state; 00:50.3 first sidebar command returns false because the global CDP target still points at the other lease; 01:21.8 select correct phone runtime and open sidebar; 01:29.6 Back closes it; 01:32.2 focus again; 01:35.5 keyboard visible; 01:39.1 dismiss; capture warmed recovered state; 01:49.6 Back to Home; settle and capture list. No app reload in this flow. The unsuccessful command and correction account for the long idle section.

**C5 before** — [C5-fold.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/cf5e2b5a623e8df1/C5-fold.mp4)

76.125s / 190 decoded frames; 81.8s recording window. 00:02.3 open pose; 00:05.4 select Alpha; 00:11.5 open floating sidebar with existing dispatcher; 00:13.4 open pose; 00:22.5 half-open; 00:32.0 closed; 00:47.2 reopen; 01:05.4 Back to Home. Re-snapshot and settled capture after each pose; final list is visible before the VFR tail ends.

**C5 after** — [C5-fold.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/aad4f200e683c3ee/C5-fold.mp4)

81.248s / 187 decoded frames; 92.6s recording window. 00:01.8 open pose; 00:05.0 select Alpha; 00:13.6 open floating sidebar; 00:15.9 open pose; 00:30.6 half-open; 00:46.3 closed; 01:02.3 reopen; 01:20.7 Back to Home. Re-snapshot and settled capture after every pose; final list is visible at the last encoded frame. The later still pair confirms the static final list.

C1 attempted traversal narration (no usable recording): before 00:02 select Alpha/open float; 00:16.9 switch Settings; 00:23 enter 411; 00:29.4 return app; 00:40.3 pool command fails; recover and set 720, capture; 02:47.1 enter 692; 02:53.2 return; settle Home. After 00:02.4 select Alpha/open float; 00:44.4 switch Settings; 00:54.9 enter 411; 01:01.7 return app; selector at 01:19.9 is offscreen after density change; scroll to Smallest width and set 720, capture; 02:39.2 enter 692; 02:47.0 return app; settle Home. Drivers resumed after transport/selector errors without deliberately restarting the app. These command logs do not substitute for recording proof.

## What else changed

- Independent fresh databases produce different synthetic IDs, timestamps and relative ages; the response content is identical. Replay timing says Worked for 5.2s before versus 5.5s after.
- Android status clock, connectivity icon state, and relative thread ages differ. Full-screen differences include those changes. No region was masked.
- Baseline and candidate use separate backend/Metro ports and source bundles, the same native client per device and identical per-pair density, font and theme settings. Phone density changes reset the route to Home. Fold changes genuinely switch between inner and cover viewports.
- A development-client native-link startup error recovered after a clean relaunch before capture. The candidate backend was restarted for the final fold sequence, and its auto-created bootstrap project was removed again before recording. Only Alpha/Beta remain in the captures.
- Candidate selected C4 recording includes an unsuccessful wrong-runtime sidebar command followed by a correction; baseline selected C4 includes a failed status query. A second candidate C4 run had a failed recording transfer and is excluded.

## Reproduction and support files

The scripts keep raw logs and pairing URLs in private scratch. No raw pairing log or database is uploaded. Existing application `toggleSidebar` dispatch is used to expose the float, without changing React state, styles or source. RN dimensions and hinge-state observations use read-only CDP inspection; target selection is serialized because the CLI shares it globally. The early `cdp-read.py` wrapper was superseded and unused; do not wrap the internally locking readers with it.

[observations.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7e5dbbb2b9ff93e2/observations.json)

- [boundary-finish.sh](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/544ebd02dcece215/boundary-finish.sh)
- [boundary-flow.sh](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ba8fbdafe1d47b5a/boundary-flow.sh)
- [boundary-matched.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/72731b48bcbf2e2b/boundary-matched.py)
- [build-addendum.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3eb1ae2eb47b1c9b/build-addendum.py)
- [capture.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1087448f80019e3b/capture.py)
- [cdp-read.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/27d9f7d65a1d727a/cdp-read.py)
- [cleanup-fold.sh](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ae088c92f88431ef/cleanup-fold.sh)
- [cleanup-phone.sh](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/061798f6ded7305b/cleanup-phone.sh)
- [fold-flow.sh](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7a0419a7a43a25e5/fold-flow.sh)
- [keyboard-flow.sh](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e7a315667ca9fbaa/keyboard-flow.sh)
- [keyboard-from-focus.sh](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/963911120a55aa5f/keyboard-from-focus.sh)
- [keyboard-resume.sh](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ec0c4197f5e97471/keyboard-resume.sh)
- [launch-side.sh](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c0cd1e3648da6f62/launch-side.sh)
- [make-evidence.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/abd206f3d5690282/make-evidence.py)
- [prepare-observations.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/29cb634c1ff2e510/prepare-observations.py)
- [review-video.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5705125f1d22958c/review-video.py)
- [runtime-geometry.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/832bcff84f2cf628/runtime-geometry.py)
- [runtime-metrics.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/92d2ed463a08080d/runtime-metrics.py)
- [seed.sh](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0ca756253362ac6f/seed.sh)
- [start-metro.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/dc29a910af9a467f/start-metro.py)
- [start-server.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c73cdcfe74ec0927/start-server.py)
- [stop-side.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4bc67b02018537c4/stop-side.py)
- [upload-evidence.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/cd9dc0ec3828a78d/upload-evidence.py)

Reproduction sequence: launch each side with `start-server.py` and `start-metro.py`, run `seed.sh` once against its fresh home, install/open dev client and pair via `launch-side.sh`, then run `keyboard-flow.sh`, `fold-flow.sh` or `boundary-matched.py` with the explicit runtime target/session environment. Resume helpers record the interruptions rather than hiding them. The selected artifact paths and diff recipe are in pairs/manifest; prepare-observations.py builds the sanitized measurement transcript and whole-screen presentation image; make-evidence.py creates the unmasked differences; review-video.py decodes review sheets; upload-evidence.py preserves ghdrop output; build-addendum.py assembles this file. No product tests or repo-wide checks were run for this capture-only task.

Cleanup: both leases had display density reset, foldable returned open, test app user data cleared, and both sessions closed. All owned backend/Metro process groups are stopped; baseline worktree removed; candidate checkout remains clean. Scratch evidence and private logs retained under the assigned directory. Free disk was 107GB at cleanup.

FRICTION:
infra | Pool opens and ordinary commands intermittently returned "Remote daemon is unavailable" on both leases; the first foldable lease request timed out after 300000ms; the first foldable installation said its worker was not connected to the gateway. | Stable pool worker/gateway connectivity.
tool | Candidate clean C4 export failed ECONNRESET aborted and a retry reported no active recording. Candidate C1 export left an MP4 without a moov atom and no active recording remained. | Retain downloadable native artifacts until confirmed transfer completion.
runbook | Round 1's 693dp setting came from Developer options > Smallest width. The ordinary phone Display size slider stops around 485dp. | Name the actual round-1 Settings path in the brief.
tool | CDP target selection is global across sessions. A foldable selection caused one candidate sidebar command to run against the wrong runtime and return false; selecting the phone corrected it. | A target flag scoped to the runtime invocation or documented shared selection.
other | Density changes reset the app to Home, so this Settings method cannot demonstrate continuously mounted floating state across breakpoints. | Lease-scoped window resize that preserves the activity.
tool | Before C1 export also failed ECONNRESET aborted; stop retry reported no active recording. | Durable record-stop transfer retry.
infra | Candidate Metro briefly overlapped the stopped-side teardown during restoration; it was stopped and restarted after baseline teardown. No inotify failure was observed. | A single-side lifecycle driver.
infra | One development-client startup showed UnsatisfiedLinkError NativeStatePropsGetter; a clean app relaunch recovered. | Native client startup without transient native-link failures.


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

## Uploaded artifact links (verbatim ghdrop output)

![C4-recovered-cold-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/506d78ec1ecdcf20/C4-recovered-cold-before.png)
![C4-recovered-cold-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8c648025cf998651/C4-recovered-cold-after.png)
![C4-recovered-cold-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3db9026f681b3f37/C4-recovered-cold-diff0.png)
![C4-recovered-cold-diff2pct.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/32a7b030892fd497/C4-recovered-cold-diff2pct.png)
![C4-recovered-warm-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5149fa0858d286bb/C4-recovered-warm-before.png)
![C4-recovered-warm-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/105d6de743368646/C4-recovered-warm-after.png)
![C4-recovered-warm-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/79929135ad646fdd/C4-recovered-warm-diff0.png)
![C4-recovered-warm-diff2pct.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c250782e14515429/C4-recovered-warm-diff2pct.png)
![C4-list-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/cbc2e34107ddc62c/C4-list-before.png)
![C4-list-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/fe2b52cfd7ac3371/C4-list-after.png)
![C4-list-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a45b32781f29952c/C4-list-diff0.png)
![C4-list-diff2pct.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/cd8228f05de1f273/C4-list-diff2pct.png)
![C1-medium-start-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5e465a58a668a1d8/C1-medium-start-before.png)
![C1-medium-start-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d592cd3fe3e35000/C1-medium-start-after.png)
![C1-medium-start-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5a769dfcec6b01e7/C1-medium-start-diff0.png)
![C1-medium-start-diff2pct.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/30a9265da2946c2c/C1-medium-start-diff2pct.png)
![C1-width-411-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/07bb846c72ace96f/C1-width-411-before.png)
![C1-width-411-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e66ca7fb104f3e57/C1-width-411-after.png)
![C1-width-411-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9942ce251cee7a34/C1-width-411-diff0.png)
![C1-width-411-diff2pct.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/822fd526bea48896/C1-width-411-diff2pct.png)
![C1-width-720-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/09d1ad73aafb60de/C1-width-720-before.png)
![C1-width-720-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/25df4cefe37e6218/C1-width-720-after.png)
![C1-width-720-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/793e94b3acb23d6c/C1-width-720-diff0.png)
![C1-width-720-diff2pct.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d464ab6324126f57/C1-width-720-diff2pct.png)
![C1-width-692-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4b123369679fd10b/C1-width-692-before.png)
![C1-width-692-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1e05cdf4ef6cf2f8/C1-width-692-after.png)
![C1-width-692-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/fe9410eea0e7c1cd/C1-width-692-diff0.png)
![C1-width-692-diff2pct.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/005f4537307539b7/C1-width-692-diff2pct.png)

![C5-list-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d3b295211483caf7/C5-list-diff0.png)
![C5-half-open-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/cf4a594d7697acae/C5-half-open-before.png)
![C5-closed-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1a012b46f0442a6e/C5-closed-before.png)
![C5-closed-diff2pct.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a6765ae6f4169dcd/C5-closed-diff2pct.png)
![C5-list-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/745a53f60c3c691e/C5-list-after.png)
![C5-list-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1e6a2da99eefceae/C5-list-before.png)
![C5-open-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/131ce8198dbb36a2/C5-open-after.png)
![C5-half-open-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/fa4c7d9b560560d3/C5-half-open-diff0.png)
![C5-open-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/786813e6a4ea600d/C5-open-before.png)
![C5-open-diff2pct.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/864a00948f7eae4c/C5-open-diff2pct.png)
![C5-half-open-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bc721783ddb50963/C5-half-open-after.png)
![C5-open-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5381cab12c21b3de/C5-open-diff0.png)
![C5-list-diff2pct.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/33545be9780c71be/C5-list-diff2pct.png)
![C5-closed-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f29b5103a38bd37d/C5-closed-after.png)
![C5-closed-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/73d1296c8dd4c3a6/C5-closed-diff0.png)
![C5-half-open-diff2pct.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/303c6c6fe240b903/C5-half-open-diff2pct.png)
[C4-keyboard.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/dbed78275454905c/C4-keyboard.mp4)
[C4-keyboard.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/facfdafe587fe508/C4-keyboard.mp4)
[C5-fold.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/cf5e2b5a623e8df1/C5-fold.mp4)
[C5-fold.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/aad4f200e683c3ee/C5-fold.mp4)

[boundary-matched.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/72731b48bcbf2e2b/boundary-matched.py)
[capture.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1087448f80019e3b/capture.py)
[cdp-read.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/27d9f7d65a1d727a/cdp-read.py)
[make-evidence.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/abd206f3d5690282/make-evidence.py)
[prepare-observations.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/29cb634c1ff2e510/prepare-observations.py)
[review-video.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5705125f1d22958c/review-video.py)
[runtime-geometry.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/832bcff84f2cf628/runtime-geometry.py)
[runtime-metrics.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/92d2ed463a08080d/runtime-metrics.py)
[start-metro.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/dc29a910af9a467f/start-metro.py)
[start-server.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c73cdcfe74ec0927/start-server.py)
[stop-side.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4bc67b02018537c4/stop-side.py)
[upload-evidence.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/cd9dc0ec3828a78d/upload-evidence.py)
[boundary-finish.sh](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/544ebd02dcece215/boundary-finish.sh)
[boundary-flow.sh](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ba8fbdafe1d47b5a/boundary-flow.sh)
[cleanup-fold.sh](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ae088c92f88431ef/cleanup-fold.sh)
[cleanup-phone.sh](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/061798f6ded7305b/cleanup-phone.sh)
[fold-flow.sh](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7a0419a7a43a25e5/fold-flow.sh)
[keyboard-flow.sh](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e7a315667ca9fbaa/keyboard-flow.sh)
[keyboard-from-focus.sh](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/963911120a55aa5f/keyboard-from-focus.sh)
[keyboard-resume.sh](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ec0c4197f5e97471/keyboard-resume.sh)
[launch-side.sh](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c0cd1e3648da6f62/launch-side.sh)
[seed.sh](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0ca756253362ac6f/seed.sh)
[observations.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7e5dbbb2b9ff93e2/observations.json)
![C4-list-comparison.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/30d1a1ceb7f5e6fb/C4-list-comparison.png)
[pairs.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f5536b28a301918f/pairs.json)
[manifest.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2a9dc6848f5b73a3/manifest.json)
[FRICTION.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b6203403d61c3356/FRICTION.txt)

![C1-list-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/90acae1a40e047d8/C1-list-before.png)
![C1-list-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d57890608728fd6e/C1-list-after.png)
![C1-list-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/56496099295491bd/C1-list-diff0.png)
![C1-list-diff2pct.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e9c5803400f964df/C1-list-diff2pct.png)

[build-addendum.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3eb1ae2eb47b1c9b/build-addendum.py)
[pairs.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5fa8fe4bdbb4aa48/pairs.json)
[manifest.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/82141bd4873f467f/manifest.json)

