# ADR 0004 — Milestones **Status:** Accepted, 2026-09-02. Reordered from the archived Go plan. The original put embedded inbound at milestone 4 and treated it as optional-until-later; ADR 0005 makes it **required at launch**, because the launch host cannot send direct-to-MX at all. ## v0.1 — the agent layer, provable without mail Nothing here needs a working mail server, which is the point: it is all testable in CI. - [x] Apache-2.0 workspace, 12 crates, `cargo check` green - [x] `openmail-relay` provider table (SES, Oracle, SendGrid, Postmark, Resend, custom) - [ ] `openmail-core::extract::strip_quoted` — the first real algorithm - [ ] `openmail-core::thread` resolution, both bases - [ ] `openmail-store` — Postgres schema, embedded migrations, S3 blobs - [ ] `openmail-api` — v0 REST, bearer auth - [ ] Ingest endpoint: POST a raw `.eml` and get a threaded, extracted message back. Closes the loop with **zero mail infrastructure.** ## v0.2 — receive - [ ] `openmail-smtpd` on :25, real MX for a test domain - [ ] `openmail-guard` gate, `mail-auth` SPF/DKIM/DMARC verdicts recorded - [ ] `openmail-junk` scoring - [ ] `message.received` webhooks + WebSocket ## v0.3 — send, and the MCP surface - [ ] Relay send via SES and Oracle, DKIM-signed locally - [ ] `mail-dsn` bounce handling wired to outbox state - [ ] `openmail-mcp` — an agent creates an inbox, receives, and replies, alone ## v0.4 — direct-to-MX, and the crates ship - [ ] `mail-dane` and `mail-mta-sts` complete, **published to crates.io** - [ ] Direct MX delivery with both enforced - [ ] IP warmup, FBL enrolment, suppression lists ## v1.0 - [ ] IMAP front-end so humans use their own client against the same mailbox - [ ] Multi-tenancy beyond `pods` - [ ] Deliverability track record worth publishing ## Not in v1 A hosted SaaS, billing, or a webmail UI. `pods` exists so the SaaS path stays open architecturally — do not remove it as unused.