One sentence from you and we can change your schedule. But the only things we change are tasks you have not done yet; anything finished, skipped, postponed or backfilled is off limits. This is what we remember, what we dare to touch, and how a change is undone.
1. We remember three things
Three things with different lifespans: who you are barely changes, what you grow does get changed, the weather changes every hour.
Who you are: your city, a balcony or open ground, what pots you use, and limits like “no sprays at home”. Say it once and we keep it.
What you are growing: one planting is one ledger, each line a task for a date. Tomatoes and chrysanthemums are separate ledgers that do not interfere.
Recent weather: we look it up ourselves. We read three days ahead and three days behind, because “water today?” depends more on the last two days than on today.
2. We only touch what is not done yet
Why so strict? Suppose we could edit a completed record: you look back at “watered last Wednesday” while we quietly rewrote that line two days ago, and the account no longer matches what you actually did. Once the account is wrong, every later judgement is built on sand.
Nothing finished, skipped, postponed or backfilled is ever touched. Changing those means a restore, which redoes the step and leaves a record.
3. Every change leaves a full snapshot
The method is crude but effective: on each change we save the entire resulting state. So any moment can be returned to, and you can see what changed, when, and by which step.
That is why we dare to change your plan: a wrong change can be restored, and restoring takes one sentence.
“No, put it back” needs no clever undo stack — we simply take the snapshot out again.
Snapshots are for you to lean on, not to maintain: you never manage them, we keep them.
4. The price, stated plainly
Everything lives on one machine, as files rather than a large database. That buys simplicity, portability and readability; it costs availability — if the machine dies, the service stops.
We hold up for one person with a few plantings and a few dozen tasks a day, not for tens of thousands of concurrent users. At this stage, good enough wins.
We do not aim at “never wrong”; we aim at wrong can be undone, and you will know.
5. If you also write code
A single long-running Node process with zero runtime dependencies: floramind.mjs assembles and dispatches, logic lives in lib/.
State is data/flora/<user>/store.json plus commits.jsonl — a full snapshot per write, appended, never rewritten.
Writes are atomic via temp file and rename; cache reads validate mtime + size or they serve stale data.
One write entry point (applyAction), so “change log” and “restore” need no second implementation.
Module sizes are held by a line-count ratchet (tools/test-structure.mjs) that only moves down; shared state exists once.