# adapter:outbound:notification — notification adapter ## Registered identity - Module ID: `adapter-outbound-notification` - Gradle path: `:adapter:outbound:notification` - Focused test (derived from Gradle path): `./gradlew :adapter:outbound:notification:test --console=plain` - Runtime baseline: Java 21; repository framework baseline: Spring Boot 4.0.0. - Registry SSOT: `src/config/architecture/modules.json`. Package root: `dev.caskeleton.adapter.outbound.notification`. ## Responsibility - Preserve the current raw notification router/provider seams only as the `R0 legacy` compatibility baseline until the reviewed canonical cutover removes them. - Implement future provider protocols behind application-owned ports without leaking SDK, transport, bootstrap, or persistence types. - Own provider settings, technical fallback mechanics, and provider adaptation; application policy owns mode, eligibility, retry/fallback decisions and business failure semantics. - Reuse `adapter:outbound:support` for shared outbound concerns. ## Current R0 freeze - `RoutingNotifier` performs route-list fan-out over `(Channel, providerId)`. - `FailOpenNotificationProvider` applies one global fail-open rule. - `google-email`/`GoogleEmailClient` and `slack-webhook`/`SlackClient` are fake-only extension seams, not production integrations or qualified provider cards. - Checked-in provider selector keys drift from the router's `routes` + provider `enabled` grammar. Preserve and document that drift until the canonical graph replaces it; do not silently reinterpret the old keys. - There are no feature/application production consumers and no real-provider, durable, receipt, security, load, or rotation evidence. - The exact legacy deletion inventory lives in [README.md](README.md). Do not add behavior to those classes while building their canonical replacements. ## Boundaries - Allowed dependency edges come only from the module's `src/config/architecture/modules.json` entry. - No inbound DTO/controller, persistence, bootstrap, or sample dependency. - Provider selection may route configured channels but must not encode business eligibility rules. ## Tests Use provider/client fakes and contract tests; no real webhook or email network calls. Settings changes include binding/validation tests.