src/events/AxEventRoutingSpecs.md
AxEventRouting is the pure decision layer for incoming AX events: which bounded pool an outgoing
AX query runs on, which events are coalesced (throttled), whether an event takes the prompt
MRU-order fast path, and the de-dup key per event. It holds no state and touches no queues,
threads, or timing — AccessibilityEvents and AXCallScheduler turn its decisions into real
scheduling. Extracted so the routing/throttling design is unit-testable (same pattern as
SelectionResolver).
retry; otherwise the bursty periodic inventory
is isolated on scan; everything else is an event-driven firstTry. AXCallScheduler has no throttle —
it is a pure executor, so this is purely about which lane, never when.focusOrderQueue (IPC-free) rather than via an attribute read.AXCallScheduler de-dups in-flight calls per key, so non-interchangeable work must not
share a key. App events split activate vs visibility; window events split focus / geometry /
generic. The bare pid-<n> scan key is owned by manuallyUpdateWindows and never collides.Mirrors AxEventRoutingTests.swift 1:1.
firstTry.scan (isolated from event reads).retry, even for scan work (unresponsive wins).wid-…-focus; resize/move → wid-…-geometry; title/created → wid-…-generic.pid-…-activate; hidden/shown → pid-…-visibility.pid-<n> scan key.scan.firstTry.retry.