diff --git a/docs/plans/2026-05-19-notification-outbox-implementation.md b/docs/plans/2026-05-19-notification-outbox-implementation.md index 7518633..ffc18af 100644 --- a/docs/plans/2026-05-19-notification-outbox-implementation.md +++ b/docs/plans/2026-05-19-notification-outbox-implementation.md @@ -705,6 +705,10 @@ public interface INotificationDeliveryAdapter --- +## Follow-ups (post-merge, not blocking) + +- **Share the SMTP helpers (from Task 12 review).** `EmailNotificationDeliveryAdapter` reimplements `ClassifySmtpError`/`SmtpErrorClass`, `ValidateAddresses`, and a `ScrubCredentials` helper because the originals are `internal` to `ScadaLink.NotificationService`. To avoid divergence (especially in the security-relevant credential redaction and the SMTP 4xx/5xx classification policy), promote `CredentialRedactor` to `public`, extract a `public static SmtpErrorClassifier`, and make `ValidateAddresses` shared — then have the adapter call them and delete the duplicates. The project reference already exists, so this is low-cost. + ## Done The Notification Outbox feature is implemented end to end: site scripts enqueue notifications that store-and-forward to central, the `NotificationOutboxActor` singleton ingests them into the `Notifications` table and delivers them via the Email adapter with retry/parking, operators see KPIs and manage notifications from the Central UI, and the full test suite passes. Teams and other delivery adapters can be added later by implementing `INotificationDeliveryAdapter` and registering it — no other change required.