Schedule Runner
Clock-driven runner for SCHEDULE blocks (#77 Phase 40).
Each registered trigger carries a nextFireMs watermark. tick is called once per ingest from TradingPipeline.ingest(tick) and once per second from a LiveSession timer (live only — for quiet markets); it advances watermarks and emits the action lambda when due.
Backtest determinism: the runner reads time only via the tick argument — the same simulated clock that drives the rest of the engine — so a backtest of a strategy with SCHEDULE AT 09:00 UTC fires the action at the same simulated instant on every run, regardless of wall clock.
Fire model: replay missed occurrences. Every elapsed fire is emitted once with its scheduled event-time. Live's one-second heartbeat and sparse backtest ticks therefore observe the same occurrence count across quiet market gaps.
Functions
Register every trigger inside schedule under strategyId. nowMs is the engine's current clock at registration time — it seeds the watermark so the first eligible fire is the next one after registration.
Total trigger count across all strategies. Test/debug helper.
Drop every trigger attributed to strategyId. Idempotent.