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-09-26. 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%)

Latest changes

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