Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 10 additions & 9 deletions docs/stories/US-001-multiple-alarms.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

---

Expand Down Expand Up @@ -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".

---

Expand Down
29 changes: 20 additions & 9 deletions docs/stories/US-002-recurring-alarms.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

---

Expand Down Expand Up @@ -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).

---

Expand Down Expand Up @@ -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.
8 changes: 4 additions & 4 deletions memory-bank/activeContext.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand All @@ -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.

6 changes: 3 additions & 3 deletions memory-bank/progress.md
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down