docs: reorganize roadmaps — broadcast/survey to completed, 10 scaffolded roadmaps to new dir

- Move platform_BROADCAST_SURVEY_ROADMAP.md to completed/ (modules + 43 tests built)
- Create docs/roadmaps/scaffolded/ for roadmaps with modules built but full execution pending
- Move 10 roadmaps from not-started/ to scaffolded/:
  ORG_WORKSPACE_RBAC, AGENT_REGISTRY, AGENT_RUNTIME, AI_BUDGET,
  AI_GOVERNANCE_EVALS, HUMAN_REVIEW, KNOWLEDGE_RAG, SCIM,
  SUPPORT_CASE, DURABLE_EVENT_BUS
- Update WORKSPACE_REVIEW: 17 completed roadmaps, 10 scaffolded, 1 not-started (index)
- Only platform_AGENT_PLATFORM_GAP_ROADMAP_INDEX.md remains in not-started/
This commit is contained in:
saravanakumardb1 2026-03-20 00:25:36 -07:00
parent a8bef2ea08
commit 8c3d54048a
12 changed files with 203 additions and 200 deletions

View File

@ -220,32 +220,32 @@
## 3. Roadmaps Inventory ## 3. Roadmaps Inventory
### Completed (16 Roadmaps) ### Completed (17 Roadmaps) — in `docs/roadmaps/completed/`
| Roadmap | Date | Key Achievement | | Roadmap | Date | Key Achievement |
| ------------------------------------------ | ---------- | ----------------------------------- | | ------------------------------------------ | ---------- | --------------------------------------- |
| diagnostics_REMOTE_DIAGNOSTICS_ROADMAP.md | 2026-03-03 | Phases 1-3 complete | | diagnostics_REMOTE_DIAGNOSTICS_ROADMAP.md | 2026-03-03 | Phases 1-3 complete |
| platform_COMPONENTS_ROADMAP.md | 2026-02 | 23/25 gap items built | | platform_COMPONENTS_ROADMAP.md | 2026-02 | 23/25 gap items built |
| platform_BACKEND_MIGRATION.md | 2026-02 | All 6 backends migrated | | platform_BACKEND_MIGRATION.md | 2026-02 | All 6 backends migrated |
| platform_SERVICE_CONSOLIDATION_ROADMAP.md | 2026-02 | 3→1 service consolidation | | platform_SERVICE_CONSOLIDATION_ROADMAP.md | 2026-02 | 3→1 service consolidation |
| telemetry_IMPLEMENTATION_ROADMAP.md | 2026-02 | Full telemetry system | | telemetry_IMPLEMENTATION_ROADMAP.md | 2026-02 | Full telemetry system |
| extraction_SERVICE_ROADMAP.md | 2026-02 | Text extraction service | | extraction_SERVICE_ROADMAP.md | 2026-02 | Text extraction service |
| mobile_IOS_PLATFORM_SDK.md | 2026-02 | Swift SDK audit | | mobile_IOS_PLATFORM_SDK.md | 2026-02 | Swift SDK audit |
| mobile_ANDROID_PLATFORM_SDK.md | 2026-02 | Kotlin SDK proposal | | mobile_ANDROID_PLATFORM_SDK.md | 2026-02 | Kotlin SDK proposal |
| mobile_REACT_NATIVE_PLATFORM_SDK.md | 2026-02 | RN SDK gap analysis | | mobile_REACT_NATIVE_PLATFORM_SDK.md | 2026-02 | RN SDK gap analysis |
| cloud_AGNOSTIC_REFACTOR_ROADMAP.md | 2026-02 | Datastore abstraction | | cloud_AGNOSTIC_REFACTOR_ROADMAP.md | 2026-02 | Datastore abstraction |
| cloud_REFERRALS_PARTITION_KEY_MIGRATION.md | 2026-02 | DB migration | | cloud_REFERRALS_PARTITION_KEY_MIGRATION.md | 2026-02 | DB migration |
| platform_COMMON_EXTRACTION_ROADMAP.md | 2026-02 | Shared extraction | | platform_COMMON_EXTRACTION_ROADMAP.md | 2026-02 | Shared extraction |
| product_MARKETPLACE_MODULE_DESIGN.md | 2026-02 | Marketplace design | | product_MARKETPLACE_MODULE_DESIGN.md | 2026-02 | Marketplace design |
| product_PRE_LAUNCH_SIGNUP_SYSTEM.md | 2026-02 | Pre-launch system | | product_PRE_LAUNCH_SIGNUP_SYSTEM.md | 2026-02 | Pre-launch system |
| SHARED_CLIENT_PACKAGES_ROADMAP.md | 2026-03-19 | 9 packages + all product migrations | | SHARED_CLIENT_PACKAGES_ROADMAP.md | 2026-03-19 | 9 packages + all product migrations |
| platform_ACCELERATION_ROADMAP.md | 2026-03-19 | All 4 phases complete | | platform_ACCELERATION_ROADMAP.md | 2026-03-19 | All 4 phases complete |
| platform_BROADCAST_SURVEY_ROADMAP.md | 2026-03-20 | Broadcasts + surveys modules + 43 tests |
### Scaffolded (11 Roadmaps — modules exist, full roadmap execution pending) ### Scaffolded (10 Roadmaps — in `docs/roadmaps/scaffolded/`, modules exist, full roadmap execution pending)
| Roadmap | Module(s) | Files | Tests | | Roadmap | Module(s) | Files | Tests |
| --------------------------------------------- | ----------------------- | ----- | ----- | | --------------------------------------------- | ----------------------- | ----- | ----- |
| platform_BROADCAST_SURVEY_ROADMAP.md | broadcasts, surveys | 9 | 43 |
| platform_ORG_WORKSPACE_RBAC_ROADMAP.md | orgs | 5 | ✅ | | platform_ORG_WORKSPACE_RBAC_ROADMAP.md | orgs | 5 | ✅ |
| platform_AGENT_REGISTRY_PROMPT_VERSIONING | agents | 5 | ✅ | | platform_AGENT_REGISTRY_PROMPT_VERSIONING | agents | 5 | ✅ |
| platform_AGENT_RUNTIME_ORCHESTRATION | runs | 7 | ✅ | | platform_AGENT_RUNTIME_ORCHESTRATION | runs | 7 | ✅ |

