Memory is not a chat log. For each planting we keep one sentence of conclusion: the constraints you stated (south-facing balcony, no sprays at home) stay, small talk does not. This is what we keep, how we work out *which* planting it belongs to, and how you correct us.
1. You should not need to say it twice
You once said “south-facing balcony, sandy soil, yellowed leaves after overwatering”. Ask again two weeks later and you do not repeat yourself — it is already inside that sentence.
One summary per planting at most, two sentences and 120 characters, overwritten each time — “what it is now”, not a log.
2. We keep conclusions, not your words
Two things only: what this planting is, and why something changed recently.
Small talk is not stored; neither is a review where we changed nothing — “I looked” is not a change in facts.
Talking alone can update memory: “no sprays at home” stays, because scheduling needs it next time.
Archived plantings are kept as records but stop influencing decisions, so a two-year-old note cannot distort today.
3. Before writing, we identify the planting
An id if there is one; a uniquely matching name otherwise; if neither works, it goes to your profile — never to the first planting.
Why the rule exists: it did go wrong once. The summary for “balcony cherry radish” ended up holding content about “balcony potatoes”, because the old behaviour was “if unsure, use the first one”.
4. Correcting us takes one sentence
Ask us to read it back — “what do you have on this pot?” — and we repeat the summary as stored, unpolished.
Say “no, that was the potatoes” and we overwrite it, version number incremented.
Memory creates no change record — it is not a schedule and needs no rollback — but you can always see what it currently says.
5. The price
One sentence cannot hold detail: variety and history get compressed, so a specific question still sends us back to the source material.
Memory is overwritten, not appended: the old conclusion is gone. For history you look at the change log.
6. If you also write code
Summaries live in knowledge, one per planting, overwritten on write, version + 1.
lib/memory.mjs writes only when applied.length > 0: group by plantingId, compose “first sentence of the old memory + which day + what we changed”, at most two sentences and 120 characters.
Persisted through rememberPlanting(), touching only knowledge — no commit, because memory is not a schedule.
The three-step target resolution (id → unique name → profile notes) is a hard rule, documented in BUSINESS.md §7.