Skip to content

Releases: OrangePeachPink/sprout

v0.8.1 — Architecture hardening, and the Predict delta

Choose a tag to compare

@github-actions github-actions released this 26 Jul 01:20
Immutable release. Only release title and notes can be modified.
c959ba7

Architecture hardening, and the Predict delta

v0.8.0 was called "Predict" and its forecast never reached a surface. A blind review across
eight independent tracks found it after the fact — the headline model existed, was tested, and
was reachable by nothing a person could see. That gap became
PRD-0009,
and eight of its nine ratified requirements ship here.

The rest of the release went after the seams underneath — and kept finding the same defect, five
separate times: a layer correct about the question it asks, and silent about the one nobody wired.


Your plants now say one thing, in one place

Every surface used to reach its own conclusion about a plant. Now there is one composed state
and the card, the queue, and the chart all read from it rather than re-deriving it.

  • The attention model decides once what a plant needs. The harm level fires on plants trending
    badly, not only on broken instruments; the calm signal is affirmative and time-bound; a plant that
    was just watered is held rather than re-nagged.
  • An untrustworthy reading predicts nothing. A sensor we don't believe stops producing forecasts
    instead of producing confident ones.
  • The queue is ordered by forecast, not by wetness — and it is the same ordering the card
    shows, asserted in code so the two cannot drift apart.
  • The forecast appears on the history chart, with an unmistakable boundary between what was
    measured and what is predicted, and a confidence vocabulary where the interval is the how-sure.

Adding a board no longer requires knowing how Sprout works

The whole path, in the app: describe your hardware → map probes to plants → flash → it reports.
No JSON, no config files, no command line. You declare the board before flashing it, and Sprout
keeps what you set up when the board first speaks. A board that answers but isn't registered is
offered for adoption rather than ignored.

Things that were quietly wrong, and aren't

  • The health strip stopped crying wolf. Every sensor was drifting toward "inspect" — not because
    the hardware was failing, but because three signals counted any single event, ever over unbounded
    history. Older boards scored worse purely for being older. Now they are rates, dropout cadence is
    measured locally instead of pooled across logging regimes, and an instrument with no readings gets
    no verdict rather than a clean bill of health.
  • The zero state names the real state instead of waiting forever; the serial lock says who holds
    the port and what to do about it; Ctrl-C exits clean; just doctor turned a wall of output into a
    checklist.
  • Charts say when they're frozen rather than going silently stale, and the wide-window build is
    twice as fast.

Under the hood

  • The package flip: tools is importable by name and 227 lines of sys.path surgery are gone,
    with byte-identical output.
  • Release integrity, walked rather than assumed. A dry-run of the entire signing chain — draft,
    sign, verify, publish, resolve, delete — on a throwaway tag found a cut-blocking defect on its
    first run
    : the signer could not resolve a draft, and would have produced a second asset-less
    release with an error blaming the operator for a draft that already existed.
  • Signed-pull OTA reached hardware, dark by construction. The feed fails closed.

The record, corrected

v0.8.0's entry was missing from the changelog entirely for four days while the file still
announced it as the next cycle. It is now written, honestly: that release shipped its foundations
and not its name, and it published with zero assets because the signer ran after publish and
GitHub refused the upload to an immutable release.

Releases now carry a theme-conformance gate — a themed release is not closed until someone
asks whether the name became true on the operator's surface.

