diff --git a/.planning/ROADMAP.md b/.planning/ROADMAP.md index 0a254e3..27402b8 100644 --- a/.planning/ROADMAP.md +++ b/.planning/ROADMAP.md @@ -213,11 +213,18 @@ Plans: - Hard constraints: `setInterval` only; scheduler reads `reminder_lead_minutes` from the DB (ground truth), not the outbox payload; drop the `isShared`-only reminder restriction (a user who set an alarm wants it regardless of calendar). **Plans**: 4 plans (3 waves) - Plans: +**Wave 1** + - [ ] 11-01-PLAN.md — VALARM builders + classifier + extractor + computeAlertInstantUtc (vevent.ts, TDD) + +**Wave 2** *(blocked on Wave 1 completion)* + - [ ] 11-02-PLAN.md — Variable-lead scheduler: uid:dtstartMs dedup, drop isShared, all-day 9 AM, humanized body (TDD) - [ ] 11-03-PLAN.md — Backend plumbing: schema field, outbox preserve-on-edit, sync upsert, occurrence surfacing + +**Wave 3** *(blocked on Wave 2 completion)* + - [ ] 11-04-PLAN.md — EventForm reminder picker (allDay swap, edit pre-population) + client types + Playwright smoke **UI hint**: yes diff --git a/.planning/STATE.md b/.planning/STATE.md index 7670f80..ac16d20 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -2,9 +2,9 @@ gsd_state_version: 1.0 milestone: v1.1 milestone_name: Operability & Polish -status: verifying +status: executing stopped_at: Phase 11 UI-SPEC approved -last_updated: "2026-06-14T00:53:26.431Z" +last_updated: "2026-06-14T01:26:07.775Z" last_activity: "2026-06-13 - Completed quick task 260613-ndv: isolated local apps/api tests to familysync_test (dev DB no longer polluted)" progress: total_phases: 21 @@ -27,7 +27,7 @@ See: .planning/PROJECT.md (updated 2026-06-10) Phase: 13 Plan: Not started -Status: Phase complete — ready for verification +Status: Ready to execute Last activity: 2026-06-13 - Completed quick task 260613-ndv: isolated local apps/api tests to familysync_test (dev DB no longer polluted) ### ✅ Resolved Checkpoint — Phase 15 Plan 15-03 Task 2 (human-action) diff --git a/.planning/phases/11-per-event-reminders/11-02-PLAN.md b/.planning/phases/11-per-event-reminders/11-02-PLAN.md index 3fabe0d..e8b03eb 100644 --- a/.planning/phases/11-per-event-reminders/11-02-PLAN.md +++ b/.planning/phases/11-per-event-reminders/11-02-PLAN.md @@ -2,8 +2,8 @@ phase: 11-per-event-reminders plan: 02 type: tdd -wave: 1 -depends_on: [] +wave: 2 +depends_on: [11-01] files_modified: - apps/api/src/broker/reminderScheduler.ts - apps/api/tests/broker/reminderScheduler.test.ts @@ -16,7 +16,7 @@ must_haves: - "A timed event with reminderLeadMinutes=0 produces no push; an all-day event with 0 fires at 9 AM on the event date" - "Reminders fire on personal calendars too (the isShared-only restriction is dropped)" - "The same event fires exactly once across consecutive ticks; a rescheduled event (new dtstart) re-fires — dedup key is uid:dtstartMs" - - "Push body is humanized to the largest sensible unit (30 min / 1 hour / 1 day / 7 days)" + - "Push body is humanized to the largest sensible unit (30 min / 1 hour / 1 day / 7 days) (D-09)" artifacts: - path: "apps/api/src/broker/reminderScheduler.ts" provides: "humanizeLeadMinutes, variable-lead query, uid:dtstartMs dedup, all-day 9 AM branch, NULL-vs-0 guard, dropped isShared restriction" @@ -66,7 +66,7 @@ NOTE: `computeAlertInstantUtc` is created by Plan 11-01 in vevent.ts and importe -This plan imports `computeAlertInstantUtc` from `../broker/vevent.js` (created in Plan 11-01). Until Plan 11-01 merges, the all-day-9AM test (Wave 0 gap) cannot pass — this plan is wave 1 alongside 11-01 but the all-day task's automated verify depends on 11-01's symbol. Sequence the all-day task LAST within this plan; if 11-01 has not yet landed in the shared tree, the executor imports the symbol signature as specified in 11-01's artifacts list and the test goes RED until both merge. Do not redefine computeAlertInstantUtc here. +This plan imports `computeAlertInstantUtc` from `../broker/vevent.js` (created in Plan 11-01). This plan is **wave 2, `depends_on: [11-01]`** — 11-01 lands before this plan runs, so the symbol is available and the all-day-9AM test can go GREEN within this plan. Sequence the all-day task LAST within this plan. Do not redefine computeAlertInstantUtc here — import it from 11-01.