- table labels follow the design (Alerts, Monitors, Alert Types, ...)
- per-record monitor alerts are titled with the record's label field
- heartbeat titles read "for 46 h" instead of minutes; short group names
are upper-cased (CDN)
- AlertsDemoServer (test scope, not shipped): H2 + mock admin + 30 days of
history produced through the engine, for screenshots and manual checks
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Implements phases P1 to P3 of the Alerts design (QRun-IO/qqq#1090):
- 15 alerts_* tables with the Liquibase changelog, record security
(alerts_user / alerts_permission / alerts_readable_table keys) and a
write guard so alerts change only through the engine and record actions
- the state machine: dedup, refresh, severity changes, snooze, resolve,
reopen window, flapping, quiet-period auto-resolve, maintenance windows
- monitors: TABLE_QUERY, AGGREGATE, HEARTBEAT, PROCESS_FAILED, CODE, with
the full-state diff, forMinutes, timeouts, CHECK_FAILED meta-alert and
seeded monitors
- routing with scopes, teams, the bootstrap rule, recipient visibility and
logged suppression reasons; in-app, email and email-list channels; a
channel SPI; retries to DEAD and channel health; redaction
- record actions as streamed ETL processes; hidden scheduled processes
- the Alerts app home, AlertSummaryLoader, and /qqq/v1/alerts routes for
the Next UI bell and record panel
The core producer SPI (QRun-IO/qqq#1108) is not released yet, so its types
are a stand-in in the spi package, marked for replacement.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>