src/util/SchedulingPolicySpecs.md
SchedulingPolicy holds the pure timing decisions behind the AX scheduling layer, extracted so they're
testable without real clocks or queues (same pattern as SelectionResolver / AxEventRouting):
ThrottleDecision — for one throttleOrProceed call: run on the leading edge, or (within the
window) schedule a single trailing run and coalesce the rest. Used by Throttler and ThrottlerWithKey.RetryPolicy — backoff schedule (200ms → 1s → 2s → 5s, then 5s) and the 60s give-up, for retrying
an AX call against an unresponsive app. Used by AXCallScheduler.Mirrors SchedulingPolicyTests.swift 1:1.
runNow.runNow (window reset).scheduleTail(remaining).coalesce.runNow.scheduleTail, then coalesce for the rest.