# F02 — capture2 merged evidence

**CAPTURED — direct one-column table, caption, native play/pause and static pairs plus retained web proof.**

HARNESS synthetic RPC data around real app routes. Before [32ecd71726](https://git.cafe/pingdotgg/t3code/commit/32ecd71726fee16f335484c1f95cbce126d461f6); after [57eaadd11e](https://git.cafe/pingdotgg/t3code/commit/57eaadd11e361b203d165aa9b64f3951df6cbdb4). Web Chrome156/Linux preview, no emulation,390×1000CSS,DPR2,fontScale1,dark. iPhone17Pro402×874pt,DPR3,fontScale1,light; still402×874/video1206×2622. Pixel9 API36,411.4286×923.4286dp,DPR2.625,fontScale1,dark (F01 both themes);1080×2424px. Agent-device/Simlock cached clients. JS clock08:00Z for stills; OS clock remains in full native frames. No independent Electron run; desktop shares web renderer.

[Retained previous F02 proof, including earlier full tables/recordings](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/08b3436dedd99122/F02-sheet.md). This sheet supersedes its coverage/status wording.

## F02-android-dark — Android dark,411.4286×923.4286dp

Two frames500ms apart: before=True, after=True. Diff0=RGBabsolute difference×16; DiffT=per-channel>12/255. Changed pixels0/T12=1238473/1060049; bounds=[42, 721, 1038, 2304]. Before/After show full surfaces; Diff0/DiffT use the same status-bar crop: (0,120,1080,2424), Android rows120..2423.

| Before | After | Diff0 | DiffT |
|---|---|---|---|
| ![F02-android-dark-before-full.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/cf630caff0ea644a/F02-android-dark-before-full.png)<br>[32ecd71726](https://git.cafe/pingdotgg/t3code/commit/32ecd71726fee16f335484c1f95cbce126d461f6) | ![F02-android-dark-after-full.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/702cf4949f5c7a00/F02-android-dark-after-full.png)<br>[57eaadd11e](https://git.cafe/pingdotgg/t3code/commit/57eaadd11e361b203d165aa9b64f3951df6cbdb4) | ![F02-android-dark-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e71d0840ccf97df3/F02-android-dark-diff0.png)<br>[32ecd71726](https://git.cafe/pingdotgg/t3code/commit/32ecd71726fee16f335484c1f95cbce126d461f6)→[57eaadd11e](https://git.cafe/pingdotgg/t3code/commit/57eaadd11e361b203d165aa9b64f3951df6cbdb4) | ![F02-android-dark-diff12.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1f3d1a070834bbed/F02-android-dark-diff12.png)<br>[32ecd71726](https://git.cafe/pingdotgg/t3code/commit/32ecd71726fee16f335484c1f95cbce126d461f6)→[57eaadd11e](https://git.cafe/pingdotgg/t3code/commit/57eaadd11e361b203d165aa9b64f3951df6cbdb4) |

Settling partners: [F02-android-dark-before-settle1-full.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c4128d8a3144371d/F02-android-dark-before-settle1-full.png) · [F02-android-dark-after-settle1-full.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/55b8f305595f1f67/F02-android-dark-after-settle1-full.png). Cropped source pair: [F02-android-dark-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/451761301181f052/F02-android-dark-before.png) · [F02-android-dark-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/59c87813f30a31dd/F02-android-dark-after.png).

## F02-ios-light — iOS light,402×874pt

Two frames500ms apart: before=True, after=True. Diff0=RGBabsolute difference×16; DiffT=per-channel>12/255. Changed pixels0/T12=195951/188161; bounds=[16, 162, 386, 811]. Before/After show full surfaces; Diff0/DiffT use the same status-bar crop: (0,62,402,873), iOS rows62..872.

| Before | After | Diff0 | DiffT |
|---|---|---|---|
| ![F02-ios-light-before-full.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/387e111e69b91fa4/F02-ios-light-before-full.png)<br>[32ecd71726](https://git.cafe/pingdotgg/t3code/commit/32ecd71726fee16f335484c1f95cbce126d461f6) | ![F02-ios-light-after-full.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/110286722ee7d9fc/F02-ios-light-after-full.png)<br>[57eaadd11e](https://git.cafe/pingdotgg/t3code/commit/57eaadd11e361b203d165aa9b64f3951df6cbdb4) | ![F02-ios-light-diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/747aab3f98d3ef92/F02-ios-light-diff0.png)<br>[32ecd71726](https://git.cafe/pingdotgg/t3code/commit/32ecd71726fee16f335484c1f95cbce126d461f6)→[57eaadd11e](https://git.cafe/pingdotgg/t3code/commit/57eaadd11e361b203d165aa9b64f3951df6cbdb4) | ![F02-ios-light-diff12.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/fad78121276ebafe/F02-ios-light-diff12.png)<br>[32ecd71726](https://git.cafe/pingdotgg/t3code/commit/32ecd71726fee16f335484c1f95cbce126d461f6)→[57eaadd11e](https://git.cafe/pingdotgg/t3code/commit/57eaadd11e361b203d165aa9b64f3951df6cbdb4) |

Settling partners: [F02-ios-light-before-settle1-full.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0f94443c1d99319e/F02-ios-light-before-settle1-full.png) · [F02-ios-light-after-settle1-full.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2f4ab2b3afa0639b/F02-ios-light-after-settle1-full.png). Cropped source pair: [F02-ios-light-before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b4b7e9d7759baa26/F02-ios-light-before.png) · [F02-ios-light-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/50ec1894cb802866/F02-ios-light-after.png).

## ios — one-column direct clip play/pause

Static one-column caption pair is above. Record from paused state, play the direct flower clip, then pause and hold the ending. Action timestamps below are seconds from each record-start completion; preparation is excluded. The recorder may stop encoding unchanged frames before the stop-call clock.

Before: 1.0s press Play flower.mp4; 5.2s /tmp/lead-25988-r2/capture2/cdp.mjs 8082 simlock (()=>{let a=[];function v(f){if(!f)return;const p=f.memoizedProps?.player;if(p&&typeof p.pause==='function'&&!a.includes(p)){p.pause();a.push(p)}v(f.child);v(f.sibling)}for(const id of __REACT_DEVTOOLS_GLOBAL_HOOK__.renderers.keys())for(const r of __REACT_DEVTOOLS_GLOBAL_HOOK__.getFiberRoots(id))v(r.current);return a.map(p=>({status:p.status,playing:p.playing,currentTime:p.currentTime}))})(); 8.8s record stop.

After: 1.0s press Play flower.mp4; 4.2s /tmp/lead-25988-r2/capture2/cdp.mjs 8081 simlock (()=>{let a=[];function v(f){if(!f)return;const p=f.memoizedProps?.player;if(p&&typeof p.pause==='function'&&!a.includes(p)){p.pause();a.push(p)}v(f.child);v(f.sibling)}for(const id of __REACT_DEVTOOLS_GLOBAL_HOOK__.renderers.keys())for(const r of __REACT_DEVTOOLS_GLOBAL_HOOK__.getFiberRoots(id))v(r.current);return a.map(p=>({status:p.status,playing:p.playing,currentTime:p.currentTime}))})(); 7.9s record stop.

| Before | After |
|---|---|
| [F02-ios-before.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1b379becb253ebdb/F02-ios-before.mp4)<br>[32ecd71726](https://git.cafe/pingdotgg/t3code/commit/32ecd71726fee16f335484c1f95cbce126d461f6) | [F02-ios-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b714d41468d86a5e/F02-ios-after.mp4)<br>[57eaadd11e](https://git.cafe/pingdotgg/t3code/commit/57eaadd11e361b203d165aa9b64f3951df6cbdb4) |

before action clock: [F02-ios-before-events.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/97fa9c384032af2f/F02-ios-before-events.json) · after action clock: [F02-ios-after-events.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/30a6adece5942da0/F02-ios-after-events.json) · 

## android — one-column direct clip play/pause

Static one-column caption pair is above. Record from paused state, play the direct flower clip, then pause and hold the ending. Action timestamps below are seconds from each record-start completion; preparation is excluded. The recorder may stop encoding unchanged frames before the stop-call clock.

Before: 1.0s press Play flower.mp4; 7.2s /tmp/lead-25988-r2/capture2/cdp.mjs 8082 Google (()=>{let a=[];function v(f){if(!f)return;const p=f.memoizedProps?.player;if(p&&typeof p.pause==='function'&&!a.includes(p)){p.pause();a.push(p)}v(f.child);v(f.sibling)}for(const id of __REACT_DEVTOOLS_GLOBAL_HOOK__.renderers.keys())for(const r of __REACT_DEVTOOLS_GLOBAL_HOOK__.getFiberRoots(id))v(r.current);return a.map(p=>({status:p.status,playing:p.playing,currentTime:p.currentTime}))})(); 11.2s record stop.

After: 1.0s press Play flower.mp4; 4.3s /tmp/lead-25988-r2/capture2/cdp.mjs 8081 Google (()=>{let a=[];function v(f){if(!f)return;const p=f.memoizedProps?.player;if(p&&typeof p.pause==='function'&&!a.includes(p)){p.pause();a.push(p)}v(f.child);v(f.sibling)}for(const id of __REACT_DEVTOOLS_GLOBAL_HOOK__.renderers.keys())for(const r of __REACT_DEVTOOLS_GLOBAL_HOOK__.getFiberRoots(id))v(r.current);return a.map(p=>({status:p.status,playing:p.playing,currentTime:p.currentTime}))})(); 8.3s record stop.

| Before | After |
|---|---|
| [F02-android-before.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/312943facc73421f/F02-android-before.mp4)<br>[32ecd71726](https://git.cafe/pingdotgg/t3code/commit/32ecd71726fee16f335484c1f95cbce126d461f6) | [F02-android-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8848986898943d1b/F02-android-after.mp4)<br>[57eaadd11e](https://git.cafe/pingdotgg/t3code/commit/57eaadd11e361b203d165aa9b64f3951df6cbdb4) |

before action clock: [F02-android-before-events.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/077c0afa7f66a0fb/F02-android-before-events.json) · after action clock: [F02-android-after-events.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3005dd708b5419b7/F02-android-after-events.json) · 

Scripts: [fixtures.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/02339fcdd64099b9/fixtures.json) · [proxy.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/423f2adfdadd429d/proxy.mjs) · [native-control.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7077291dac5bc0d0/native-control.py) · [web-sequence.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d2da090fd55f92cd/web-sequence.md) · [capture2-manifest.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b7c4ba222afa00cc/capture2-manifest.json) · [recording2-manifest.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e4b84f26f5ca1e52/recording2-manifest.json) · [rebuild-capture2.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/eedbcec94acc9c24/rebuild-capture2.md) · [rebuild-capture2.zip](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2c8c8c89810f1b20/rebuild-capture2.zip)
