Owns the RAF lifecycle and the mouse/dirty timestamps that drive
picking. The orchestrator builds a narrow SettleSchedulerCtx
(no this back-pointer) and lets the scheduler decide when to
actually invoke firePick. The decision policy itself is the
pure function evaluateSettle() in ./settle-loop.
The split keeps three concerns separate and unit-testable:
settle-loop.ts pure decision (when to fire, given timestamps).
Two-axis settle scheduler for PickingSystem.
Owns the RAF lifecycle and the mouse/dirty timestamps that drive picking. The orchestrator builds a narrow
SettleSchedulerCtx(nothisback-pointer) and lets the scheduler decide when to actually invokefirePick. The decision policy itself is the pure functionevaluateSettle()in./settle-loop.The split keeps three concerns separate and unit-testable:
settle-loop.tspure decision (when to fire, given timestamps).settle-scheduler.tsrAF lifecycle + timestamp ownership.picking-system.tsGPU pipeline + registration coordination.