Repository navigation
Conversation
A deep app tree makes XCTest's windows query fail with kAXErrorIllegalArgument, and the synthesized-gesture route that recovers from it accepted only an iPhone: the runner refused to name a screen it could not prove the app filled, so every tap, long press, scroll, swipe, and back fallback on a hostile-tree iPad app failed. iPad hosts run the same hostile trees as iPhone hosts. RunnerApplicationFillsScreen now answers that proof in-process: it compares the AXRuntime primary app's frame against the system app's frame, the same comparison the Simulator snapshot bridge refuses a windowed capture on (app-window-not-full-screen, ADR 0004). Neither read walks the app's tree. The sole-screen rule keeps one owner (RunnerResolveSoleScreen) and opens on an iPad only while the evidence says fills-screen; a windowed or Stage Manager app, and any unknown, keeps requiring a resolved window. The back fallback point now derives from the screen's own top safe-area inset instead of a frame-height fraction, which sat below the iPad's navigation bar. Co-Authored-By: Claude <noreply@anthropic.com>
|
Size Report
Startup median (7 runs, lower is better):
|
|
Thanks for this. The full-screen iPad route looks right at b18479a, but one change in the resolved-window path needs a decision before merge. All 19 reported checks pass. The PR CI runs only the iPhone runner lanes, and the new ipad-sole-screen job is nightly, so it has not run yet. The new The iPad full-screen, windowed deep-tree and iPhone results in the PR body match 29ecf0f9, which is identical to this head. They have no attached logs, so I could not check them. Not blocking, and fine to take or leave: (1) in Before merge, delete the |
* origin/main: fix(android): bound the dumpsys reads behind dialog and foreground checks (#3936) feat(android): detect Fire OS devices as Android TV targets and document Fire TV support (#3923) docs(macos): document Electron/Chromium app automation through the accessibility tree (#3932) test(capture-kit): encode solid test PNGs unfiltered to stay inside the unit budget (#3933) fix: guard bounded lifecycle and claim recovery (#3911) fix(ios): clear a long text value wherever the caret lands (#3908) fix(snapshot): stop iOS 27 floating-bar containers from covering content (#3912) ci: cache and bound the Linux desktop dependency install (#3919)
…a, one rule block, one nightly job - Drop the frame.minY > 1 branch so one inset-based formula serves every back route (a minY+22 point on a windowed iPad is the window-controls strip). - Set the probe's loggedFills flag only in the fills-screen case so a first windowed answer cannot hide the line the nightly grep reads. - Share the foreground-ownership and frame-fill rule between the runner bridge and the snapshot bridge as one byte-identical block, pinned equal by test/repo-guards/full-screen-rule-parity.test.ts; delete both copies. - Early-return on the phone idiom so RunnerFullScreenEvidenceUnknown keeps one meaning. - Reuse the nightly full-suite job for the iPad leg via its matrix instead of a parallel job; rename the back fixture test to what it now proves and delete the stale iPad-refuses doc lines.
… rule block Fixes the lint failure at 17ae6b1 and cuts the pinned block to the rule its two callers actually share, which is the size the review asked for.
|
All six points resolved at f4944b5. Point by point: Blocking 1 — Blocking 2 — Non-blocking 2 — one implementation, with the pinned-equal form. The frame comparison, the 0.5 tolerance, the foreground-element protocol, and the primary-pid check now live in one Non-blocking 3 — the negative test. Took your second option exactly: renamed to Non-blocking 4 — the iPhone TOP_INSET line, quoted from today's Reads 62, not 0, so the point lands at y = 62+22 = 84, inside the iPhone bar band (62-116) — no clamp to y=56, and no clamp was needed: the runner-process scene read answers on the phone. Non-blocking 5 — stale doc lines deleted ("an iPad refuses…" gone; the remaining paragraph stands alone). Non-blocking 6 — one meaning for Size. Diff 591+/59− → 625+/79− across the review round's deletions and the new parity guard; the parts you asked to cut:
Evidence at f4944b5 (owned sims
Windowed negative: the executable negative (SpringBoard → |
|
Validation closed at f4944b5: |
|
Thanks for the update. The earlier findings are fixed, and one new problem remains in the iPad nightly leg at f4944b5. The merge into the matrix dropped the iPad job's Not blocking, and fine to take or leave: after the early return on the phone idiom, the only production call is CI is green at f4944b5, with 19 checks and none failing. PR CI runs only the iPhone runner lanes, and the changed iPad leg runs only nightly or by |
Summary
Taps, long presses, scroll/swipe/gesture-viewport, and the
backfallback fail on an iPad simulator when the app's accessibility tree is too deep for XCTest: the sole-screen synthesized-gesture route accepted only an iPhone, though iPad hosts run the same hostile trees.RunnerFullScreenEvidenceFromForegroundnow decides the proof in-process by comparing the AXRuntime primary app's frame against the system app's frame — the same rule the snapshot bridge refuses a windowed capture on (app-window-not-full-screen, ADR 0004); neither read walks the app's tree. The comparison, tolerance, foreground-element protocol, and primary-pid check are oneAGENT_DEVICE_FULL_SCREEN_RULEblock both sources carry, pinned byte-identical bytest/repo-guards/full-screen-rule-parity.test.ts(the two builds' packaged layouts are disjoint, so a shared include cannot reach both; see the review reply).RunnerResolveSoleScreenkeeps one owner of the rule, early-returns on the phone idiom before probing, and opens on iPad only onfills-screen; windowed/Stage Manager or unknown keeps requiring a window. Thebackfallback point derives from the screen's top safe-area inset via one formula for every route. The nightly workflow gains an iPad matrix leg inside the existing job (no parallel job).Validation
Head
f4944b5. Runner unit tests (unit-test variant, own derived path): 12/12 onReview 3918 iPhone, 12/12 onReview 3918 iPad; the iPad log showsAGENT_DEVICE_RUNNER_FULL_SCREEN_EVIDENCE result=fills-screen ... window=(0,0 834x1210) screen=(0,0 834x1210)and the SpringBoard negativeresult=not-primary-app. macOS host lane: the five decision-seam tests pass.Live, Release fixture app (cached artifact + JS repack), Settings → Open heavy feed, iPad Pro 11":
press id="heavy-post-0-like"point.x != INFINITYpress 561 520longpress 417 600 800Last action: held post 1scroll down --pixels 500swipe 417 900 417 400backiPhone 17 Pro:
backfrom the heavy feed works; the fallback logsAGENT_DEVICE_RUNNER_BACK_FALLBACK_TOP_INSET read=62.0 windows=1(point y=84, inside the bar band 62-116; no clamp), and the session log has zero probe lines — the phone never probes. Windowed negative: the executable refusal (not-primary-app→ no sole screen) is asserted intestSoleScreenDisplayIDIsNamedOnlyForAnAppThatFillsItsScreenon the iPad lane.pnpm check:xctest-selection, the parity guard, and the darwin-Werrorbridge compile pass;check:affected --run --head f4944b5receipt on the review thread. The nightly iPad leg is new — its first run is a CI obligation.