# Phase Handover — Communication 8 Enterprise Communication Platform ## Metadata | Field | Value | | --- | --- | | Phase ID | communication-8 | | Title | Enterprise Communication Platform (SMS-first MVP) | | Status | Complete — **Production Ready (SMS)** | | Service(s) | communication (`communication-service`, port 8005) | | Commercial product | Torbat Communication | | Version | 0.8.10.1 | | Date | 2026-07-26 | | ADR(s) | ADR-001, ADR-003, ADR-006, ADR-012 | ## Enterprise Phase Discovery Summary | Item | Detail | | --- | --- | | Discovery Record location | [communication-phase-8.md](../communication-phase-8.md) | | Gaps promoted & closed | Sub-phases 8.0–8.10 + validation hardening (idempotency, rate limits, permissions, metrics, OTP isolation) | | Exclusions (future / other service) | Non-SMS channel adapters; Core auth OTP migration; Notification service consumer; Celery worker as optional ops | | CRUD-only rejected | Yes — router, queue, failover, templates, contacts, OTP, webhooks, monitoring | ## Business Analysis Summary | Item | Detail | | --- | --- | | Capabilities delivered | Independent SMS messaging platform: providers, router/failover, templates, dynamic contacts, queue/DLQ, delivery tracking, business OTP, webhooks, monitoring | | Explicit non-goals honored | No foreign DB ownership; no provider code in business modules; auth OTP stays on Core; future channels remain stubs | ## Reusable Components | Component | Location | Reuse notes | | --- | --- | --- | | ChannelProvider protocol | `app/providers/contracts.py` | Extend for future channel adapters | | Provider registry | `app/providers/__init__.py` | Maps `provider_kind` → adapter | | CommunicationRouter | `app/services/router.py` | Priority, failover, circuit breaker | | QueueEngine | `app/services/queue_engine.py` | Async drain, DLQ, rate-limit deferral | | TemplateService | `app/services/template_service.py` | Variables, locale, approval workflow | | ContactService | `app/services/contact_service.py` | Manual, CSV, remote source resolve | | OTPService | `app/services/otp_service.py` | Business OTP; rejects Core reserved purposes | | WebhookService | `app/services/webhook_service.py` | HMAC + external_id dedupe | ## Public APIs | Method | Path | Auth / Permission | Notes | | --- | --- | --- | --- | | GET | `/health` | public | Liveness | | GET | `/health/ready` | public | DB readiness | | GET | `/capabilities` | public | Channels, features, contact source types | | GET | `/metrics` | public | Service feature summary | | GET/POST | `/api/v1/providers` | `communication.providers.*` | Provider CRUD, status, balance, health | | POST | `/api/v1/providers/senders` | `communication.senders.manage` | Sender numbers | | GET/POST | `/api/v1/templates` | `communication.templates.*` | Template CRUD, approve/reject, preview | | GET/POST | `/api/v1/contacts/*` | `communication.contacts.*` / `communication.sources.*` | Manual, CSV, sources, resolve | | POST | `/api/v1/messages/send` | `communication.messages.send` | Idempotent on correlation_id + to_address | | GET | `/api/v1/messages` | `communication.messages.view` | List/filter messages | | POST | `/api/v1/messages/queue/process` | `communication.queue.manage` | Process due queue items | | GET | `/api/v1/messages/queue/dead-letters` | `communication.queue.view` | DLQ inspection | | POST | `/api/v1/otp/request` | `communication.otp.request` | Business OTP generate | | POST | `/api/v1/otp/verify` | `communication.otp.verify` | Business OTP verify | | POST | `/api/v1/webhooks/incoming` | `communication.webhooks.manage` | Provider delivery callbacks | | GET | `/api/v1/monitoring/stats` | `communication.monitoring.view` | Message/queue/provider snapshot | | GET | `/api/v1/monitoring/metrics` | `communication.monitoring.view` | Latency, failure rate, deferrals | ## Events | Event type | Domain / Integration | Payload summary | Version | | --- | --- | --- | --- | | `communication.message.queued` | Domain | channel, to, correlation_id | 1 | | `communication.message.sent` | Domain | provider, provider_message_id | 1 | | `communication.message.delivered` | Domain | delivery confirmation | 1 | | `communication.message.failed` | Domain | error, terminal failure | 1 | | `communication.provider.failover` | Domain | from/to provider | 1 | | `communication.otp.*` | Domain | OTP lifecycle | 1 | | `communication.queue.dead_letter` | Domain | queue item exhausted retries | 1 | | `communication.webhook.received` | Domain | inbound provider webhook | 1 | ## Permissions | Permission | Routes / actions | | --- | --- | | `communication.providers.*` | Provider and sender management | | `communication.templates.*` | Template CRUD and approval | | `communication.contacts.*` / `communication.sources.*` | Contacts and dynamic sources | | `communication.messages.*` | Send, view, cancel | | `communication.queue.*` | Queue process and DLQ | | `communication.otp.*` | OTP request/verify | | `communication.webhooks.manage` | Incoming webhooks | | `communication.monitoring.view` | Stats and metrics | ## Extension Points | Extension point | How to extend | Forbidden uses | | --- | --- | --- | | ChannelProvider | Register new adapter in provider registry | Provider code in business modules | | Contact source types | Add resolver for new remote source | Copy foreign-module rows into communication_db | | Template variables | Extend template schema + validators | Bypass approval for production sends | | Queue worker | Optional Celery entry via `QueueEngine.process_due` | Blocking business transactions on send failure | ## Known Limitations - **MVP scope:** SMS active (mock + Payamak); Email/Push/WhatsApp/Telegram/Rubika/Voice are stubs — see [communication-roadmap.md](../communication-roadmap.md) - No dedicated Celery worker (optional ops; API path is correct) - Publish-only event envelopes (no wired bus consumers yet) - In-process rate limiter (per-instance) - Sender unique constraint not soft-delete-aware - Core auth OTP remains on Core (ADR-012 neutral note) ## Migration Notes | Item | Detail | | --- | --- | | Alembic revision(s) | `0001_initial`, `0002_validation_hardening` | | Upgrade steps | `alembic upgrade head` in communication service | | Downgrade support | Yes | | Data backfill | None | | Breaking changes | None (additive validation hardening) | ## Dependencies | Dependency | Type | Required for | | --- | --- | --- | | onboarding-4 | Phase | Core platform baseline | | shared-lib | Library | Events, security, exceptions | | Payamak / mock SMS | External provider | SMS delivery | ## Next Phase Entry Communication is **feature-complete for the current MVP scope (SMS only)**. No registered Communication phases remain. | Field | Value | | --- | --- | | Recommended next phase | None (MVP complete) | | Blockers for future channels | Explicit product decision + new phase registration when scoped | | Entry checklist | Read this handover + [service-snapshots/communication.yaml](../service-snapshots/communication.yaml); future channels via [communication-roadmap.md](../communication-roadmap.md) only | ## Completion Sign-Off - [x] Quality gates passed (see [communication-phase-8-audit.md](../communication-phase-8-audit.md)) - [x] Tests green (42) - [x] Documentation updated - [x] Service snapshot generated - [x] Progress / registries / manifests updated - [x] Production Ready (SMS) declared - [x] No TODO for claimed deliverables ## Related Documents - [communication-phase-8.md](../communication-phase-8.md) - [communication-phase-8-audit.md](../communication-phase-8-audit.md) - [communication-roadmap.md](../communication-roadmap.md) - [service-snapshots/communication.yaml](../service-snapshots/communication.yaml) - [ADR-012](../architecture/adr/ADR-012.md)