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.
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)
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Phase (c) of docs/NOTIFICATIONS.md, stacked on #9 (retarget to develop once #9 merges).
AlertsProcessListeneralso 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).alerts*processes are skipped. Off withnotifyFailedJobs(false).sourceKey process:<uuid>); a repeat brings it back to unread.jobRunLinkPattern({processName},{processUUID}), else the process's table.NotificationSignalandsink().notifyfrom #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