79 lines
3 KiB
Markdown
79 lines
3 KiB
Markdown
# 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
|
||
|
||
1. **Flat inbox pool** — Dispatcher treats every inbox as equal; primaries can email each other.
|
||
2. **Global ramp** — Not tied to campaign start date or recipe.
|
||
3. **SQLite** — Fine for self-hosted; need Postgres path for SaaS.
|
||
4. **No schedule entity** — "Planned sends today" is implicit, not queryable.
|
||
5. **Spam rescue granularity** — Marks all pending logs from sender, not per UID.
|
||
6. **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](./16-roadmap.md) for sprint breakdown.
|