mirror of
https://github.com/rcourtman/Pulse.git
synced 2026-10-14 00:00:30 +00:00
3049da030e
The lifecycle contract suite from docs/ALERT_ENGINE_EVOLUTION.md — the audit's end-to-end assertions over externally observable alert behavior, each one a recurring regression class from the issue record: - A config save that changes nothing emits nothing (#1682: config saves dispatched resolved notifications for still-active alerts), and one that genuinely resolves an alert resolves it exactly once, with no fire event and no residue in the reducer core. - An acknowledged alert does not escalate, resumes escalating when unacknowledged, and its recovery notification is suppressed. - N grouped alerts render N on every delivery surface (#1683: built-in service payloads silently dropped N−1 of N): grouped email HTML and text, apprise, the generic webhook payload, a custom template, and every built-in service template — discord, slack, telegram, teams, teams-adaptive, pagerduty, pushover, gotify, ntfy, mattermost — driven through the real grouped send path against a capture server. - Cancelling an alert still inside the grouping window reports the firing as never delivered, the answer the monitor uses to hold the recovery notification (#1553: resolves sent for suppressed firings); a delivered firing is never misreported as undelivered. The engine contracts drive real metric evaluations through the public read model (GetActiveAlerts / AcknowledgeAlert by exported ID) so they gate the path users actually exercise.