Known scope, carried rather than hidden

  • The health analysis still reads pre-production bench rows; lab sessions are unmarked on the
    timeline (#1634,
    #1635).
  • The version guard doesn't inspect uv.lock, and doesn't check dates at all — both found during
    this cut (#1633,
    #1637).

Per-component detail is in
CHANGELOG.md.


Full generated commit list

What's Changed

✨ Features

🐛 Bug fixes

📖 Documentation

  • docs(adr-0003): the v0.8.0 process standardization — the ratified retro package by @OrangePeachPink in #1441
  • docs(team): the D pass — OPERATIONS + CONTRIBUTING sync to tonight's ratified process by @OrangePeachPink in #1450

🔧 Other changes

Read more

v0.8.0 — Predict: Sprout Sees It Coming

Choose a tag to compare

@github-actions github-actions released this 21 Jul 18:22
Immutable release. Only release title and notes can be modified.
b9b5980

What's Changed

✨ Features

🐛 Bug fixes

📖 Documentation

🔧 Other changes

Read more

v0.7.3 — Monitor: Sprout Gets a Voice

Choose a tag to compare

@github-actions github-actions released this 19 Jul 17:28
7fe3c10

Monitor: Sprout Gets a Voice. The surface we designed first is now the product: open Sprout and meet your plants — a card grid in Sprout's own voice, most-thirsty first, each plant wearing its mood, with the instrument workbench one click behind it. Underneath the voice, the measurements grew up too: the seven-band ladder was re-derived from a six-day in-situ dry-down on the real windowsill fleet, ratified band by band, and shipped to both firmware and host as doctrine (ADR-0035, Accepted). And the door is open — this release ships with our first three community contributors named in CONTRIBUTORS.md.

Per-component reality (ADR-0009 §3)

  • Host — the production Home + hero (two-surface architecture, ADR-0033 Accepted): the voice pool with event-free variants, the pulse histogram + segment-bound sparkline, one-tap "Glug glug" watering log, the 14d window, the full creative palette + chart focus-tap, in-app pot/location editing, shell route coverage.
  • Firmware — the ratified band ladder (the one flash-affecting change: all seven levels in-soil, boundaries measured + ratified); the native suites grew (band-partition invariants, the dose-control sim — sim-only, not linked into the shipped build); the coincident water-anchor relax.
  • Docs & process — ADR-0033 + ADR-0035 Accepted with measured numbers · the color-roles charter + BRAND.md canon · the audience-scoped instruction-file split (#1125) with the credit-protection CI · the contributors roster · Trust Your Sensor live on Pages · the voice-guard, per-hook job summary, and board-hygiene tooling.

Release evidence

  • Register sweep (just voice-guard --all): user-facing surfaces clean; remaining hits are internal code-comment names of shipped concepts (the kept class).
  • Board hygiene (just board-hygiene): zero drift; one advisory (v0.8.0 sizing, routed to planning).
  • Weekly full battery (firmware included): green, fresh at cut. 58 accelerated merges, zero reverts (#1048's final tally).

What's Changed

✨ Features

🐛 Bug fixes

📖 Documentation

🔧 Other changes

Read more

v0.7.2 — the monitor you can trust

Choose a tag to compare

@OrangePeachPink OrangePeachPink released this 12 Jul 02:49
9f95430

Sprout 0.7.2 is the release where the logger became unkillable and the plants got a real registry.

The headline promise, kept: just be a damn logger and never stop. The collection worker now supervises itself, restarts on any death, refuses loudly instead of silently, and every failure it can still hit writes itself into a log in plain words. The dashboard's one button never lies about recording state.

The other half: Plants & Sensors — your real fleet in a tab. Add plants and sensors, map any sensor to any plant with a plant-first picker (no channel soup), pause what's resting, and permanently delete what's gone — with a receipt showing exactly what left the disk. Classic review-then-save; nothing changes until you say so.

Also aboard: per-channel calibration tiers live on the wire and honest on every chip (a fully-calibrated channel wears no badge at all), an opt-in environment overlay (context, not cause), era-aware provenance that never cries VIOLATION at your own history, a web flasher that offers only what's bench-proven, ed25519 release signing (this release is its first live fire), and the dashboard's old 15-second slowness diagnosed down to ~3.

Grown on a kitchen windowsill. Raw counts + band are the truth. tend well. 🌱


What's Changed

✨ Features

🐛 Bug fixes

📖 Documentation

Read more

v0.7.1 — Wave 1: Monitor

Choose a tag to compare

@github-actions github-actions released this 10 Jul 20:00
d49d539

What's Changed

✨ Features

🐛 Bug fixes

📖 Documentation

🔧 Other changes

  • chore(process): epic sub-issue hygiene lint (ADR-0003 §2 self-enforcing) by @OrangePeachPink in #682
  • docs(release): version-milestone roadmap + first release criteria (ADR-0009) by @OrangePeachPink in #696
  • docs(process): release/milestone mechanics + GitHub-native-by-default principle by @OrangePeachPink in #705
  • docs(process): agent-lane roster — retire Sage/Ingest, expand DX, DesignQA leads design by @OrangePeachPink in #706
  • docs(release): codify the release-notes quality bar (ADR-0009 §6) by @OrangePeachPink in #733
  • docs(process): standardize Priority (P0–P3) + Size (XS–XL) meanings by @OrangePeachPink in #737
  • chore(process): commits credit the maintainer — drop AI co-author trailers by @OrangePeachPink in #738
  • ci: velocity-first sprint posture — fast per-PR lane + weekly full battery (#740) by @OrangePeachPink in #741
  • docs(evidence): fix merged install-record ref #20 -> #679 (sensorless dashboard) by @OrangePeachPink in #681
  • docs: post-v0.7.0 docs-pass — README + BOARDS reflect the shipped Wi-Fi fleet by @OrangePeachPink in #744
  • feat(data): plant-first identity data-shape — probe/board-name/side/plant-meta (#713 Data half) by @OrangePeachPink in #743
  • fix(quality): flag sub-wet-rail soil readings as sensor fault, not a moisture band (#670) by @OrangePeachPink in #672
  • feat(data): watering-status data-shape — within-band position + sortable dryness (#715 Data half) by @OrangePeachPink in #747
  • docs: re-validate onboarding vs shipped v0.7.0 (#690) — fleet-start step + CI-posture drift fix by @OrangePeachPink in #748
  • fix(data): run ContextFiller on the fleet logger — interior temp/RH fills untethered soil rows (#701) by @OrangePeachPink in #750
  • feat(firmware): emit schema v4 — config_id + rssi/uptime/heap + SENSOR_FAULT (#739) by @OrangePeachPink in #754
  • fix(dx): pre-commit npx→language:node — kill the focus-stealing cmd.exe windows (#664) by @OrangePeachPink in #751
  • docs(dx): PlatformIO first-run behavior + clean-reset runbook (#692) by @OrangePeachPink in #752
  • docs(dx): add sprint-CI-posture revert to the go-public checklist (#740) by @OrangePeachPink in #753
  • docs(dx): §2 runbook hardening — confirmed dual-Python fix + pioarduino-IDE unwanted guard (#692) by @OrangePeachPink in #756
  • feat(data): parse_v1 schema-v4 extension — config_id / rssi·uptime·heap / SENSOR_FAULT (#739 Data half) by @OrangePeachPink in #759
  • feat(firmware): advertise sprout-<device_id>.local via mDNS (#676) by @OrangePeachPink in #760
  • feat(dx): headless collection lifecycle — just collection start|stop|status + reclaim (#689) by @OrangePeachPink in #764
  • fix(dashboard): settled summary stats — no warmup / fault-zero pollution (#697) by @OrangePeachPink in #765
  • docs(dx): the Docs Front Door + doc-IA map, cross-linked with the Design Library (#757) by @OrangePeachPink in #766
  • feat(data): host cal-state reader — calibrated boards stop rendering provisional (#404) by @OrangePeachPink in #768
  • test(data): host session-tolerance — a reset-driven session change is not churn (#712) by @OrangePeachPink in #769
  • feat(dx): local time on the dashboard face — render the bare-UTC displa...
Read more

v0.7.0 — Wave 1: Monitor

Choose a tag to compare

@OrangePeachPink OrangePeachPink released this 05 Jul 23:30
8f82fd6

🌱 Wave 1 — Monitor. The plants are online.

Sprout's first release. Eleven windowsill plants, monitored by WiFi-only ESP32s — one power cord each, zero data cables, zero bench time — all visible live in one dashboard, readings logged durably around the clock. This is the baseline every future release builds on.

✨ Highlights

  • The untethered fleet — two proven ESP32 boards (classic + official C5) run on brick power and serve their own telemetry over WiFi; one Start governs collection. No serial tether at go-live.
  • One honest dashboard — four-destination IA (Monitor / Capture / Lab / Diagnostics & Logs), raw ADC + band words as truth (percent only ever a labelled index), canonical moods bound to the band map, device-scoped calibration ladder, live-by-default.
  • Identity model (ADR-0027) — minted stable device IDs, a channel≠probe split, and a registry as the authoritative name home, so a plant's name survives reflashes and DHCP.
  • Optional-peripherals doctrine (ADR-0028) — the minimum Sprout (1 MCU + 1 soil sensor) is complete; every peripheral is optional and absence is first-class. Wave 1 ran 8 instrumented plants + 3 sensorless-by-design, honestly.
  • First closed prediction loop — a blind drydown forecast scored 7/8 against install-night actuals; the one miss now seeds the Wave-2 predictor.

📖 Notable decisions this release

ADR-0027 (identity) · ADR-0028 (optional peripherals) · ADR-0009 (versioning & release policy — this release is its first exercise) · the four-tab information architecture.

⚠️ Honest scope (carried, not hidden)

  • C5 bands are provisional until per-board ADC calibration (Wave 2, #443).
  • The !wedge safety check was not re-run at this install (boards went straight to untethered) — tracked in #599.
  • The yellow C5 (yyvvpd) is minted and shelved as a hot spare; recovery is non-urgent headroom.

Notes

Sprout's first tracked release — earlier development lives in the git history, not in prior release notes; the changelog discipline starts here (nothing before this is reconstructed — that would invent history). This is a private, pre-public release — the deliberate road to 1.0.0 is the Wave-4 public launch (ADR-0009: 1.0 is a chosen milestone, never reached by counting). v0.7.0 is the baseline tag; from here, release notes generate automatically tag-to-tag.

Full Wave-1 record: #584.