# Migration guide ## From the R0 routing seam The pre-existing `dev.caskeleton.adapter.outbound.notification` router (`RoutingNotifier`, `FailOpenNotificationProvider`, the Google email and Slack webhook seams) stays untouched. The delivery platform lives beside it under `…notification.platform` and does not modify or delete any R0 class. Migration order per capability: 1. Register the contact points behind `ContactPointStorePort` so the platform owns protected values. 2. Publish the template version, and pin the template id, version and locale at every call site. 3. Move the call site from the router to the N1 typed facade for the channel. 4. Verify evidence in the snapshot rather than in the caller's return value: `submit()` is durable acceptance and nothing more. 5. Remove the R0 route only after the platform route has produced provider evidence in the target environment. ## Return-value semantics change The R0 seam returned a send-shaped result. `NotificationReceipt` returns `notificationId`, a request status and an acceptance time. Callers that treated the old return value as proof of delivery must be changed; there is no compatibility shim, because a shim would have to invent the delivery claim this platform exists to avoid. ## FCM target migration Registration tokens keep working through `LegacyFcmRegistrationToken`. New registrations should use `FcmInstallationId`. The two are distinct types, so a migration is a compile-time task rather than a runtime guess.