Files
pulse/internal/notifications
rcourtman 3049da030e test(alerts): pin the lifecycle contracts as a release gate
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.
2026-08-27 09:09:56 +01:00
..
2026-03-18 16:06:30 +00:00
2026-03-18 16:06:30 +00:00
2026-03-18 16:06:30 +00:00