fix(ios): verify deep-tree back on the sole screen

Merged
TH
3d ago
+212-27

Summary

  • In-app back now recovers after the XCTest query rejection that deep trees cause on single-screen iPhones. It reuses the sole-screen synthesized dispatch and the before/after visual check. Healthy control selection and the #2728 outcomes are unchanged.
  • The top-leading fallback taps one point, 0.1·h (56–96), on both the window route and the sole-screen route. The health of the accessibility tree picks the route and the capture, not the target. A rejected query skips the windows query only where the sole screen answers; an iPad still asks for its windows.
  • 9 files: runner, display capture, regression tests, help, and the panel ADR.

Validation

Head 2864217fbe (main e3ed027a1d merged).

  • On an iPhone 17 Pro (402x874), both the heavy-feed header and the automation-lab header put the back control at y 62–106. A tap at y 132 missed both; a tap at y 87 hit. Live heavy-feed back succeeded 3/3 (1127–1748 ms). With the heavy feed as the root screen, back reported changed=no, so back was unavailable. On an iPad deep tree the outcome is the same as base (unavailable). Details: https://github.com/callstack/agent-device/pull/3894#issuecomment-6337876717
  • Earlier A/B on the Release heavy-feed fixture, base 9935ef51c2 vs db9c6a836a: 0/3 → 3/3, median 903 ms.
  • Runner Navigation tests: 18/18 on iPhone and on iPad. Mutations: an always-changed sole-screen capture fails only the new miss test; skipping windows on an iPad fails the new window-route test. Combined with #3893: 54/54 on both.
  • check:xctest-selection passed. check:affected --run --head 2864217fbe passed (exactCommit: true).

Known gap: on an iPad the bar sits at y 32–86, and the fallback point (y 96) misses it on both routes. This PR does not change that.

🤖 Generated with Claude Code