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)
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)
- E1-1, E1-2, E1-3 (campaign CRUD + roles)
- E2-1, E2-6 (Grow recipe + validation)
- 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