concept sketch · v0.9.0 ahead-of-need · iterate at grooming · #597

Sprout v0.9.0 — watering, tank & optionality concepts

Sketches, not specs. Direction for the pumps wave so it opens with visual intent instead of a blank page. Decisions honored throughout: ADR-0016 (single authority / arm-gate), ADR-0022 (alert-first; the silent under-watering failure gets the loudest treatment), ADR-0028 (the minimum Sprout is complete), ADR-0008 (character on notification/approval surfaces, instrument grammar in histories), the doctrine's four-question test and out-of-box fence, and the house rule: a derived number never dresses as a measurement.

1 · The watering loop on the plant card

Pump presence enriches the existing plant-first card without restructuring it — one status line + a dose history in instrument grammar. No mood, no prose inside the dense readout.

Pothos (XXL)
s2 · classic (left) · pump P2
Dry · parched
💧 last dose 120 ml · yesterday 18:04 · 14 doses total
dose history → sparkrow of ticks (one per dose, height = ml), instrument-grammar, taps into the Workbench log
Pothos (XXL)
s2 · classic (left) · pump P2
needs attention
I asked for water twice, but nothing arrived — please check my pump and tube. I'll keep watching the soil and won't try again until you've had a look.
the ADR-0022 case: a gate that never opens kills silently → this alert state outranks every other card state, never auto-clears

Why: the noisy failure (an extra dose) is recoverable; the silent one (no dose, ever) is not. The alert card is therefore the most designed state in the loop — alert-first, calm voice, no guilt, explicit next action.

2 · The one-human-touch approval moment

Sprout never waters silently (ADR-0016: a forced dose is an explicit human decision). The ask is a character surface (ADR-0008 allows notification/approval); the facts in it are instrument-sourced, never invented.

Pothos (XXL) has been properly thirsty since this morning — may I give it a drink? One dose is about 120 ml.
Dry · parched · raw 2,941 · dose size from your pump setup — never a made-up number
Yes, water itNot now
"Not now" is a first-class answer: no re-ask for this thirst episode, no countdown, no nag. Approval history lands in the Workbench log.

3 · Tank awareness — modeled vs. measured

Predict-first (#19): a modeled level from dose history ships before any tank sensor exists. The two must never look alike — provenance is the design, not a footnote.

Tank · modeled
≈ 41% · modeled from 14 doses since refill
runway ≈ 9 days at the current pace
≈ everywhere · hatched fill · predicted-purple · "modeled" written out — it can never pass for a reading
Tank · measured
38% · measured · float sensor
runway ≈ 8 days at the current pace
solid fill, plain number — and the runway stays ≈, because a forecast is modeled even when the level isn't

Grammar: modeled = ≈ + hatch + --st-predicted + the word "modeled". Measured = solid + sensor named. A sensor upgrade swaps the card's provenance, not its layout — presence enriches, never restructures.

4 · The refill notification — ahead of need, never a nag

#479's bar: "I'm glad it told me," not "make it stop." One notification, sent early, actionable, calm. Explicitly above the robot-mop-yells-empty floor.

My tank's getting light — about two days of watering left. A top-up whenever you're passing would be perfect. No rush.
fires ONCE at the runway threshold (ahead-of-need, never on-empty) · never repeats for the same tank cycle · never mid-crisis · dismiss = done

Voice rules applied: first person, fact-then-feeling, one line of ask, no guilt, no invented precision ("about two days", from the runway model — ≈-faithful). Proposed lines graduate into voice-strings.json → bySurface at build time; this sketch is not the canonical pool.

5 · Optionality made visible — the minimum rig is complete

ADR-0028 + the out-of-box fence, rendered: one MCU + one sensor is a whole product. Absence is nothing — no ghost slots, no grayed "add a pump" upsell, no "degraded" badge.

Monstera
s1 · myboard
Moist · thriving
minimum rig: no pump line, no tank card, no approval asks — the card simply ends here, complete
Pothos (XXL)
s2 · classic (left) · pump P2
Dry · parched
💧 last dose 120 ml · yesterday 18:04
pump-equipped: the same card + one line. Same layout, same hierarchy — presence enriched, nothing restructured

The test for every v0.9.0 surface: render it with the peripheral absent. If the absence leaves a hole, a gray slot, or an apology — the design is wrong. If it leaves nothing, it's right.

Inputs: ADR-0016 · ADR-0022 · ADR-0028 · ADR-0008 · doctrine §1–§3 · #19 · #478/#479 · #597. Sketch fidelity — iterate at v0.9.0 grooming. — Design-QA 🔍