181 lines
4.9 KiB
Markdown
181 lines
4.9 KiB
Markdown
# Agile Epics & Backlog
|
||
|
||
## Epic map
|
||
|
||
| Epic ID | Name | Phase | Priority |
|
||
|---------|------|-------|----------|
|
||
| E1 | Campaign & role model | 1 | P0 |
|
||
| E2 | Recipe engine | 1 | P0 |
|
||
| E3 | Campaign dispatcher | 1 | P0 |
|
||
| E4 | Reply rate engine | 1 | P0 |
|
||
| E5 | Statistics & reporting | 1 | P0 |
|
||
| E6 | AI content safety | 1 | P0 |
|
||
| E7 | Spam rescue v2 | 2 | P0 |
|
||
| E8 | Web dashboard | 2 | P1 |
|
||
| E9 | DNS & deliverability checks | 2 | P1 |
|
||
| E10 | Job queue | 2 | P1 |
|
||
| E11 | Multi-tenant SaaS | 3 | P2 |
|
||
| E12 | Peer network (optional) | 3 | P3 |
|
||
| E13 | External integrations | 3–4 | P3 |
|
||
|
||
---
|
||
|
||
## E1 — Campaign & role model
|
||
|
||
### Stories
|
||
|
||
| ID | Story | Points |
|
||
|----|-------|--------|
|
||
| E1-1 | As an operator, I can mark a mailbox as primary or satellite | 3 |
|
||
| E1-2 | As an operator, I can create a warmup campaign for a primary | 5 |
|
||
| E1-3 | As an operator, I can assign/remove satellites from a campaign | 3 |
|
||
| E1-4 | As an operator, I can run multiple campaigns for different primaries | 5 |
|
||
| E1-5 | As a developer, migrate existing Inbox rows to new schema | 3 |
|
||
|
||
**Integration:** Prisma migration + `/api/campaigns` routes
|
||
|
||
---
|
||
|
||
## E2 — Recipe engine
|
||
|
||
### Stories
|
||
|
||
| ID | Story | Points |
|
||
|----|-------|--------|
|
||
| E2-1 | As an operator, I can select Grow recipe with 30-day duration | 5 |
|
||
| E2-2 | As an operator, I can select Flat recipe | 3 |
|
||
| E2-3 | As an operator, I can select Randomized recipe | 5 |
|
||
| E2-4 | As an expert, I can define Custom per-day schedule | 8 |
|
||
| E2-5 | As an operator, I can preview ramp chart before starting | 3 |
|
||
| E2-6 | System enforces min 1, max 50 emails/day | 2 |
|
||
| E2-7 | System enforces 48h +20% volume cap | 5 |
|
||
|
||
**Integration:** `packages/recipe-engine` or `src/services/recipe.service.ts`
|
||
|
||
---
|
||
|
||
## E3 — Campaign dispatcher
|
||
|
||
### Stories
|
||
|
||
| ID | Story | Points |
|
||
|----|-------|--------|
|
||
| E3-1 | Satellites send only to assigned primary | 5 |
|
||
| E3-2 | Primary replies only to assigned satellites | 5 |
|
||
| E3-3 | Sends respect daily schedule from recipe | 5 |
|
||
| E3-4 | Sends distributed with jitter in send window | 5 |
|
||
| E3-5 | Campaign auto-completes after durationDays | 3 |
|
||
| E3-6 | Maintenance mode at 20% volume post-campaign | 5 |
|
||
|
||
**Integration:** Replace `dispatcher.job.ts` with campaign-aware version
|
||
|
||
---
|
||
|
||
## E4 — Reply rate engine
|
||
|
||
### Stories
|
||
|
||
| ID | Story | Points |
|
||
|----|-------|--------|
|
||
| E4-1 | Operator sets reply rate 30% (default) | 2 |
|
||
| E4-2 | System caps reply rate at 45% | 1 |
|
||
| E4-3 | Rescuer samples replies probabilistically | 8 |
|
||
| E4-4 | Non-replied messages still rescued and flagged | 3 |
|
||
| E4-5 | Dashboard shows reply rate actual vs target | 3 |
|
||
|
||
---
|
||
|
||
## E5 — Statistics & reporting
|
||
|
||
### Stories
|
||
|
||
| ID | Story | Points |
|
||
|----|-------|--------|
|
||
| E5-1 | API returns today's planned vs actual sends | 5 |
|
||
| E5-2 | API returns daily time series for 30 days | 5 |
|
||
| E5-3 | API returns spam detected/rescued counts | 3 |
|
||
| E5-4 | API returns inbox placement rate | 5 |
|
||
| E5-5 | Nightly rollup job materializes DailyStat | 5 |
|
||
| E5-6 | Workspace overview endpoint for all primaries | 5 |
|
||
|
||
---
|
||
|
||
## E6 — AI content safety
|
||
|
||
### Stories
|
||
|
||
| ID | Story | Points |
|
||
|----|-------|--------|
|
||
| E6-1 | Validator rejects bracket placeholders | 3 |
|
||
| E6-2 | Validator rejects tier-1 spam words | 3 |
|
||
| E6-3 | Auto-regenerate up to 3 times on failure | 3 |
|
||
| E6-4 | Mailbox profile supplies real name/company | 3 |
|
||
| E6-5 | Plain text only, no links in warmup body | 2 |
|
||
|
||
---
|
||
|
||
## E7 — Spam rescue v2
|
||
|
||
### Stories
|
||
|
||
| ID | Story | Points |
|
||
|----|-------|--------|
|
||
| E7-1 | Match spam UID to single WarmupLog | 5 |
|
||
| E7-2 | Track placement inbox vs spam | 3 |
|
||
| E7-3 | Auto-discover spam folder per provider | 5 |
|
||
| E7-4 | Auto-pause campaign on high spam rate | 5 |
|
||
|
||
---
|
||
|
||
## E8 — Web dashboard
|
||
|
||
### Stories
|
||
|
||
| ID | Story | Points |
|
||
|----|-------|--------|
|
||
| E8-1 | Dashboard shows all active campaigns | 5 |
|
||
| E8-2 | 4-step campaign wizard | 8 |
|
||
| E8-3 | Campaign detail with charts | 8 |
|
||
| E8-4 | Add mailbox with provider presets | 5 |
|
||
| E8-5 | Connection test from UI | 3 |
|
||
| E8-6 | Global activity log view | 3 |
|
||
|
||
---
|
||
|
||
## Integration breakdown (build order)
|
||
|
||
```mermaid
|
||
flowchart TD
|
||
E1[E1 Campaign model] --> E2[E2 Recipe engine]
|
||
E2 --> E3[E3 Dispatcher]
|
||
E1 --> E4[E4 Reply rate]
|
||
E3 --> E5[E5 Statistics]
|
||
E3 --> E6[E6 AI validator]
|
||
E4 --> E7[E7 Spam rescue v2]
|
||
E5 --> E8[E8 Web UI]
|
||
E6 --> E8
|
||
E7 --> E8
|
||
```
|
||
|
||
## Suggested first sprint (2 weeks)
|
||
|
||
1. E1-1, E1-2, E1-3 (campaign CRUD + roles)
|
||
2. E2-1, E2-6 (Grow recipe + validation)
|
||
3. E6-1 (placeholder validator)
|
||
|
||
**Sprint goal:** Create FillCare campaign via API; preview Grow schedule; no sends yet.
|
||
|
||
## Story point scale
|
||
|
||
| Points | Meaning |
|
||
|--------|---------|
|
||
| 1–2 | Few hours |
|
||
| 3 | Half day |
|
||
| 5 | 1 day |
|
||
| 8 | 2–3 days |
|
||
|
||
## Backlog hygiene
|
||
|
||
- Every story links to spec doc section
|
||
- Acceptance criteria required before sprint commit
|
||
- Demo: FillCare primary visible in stats after each epic
|