feat(notifications): notify people of their failed and partial jobs (phase c) #10

Merged
KofTwentyTwo merged 2 commits from feature/notifications-c-jobs into develop 2026-10-13 15:15:27 +00:00
KofTwentyTwo commented 2026-10-13 15:06:49 +00:00 (Migrated from github.com)

Phase (c) of docs/NOTIFICATIONS.md, stacked on #9 (retarget to develop once #9 merges).

  • AlertsProcessListener also sends a JOB notification to the person who started a run that fails, or that completes with ERROR summary lines (a partial streamed-ETL run, an import or export with bad rows).
  • System-user runs, sessions without a user, and the qbit's own alerts* processes are skipped. Off with notifyFailedJobs(false).
  • One notification per run (sourceKey process:<uuid>); a repeat brings it back to unread.
  • Link: jobRunLinkPattern ({processName}, {processUUID}), else the process's table.
  • Monitor heartbeats and PROCESS_FAILED handling stay limited to processes a monitor watches (the listener now applies to every process, so this guard matters).
  • Producer SPI: the stand-in NotificationSignal and sink().notify from #9 match the core PR (QAlerts.notify, QRun-IO/qqq). When that RC ships, the stand-in package is swapped for core's.

Tests: JobNotificationsTest (failed run as a user, system run, success, off switch, partial-run counting, links). ./mvnw verify: 64 tests, coverage gate met, checkstyle 0 violations.

🤖 Generated with Claude Code

Phase (c) of docs/NOTIFICATIONS.md, stacked on #9 (retarget to develop once #9 merges). - `AlertsProcessListener` also sends a JOB notification to the person who started a run that fails, or that completes with ERROR summary lines (a partial streamed-ETL run, an import or export with bad rows). - System-user runs, sessions without a user, and the qbit's own `alerts*` processes are skipped. Off with `notifyFailedJobs(false)`. - One notification per run (`sourceKey process:<uuid>`); a repeat brings it back to unread. - Link: `jobRunLinkPattern` (`{processName}`, `{processUUID}`), else the process's table. - Monitor heartbeats and PROCESS_FAILED handling stay limited to processes a monitor watches (the listener now applies to every process, so this guard matters). - Producer SPI: the stand-in `NotificationSignal` and `sink().notify` from #9 match the core PR (`QAlerts.notify`, QRun-IO/qqq). When that RC ships, the stand-in package is swapped for core's. Tests: `JobNotificationsTest` (failed run as a user, system run, success, off switch, partial-run counting, links). `./mvnw verify`: 64 tests, coverage gate met, checkstyle 0 violations. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Sign in to join this conversation.