diff --git a/docs/stories/US-001-multiple-alarms.md b/docs/stories/US-001-multiple-alarms.md index 1a1e420..f10adb5 100644 --- a/docs/stories/US-001-multiple-alarms.md +++ b/docs/stories/US-001-multiple-alarms.md @@ -2,7 +2,8 @@ **Story ID:** US-001 **Epic:** Alarms -**Status:** QA (QA assessment passed; code review approved — pending merge) +**Status:** Done — deployed to production (PR #13, 2026-09-13); audible +tone owner-verified on prod 2026-09-15 --- @@ -36,14 +37,14 @@ _These criteria define "Done." Every criterion must be verified by QA._ -- [ ] **AC-1:** Given the alarms panel is empty, When the user creates an alarm named "Standup" for 09:30, Then it appears in the list, enabled, with its name and time shown. -- [ ] **AC-2:** Given an enabled alarm set for 09:30, When the device clock reaches 09:30 with the page open, Then a visual and audible alert starts, and the alarm is automatically disabled afterward. -- [ ] **AC-3:** Given an alarm is ringing, When the user chooses Snooze, Then the alert stops and the alarm re-arms for 9 minutes later; When the user chooses Dismiss, Then the alert stops and the alarm stays disabled. -- [ ] **AC-4:** Given one or more alarms exist, When the page is reloaded, Then all alarms reappear with their names, times, and enabled/disabled states intact. -- [ ] **AC-5:** Given an alarm is disabled, When its time arrives, Then no alert occurs. -- [ ] **AC-6 (edge case):** Given the user enables an alarm whose time is earlier than the current time, Then it does not ring today and is scheduled for the next occurrence of that time (tomorrow). -- [ ] **AC-7:** Given an alarm is deleted, Then it disappears from the list, no longer rings, and no longer reappears after a reload. -- [ ] **AC-8 (validation):** Given the user creates an alarm, Then an invalid or empty time is rejected with a clear message; a blank name defaults to "Alarm". +- [x] **AC-1:** Given the alarms panel is empty, When the user creates an alarm named "Standup" for 09:30, Then it appears in the list, enabled, with its name and time shown. +- [x] **AC-2:** Given an enabled alarm set for 09:30, When the device clock reaches 09:30 with the page open, Then a visual and audible alert starts, and the alarm is automatically disabled afterward. +- [x] **AC-3:** Given an alarm is ringing, When the user chooses Snooze, Then the alert stops and the alarm re-arms for 9 minutes later; When the user chooses Dismiss, Then the alert stops and the alarm stays disabled. +- [x] **AC-4:** Given one or more alarms exist, When the page is reloaded, Then all alarms reappear with their names, times, and enabled/disabled states intact. +- [x] **AC-5:** Given an alarm is disabled, When its time arrives, Then no alert occurs. +- [x] **AC-6 (edge case):** Given the user enables an alarm whose time is earlier than the current time, Then it does not ring today and is scheduled for the next occurrence of that time (tomorrow). +- [x] **AC-7:** Given an alarm is deleted, Then it disappears from the list, no longer rings, and no longer reappears after a reload. +- [x] **AC-8 (validation):** Given the user creates an alarm, Then an invalid or empty time is rejected with a clear message; a blank name defaults to "Alarm". --- diff --git a/docs/stories/US-002-recurring-alarms.md b/docs/stories/US-002-recurring-alarms.md index 04b3c2e..d21076d 100644 --- a/docs/stories/US-002-recurring-alarms.md +++ b/docs/stories/US-002-recurring-alarms.md @@ -2,7 +2,8 @@ **Story ID:** US-002 **Epic:** Alarms -**Status:** In Progress +**Status:** Done — deployed to production (PR #18, rebase-merged +2026-09-15); live ring owner-verified on prod 2026-09-15 --- @@ -44,14 +45,14 @@ _These criteria define "Done." Every criterion must be verified by QA._ -- [ ] **AC-1:** Given the create form, When the user checks "Repeat daily" and adds a 09:30 alarm, Then the alarm appears in the list enabled, marked with the daily-repeat indicator. -- [ ] **AC-2:** Given an enabled daily-repeat alarm for 09:30, When the clock reaches 09:30, Then the alarm rings, and afterwards it remains enabled — the next day at 09:30 it rings again. -- [ ] **AC-3:** Given a daily-repeat alarm that just rang, When the user dismisses it, Then the alarm stays enabled and rings again the following day (including across a page reload). -- [ ] **AC-4:** Given a daily-repeat alarm, When the user disables its toggle, Then it never rings again until re-enabled (toggling also clears any pending snooze). -- [ ] **AC-5:** Given an alarm created before this story (persisted without a repeat flag), When the page loads, Then it behaves exactly as a one-shot alarm (rings once, auto-disables). -- [ ] **AC-6:** Snooze works identically for daily-repeat alarms: the snoozed ring fires at the snooze time, and afterwards the alarm is still armed for the next day. -- [ ] **AC-7:** One-shot alarms created after this story keep US-001 semantics exactly: ring once, auto-disable. -- [ ] **AC-8:** While a daily-repeat alarm is ringing and a second one becomes due, the second stays armed and rings on a later tick (one overlay at a time, as in US-001). +- [x] **AC-1:** Given the create form, When the user checks "Repeat daily" and adds a 09:30 alarm, Then the alarm appears in the list enabled, marked with the daily-repeat indicator. +- [x] **AC-2:** Given an enabled daily-repeat alarm for 09:30, When the clock reaches 09:30, Then the alarm rings, and afterwards it remains enabled — the next day at 09:30 it rings again. +- [x] **AC-3:** Given a daily-repeat alarm that just rang, When the user dismisses it, Then the alarm stays enabled and rings again the following day (including across a page reload). +- [x] **AC-4:** Given a daily-repeat alarm, When the user disables its toggle, Then it never rings again until re-enabled (toggling also clears any pending snooze). +- [x] **AC-5:** Given an alarm created before this story (persisted without a repeat flag), When the page loads, Then it behaves exactly as a one-shot alarm (rings once, auto-disables). +- [x] **AC-6:** Snooze works identically for daily-repeat alarms: the snoozed ring fires at the snooze time, and afterwards the alarm is still armed for the next day. +- [x] **AC-7:** One-shot alarms created after this story keep US-001 semantics exactly: ring once, auto-disable. +- [x] **AC-8:** While a daily-repeat alarm is ringing and a second one becomes due, the second stays armed and rings on a later tick (one overlay at a time, as in US-001). --- @@ -86,3 +87,13 @@ _These criteria define "Done." Every criterion must be verified by QA._ is schema-additive and normalised at parse time, that change is backward compatible: `repeat: true` can be read as "all seven days" by the future implementation, and old one-shot records (flag absent) keep working. + +## 7. Verification Record (2026-09-15) + +- 12 new unit tests (ring-stays-armed, next-day re-ring, dismiss/reload + survival, disable-clears-snooze, legacy JSON, snooze interplay, + second-due queuing); full suite 152/152; `make check` green; 7/7 + Playwright assertions; screenshots in the story folder. +- Deployed via PR #18 (rebase-merged into `main`); Release workflow and + webhook deploy succeeded; `/healthz` 200. +- Owner-verified on prod: repeat alarm rings live and behaves as specified. diff --git a/memory-bank/activeContext.md b/memory-bank/activeContext.md index 2105650..8d377ea 100644 --- a/memory-bank/activeContext.md +++ b/memory-bank/activeContext.md @@ -17,6 +17,8 @@ widening. - Verified: 152/152 unit tests (12 new), `make check` green, 7/7 Playwright assertions, 2 screenshots in the story folder. +- Owner-verified on prod (2026-09-15): repeat alarm rings live; alarm tone + audible — closes the last US-001/US-002 QA items; both stories Done. ## Repo cleanup & workflow change (2026-09-15) @@ -34,10 +36,8 @@ widening. ## Next steps -- Owner: verify the repeat alarm rings live after this deploy (`/healthz`, - then a cache-busted homepage). -- Owner: audible alarm-tone check (US-001) and visual pass on prod (US-005) - — both still open. +- Owner: US-005 visual sign-off on prod (last open DoD item) — then the + story's Status flips to Done. - Then: US-004 multi-clock epic, run individually per owner decision — needs a PO story defining "a clock" + likely an ADR before starting. diff --git a/memory-bank/progress.md b/memory-bank/progress.md index 5fcf55c..5f7469a 100644 --- a/memory-bank/progress.md +++ b/memory-bank/progress.md @@ -34,9 +34,9 @@ origin); `dev` is retired — work now branches from `main` and PRs into ## Remaining / known issues -- Production audio QA: alarm tone not yet verified by a human (jsdom can't - test audio) — last open US-001 DoD item. -- US-005 visual sign-off on prod still pending (owner eyeball). +- US-005 visual sign-off on prod still pending (owner eyeball) — the last + open DoD item anywhere. Audio tone and live repeat-ring verified by the + owner on prod 2026-09-15. - Edge-cached homepage can lag up to 2 h behind a deploy (expected; judge freshness via `/healthz` or a query-string cache-bust, which works). - npm minor drift: eslint/prettier/lint-staged/TS patch bumps available;