Watering reminders
Goal: A user receives one daily digest of the plants that need water, can mark them done in a tap, and can see why each schedule says what it says.
Depends on: Room light survey (closed) — schedules are only defensible once the room is measured.
Refs: strategy/Care Model.md, features/watering-reminders.md, implementation/data-layer.md
Open notes (phase-specific only)
Canonical open process:
docs/CONTRIBUTING.md→ "Opening a Product Phase". Do not copy it here.
- Serves the vision by: turning a measured room into an action the user takes this week. Without reminders the survey is trivia.
- Thesis: a schedule the user can see the reasoning for is a schedule they will follow, so the reminder has to carry its own justification.
- Conflicts surfaced at open: the species baseline and the measured light disagree for two of the seed plants. Resolved by the Care Model's widen-never-average rule rather than by picking a winner.
- Open Questions in this phase's area: §1 (the light premise) is not blocked by this phase but bounds how confident the copy may sound. §1's second question (manual override) is this phase's to settle in the walkthrough.
- Scope call at open: digest only, one per day. Per-plant urgency was cut before the build started (see
decisions.md2026-07-18).
Workstream A — Scheduling
| Task | Description | Refs | Status |
|---|---|---|---|
| A1 | Compute an interval band from species baseline, light band and pot volume. | strategy/Care Model.md | done |
| A2 | Widen the band where inputs disagree, never average. | strategy/Care Model.md | done |
| A3 | Seasonal shift, summer/winter only, northern hemisphere. | FC8 | done |
| A4 | Recompute on re-survey, and record why the schedule moved. | implementation/data-layer.md | done |
Workstream B — The digest
| Task | Description | Refs | Status |
|---|---|---|---|
| B1 | Collapse all due plants into one notification at a user-picked time. | decisions.md 2026-07-18 | done |
| B2 | Schedule the digest job server-side so it survives an app that never opens. | implementation/data-layer.md | done |
| B3 | Respect device locale for the digest time. | P17 | done |
| B4 | Quiet handling when nothing is due: no notification at all. | done | |
| B5 | Overdue plants lead the digest, without scolding copy. | strategy/Vision.md | in_progress |
Workstream C — The care screen
| Task | Description | Refs | Status |
|---|---|---|---|
| C1 | Mark-watered in one tap from the digest, writing an append-only care event. | implementation/data-layer.md | in_progress |
| C2 | Show the reasoning behind each schedule as a plain sentence. | strategy/Care Model.md | todo |
| C3 | Offline mark-watered, queued and merged on reconnect. | decisions.md 2026-06-27 | todo |
Acceptance Criteria
- A user with six plants receives exactly one notification per day.
- Nothing due means no notification.
- Every schedule can explain itself in one sentence, naming the light band.
- Marking watered works with the network off and survives a restart.
- No reminder copy implies the user failed.
Close notes (phase-specific only)
- Settle Open Questions §1's override question in the walkthrough.
- P17 (locale time) is fixed inside B3 — remove the punch row at close.
features/watering-reminders.mdmoves from staged to built.