Specification
Behaviour of the app, one page per area. Every requirement has an ID; code comments and unit tests reference these IDs. Change the spec before the code.
| Page | IDs | Covers |
|---|---|---|
| scheduling.md | SCHED-001 … SCHED-016 | Schedules (set times or repeating), next-occurrence maths, alarms, snooze |
| skipping.md | SKIP-001 … SKIP-007 | Skip today, skip future dates |
| notifications.md | NOTIF-001 … NOTIF-010 | Reminder notification content, actions, permission |
| library.md | LIB-001 … LIB-007 | Stretch library and first-run seed |
| goals.md | GOAL-001 … GOAL-010 | Daily goals per stretch, progress, goal history, database upgrades |
| sessions.md | SESS-001 … SESS-005 | Stretch session screen and the completion log |
| trends.md | TREND-001 … TREND-010 | Daily score, week/month trends, streak, day detail |
| screens.md | HOME-001 … HOME-009 | Home screen layout |
| widgets.md | WIDGET-001 … WIDGET-010 | Segmented ring home screen widget for today's goals |
| privacy.md | PRIV-001 … PRIV-004 | No internet access, on-device data, the permission set, the privacy policy |
| store-listing.md | STORE-SHOT-001 … STORE-SHOT-014, STORE-ICON-001 … STORE-ICON-005, STORE-GRAPHIC-001 … STORE-GRAPHIC-007, STORE-LIST-001 … STORE-LIST-008 | Google Play phone screenshots: the shots, their frozen inputs, layout, recording (on a deliberate label) and verifying; the store icon rendered from the launcher icon and the feature graphic's text and two showcase phones; the listing text, its claims' requirement IDs, the drift check and the release's listing zip; the app's launcher label matching the store title |
Every page except this one starts with a store marker line, <!-- store: headline --> or
<!-- store: omit -->, saying whether the Google Play listing must mention it
(STORE-LIST-002).
A bold Invariant — … sentence marks a rule a technically-correct implementation could still break; treat it as a hard constraint on how the behaviour is built, not only what it outputs.