Supersedes #22 (feature/notify-email-requested), which was green but now conflicts with develop after #31-#36. This branch merges #22 into current develop (no rebase) and resolves the conflicts.
What it does
Recipient email status REQUESTED (per-notification, e.g. per-job opt-in): emailed immediately without a standing category preference.
Skipped when no address is known; never emailed for ALERT notifications; eligible for one day after delivery.
Reconciliation with develop
develop's emailer now pages recipients by id and applies user pause; the REQUESTED path is folded into that loop rather than the old single-query version.
REQUESTED email honours the user's notification preferences: the category email minimum severity (when a preference row exists), pause (SECURITY bypasses), and quiet hours (held as REQUESTED, CRITICAL bypasses, via AlertTiming.isQuiet). Digest/immediate modes no longer override severity for a request.
No schema change, so no new changeset and no H2/Postgres concern (alerts.changelog.sql untouched).
Tests updated/added: min severity, pause and quiet-hours holds, SECURITY pause bypass.
./mvnw verify is green locally (224+ tests including Testcontainers).
Supersedes #22 (`feature/notify-email-requested`), which was green but now conflicts with develop after #31-#36. This branch merges #22 into current develop (no rebase) and resolves the conflicts.
## What it does
- Recipient email status `REQUESTED` (per-notification, e.g. per-job opt-in): emailed immediately without a standing category preference.
- Skipped when no address is known; never emailed for ALERT notifications; eligible for one day after delivery.
## Reconciliation with develop
- develop's emailer now pages recipients by id and applies user pause; the REQUESTED path is folded into that loop rather than the old single-query version.
- REQUESTED email honours the user's notification preferences: the category email minimum severity (when a preference row exists), pause (SECURITY bypasses), and quiet hours (held as REQUESTED, CRITICAL bypasses, via `AlertTiming.isQuiet`). Digest/immediate modes no longer override severity for a request.
- No schema change, so no new changeset and no H2/Postgres concern (`alerts.changelog.sql` untouched).
- Tests updated/added: min severity, pause and quiet-hours holds, SECURITY pause bypass.
`./mvnw verify` is green locally (224+ tests including Testcontainers).
🤖 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.
Supersedes #22 (
feature/notify-email-requested), which was green but now conflicts with develop after #31-#36. This branch merges #22 into current develop (no rebase) and resolves the conflicts.What it does
REQUESTED(per-notification, e.g. per-job opt-in): emailed immediately without a standing category preference.Reconciliation with develop
AlertTiming.isQuiet). Digest/immediate modes no longer override severity for a request.alerts.changelog.sqluntouched)../mvnw verifyis green locally (224+ tests including Testcontainers).🤖 Generated with Claude Code