Skip to content

v0.8.1 β€” Architecture hardening, and the Predict delta

Latest

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

Full Changelog: v0.8.0...v0.8.1