View File

@ -25,10 +25,10 @@
### Two New Systems ### Two New Systems
| System | Purpose | Key Features | | System | Purpose | Key Features |
|--------|---------|--------------| | ----------------------- | --------------------------------------- | ------------------------------------------------------------------------------------- |
| **Broadcast Messaging** | Targeted announcements to user segments | Push, in-app, email channels; scheduling; A/B testing; geo/platform/version targeting | | **Broadcast Messaging** | Targeted announcements to user segments | Push, in-app, email channels; scheduling; A/B testing; geo/platform/version targeting |
| **Surveys & Polls** | In-app user research | Multiple question types; conditional logic; targeting; real-time results; CSV export | | **Surveys & Polls** | In-app user research | Multiple question types; conditional logic; targeting; real-time results; CSV export |
### DRY Strategy ### DRY Strategy
@ -102,14 +102,14 @@ Admin creates broadcast/survey
**Location:** `services/platform-service/src/modules/broadcasts/` **Location:** `services/platform-service/src/modules/broadcasts/`
| File | Purpose | | File | Purpose |
|------|---------| | --------------- | --------------------------------------------------------------------- |
| `types.ts` | `Broadcast`, `BroadcastStatus`, `BroadcastTarget`, `BroadcastChannel` | | `types.ts` | `Broadcast`, `BroadcastStatus`, `BroadcastTarget`, `BroadcastChannel` |
| `repository.ts` | CRUD + targeting query builder | | `repository.ts` | CRUD + targeting query builder |
| `routes.ts` | Admin CRUD + public "mark as read" | | `routes.ts` | Admin CRUD + public "mark as read" |
| `scheduler.ts` | Cron-based scheduling + A/B testing splits | | `scheduler.ts` | Cron-based scheduling + A/B testing splits |
| `delivery.ts` | Push (FCM/APNS) + in-app + email dispatch | | `delivery.ts` | Push (FCM/APNS) + in-app + email dispatch |
| `targeting.ts` | Segment evaluation engine | | `targeting.ts` | Segment evaluation engine |
**Key Types:** **Key Types:**
@ -187,21 +187,21 @@ export interface BroadcastMetrics {
**Endpoints:** **Endpoints:**
| Method | Endpoint | Auth | Purpose | | Method | Endpoint | Auth | Purpose |
|--------|----------|------|---------| | -------- | ------------------------------- | ----- | --------------------------------------------------------- |
| `POST` | `/admin/broadcasts` | Admin | Create broadcast | | `POST` | `/admin/broadcasts` | Admin | Create broadcast |
| `GET` | `/admin/broadcasts` | Admin | List all broadcasts | | `GET` | `/admin/broadcasts` | Admin | List all broadcasts |
| `GET` | `/admin/broadcasts/:id` | Admin | Get single broadcast | | `GET` | `/admin/broadcasts/:id` | Admin | Get single broadcast |
| `PUT` | `/admin/broadcasts/:id` | Admin | Update draft/scheduled | | `PUT` | `/admin/broadcasts/:id` | Admin | Update draft/scheduled |
| `DELETE` | `/admin/broadcasts/:id` | Admin | Cancel/delete | | `DELETE` | `/admin/broadcasts/:id` | Admin | Cancel/delete |
| `POST` | `/admin/broadcasts/:id/send` | Admin | Trigger immediate send (with safety check for >10k users) | | `POST` | `/admin/broadcasts/:id/send` | Admin | Trigger immediate send (with safety check for >10k users) |
| `POST` | `/admin/broadcasts/:id/pause` | Admin | Pause sending (cancels pending deliveries) | | `POST` | `/admin/broadcasts/:id/pause` | Admin | Pause sending (cancels pending deliveries) |
| `GET` | `/admin/broadcasts/:id/metrics` | Admin | Real-time metrics | | `GET` | `/admin/broadcasts/:id/metrics` | Admin | Real-time metrics |
| `POST` | `/admin/broadcasts/:id/clone` | Admin | Duplicate for A/B test | | `POST` | `/admin/broadcasts/:id/clone` | Admin | Duplicate for A/B test |
| `GET` | `/broadcasts` | User | List my active broadcasts | | `GET` | `/broadcasts` | User | List my active broadcasts |
| `POST` | `/broadcasts/:id/read` | User | Mark as read | | `POST` | `/broadcasts/:id/read` | User | Mark as read |
| `POST` | `/broadcasts/:id/dismiss` | User | Dismiss in-app message | | `POST` | `/broadcasts/:id/dismiss` | User | Dismiss in-app message |
| `POST` | `/broadcasts/:id/click` | User | Track CTA click | | `POST` | `/broadcasts/:id/click` | User | Track CTA click |
**Rate Limiting:** Public endpoints (`/broadcasts`, `/broadcasts/:id/read`, etc.) use existing `ratelimit` module: 100 req/min per user. **Rate Limiting:** Public endpoints (`/broadcasts`, `/broadcasts/:id/read`, etc.) use existing `ratelimit` module: 100 req/min per user.
@ -209,13 +209,13 @@ export interface BroadcastMetrics {
**Location:** `services/platform-service/src/modules/surveys/` **Location:** `services/platform-service/src/modules/surveys/`
| File | Purpose | | File | Purpose |
|------|---------| | --------------- | ------------------------------------------------------ |
| `types.ts` | `Survey`, `Question`, `QuestionType`, `SurveyResponse` | | `types.ts` | `Survey`, `Question`, `QuestionType`, `SurveyResponse` |
| `repository.ts` | CRUD + response aggregation | | `repository.ts` | CRUD + response aggregation |
| `routes.ts` | Admin CRUD + public response submission | | `routes.ts` | Admin CRUD + public response submission |
| `targeting.ts` | Reuses broadcasts/targeting.ts | | `targeting.ts` | Reuses broadcasts/targeting.ts |
| `analytics.ts` | Response statistics, CSV export | | `analytics.ts` | Response statistics, CSV export |
**Key Types:** **Key Types:**
@ -255,15 +255,15 @@ export interface Survey {
} }
export type QuestionType = export type QuestionType =
| 'single_choice' // Radio buttons | 'single_choice' // Radio buttons
| 'multiple_choice' // Checkboxes | 'multiple_choice' // Checkboxes
| 'rating' // 1-5 or 1-10 stars | 'rating' // 1-5 or 1-10 stars
| 'nps' // 0-10 scale | 'nps' // 0-10 scale
| 'text_short' // Single line | 'text_short' // Single line
| 'text_long' // Multi-line textarea | 'text_long' // Multi-line textarea
| 'dropdown' // Select menu | 'dropdown' // Select menu
| 'scale' // Likert scale (1-7) | 'scale' // Likert scale (1-7)
| 'ranking'; // Drag to rank | 'ranking'; // Drag to rank
export interface Question { export interface Question {
id: string; id: string;
@ -281,7 +281,7 @@ export interface Question {
// Validation // Validation
minLength?: number; minLength?: number;
maxLength?: number; maxLength?: number;
minValue?: number; // For numeric types minValue?: number; // For numeric types
maxValue?: number; maxValue?: number;
} }
@ -302,9 +302,9 @@ export interface QuestionOption {
} }
export type SurveyTrigger = export type SurveyTrigger =
| { type: 'immediate' } // Show right away | { type: 'immediate' } // Show right away
| { type: 'delay_seconds'; seconds: number } // After N seconds in app | { type: 'delay_seconds'; seconds: number } // After N seconds in app
| { type: 'event'; eventName: string } // After specific event | { type: 'event'; eventName: string } // After specific event
| { type: 'page_view'; pagePattern: string }; // URL pattern match | { type: 'page_view'; pagePattern: string }; // URL pattern match
export interface SurveyResponse { export interface SurveyResponse {
@ -353,24 +353,24 @@ export function computeCompletionRate(metrics: SurveyMetrics): number {
**Endpoints:** **Endpoints:**
| Method | Endpoint | Auth | Purpose | | Method | Endpoint | Auth | Purpose |
|--------|----------|------|---------| | -------- | -------------------------------- | ----- | --------------------------------------------------- |
| `POST` | `/admin/surveys` | Admin | Create survey | | `POST` | `/admin/surveys` | Admin | Create survey |
| `GET` | `/admin/surveys` | Admin | List all surveys | | `GET` | `/admin/surveys` | Admin | List all surveys |
| `GET` | `/admin/surveys/:id` | Admin | Get survey with questions | | `GET` | `/admin/surveys/:id` | Admin | Get survey with questions |
| `PUT` | `/admin/surveys/:id` | Admin | Update survey | | `PUT` | `/admin/surveys/:id` | Admin | Update survey |
| `DELETE` | `/admin/surveys/:id` | Admin | Delete survey | | `DELETE` | `/admin/surveys/:id` | Admin | Delete survey |
| `POST` | `/admin/surveys/:id/duplicate` | Admin | Clone survey | | `POST` | `/admin/surveys/:id/duplicate` | Admin | Clone survey |
| `GET` | `/admin/surveys/:id/responses` | Admin | All responses (paginated) | | `GET` | `/admin/surveys/:id/responses` | Admin | All responses (paginated) |
| `GET` | `/admin/surveys/:id/analytics` | Admin | Aggregated stats | | `GET` | `/admin/surveys/:id/analytics` | Admin | Aggregated stats |
| `GET` | `/admin/surveys/:id/export.csv` | Admin | CSV export | | `GET` | `/admin/surveys/:id/export.csv` | Admin | CSV export |
| `GET` | `/admin/surveys/:id/respondents` | Admin | List users who responded | | `GET` | `/admin/surveys/:id/respondents` | Admin | List users who responded |
| `POST` | `/admin/surveys/:id/pause` | Admin | Stop showing survey | | `POST` | `/admin/surveys/:id/pause` | Admin | Stop showing survey |
| `GET` | `/surveys/active` | User | Get active survey for me (rate limited: 10 req/min) | | `GET` | `/surveys/active` | User | Get active survey for me (rate limited: 10 req/min) |
| `POST` | `/surveys/:id/start` | User | Begin survey session | | `POST` | `/surveys/:id/start` | User | Begin survey session |
| `POST` | `/surveys/:id/response` | User | Submit answer(s) (validated against question type) | | `POST` | `/surveys/:id/response` | User | Submit answer(s) (validated against question type) |
| `POST` | `/surveys/:id/complete` | User | Mark as complete | | `POST` | `/surveys/:id/complete` | User | Mark as complete |
| `POST` | `/surveys/:id/dismiss` | User | "Don't show again" | | `POST` | `/surveys/:id/dismiss` | User | "Don't show again" |
**Security:** Survey responses validate answer type matches question type (reject string for NPS question). Admin endpoints require `role === 'admin'`. **Security:** Survey responses validate answer type matches question type (reject string for NPS question). Admin endpoints require `role === 'admin'`.
@ -420,7 +420,7 @@ export async function evaluateTarget(
if (target.percentageRollout !== undefined) { if (target.percentageRollout !== undefined) {
const hash = fnv1a32(`${context.userId}:${target.percentageRollout}`); const hash = fnv1a32(`${context.userId}:${target.percentageRollout}`);
if ((hash % 100) >= target.percentageRollout) { if (hash % 100 >= target.percentageRollout) {
return false; return false;
} }
} }
@ -626,12 +626,12 @@ class BLSurveyClient {
**Location:** `dashboards/admin-web/src/app/(dashboard)/broadcasts/` **Location:** `dashboards/admin-web/src/app/(dashboard)/broadcasts/`
| Page | Features | | Page | Features |
|------|----------| | ----------------------- | --------------------------------------------------------- |
| `page.tsx` | List all broadcasts with status chips | | `page.tsx` | List all broadcasts with status chips |
| `new/page.tsx` | Create wizard: content → targeting → scheduling → preview | | `new/page.tsx` | Create wizard: content → targeting → scheduling → preview |
| `[id]/page.tsx` | Edit + metrics dashboard | | `[id]/page.tsx` | Edit + metrics dashboard |
| `[id]/preview/page.tsx` | Device mockup preview (iPhone, Android, Web) | | `[id]/preview/page.tsx` | Device mockup preview (iPhone, Android, Web) |
**Targeting Builder Component:** **Targeting Builder Component:**
@ -670,13 +670,13 @@ interface TargetingBuilderProps {
**Location:** `dashboards/admin-web/src/app/(dashboard)/surveys/` **Location:** `dashboards/admin-web/src/app/(dashboard)/surveys/`
| Page | Features | | Page | Features |
|------|----------| | ------------------------- | ----------------------------------------------------- |
| `page.tsx` | List surveys with completion rates | | `page.tsx` | List surveys with completion rates |
| `new/page.tsx` | Survey builder: questions → targeting → display rules | | `new/page.tsx` | Survey builder: questions → targeting → display rules |
| `[id]/page.tsx` | Edit + live preview | | `[id]/page.tsx` | Edit + live preview |
| `[id]/analytics/page.tsx` | Response analytics + charts | | `[id]/analytics/page.tsx` | Response analytics + charts |
| `[id]/responses/page.tsx` | Individual responses table | | `[id]/responses/page.tsx` | Individual responses table |
**Question Builder Component:** **Question Builder Component:**
@ -811,58 +811,61 @@ class BroadcastClient:
**Commit:** `1b11db3` — feat(broadcasts,surveys): Phase 1 complete - backend modules **Commit:** `1b11db3` — feat(broadcasts,surveys): Phase 1 complete - backend modules
| Day | Task | Deliverable | Status | | Day | Task | Deliverable | Status |
|-----|------|-------------|--------| | --- | ------------------------------------------ | --------------------------------- | ------ |
| 1 | `broadcasts` module scaffold + types | `types.ts`, `repository.ts` tests | ✅ | | 1 | `broadcasts` module scaffold + types | `types.ts`, `repository.ts` tests | ✅ |
| 2 | `broadcasts` routes + targeting engine | 9 endpoints, targeting.ts | ✅ | | 2 | `broadcasts` routes + targeting engine | 9 endpoints, targeting.ts | ✅ |
| 3 | `surveys` module scaffold + types | `types.ts`, `repository.ts` tests | ✅ | | 3 | `surveys` module scaffold + types | `types.ts`, `repository.ts` tests | ✅ |
| 4 | `surveys` routes + question types | 14 endpoints | ✅ | | 4 | `surveys` routes + question types | 14 endpoints | ✅ |
| 5 | Cosmos containers + server.ts registration | 7 containers, routes registered | ✅ | | 5 | Cosmos containers + server.ts registration | 7 containers, routes registered | ✅ |
**Tests:** 80+ unit tests for repositories, 40+ for routes (to be added in follow-up) **Tests:** 80+ unit tests for repositories, 40+ for routes (to be added in follow-up)
### Phase 2: Admin Dashboard (Week 2) ✅ **COMPLETED** ### Phase 2: Admin Dashboard (Week 2) ✅ **COMPLETED**
**Commits:** **Commits:**
- `...` — feat(admin): Phase 2.1 - Broadcast and Survey list pages - `...` — feat(admin): Phase 2.1 - Broadcast and Survey list pages
- `...` — feat(admin): Phase 2.2 - Broadcast create/edit wizard - `...` — feat(admin): Phase 2.2 - Broadcast create/edit wizard
- `...` — feat(admin): Phase 2.3 - Survey builder UI - `...` — feat(admin): Phase 2.3 - Survey builder UI
| Day | Task | Deliverable | Status | | Day | Task | Deliverable | Status |
|-----|------|-------------|--------| | --- | ---------------------------- | ---------------------------------- | ------ |
| 6 | Broadcast list UI | List, filter, actions | ✅ | | 6 | Broadcast list UI | List, filter, actions | ✅ |
| 7 | Broadcast create/edit wizard | Targeting builder, reach estimator | ✅ | | 7 | Broadcast create/edit wizard | Targeting builder, reach estimator | ✅ |
| 8 | Survey builder UI | Question builder, 9 question types | ✅ | | 8 | Survey builder UI | Question builder, 9 question types | ✅ |
| 9 | Survey list + analytics | Response charts, CSV export | ✅ | | 9 | Survey list + analytics | Response charts, CSV export | ✅ |
| 10 | Navigation | Sidebar nav items | ✅ | | 10 | Navigation | Sidebar nav items | ✅ |
### Phase 3: Client SDKs (Week 3) ✅ **COMPLETED** ### Phase 3: Client SDKs (Week 3) ✅ **COMPLETED**
**Commits:** **Commits:**
- `...` — feat(packages): @bytelyst/broadcast-client package - `...` — feat(packages): @bytelyst/broadcast-client package
- `...` — feat(packages): @bytelyst/survey-client package with offline cache - `...` — feat(packages): @bytelyst/survey-client package with offline cache
| Day | Task | Deliverable | Status | | Day | Task | Deliverable | Status |
|-----|------|-------------|--------| | --- | ---------------------------- | ------------------------------------- | --------- |
| 11 | `@bytelyst/broadcast-client` | Package + types + polling | ✅ | | 11 | `@bytelyst/broadcast-client` | Package + types + polling | ✅ |
| 12 | `@bytelyst/survey-client` | Package + validation + offline cache | ✅ | | 12 | `@bytelyst/survey-client` | Package + validation + offline cache | ✅ |
| 13 | Swift SDK extensions | `BLBroadcastClient`, `BLSurveyClient` | ✅ | | 13 | Swift SDK extensions | `BLBroadcastClient`, `BLSurveyClient` | ✅ |
| 14 | Kotlin SDK extensions | `BLBroadcastClient`, `BLSurveyClient` | ✅ | | 14 | Kotlin SDK extensions | `BLBroadcastClient`, `BLSurveyClient` | ✅ |
| 15 | SDK integration tests | All platforms | ⏭️ Future | | 15 | SDK integration tests | All platforms | ⏭️ Future |
### Phase 4: Platform Integration (Week 4) ✅ **COMPLETED** ### Phase 4: Platform Integration (Week 4) ✅ **COMPLETED**
**Commits:** **Commits:**
- `4bf18f4` — feat(user-dashboard): Phase 4.1 - Web integration components - `4bf18f4` — feat(user-dashboard): Phase 4.1 - Web integration components
- `...` — feat(platform-service): Phase 4.4 - Push notification wiring (FCM/APNS) - `...` — feat(platform-service): Phase 4.4 - Push notification wiring (FCM/APNS)
| Day | Task | Deliverable | Status | | Day | Task | Deliverable | Status |
|-----|------|-------------|--------| | --- | -------------------------------- | -------------------------- | --------- |
| 16 | Web integration (user-dashboard) | Banner, modal, survey flow | ✅ | | 16 | Web integration (user-dashboard) | Banner, modal, survey flow | ✅ |
| 17 | iOS integration | SwiftUI components | ✅ | | 17 | iOS integration | SwiftUI components | ✅ |
| 18 | Android integration | Compose components | ✅ | | 18 | Android integration | Compose components | ✅ |
| 19 | FCM/APNS setup + testing | Push delivery service | ✅ | | 19 | FCM/APNS setup + testing | Push delivery service | ✅ |
| 20 | Documentation + polish | README, API docs | ⏭️ Future | | 20 | Documentation + polish | README, API docs | ⏭️ Future |
--- ---
@ -882,16 +885,16 @@ The Broadcast and Survey platform is now **MVP complete** with:
## 8. Cosmos Containers ## 8. Cosmos Containers
| Container | Partition Key | Purpose | Est. Size | TTL | | Container | Partition Key | Purpose | Est. Size | TTL |
|-----------|---------------|---------|-----------|-----| | ---------------------- | ------------- | ------------------------------------------------ | --------- | ------- |
| `broadcasts` | `/productId` | Broadcast definitions + targeting | Small | — | | `broadcasts` | `/productId` | Broadcast definitions + targeting | Small | — |
| `broadcast_deliveries` | `/userId` | Per-user delivery status (avoids hot partitions) | Large | 90 days | | `broadcast_deliveries` | `/userId` | Per-user delivery status (avoids hot partitions) | Large | 90 days |
| `broadcast_reads` | `/userId` | User read receipts | Large | 90 days | | `broadcast_reads` | `/userId` | User read receipts | Large | 90 days |
| `surveys` | `/productId` | Survey definitions + questions | Small | — | | `surveys` | `/productId` | Survey definitions + questions | Small | — |
| `survey_responses` | `/surveyId` | Individual responses | Large | 1 year | | `survey_responses` | `/surveyId` | Individual responses | Large | 1 year |
| `in_app_messages` | `/userId` | Active in-app messages per user | Medium | 30 days | | `in_app_messages` | `/userId` | Active in-app messages per user | Medium | 30 days |
| `targeting_segments` | `/productId` | Pre-computed user segments | Medium | 1 day | | `targeting_segments` | `/productId` | Pre-computed user segments | Medium | 1 day |
| `broadcast_templates` | `/productId` | Reusable broadcast templates | Small | — | | `broadcast_templates` | `/productId` | Reusable broadcast templates | Small | — |
**Partition Key Rationale:** `broadcast_deliveries` uses `/userId` (not `/broadcastId`) to distribute writes across partitions during large sends. Read receipts also use `/userId` for efficient per-user queries. **Partition Key Rationale:** `broadcast_deliveries` uses `/userId` (not `/broadcastId`) to distribute writes across partitions during large sends. Read receipts also use `/userId` for efficient per-user queries.
@ -968,15 +971,15 @@ The Broadcast and Survey platform is now **MVP complete** with:
## Appendix A: DRY Checklist ## Appendix A: DRY Checklist
| Component | Reused From | Notes | | Component | Reused From | Notes |
|-----------|-------------|-------| | ------------------------- | -------------------------- | ------------------------------------------ |
| Targeting engine | `flags/` module | Same FNV-1a hash, same segment logic | | Targeting engine | `flags/` module | Same FNV-1a hash, same segment logic |
| Storage adapters | Existing SDK patterns | `BLTelemetryClient` storage pattern | | Storage adapters | Existing SDK patterns | `BLTelemetryClient` storage pattern |
| Admin UI components | `flags/page.tsx` | Copy table, filters, pagination | | Admin UI components | `flags/page.tsx` | Copy table, filters, pagination |
| API client factory | `@bytelyst/api-client` | `createApiClient()` with auth | | API client factory | `@bytelyst/api-client` | `createApiClient()` with auth |
| Cosmos repository pattern | All existing modules | `types.ts``repository.ts``routes.ts` | | Cosmos repository pattern | All existing modules | `types.ts``repository.ts``routes.ts` |
| Charts | Admin dashboard Recharts | Same chart components | | Charts | Admin dashboard Recharts | Same chart components |
| Real-time updates | SSE pattern from telemetry | Or polling fallback | | Real-time updates | SSE pattern from telemetry | Or polling fallback |
--- ---