Current State & Gap Analysis
What exists today (MVP)
Data layer
| Model |
Purpose |
Inbox |
Flat mailbox record (no role) |
WarmupLog |
Message lifecycle: sent → rescued_from_spam → replied → complete |
Setting |
Global key-value config |
Jobs
| Job |
Behavior |
| Dispatcher |
Random sender/receiver from all active inboxes; AI email; SMTP send |
| Rescuer |
Spam folder scan; move to INBOX; flag; AI reply (~100% reply when found) |
| Ramp bump |
Midnight currentRamp += 2 up to dailyLimit |
API
- Inbox CRUD + connection test
- Paginated logs
- Global settings (cron, industries)
Strengths
- Working SMTP/IMAP connector with encrypted credentials
- Spam rescue on Gmail/Yahoo/Outlook folder names
- AI via OpenRouter (free models)
- Error inbox marking (
status: error)
- Prisma 7 + SQLite portability
Gap matrix
| Feature |
Current |
Target |
Priority |
| Primary vs satellite roles |
All equal |
Role-based pairing |
P0 |
| Multiple primaries |
Implicit |
Explicit campaigns per primary |
P0 |
| Grow recipe |
Partial ramp |
Named recipe engine |
P0 |
| Flat recipe |
Missing |
Constant daily volume |
P0 |
| Randomized recipe |
Missing |
Daily variance algorithm |
P1 |
| Custom recipe |
Missing |
Per-day schedule editor |
P1 |
| Warmup duration 30–45d |
Missing |
Campaign start/end |
P0 |
| Min emails/day (1) |
Missing |
Enforced floor |
P0 |
| Max emails/day (40–50) |
Partial |
Validated cap |
P0 |
| Reply rate 30% |
~100% |
Probabilistic sampling |
P0 |
| Per-primary statistics |
Missing |
Dashboard API |
P0 |
| Spam count per primary |
Partial (per log) |
Aggregated metrics |
P0 |
| AI placeholder blocking |
Prompt only |
Post-generation validation |
P0 |
| Send time jitter |
Missing |
Human-like windows |
P1 |
| Web UI |
Missing |
Full operator console |
P1 |
| Multi-tenant |
Missing |
Org/workspace model |
P2 |
| Peer network |
Missing |
Optional phase 3 |
P3 |
| DNS/auth checks |
Missing |
SPF/DKIM/DMARC validation |
P1 |
| Auto-pause on bad signals |
Partial (auth only) |
Spam/bounce thresholds |
P1 |
| Tests |
Missing |
Unit + integration |
P1 |
Architectural debt
- Flat inbox pool — Dispatcher treats every inbox as equal; primaries can email each other.
- Global ramp — Not tied to campaign start date or recipe.
- SQLite — Fine for self-hosted; need Postgres path for SaaS.
- No schedule entity — "Planned sends today" is implicit, not queryable.
- Spam rescue granularity — Marks all pending logs from sender, not per UID.
- No idempotency — Cron overlap could double-send without locks.
Recommended migration path
Phase A: Schema + roles + recipes (backend only)
Phase B: Statistics API + reply rate engine
Phase C: Web UI (self-hosted)
Phase D: Hardening (jitter, validation, auto-pause)
Phase E: Multi-tenant + optional peer network
See 16-roadmap.md for sprint breakdown.