# Issue 27024, capture round 2

Before: 08a463e299; after: 74ef8c4ced. These are fresh isolated checkouts; no live database was read or copied. Install with `vp i`; start each server with `T3CODE_DEV_SEED=0 vp run dev`. Runtime ports are 15549/7509 before and 15168/7128 after. All uploaded data are synthetic.

The original uploaded drivers were reused and adapted to the capture-2 scratch root. Instrumentation patches apply to these exact revisions and leave the changed derivation files untouched. They insert labelled consumer wrappers and freeze client UI clocks. The native clock is frozen only in useVisibleSecondClock; service deadlines retain the real clock. Guest Date is frozen in index.html before any component module initializes, making the expiry hook deterministic.

R1 deterministic: fixed projected items: parent prompt at t=0, Bash t=1, answer updated t=3, resumed child t=140, notification B t=150 and response at t=152. The initial and resumed-live stages keep A as latest with complete timestamps; notification B makes A historical. The labelled web/mobile harness runs each revision's unmodified real derivation and MessagesTimeline/ThreadFeed consumer. It does not prove provider execution, orchestration, guest authentication, or connectivity. Server RPC creates messages/runs with authoritative server/provider timestamps and has no API to insert arbitrary projected work with fixed timestamps; that is why the deterministic comparison uses the explicitly permitted harness.

R2–R6 reuse fixture-data.ts and the original adjacent-batch, steer, trailing-work, ownership, and cards-only scenarios. R7 reuses the same uploaded synthetic R1 projection on both sides, through the actual GuestThread consumer. Guest expiry is frozen before hook initialization. All fold labels are computed by the actual source helpers, never hardcoded.

Web: `run-web-single.py` authenticates and records each row before then after in one named Chromium process. One renderer avoids compositor rounding drift. Set the real app glassOpacity setting to 100 and close the thread-details panel and main sidebar on both sides before recording. Strict companion stills also force a fresh 1440×901 →1440×900 layout; this removes an eight-pixel one-level composer-corner raster difference. Browser launch disables GPU and GPU compositing; 1440x900/DPR1/dark, except guest 390x844/DPR1/light. No device emulation; font scale 100%; reduced motion on, timezone UTC. Each still waits for networkidle and fonts, then two whole-viewport PNGs at least 500 ms apart must have AE=0. R1 includes stage progression, expand/collapse, browser reload, full-history scroll, and repeated disclosure. Native R1 uses a full app relaunch for its reload chapter and explicitly resets the labelled fixture before replaying the fixed timeline.

Native: `vp run mobile:install ios --prepare`, then lease iPhone 17 Pro through agent-device proxy and `vp run mobile:install ios --session issue-27024-recapture`. Both revisions share native fingerprint 953468b560e21a2a7cfb6d86a69eda1e061efb8a. Two isolated Metro servers listen on 8084/8085. The device reaches backend relays on the VM tailnet IP, and pairs through the server-issued one-time credentials; those credentials are never uploaded. Switch bundles using agent-device open with --launch-url and explicit Metro hints, then navigate to that environment's thread. Viewport 402x874 logical, DPR3, fontScale1, light; screenshot output is 402x874 at 1x; videos are native resolution. Native timezone is America/Los_Angeles.

In iOS Settings → Accessibility → Display & Text Size, enable Reduce Transparency; in Accessibility → Motion, enable Reduce Motion. Both were read back as checked. These are OS settings, not rendering-source edits.

Strict native captures use one simulator for both revisions. Different hosts produced one-level blur differences and were rejected. The remote daemon's --normalize-status-bar still produced charging animation and was rejected. Final stills instead verify the entire native status bar pixel-identically across each before/after pair, using capture within the same minute; no masking or postprocessing. The driver retries the pair on a minute boundary. Every accepted native still also has two identical frames at least 500 ms apart.

Real R1 demonstration: new RPC-created threads at the requested SHAs run Claude Sonnet 5.5, delegate one async Haiku 5.5 task, finish, run Bash ls/LISTED, then resume the same child after over two minutes and handle its Finished notification. These independent runs are labelled demonstrations, not strict pixel comparisons. The earlier uploaded real native demonstration is retained with its original SHAs explicitly stated.

Diffs compare full RGB frames with no alignment, masking, crop, or normalization. Diff0 highlights every nonzero maximum-channel delta saturated pink; DiffT16 highlights deltas >16/255. Unchanged pixels are dimmed to 22%. A zero count is an exact pixel match. Captures, both diff variants, interaction videos, timestamps, fixture source, metadata, and instrumentation patches are linked from the index.


Run order: apply instrumentation-before-round2.patch / instrumentation-after-round2.patch from the bundle to the matching fresh revisions; they include all added fixture files. Mint local bearer credentials into auth-before.private / auth-after.private without publishing them. Run node seed-driver.mjs <side> scaffold evidence-parent, then node seed-driver.mjs <side> empty. The optional live path uses launch r1-proof, projection, and send actions; use the childThreadId from the synthetic projection when resuming. Ports and paths are explicit constants in these reused scratch drivers and must be adapted if occupied. Run run-web-single.py for all browser recordings, then web-strict-pairs.py R5 and web-strict-pairs.py R1 for strict companion stills. The latter forces a real 1440×901 →1440×900 viewport layout before the settled frame to avoid cached one-level rounded-corner raster differences; final captures remain1440×900. Run single-native-pairs.py <R1|R2|R4|R5> record for paired native recordings, then single-native-pairs.py <row> for strict companion pairs. Set CAPTURE_NO_SELECTED_STILLS=1 when re-recording to preserve accepted strict stills. The driver waits for the Metro loading overlay to disappear and UI stability, then explicitly navigates to the target thread; it retries navigation once if Expo restores the Chats route. Strict native pairs start near a minute boundary, reject differing status bars, and never normalize or mask screenshots. Metadata, accepted source images, Diff0/DiffT16, and decoded contact sheets are retained separately in the uploaded materials.

R1 native strict companion stills long-press the existing Reset fixture control to remount the actual feed with its current fixed data. This is a nonvisual harness control; it clears cached LegendList row measurements without changing the fixture stage. Interaction recordings keep the ordinary stage-update path and are separate from these static companions. The changed helpers and the actual feed renderer remain unchanged.
