fix(ios): read simulator snapshots past 64 accessibility levels

KR
4h ago
+119-31

Summary

On an iOS simulator, snapshot dropped every control nested more than 64 accessibility levels deep, so press by label or ref could not find it. Fixes #4088.

  • The daemon asks the simulator AX bridge for its full protocol bound, 128 levels, instead of 64 (limits.ts).
  • One native request still reads at most 65 levels and the rest arrives through continuations, so trees up to 65 levels deep make exactly the same requests as before. Depth hints compare against that first request, so a hint is still forgotten once a probe-back succeeds.
  • The continuation budget goes from 32 to 64. Without it, screens with several deep chains exhaust the budget and fall back to the slow runner capture. Exhaustion still fails closed (#2414).

8 files: the bridge README, the shared recovery fixture, and the native fixture, which now checks every continuation's levels.

Validation

Device run at 7fcde94 (the bridge change before review fixes to host-side hint bookkeeping, the hint cap, and tests), Xcode 26.6, iOS 26.5 simulator, iPhone 17 Pro, Deep target under N plain UIViews:

screenbase 3b9e8d1head
AX depth 25–64found, pressedsame
AX depth 65–125missing, Selector did not matchfound, pressed
70×20 chains8/20, 5471 ms (runner fallback)20/20, 516 ms
100×120/12, 397 ms12/12, 535 ms
120×200/20, ~6.4 s (budget exhausted)same

At d1a2434 on macOS: snapshot-source vitest 134/134 (native fixtures included), oxlint, typecheck, fallow audit --base upstream/main, check:production-exports. Runner conformance XCTests passed at 7fcde94 (fixture unchanged since).

No check:affected --run receipt: locally layering and eager-closure-budgets.test.ts fail identically on the unchanged base (the clone's origin is a stale fork). CI is the record. Not tested: Xcode 27, iOS 27, physical devices.


Changes made by Claude Opus 5.5 in Claude Code (T3 Code).