MVP release checklist
Duckbill™ release readiness for MAIL-49 / MAIL-62 / MAIL-118. Jira is the work plan. This page is the requirements-to-evidence map (Kickoff §11–12; ADR 0029). The governing spec title may still say Inbox Agent until MAIL-193.
ENABLE_SEND stays off. No secrets are recorded here.
Matrix status
The 04_MVP §11 matrix is waiting on E2E and NFR evidence. Every criterion has MAIL keys and a live documentation or product URL. Rows that need Stream A or Stream B results leave TODOs that map to MAIL-103 / MAIL-109. A TODO is not a pass. Epic MAIL-12 stays open.
Reserved evidence URLs (not published by this stream):
| Stream | Ticket | Preview (TODO) | Production (TODO) |
|---|---|---|---|
| A — E2E | MAIL-103 | https://duckbill-dev.jasonkoch.io/docs/operations/e2e-mvp-path | https://duckbill.jasonkoch.io/docs/operations/e2e-mvp-path |
| B — NFR | MAIL-109 | https://duckbill-dev.jasonkoch.io/docs/operations/nfr-gates | https://duckbill.jasonkoch.io/docs/operations/nfr-gates |
Exit-criteria evidence (04_MVP §11)
Criteria are copied from MVP scope §11. Do not invent additional gates here.
| # | 04_MVP §11 criterion | MAIL keys | Live URL or test | Evidence status |
|---|---|---|---|---|
| 1 | at least one real mailbox can connect and remain synchronized | MAIL-21, MAIL-63, MAIL-215, MAIL-24, MAIL-25, MAIL-50, MAIL-103 | https://duckbill.jasonkoch.io/connect · https://duckbill.jasonkoch.io/docs/architecture/live-microsoft-connect · TODO MAIL-103 https://duckbill.jasonkoch.io/docs/operations/e2e-mvp-path | Implementation shipped. Live mailbox proof waiting on MAIL-103. |
| 2 | replayed/duplicated events do not duplicate canonical data | MAIL-27, MAIL-32, MAIL-51, MAIL-109 | https://duckbill.jasonkoch.io/docs/architecture/canonical-schema · https://duckbill.jasonkoch.io/docs/decisions/0018-conservative-canonicalization · npm test replay/idempotency · TODO MAIL-109 https://duckbill.jasonkoch.io/docs/operations/nfr-gates | Unit/replay coverage exists. NFR suite evidence waiting on MAIL-109. |
| 3 | MailMessage/MessageInstance semantics are correctly implemented | MAIL-16, MAIL-32, MAIL-103 | https://duckbill.jasonkoch.io/docs/05_Canonical_Data_Model_Entity_Relationship_Specification · https://duckbill.jasonkoch.io/docs/architecture/canonical-schema · TODO MAIL-103 real-data cardinality on https://duckbill.jasonkoch.io/docs/operations/e2e-mvp-path | Schema and conservative identity shipped. Real-mailbox cardinality waiting on MAIL-103. |
| 4 | reconciliation detects and repairs representative drift | MAIL-28, MAIL-109 | https://duckbill.jasonkoch.io/docs/architecture/reconciliation · https://duckbill.jasonkoch.io/docs/decisions/0017-reconciliation-and-cursor-recovery · TODO MAIL-109 https://duckbill.jasonkoch.io/docs/operations/nfr-gates | Reconciliation shipped. Representative-drift gate waiting on MAIL-109. |
| 5 | AI output is structured, versioned, evaluated, and correctable | MAIL-36, MAIL-37, MAIL-38, MAIL-39, MAIL-40, MAIL-54, MAIL-57 | https://duckbill.jasonkoch.io/docs/architecture/ai-intelligence · https://duckbill.jasonkoch.io/docs/architecture/ai-evaluation · https://duckbill.jasonkoch.io/docs/architecture/human-corrections · npm run ai:eval · TODO MAIL-103 / MAIL-109 evidence pages | Golden-set and corrections shipped. Live path and NFR AI gate waiting on MAIL-103 / MAIL-109. |
| 6 | a user can identify actionable mail more efficiently through the interface | MAIL-41, MAIL-42, MAIL-76, MAIL-171, MAIL-50, MAIL-103 | https://duckbill.jasonkoch.io/inbox · https://duckbill.jasonkoch.io/docs/architecture/triage-ui · TODO MAIL-103 https://duckbill.jasonkoch.io/docs/operations/e2e-mvp-path | Triage UI shipped. Efficiency on a real mailbox waiting on MAIL-103. |
| 7 | supported mailbox mutations converge with provider state | MAIL-43, MAIL-44, MAIL-45, MAIL-66, MAIL-103 | https://duckbill.jasonkoch.io/docs/architecture/safe-writeback · https://duckbill.jasonkoch.io/docs/decisions/0025-safe-provider-writeback · TODO MAIL-103 https://duckbill.jasonkoch.io/docs/operations/e2e-mvp-path | Durable command + sync convergence shipped. Live write-back proof waiting on MAIL-103. |
| 8 | failures are visible and recoverable | MAIL-29, MAIL-47, MAIL-48, MAIL-75, MAIL-109 | https://duckbill.jasonkoch.io/ops · https://duckbill.jasonkoch.io/api/health · https://duckbill.jasonkoch.io/docs/architecture/ops-health · TODO MAIL-109 https://duckbill.jasonkoch.io/docs/operations/nfr-gates | Health, DLQ, and kill switches shipped. NFR recovery confirmation waiting on MAIL-109. |
| 9 | security, privacy, backup, and service-quality gates pass | MAIL-33, MAIL-35, MAIL-46, MAIL-51, MAIL-56, MAIL-69, MAIL-109 | https://duckbill.jasonkoch.io/docs/operations/privacy-and-logging · https://duckbill.jasonkoch.io/docs/operations/backup-and-restore · https://duckbill.jasonkoch.io/docs/architecture/security-and-policy · tests/privacy/* · TODO MAIL-109 https://duckbill.jasonkoch.io/docs/operations/nfr-gates | Privacy, backup rehearsal, and policy gateway shipped. Formal 03_NFR §16 checklist waiting on MAIL-109. |
| 10 | no out-of-scope custom mail-client or calendar work is required for release | MAIL-49, MAIL-62, MAIL-118 | https://duckbill.jasonkoch.io/docs/operations/mvp-release · this scope audit | Satisfied by the NOT-done list below. No custom mail client or calendar product is required to operate the MVP. |
Preview mirrors the same paths on https://duckbill-dev.jasonkoch.io.
Scope audit (04_MVP §3)
04_MVP §3 items are future-direction work and must not be pulled into MVP. Each row is NOT done.
| 04_MVP §3 item | Status | Notes |
|---|---|---|
| a full custom desktop mail client | NOT done | /inbox is a lightweight triage workspace, not a mail client replacement. |
| a native iOS mail client | NOT done | No iOS app is in this release. |
| full compose/send/reply/forward experience intended to replace Outlook | NOT done | Suggested drafts are local copy-out only (MAIL-170 / ADR 0021). ENABLE_SEND stays off. |
| calendar implementation or replacement of Fantastical | NOT done | Dates may be extracted from mail. There is no calendar product. |
| canonical contact consolidation across every contact system | NOT done | Contact intelligence may capture provenance. No consolidation target is chosen. |
| automatic destructive mail actions based solely on AI | NOT done | Policy gateway denies AI send/delete (ADR 0019 / ADR 0025). |
| autonomous external replies | NOT done | AI must not send. Drafts never send. |
| broad multi-user/enterprise administration | NOT done | Single-operator product surface. |
| shared/team inbox workflows | NOT done | Not in MVP. |
| enterprise records management/eDiscovery | NOT done | Not in MVP. |
| complex rules-builder UI | NOT done | Conservative deterministic rules only. |
| broad attachment document-management system | NOT done | Attachment metadata and on-demand content only. |
| migration of all historical contacts into a single target | NOT done | Contact boundary in 04_MVP §4. |
| generalized personal assistant features unrelated to inbox processing | NOT done | Inbox processing only. |
Operator-required NOT-done list
These are explicitly NOT done in this release (MAIL-49 / MAIL-62):
- custom mail client
- iOS app
- calendar product
- contact consolidation
- full composer/send
- autonomous AI send/delete
- bulk historical migration execution
Bulk historical migration remains inventory/planning only (MAIL-168 / MAIL-169 / ADR 0027). MVP does not execute a lifetime mailbox import (04_MVP §8).
Appendix A — Unresolved decisions
Decisions already recorded stay in docs/decisions/. These items are still open and must not be silently decided in chat:
| Topic | Owner | Notes |
|---|---|---|
| Live E2E proof on one real mailbox | MAIL-50 / MAIL-103 | Reserved URL /docs/operations/e2e-mvp-path. |
| Formal 03_NFR §16 pass/fail checklist | MAIL-51 / MAIL-109 | Reserved URL /docs/operations/nfr-gates. Failures become follow-up tickets, not silent waivers. |
| npm scope and spec-title rename | MAIL-193 | Chrome and this page use Duckbill™. @inbox-agent/* and governing spec titles wait. |
| Live second provider | MAIL-20 / MAIL-52 | Adapter/fixtures exist. 04_MVP §7 does not require a second live provider for MVP. |
| Contact consolidation target | later | 04_MVP §4. Do not pick a store in this release. |
| Calendar product | later | 04_MVP §5. Existing calendar tools stay external. |
| Enabling send | later ticket | ADR 0003 / ADR 0021. Flipping ENABLE_SEND without that ticket is not authorization. |
| Owner-session escape after Apple | MAIL-181 follow-on | Owner session remains ops-only (ADR 0028). Whether it stays after Apple is fully live is not decided here. |
Appendix B — Documentation review checklist (MAIL-118)
Reviewers execute this list against the live preview and production docs hosts. Record pass/fail in MAIL-118.
| # | Check | Expected |
|---|---|---|
| 1 | /docs landing does not mention Jira | Pass on duckbill-dev and duckbill.jasonkoch.io |
| 2 | Product chrome and this page say Duckbill™ | Typed ™ is superscript in chrome; markdown may use Duckbill™ |
| 3 | Every 04_MVP §11 bullet appears in the evidence table | Ten rows, wording from the spec |
| 4 | Every §11 row has MAIL keys and a live URL or test | TODOs allowed only for MAIL-103 / MAIL-109 evidence pages |
| 5 | 04_MVP §3 items are listed as NOT done | Table above matches the spec list |
| 6 | Operator NOT-done list is explicit | custom mail client, iOS app, calendar product, contact consolidation, full composer/send, autonomous AI send/delete, bulk historical migration execution |
| 7 | No secret values | Env names only; no .p8, tokens, or connection strings |
| 8 | ENABLE_SEND stays off | Documented false; not described as enabled |
| 9 | Operator runbooks exist | Deploy and operate, backup and restore, privacy and logging, CI and docs |
| 10 | ADR 0029 is published | https://duckbill.jasonkoch.io/docs/decisions/0029-mvp-release-readiness |
| 11 | Live docs return HTTP 200 | /docs/operations/mvp-release and /docs/operations/deploy on both hosts |
| 12 | Nav lists the new operations pages | Left nav Operations group |
| 13 | Epic MAIL-12 is not closed from this review | Stream C closes MAIL-62 / MAIL-118 / MAIL-49 only |
tests/web/docs-catalog.test.ts asserts the catalog, the §11 wording, and the NOT-done list.
