Conversation
Live iPhone Duo verification handoff — #2728 capture failure contractsToolchain: Xcode 27.1 beta + booted iPhone Duo (iOS 27.1), plus a single-panel iPhone (17/18 Pro) control. Build the runner at this PR head ( 0. Focused runner unit tests (fast, any booted iPhone)
1.
|
Size Report
Startup median (7 runs, lower is better):
|
…nd recording #2741 routed screenshots through the resolved app display but left two failure contracts papered over (#2728): - The in-app `back` coordinate fallback read a nil screenshot sample as "no visual change" and sampled SpringBoard when the app resolved no window, so a two-home-screen comparison reported "in-app back control is not available" after a real leading tap had already run. The check now observes only the app's own resolved window and reports the display refusal as an unverified outcome; an observable no-change still reads as unavailable. - `record start` collapsed every no-frame bootstrap into an untyped NSError. It now surfaces the shared APP_SCREEN_* reason, so a runtime with no resolvable window fails closed with a typed code. Refuse a zero-pixel capture at the capture type so a required consumer cannot mistake it for a usable frame. macOS/tvOS keep their host-display capture and generic bootstrap error. Focused runner unit tests pin the observation split, the refusal-selection, and the typed-vs-generic error mapping.
cd758bd to
7b5b504
Compare
|
At 7b5b504, the typed refusals aren't pinned to the code paths that produce them. There's no live run at this head. The handoff comment in Is there a smaller shape here? Net production is around 235 lines, well under the usual size line, but it spans the runner and the TS contract doc and adds three new types. Not blocking: the SpringBoard fallback in the ADR ( I didn't build or run the Swift runner — the claim that the current tests can't catch these mutations comes from reading the test bodies, not from executing one. I also didn't measure what CI is green across all 18 checks, but the Swift runner's device lanes don't exercise the live back or record-start refusal routes, so that green doesn't cover the behavior this PR changes. Pin both fixes with tests that go through |
Summary
iOS
backfallback andrecord startnow report a capture that did not happen as a typed reason instead of a false verdict, finishing the failure contracts #2741 left papered over (#2728).backcoordinate fallback: anilscreenshot sample was read as "no visual change", and when the app resolved no window it sampled SpringBoard, so two identical home-screen captures reportedin-app back control is not availableafter a real leading tap had already run. It now observes only the app's own resolved window and returns the display refusal as an unverified outcome carryingAPP_SCREEN_*. An observable no-change is unchanged.record start: every no-frame bootstrap collapsed to an untypedNSError; it now throws the sharedAPP_SCREEN_*reason, so a runtime with no resolvable window fails closed with a typed code.macOS/tvOS keep their host-display capture and generic bootstrap error. 6 Swift files, one host doc comment, one ADR paragraph. Builds on #2741; addresses #2728 (parent #2725).
Validation
Commit
7b5b5043, rebased onmain(0.21.12).pnpm check:affected --run: all runnable checks passed (Swift runner builds and replay lanes are GitHub/device-lane only).build:xcuitest:ios→** TEST BUILD SUCCEEDED **;check:packaged-runner-swiftparses + line parity;xctest-selection276 declared, 0 unreachable;typecheck,lint,format,check:layering,check:fallowclean.NSErrorand the mapping test fails.Outstanding: live iPhone Duo re-verification of these paths (this host has no iPhone Duo / Xcode 27.1). A device handoff runbook is provided for the Duo lane before merge-ready.