mirror of
https://github.com/rcourtman/Pulse.git
synced 2026-09-10 10:35:51 +00:00
6a04dcb84f
Phase 2 of docs/ALERT_ENGINE_EVOLUTION.md, first and largest cutover: the deterministic reducer is now the AUTHORITATIVE transition state for the entire match-spec family (connectivity, powered-state, discrete state, provider incidents, health assessments, service gaps) and the poll-driven recovery paths. evaluateCanonicalLifecycleAlert no longer reconstructs previous state from the confirmation-count maps and re-evaluates: it derives the observation via the exported spec Match predicate, applies it to the manager-owned reducer core (with the resolved intent context and the monotonic intent tick), and translates the core's incidents and events into the existing side effects — alert objects, dispatch, history, recently-resolved, callbacks — synthesizing the evaluator-shaped result its callers consume. The recovery paths (PBS/PMG/storage, node, connection-degraded) feed healthy observations to the same core, whose recovery gate replaces confirmOfflineRecovery. Guest powered-off clears and suppressions clear the core run. User acks, unacks, and manual clears mirror into the core; restore seeds it; an existing alert the core does not know about is adopted as firing, exactly as the old engine treated any active alert as previously firing. Wall-clock immunity for intent grace is preserved deterministically: the monotonic runtime tick is now an explicit reducer signal input (with a validity flag — zero is a legitimate process-start reading), so suspend and NTP jumps neither fire nor starve gated activations. The legacy count maps are maintained as read-only mirrors of the core during the transition and are no longer consulted by any engine logic; tests that pre-seeded them now drive real observations, and tests that pinned the reconstruct-from-maps workarounds are replaced by pins of the core-owned behavior. lifecyclePreviousState and lifecycleFirstMatched are deleted — the defect class they patched cannot exist when the run state is owned rather than reconstructed. All five parity harnesses, the shadow feed, and the full characterization suite pass against the cutover engine.