GSD Task Manager · parity and focus foundations · October 31, 2026

Sprint 1

Every PR merged in one morning, ahead of a window planned for November 2 to 13. Nothing has reached users yet: Android 0.10.1 is waiting on your device test and upload, and iOS and web changes go out with their next releases.

Web main CI is green at 0709c88, with four WebKit E2E tests passing only on retry. No PRs are open in any repo.

PRs merged6427 web, 22 iOS, 15 Android
Backlog items to close35B-11 and B-36 are partial
First PR to last merge2h 58m8:40 to 11:38 a.m. CDT
Shared corpus cases352155 in use now, 197 ready for sprint 2
App code lines added3,817of 25,882 total, see below

Sprint goals

GoalStateWhere it landed
1. Android Saved parity and a 0.10.1 build◷ Merged, not uploaded#34, release #48 (versionCode 12)
2. Escalation by due date on all three clients✓ Done38-case corpus, editor hints included
3. Due time of day on web and Apple✓ DoneWeb #636, Apple #48, 117-case corpus on all three
4. Apple sync-safety gaps and data fixes✓ DoneiOS #41, #42, #43, #49, #53, plus #46, #47, #50
5. Web and MCP fixes✓ DoneWeb #641, #644, #647, #651, #652. B-11 changed the tool description only.
6. Top three and weekly sweep specs✓ DoneWeb #645, #648. The spec defaults stand because you didn't change them.
7. P2 and P3 gaps, as capacity allowed✓ DoneB-22 finished on web. You dropped B-29, so it stays open.

The morning, merge by merge

Each dot is one PR, placed at its merge time in CDT. Dots in the same few minutes stack. The merges came in batches because reviewed PRs went in as groups. Every PR is listed in the table at the bottom.

What kind of work

Sorted from each PR title's commit type. Chores are counted with docs.

Where the lines went

25,882 lines added and 606 removed. More than half are corpus and fixture JSON copied byte for byte between repos, so read app code as the real size. File types are my sort by path, so treat them as close, not exact.

What each client gained

CapabilityWebiOS and MacAndroid
Escalation by due dateNew #635, #638, #656New #40, #44, #60, #61New #35, #38
Due time of dayNew #636New #48Had it, corpus added #36
All-day reminders at 9 a.m.New #636New #48New #44
Saved tasksHad itHad itNew #34
Snooze presets on card and in editorNew #654, #660Had itHad it
Far-future timestamp capHad itNew #42New #39
Identity check before reconcile deletesNew #649New #45Had it
Three-verdict remote absenceHad itNew #43Had it
Pull contract version 3Had itHad itNew #34

Also on web

  • Duplicate and Move to on the card (#643)
  • Share into GSD from Android (#650)
  • Apple sign-in account note (#655)
  • MCP: recurring tasks spawn on complete_task (#651)

Also on iOS and Mac

  • Complete and Snooze 1h on reminders (#52)
  • Discard changes prompt in the editor (#59)
  • Account deletion through the server route (#46)
  • First-frame skeleton (#56), Mac Trash menu (#51), iPad ⌘? (#55)

Also on Android

  • Pull to refresh on every layout (#45, #47)
  • Top 8 tags with completion rate (#43)
  • Sync history totals (#40)
  • Tombstone fence on pull (#42)

Bugs the sprint found and fixed

  • Android 0.10.0 can lose a task for good. A task created between two database reads got deleted with no Trash copy. Reproduced with a fake store, not on a device. Fixed in #37, and only 0.10.1 carries it.
  • A rejected token could read as "everything deleted" on iOS and web. Identity checks in iOS #45 and web #649.
  • Web quiet hours dropped timed reminders instead of deferring them (#653).
  • Android lost a saved_at backfill on a locally newer row (#34).
  • The iOS editor hint used Do First's color for Delegate (#61).

Where the sprint slipped

  • Web main went red twice. #647 and #649 clashed in a test, fixed by #658. Then #660 broke a selector in due-time.spec.ts, fixed by #661. My review of #660 missed it.
  • #61 almost stranded. Its commit landed on a branch after #60 merged, with no PR. I found it while closing out.
  • I corrected five of my own calls as Lead, including telling S-IOS to match web on every path when native needed its own rule for queued writes. sprint/OWNER-DECISIONS.md records two of them.
  • Android has one flaky unit test: FeedbackViewModelTest, a teardown race, one failure in four full runs.

Contracts now pinned across clients

CorpusCasesWho runs it
Due time of day117Web, iOS, Android
Escalation38Web, iOS, Android
Top three123Nobody yet, sprint 2 builds it
Weekly sweep74Nobody yet, sprint 2 builds it

A check of 74 fixture copies across the repos found no mismatches. The all-day reminder rule, the far-future cap, the identity check, and three-verdict absence now hold on all three clients.

Still yours before release

  • Android 0.10.1: real-device smoke test, then upload. The minified build has never signed in or synced. Round 3 answers need new dates.
  • By hand, never run: account deletion with a throwaway account, Mac Trash right-click, reminder buttons on a real notification, ⌘? and palette Browse on iPad, cold launch with many tasks and Reduce Motion, sign-out mid-sync, and the #44 list.
  • iOS 27: simulators won't boot under Xcode 27.2, so everything ran on iOS 26.5.
  • Paste sprint/parity-deltas.md into the Project docs and check the row ids.
  • Decide: items 3, 5, 12, and 13 in OWNER-DECISIONS.md.

Sprint 2 starts here

  • First fix: saved_at can be cleared after an upgrade on web and iOS. Reproduced on a fake server, exposure unmeasured.
  • Build: top three, weekly sweep, and notify_before always a number.
  • Backlog added this sprint: IOS-CAP-REFILL, IOS-BG-REM, IOS-ARCHIVE-MENU, IOS-FIXTURE-PAIR, RECONCILE-RECHECK, AND-RT-FENCE, WEB-RT-Q, WEB-SKIP-CURSOR, SCRIPT-VALIDATORS, MCP-10B, MCP-11B, AND-FEEDBACK-FLAKE, WEB-E2E-OFFLINE.

Every PR

MergedRepoPRTitleAddedRemoved

Built from gh pr list and sprint/parity-deltas.md. Times are CDT. Backlog ids come from SPRINT.md and PR descriptions, because no one in the sprint could read the backlog itself.