You say one sentence — “sowed pak choi on 16 October” — and we hand back a list of dated tasks. This is where those dates come from: which part is a skeleton derived from the variety, which part the weather and your situation push around, and which few we never change automatically.
1. You give one sentence; we derive the rest
The skeleton is order plus rough intervals; only dates move, never the order.
Three things from you: what you sowed, on which day, and where (balcony or open ground). Naming the variety helps, because then we have a season length to work from.
We derive the skeleton from that season length and the order of the work. Autumn pak choi, for example: sow → emerge → thin → light feed → harvest, ready in 25-35 days.
The order is hard: emergence before thinning, thinning before feeding.
2. Dates move; the order does not
Days of rain, frost, or a day you cannot get to the plot — we push those dates back, but we never move feeding ahead of thinning.
Recurring work (say watering every seven days): do one and we schedule the next.
Say skip and the next one counts from the originally planned day, not from scratch. Finish two days late and everything after it shifts two days.
3. A few lines we never cross on our own
Only the next ten days. Anything further out is wasted work: the weather is unknowable and your situation will change.
Milestones are proposed only — “time to harvest”, “time to winterise”. We raise them and wait for you.
Unknown facts get asked: without a variety or without knowing whether the plot is open or covered, we ask instead of filling in a plausible value.
One planting, one ledger. Which one to change must be identifiable; if it is not, we ask.
4. The price
Without a clear variety we can only estimate by broad group — “leafy greens, about thirty days”. Naming the variety buys accuracy.
Recurring tasks follow the day you actually did the work, so finishing late shifts everything after it. That is correct, and it looks like the plan wanders.
The dashboard shows about a week. Ask and we go further out; planning further is mostly wasted.
5. If you also write code
Scheduling lives in one closed loop: mode: create | adjust in, strict JSON out, validated by lib/plan-proposal.mjs (window, count, milestones, duplicates), and written through the flora action layer — the planner never writes directly.
Three production lines plus manual actions: fast lane, deep lane, planner, user action. The planner emits structured data only; the conversational lane owns the wording.
Two hard rules for recurring tasks: both completion and skipping schedule the next one; a skip counts from the originally planned date, a completion from the actual date. Clamping once happened before the check (Math.max(1, …) is always ≥ 1), so every ordinary completion spawned a new node — caught by e2e.