Duckbill™ product completion
Owner-facing status for the MAIL product-completion program. This page is the live report: milestone percent complete, active sprint remaining work, and latest changes as work ships.
Counts come from Jira on as_of in docs/operations/product-status.json. Task story points in MAIL-222..MAIL-306 currently sum to 144. No secrets belong on this page.
The milestone, sprint, and latest-changes tables are rendered from that JSON so the numbers do not drift from the snapshot.
Snapshot as of 2026-10-11. 85 issues · 10 done (12%) · 6 in progress · 13/144 story points (9%).
Milestones
| Milestone | Fix version | Deliverable | Issues | Story points | Status |
|---|---|---|---|---|---|
| M1 | Duckbill M1 Accounts | Accounts page, unlimited Microsoft connect, session gate. Testable: signed-in /accounts lists mailboxes and can start another Graph connect. | 10/22 (45%) | 13/27 (48%) | In progress |
| M2 | Duckbill M2 Providers | Live Gmail and iCloud product connect. Testable: both Gmail and both iCloud identities listed on /accounts. | 0/22 (0%) | 0/39 (0%) | Not started |
| M3 | Duckbill M3 Inventory | Folder scan on connect and Mail folder tree. Testable: user can inspect actual and proposed folders. | 0/11 (0%) | 0/21 (0%) | Not started |
| M4 | Duckbill M4 Migration | Migration UI and dry-run targeting Microsoft. Testable: plan and counts visible; StartMigration denied. | 0/11 (0%) | 0/20 (0%) | Not started |
| M5 | Duckbill M5 Cleanup | Live classify, Review queue, one approved safe write-back, Read Later. Testable: triage from live inferences and one approved cleanup action. | 0/19 (0%) | 0/37 (0%) | Not started |
Active sprints
| Sprint | State | Deliverable | Remaining work | Issues |
|---|---|---|---|---|
| MAIL Sprint 09a Accounts | active | /accounts + Connect Microsoft | Code on production. Open: signed-in mailbox rows and a second Microsoft Graph connect (Tests MAIL-276/277/281/279). Stories/Tasks In Review. | 0/10 (0%) |
| MAIL Sprint 09b Session | complete | login redirect + status page | None. Anonymous /inbox→/login verified; status page live; Story/Task/Test sets Done (MAIL-230/244/262–265/278/280/303/305). | 10/10 (100%) |
Sprint exit checklist
A sprint cannot be called complete unless its deliverable Test has passed.
| Sprint | Deliverable | Test | Complete |
|---|---|---|---|
| MAIL Sprint 09a Accounts | Signed-in /accounts lists mailboxes and can start another Microsoft Graph connect. | MAIL-276 | Not complete |
| MAIL Sprint 09b Session | Anonymous /inbox redirects to login and the product-completion status page is live. | MAIL-278 | Complete |
| MAIL Sprint 10a Gmail | Both Gmail identities connect on Accounts through one OAuth client. | MAIL-291 | Not complete |
| MAIL Sprint 10b iCloud | Two iCloud accounts stay connected and the mailbox stays read-write. | MAIL-298 | Not complete |
| MAIL Sprint 11a Folder scan | A successful connect stores a folder scan with per-folder counts. | MAIL-288 | Not complete |
| MAIL Sprint 11b Mail view | /inbox/mail shows stored folders with actual and proposed names. | MAIL-290 | Not complete |
| MAIL Sprint 12a Migration plan | /inbox/migration builds a Microsoft plan from stored Gmail and iCloud scans. | MAIL-302 | Not complete |
| MAIL Sprint 12b Dry-run | Dry-run shows selected, skipped, duplicate, conflict, and failed, and Start stays denied. | MAIL-300 | Not complete |
| MAIL Sprint 13a Live classify | Classify runs on connected accounts and attention queues come from live inferences. | MAIL-285 | Not complete |
| MAIL Sprint 13b Review | Read Later is a queue and Review can approve one archive or folder mapping. | MAIL-284 | Not complete |
Milestone evidence
| Milestone | Evidence URL | Note |
|---|---|---|
| M1 Accounts | https://duckbill.jasonkoch.io/accounts | Accounts page shipped. Later rows stay empty until that milestone ships. |
| M2 Providers | Reserved | Reserved until Providers ships. |
| M3 Inventory | Reserved | Reserved until Inventory ships. |
| M4 Migration | Reserved | Reserved until Migration ships. |
| M5 Cleanup | Reserved | Reserved until Cleanup ships. |
Latest changes
- 2026-10-11 Sprint-exit checklist for 09a–13b and milestone evidence rows on the progress page. MAIL-243, MAIL-260, MAIL-261
- 2026-09-26 Sprint 09b closed: session gate + status page Done (10/10 issues, 13 SP on M1). MAIL-230, MAIL-244, MAIL-262, MAIL-263, MAIL-264, MAIL-265
- 2026-09-26 Accounts page and unlimited Microsoft connect live on production (/accounts). MAIL-270, MAIL-271, MAIL-259, MAIL-258, MAIL-231, MAIL-229
- 2026-09-26 Session gate and product-completion status page live on production. MAIL-262, MAIL-264, MAIL-265, MAIL-230, MAIL-244
- 2026-09-26 MAIL Sprint 09a Accounts and MAIL Sprint 09b Session started. MAIL-230, MAIL-231
- 2026-09-26 All MAIL-222..MAIL-306 issues assigned to fix versions M1–M5 (85/85). MAIL-263
- 2026-09-26 Fix versions Duckbill M1 Accounts through M5 Cleanup created (ids 10297–10301). MAIL-263
- 2026-09-26 Charter created the Duckbill product-completion plan MAIL-222..MAIL-306. MAIL-222
Jira fix versions (MAIL-263)
Planning already created the five versions. Do not recreate them. Every issue in MAIL-222..MAIL-306 is assigned (85/85).
| Id | Version | Deliverable |
|---|---|---|
| 10297 | Duckbill M1 Accounts | Accounts page, unlimited Microsoft connect, session gate |
| 10298 | Duckbill M2 Providers | Live Gmail and iCloud product connect |
| 10299 | Duckbill M3 Inventory | Folder scan on connect and Mail folder tree |
| 10300 | Duckbill M4 Migration | Migration UI and dry-run targeting Microsoft |
| 10301 | Duckbill M5 Cleanup | Live classify, Review queue, one approved cleanup action |
JQL recipes
project = MAIL AND fixVersion = "Duckbill M1 Accounts"
project = MAIL AND fixVersion = "Duckbill M2 Providers"
project = MAIL AND fixVersion = "Duckbill M3 Inventory"
project = MAIL AND fixVersion = "Duckbill M4 Migration"
project = MAIL AND fixVersion = "Duckbill M5 Cleanup"
project = MAIL AND key >= MAIL-222 AND key <= MAIL-306 AND fixVersion is EMPTY
sprint = "MAIL Sprint 09a Accounts"
sprint = "MAIL Sprint 09b Session"
The empty-fixVersion query must stay at zero for this plan.
Update rule
Update docs/operations/product-status.json in the same PR whenever a MAIL product-completion issue closes. Do not wait for a follow-up. Refresh as_of, totals, the matching milestone and sprint counts, and prepend a latest_changes row (newest first, keep at least five slots).
ENABLE_SEND and ENABLE_DELETE stay false.
Sprint exit checklist
The progress page lists MAIL Sprint 09a through MAIL Sprint 13b. Each row has a deliverable sentence and the Test that proves it. A sprint cannot be called complete unless that Test has passed. The checklist is rendered from sprint_exits in docs/operations/product-status.json.
Milestone evidence
M1 can hold a live URL after Accounts ships. M2 through M5 keep reserved rows until those milestones ship. Evidence URLs are public pages only. Do not put tokens, passwords, or other secrets in the URL or the note.
