Files
suaveplan/openspec/archive/2026-05-25-enterprise-sms/tasks.md
2026-05-27 23:29:53 +01:00

77 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Tasks — `@suaveplan/sms` enterprise migration
## 1. Package scaffold
- [ ] Create `packages/communication/messaging/sms/` with `package.json`, `tsconfig.lib.json`, `vite.config.ts`, `README.md`.
- [ ] Add deps: `@suaveplan/error`, `@suaveplan/events`, `@suaveplan/types`, `@opentelemetry/api`, `tslib`, `zod`; devdeps: `@suaveplan/testing`, `@opentelemetry/sdk-metrics`, `@vitest/coverage-istanbul`, `vitest`, `vite`, `vite-plugin-dts`, `typescript`.
- [ ] Subpath exports for every feature module + `./types`, `./routes/problem-json`.
## 2. Error codes
- [ ] `error-codes/error-codes.ts` — `defineCodes("SMS", [...])` with 13 codes, typed `SmsError` base, 12 leaf classes.
- [ ] `error-codes/error-codes.test.ts` — registry sort assertion + reachability test (every code raised from a real call site).
- [ ] `error-codes/error-codes.md`.
## 3. Legacy compatibility
- [ ] `legacy-errors/legacy-errors.ts` — back-compat `SmsError` class with the upstream `SmsErrorCode` union + factories (`invalidPhoneNumber`, `sendFailed`, `templateNotFound`, `recipientOptedOut`, `providerNotConfigured`).
- [ ] `legacy-errors/legacy-errors.test.ts`.
- [ ] `legacy-metadata/legacy-metadata.ts` — `SMS_ERROR_METADATA` + `registerSmsErrorCodes()` + `SmsRegisteredErrorCode`; eager-register on import.
- [ ] `legacy-metadata/legacy-metadata.test.ts`.
## 4. Types + schemas
- [ ] `types/sms.types.ts` — `SmsDeliveryStatus`, `SmsMessage`, `SmsDeliveryReport`, `SmsProvider`, `OptOutEntry`, `SmsTemplate`, `SmsEventMap`, `SmsServiceOptions`, `ScheduledMessage`, `ScheduleHandle`.
- [ ] `schemas/schemas.ts` — Zod for `SmsMessage`, `SmsTemplate`, `SmsDeliveryReport`, `SmsServiceOptions`; `parseSmsMessage` / `parseSmsTemplate` throw `SmsInvalidConfigError`.
## 5. Pipeline primitives
- [ ] `validation/phone.ts` — `isValidE164`.
- [ ] `templates/templates.ts` — `TemplateRegistry`, `renderTemplate(template, vars, defaults?)`.
- [ ] `opt-out/opt-out.ts` — `OptOutRegistry` (set/clear/check/bulk).
- [ ] `rate-limiter/rate-limiter.ts` — `RateLimiter` token-bucket with injectable `Clock`.
- [ ] `retry/retry.ts` — `RetryPolicy` exponential w/ jitter, abort-aware.
- [ ] `scheduler/scheduler.ts` — `MessageScheduler` with injectable `Timers`.
- [ ] `delivery-tracker/delivery-tracker.ts` — bounded LRU receipt cache.
## 6. In-memory provider
- [ ] `in-memory-provider/in-memory-provider.ts` — `InMemorySmsProvider` implementing `SmsProvider`; records sent messages, configurable per-send outcome (queued/sent/delivered/failed/undelivered), supports `simulateFailure`, supports `advance` for delivery state transitions.
## 7. OTel
- [ ] `otel/metrics.ts` — counters `sms.sent_total`, `sms.failed_total`, `sms.retry_total`; histogram `sms.send_duration_ms`; `refreshSmsMeters()`.
## 8. Service orchestrator
- [ ] `service/sms-service.ts` — `SmsService` extends/wraps `EventBus<SmsEventMap>`; constructor accepts `SmsServiceOptions` (Zod-validated); legacy `on/off/emit` mirrors against the bus; integrates rate-limiter + retry + scheduler + delivery-tracker; honours `AbortSignal`.
- [ ] `service/sms-service.test.ts` — full pipeline tests against `InMemorySmsProvider`.
## 9. Hono helper
- [ ] `routes/problem-json.ts` — `respondProblemJson` + `PROBLEM_JSON_CONTENT_TYPE`, mapping `SuaveplanError` / `HttpError` / unknown → problem+json.
## 10. Index barrel + sibling docs
- [ ] `src/index.ts` — explicit named re-exports of every public symbol.
- [ ] Sibling `.md` per `.ts` (≥200 words, 6 sections).
- [ ] Package-root `README.md` with quick start, modules table, install.
## 11. Verification
- [ ] `bunx turbo lint typecheck test build --filter=@suaveplan/sms` green.
- [ ] `bunx turbo test:coverage --filter=@suaveplan/sms` ≥ 100/100/100/100.
- [ ] Banned-pattern scan zero output (`TODO`, `FIXME`, `ts-ignore`, `.skip`, `.only`, `any`, `biome-ignore`).
- [ ] Test-runner-import scan zero output (`from "vitest"|"bun:test"`).
- [ ] All sibling `.md` present; `README.md` present.
## 12. Manifest + STATUS
- [ ] `bun scripts/folder-reorg/generate-manifest.ts` to refresh `MANIFEST.md`.
- [ ] STATUS.md: flip `@suaveplan/sms` `–` → `✅`, decrement Pending, increment Migrated.
## 13. Spec finalisation
- [ ] Fold `specs/sms/spec.md` into `openspec/specs/sms/spec.md`.
- [ ] Move change folder to `openspec/archive/2026-05-25-enterprise-sms/`.