Skip to content

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

MilestoneFix versionDeliverableIssuesStory pointsStatus
M1Duckbill M1 AccountsAccounts 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
M2Duckbill M2 ProvidersLive Gmail and iCloud product connect. Testable: both Gmail and both iCloud identities listed on /accounts.0/22 (0%)0/39 (0%)Not started
M3Duckbill M3 InventoryFolder scan on connect and Mail folder tree. Testable: user can inspect actual and proposed folders.0/11 (0%)0/21 (0%)Not started
M4Duckbill M4 MigrationMigration UI and dry-run targeting Microsoft. Testable: plan and counts visible; StartMigration denied.0/11 (0%)0/20 (0%)Not started
M5Duckbill M5 CleanupLive 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

SprintStateDeliverableRemaining workIssues
MAIL Sprint 09a Accountsactive/accounts + Connect MicrosoftCode 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 Sessioncompletelogin redirect + status pageNone. 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.

SprintDeliverableTestComplete
MAIL Sprint 09a AccountsSigned-in /accounts lists mailboxes and can start another Microsoft Graph connect.MAIL-276Not complete
MAIL Sprint 09b SessionAnonymous /inbox redirects to login and the product-completion status page is live.MAIL-278Complete
MAIL Sprint 10a GmailBoth Gmail identities connect on Accounts through one OAuth client.MAIL-291Not complete
MAIL Sprint 10b iCloudTwo iCloud accounts stay connected and the mailbox stays read-write.MAIL-298Not complete
MAIL Sprint 11a Folder scanA successful connect stores a folder scan with per-folder counts.MAIL-288Not complete
MAIL Sprint 11b Mail view/inbox/mail shows stored folders with actual and proposed names.MAIL-290Not complete
MAIL Sprint 12a Migration plan/inbox/migration builds a Microsoft plan from stored Gmail and iCloud scans.MAIL-302Not complete
MAIL Sprint 12b Dry-runDry-run shows selected, skipped, duplicate, conflict, and failed, and Start stays denied.MAIL-300Not complete
MAIL Sprint 13a Live classifyClassify runs on connected accounts and attention queues come from live inferences.MAIL-285Not complete
MAIL Sprint 13b ReviewRead Later is a queue and Review can approve one archive or folder mapping.MAIL-284Not complete

Milestone evidence

MilestoneEvidence URLNote
M1 Accountshttps://duckbill.jasonkoch.io/accountsAccounts page shipped. Later rows stay empty until that milestone ships.
M2 ProvidersReservedReserved until Providers ships.
M3 InventoryReservedReserved until Inventory ships.
M4 MigrationReservedReserved until Migration ships.
M5 CleanupReservedReserved until Cleanup ships.

Latest changes

  1. 2026-10-11 Sprint-exit checklist for 09a–13b and milestone evidence rows on the progress page. MAIL-243, MAIL-260, MAIL-261
  2. 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
  3. 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
  4. 2026-09-26 Session gate and product-completion status page live on production. MAIL-262, MAIL-264, MAIL-265, MAIL-230, MAIL-244
  5. 2026-09-26 MAIL Sprint 09a Accounts and MAIL Sprint 09b Session started. MAIL-230, MAIL-231
  6. 2026-09-26 All MAIL-222..MAIL-306 issues assigned to fix versions M1–M5 (85/85). MAIL-263
  7. 2026-09-26 Fix versions Duckbill M1 Accounts through M5 Cleanup created (ids 10297–10301). MAIL-263
  8. 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).

IdVersionDeliverable
10297Duckbill M1 AccountsAccounts page, unlimited Microsoft connect, session gate
10298Duckbill M2 ProvidersLive Gmail and iCloud product connect
10299Duckbill M3 InventoryFolder scan on connect and Mail folder tree
10300Duckbill M4 MigrationMigration UI and dry-run targeting Microsoft
10301Duckbill M5 CleanupLive 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.