docs(11): sequence plan 11-02 behind 11-01, cite D-09; record planning completion

This commit is contained in:
Lucas Berger
2026-06-13 21:26:16 -04:00
parent 6109d4ca49
commit e169b138f9
3 changed files with 15 additions and 8 deletions
+8 -1
View File
@@ -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). - 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**: 4 plans (3 waves)
Plans: Plans:
**Wave 1**
- [ ] 11-01-PLAN.md — VALARM builders + classifier + extractor + computeAlertInstantUtc (vevent.ts, TDD) - [ ] 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-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 - [ ] 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 - [ ] 11-04-PLAN.md — EventForm reminder picker (allDay swap, edit pre-population) + client types + Playwright smoke
**UI hint**: yes **UI hint**: yes
+3 -3
View File
@@ -2,9 +2,9 @@
gsd_state_version: 1.0 gsd_state_version: 1.0
milestone: v1.1 milestone: v1.1
milestone_name: Operability & Polish milestone_name: Operability & Polish
status: verifying status: executing
stopped_at: Phase 11 UI-SPEC approved 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)" last_activity: "2026-06-13 - Completed quick task 260613-ndv: isolated local apps/api tests to familysync_test (dev DB no longer polluted)"
progress: progress:
total_phases: 21 total_phases: 21
@@ -27,7 +27,7 @@ See: .planning/PROJECT.md (updated 2026-06-10)
Phase: 13 Phase: 13
Plan: Not started 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) 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) ### ✅ Resolved Checkpoint — Phase 15 Plan 15-03 Task 2 (human-action)
@@ -2,8 +2,8 @@
phase: 11-per-event-reminders phase: 11-per-event-reminders
plan: 02 plan: 02
type: tdd type: tdd
wave: 1 wave: 2
depends_on: [] depends_on: [11-01]
files_modified: files_modified:
- apps/api/src/broker/reminderScheduler.ts - apps/api/src/broker/reminderScheduler.ts
- apps/api/tests/broker/reminderScheduler.test.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" - "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)" - "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" - "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: artifacts:
- path: "apps/api/src/broker/reminderScheduler.ts" - 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" 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
</artifacts_this_phase_produces> </artifacts_this_phase_produces>
<context_note> <context_note>
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.
</context_note> </context_note>
<tasks> <tasks>