Example project — Frond is not real.

Authored demo content for a fictional plant-care app, rendered by the same parsers and held to the same invariants as a real project's dashboard. This is the system in use, three months in.

Decisions6

The institutional memory — dated entries, newest first: the call, why it holds, what was rejected instead, and what it governs. Walkthrough docs capture decisions during a phase; the load-bearing ones get lifted here at close so they survive the archive. This is the catch-up feed: read down until you hit a date you remember.

2026-09-05

Reminders are a daily digest, not per-plant pushes

What: All due plants collapse into one notification per day, at a time the user picks.

Why: Per-plant pushes tested as the fastest route to being muted: six plants meant six buzzes. The accepted cost is that we can no longer nag about a single urgent plant.

Instead of:
  • Per-plant pushes with a rate limit — harder to reason about, and still bursty.

Scope: The reminder schedule and the notification the user actually receives.

2026-09-01

Light readings are a range, never a number

What: The room survey reports a band ("bright, indirect") instead of a lux figure.

Why: A phone camera cannot justify three significant figures, and a precise-looking number invites more trust than it deserves. A band is honest about our resolution and still enough to pick a schedule.

Scope: How the room survey reports its result, everywhere a light level is shown.

2026-08-27

One plant before any account

What: Onboarding adds the first plant before asking the user to sign up.

Why: The signup wall was where the funnel died, because people had nothing invested yet. Adding a plant first means the account protects something the user already made.

Instead of:
  • Full anonymous mode — deferred, not refused: sync complexity we cannot carry yet.

Scope: The onboarding order, and where the account gate sits.

2026-08-20

Species data is licensed, not curated

What: We license a third-party species database rather than maintaining our own.

Why: Curating care data is a full-time botany job we are not staffed for, and being wrong about a rare plant is worse than being generic. The cost is that we cannot fix a bad entry directly, which the "never present as certainty" principle absorbs.

Instead of:
  • Curating our own species database — the staffing we do not have.

Scope: Where species care data comes from, and the certainty any surface may claim for it.

2026-08-15

Offline is the default assumption, not a mode

What: Every read path serves from the local store first; the network is an enhancement.

Why: Watering happens in bathrooms, basements and balconies. An explicit "offline mode" would mean two code paths, and one of them would rot.

Instead of:
  • Online-first with a cache — rejected after the first hallway test.

Scope: Every read path in the app, and the assumption each feature doc is written against.

2026-08-08

Adopted Groundwork as the work model

What: The project runs on phases, modes and rituals, with a derived dashboard at /system.

Why: Two prior attempts drowned in stale docs and a README nobody trusted. A derived dashboard cannot lie, and distill-and-delete keeps the working set small.

Scope: How the whole project is worked — phases, modes, rituals, and the derived record.

Source: docs/decisions.md