v0.7.3 β Monitor: Sprout Gets a Voice
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
- feat(dashboard): inline field-edit β rename plants, sensors, boards (#1038) by @OrangePeachPink in #1050
- feat(dashboard): per-channel view filtering β Show-all + double-click solo (#993) by @OrangePeachPink in #1053
- design(brand): Sprout asleep (night) β sleeping/sign-off scene + social card (Workflow variant) by @OrangePeachPink in #1086
- test(cal): parameterized band re-partition invariant suite (#1153) by @OrangePeachPink in #1164
- feat(home): the production Home + hero β the Sprout Voice UI lands (#875) by @OrangePeachPink in #1160
- feat(hero): the sparkline β the pulse mandate's second element (#1171) by @OrangePeachPink in #1184
- feat(watering): the manual watering log β slice 1 of "glug glug" (#1137) by @OrangePeachPink in #1185
- feat(app): edit pot size + location in-app β close the last JSON-surgery gaps (#833) by @OrangePeachPink in #1179
- feat(ci): fork-PR credit-protection nudge β warm, non-blocking (#1126) by @OrangePeachPink in #1167
- feat(control): bounded re-wetting + absorbed/ran-through sim (#414) by @OrangePeachPink in #1183
π Bug fixes
- fix(copy): monitor give-up banner names the tethered board, not a Python None (#1032) by @OrangePeachPink in #1045
- fix(registry): migrate_static honors retired β paused, not active (#1036) by @OrangePeachPink in #1047
- fix(logger): evict archived segments from logs/ β B8's bounded-growth half (#1035) by @OrangePeachPink in #1051
- perf(fleet): circuit breaker for unanswering devices β the durable half of #953 (#1020) by @OrangePeachPink in #1054
- perf(capture): serve the page shell fast + instrument the boot (#1018) by @OrangePeachPink in #1061
- fix(#1018): renderShellState fills #cards, never wipes #overview (rescue of Data's stranded fix) by @OrangePeachPink in #1064
- fix(pages): apply the #1138 register ruling to the front-door head meta (#1181) by @OrangePeachPink in #1212
π Documentation
- docs(process): Velocity modes v2.1 β V2 standing policy, internal default, ~80% target by @OrangePeachPink in #1043
- docs(voice): move the internal pipeline + lane-self-sync from CONTRIBUTING to AGENTS (#920 slice 3) by @OrangePeachPink in #1052
- docs(bench): ESP32-C5 + S3 flash/recovery troubleshooting guide (#1046) by @OrangePeachPink in #1060
- docs(adr): ADR-0033 (Proposed) β two-surface architecture, Home + Workbench (#1044) by @OrangePeachPink in #1049
- docs(prd): add PRD-0008 public front door + launch-surface epic by @OrangePeachPink in #1068
- docs(adr): ADR-0034 β the Pages root is Sprout's public front door (FD-0, #1070) by @OrangePeachPink in #1079
- docs: link the maintainer credit to Veronica Hogue / vkhogue.com by @OrangePeachPink in #1078
- docs: add the good-first shelf replenish step to the release ritual by @OrangePeachPink in #1098
- docs: contributor-onboarding polish β claim protocol + self-credit invite by @OrangePeachPink in #1106
- docs: invite contributors to grab the contributor card (CONTRIBUTORS_WELCOME) by @OrangePeachPink in #1108
- docs(hardware): ADC1 sensor-ceiling-per-board table β the 4β6 scale headroom (#1039) by @OrangePeachPink in #1116
- dx(community): the contributor "what to expect" doc (#1105) by @OrangePeachPink in #1112
- docs: de-internal-ize contributor-facing surfaces + delete stale #740 CI note by @OrangePeachPink in #1131
- process(agents): stage A β docs/team/OPERATIONS.md canonical + the contributor fence (#1125) by @OrangePeachPink in #1130
- process(agents): stage B β AGENTS.md contributor-true; doctrine lives in OPERATIONS.md (#1125) by @OrangePeachPink in #1132
- docs(gtm): fold the plant/data-overlap audience doctrine into the GTM docs (#1039 item 5) by @OrangePeachPink in #1154
- docs(contributing): "Using a coding agent?" section + retire intro honesty lexicon (#1127) by @OrangePeachPink in #1140
- docs(adr): ADR-0033 grill amendment β Home card grid + Classic Sprout (Proposed β Accepted, #1044) by @OrangePeachPink in #1110
- docs(firmware): instrument-exceptions source-side spec (#1152) by @OrangePeachPink in #1159
- docs(refs): post-split AGENTS.md reference audit β classify + close the class (#1158) by @OrangePeachPink in #1163
- docs(experiments): extended in-situ dry-down (peak-summer) for #995 (#1174) by @OrangePeachPink in #1192
- docs(llms): apply #1138 β definitional intro, not personified (FD-3 delta) by @OrangePeachPink in #1187
- docs(contributors): list external contributors by handle before the 0.7.3 cut (#1196) by @OrangePeachPink in #1201
- docs(front-door): Trust Your Sensor live on Pages β FD-5 (#1075) by @OrangePeachPink in #1206
- docs: fix stale ADR range + broken cd in onboarding (#1092, #1093) by @OrangePeachPink in #1214
π§ Other changes
- fix(fleet): loud identity mismatch β a ghost board can never need a screenshot again (#1026) by @OrangePeachPink in #1058
- feat(#966): rig-location setup UI β enable shading + weather from Diagnostics by @OrangePeachPink in #1062
- feat(#1027): adopt an answering board + migrate the sensorless roster (Data structure) by @OrangePeachPink in #1063
- feat(#995): the per-sensor health page β QA signals on the running rig by @OrangePeachPink in #1065
- docs(design): FD-1 front-door design brief + render-1:1 copy deck by @OrangePeachPink in #1067
- design(brand): FD-1 hero mark β self-contained animated Sprout by @OrangePeachPink in #1081
- fix(brand): hero-mark aria-label three-leaf (matches geometry) by @OrangePeachPink in #1084
- feat(pages): the Sprout front-door hub + FD-2 head block (FD-1) by @OrangePeachPink in #1083
- chore(deps-dev): bump the python group with 2 updates by @dependabot[bot] in #1091
- chore(deps): bump the actions group with 3 updates by @dependabot[bot] in #1090
- design(brand): optional "I contribute to Sprout" contributor card (4 formats) by @OrangePeachPink in #1107
- feat(dashboard): add hover tooltips to range buttons by @rushika1503 in #1102
- design(brand): voice-clean the social card + og/favicon head polish by @OrangePeachPink in #1101
- feat(#875): the per-plant card payload seam β the Sprout Voice UI's Data half by @OrangePeachPink in #1114
- copy: warm, sentence-case empty-state strings in Lab detail view by @siddhanttiwari19 in #1115
- design(home-card): brief + before/after exhibits at n=1/4/24 (#875) by @OrangePeachPink in #1113
- design(brand): the "asleep" illustration + a LinkedIn social card by @OrangePeachPink in #1087
- feat(#875): grill decisions Q2/Q3/Q4 β detected re-water, exceptions lane, photo intake by @OrangePeachPink in #1119
- design(home-card): identity & differentiation section (#875) by @OrangePeachPink in #1120
- design(assets): identity asset library v1 (#1121) by @OrangePeachPink in #1122
- design(assets): asset library batch 2 β persimmon + 8 silhouettes (#1121) by @OrangePeachPink in #1123
- fix(pages): complete OG head and favicon set by @Thanazar in #1117
- design(voice): #1089 honesty sweep β CITATION abstract + ORCID + README/discussions by @OrangePeachPink in #1099
- docs(adr): ADR-0028 β the three-pattern absence vocabulary + calm-empty (#1039) by @OrangePeachPink in #1155
- docs(adr): ADR-0035 β the band model & instrument-exceptions taxonomy (Proposed, #1039) by @OrangePeachPink in #1156
- perf(#1134): bound the forecast input to a recent window for wide corpora by @OrangePeachPink in #1157
- feat(#1039 Q4): finish the photo spec β format allowlist + size cap + serving path by @OrangePeachPink in #1166
- feat(cards): cal-provisional is system-level, not a per-card chip (#1039) by @OrangePeachPink in #1170
- feat(#1133): bind the trend + forecast windows to the inter-watering segment by @OrangePeachPink in #1162
- design(assets): asset library batch 3 β complete 24-plant set (#1121) by @OrangePeachPink in #1135
- design(exhibit): 24-up density β mark + identity at grid scale (#875) by @OrangePeachPink in #1168
- design(charter): the color-roles charter (V1) β #930 rescoped by @OrangePeachPink in #1109
- design(voice): event-free variants per mood + {ago} templates β morning read (#875) by @OrangePeachPink in #1165
- chore(pages): add front-door indexing package by @Thanazar in #1129
- design(tokens): the full creative palette β materials, chrome, chart series (#930) by @OrangePeachPink in #1176
- docs(adr): ADR-0003 β fix stale AGENTS.md Β§ Lane attribution ref (DX audit) by @OrangePeachPink in #1175
- design(brand): the alignment pass β grill canon into the doctrine (#1139) by @OrangePeachPink in #1177
- design(brand): hand-tuned favicons β designed at 16/32 (#1124) by @OrangePeachPink in #1178
- feat(workbench): 14d timeframe on Classic charts/history (#1191) by @OrangePeachPink in #1193
- test(serve): route coverage for the / and /classic shells (#1173) by @OrangePeachPink in #1194
- design(watering): the glug glug one-tap β UI half of #1137 by @OrangePeachPink in #1195
- ci(voice-guard): keep the retired register out β changed-lines check + RELEASE_CUT backstop (#1161) by @OrangePeachPink in #1180
- process(ops): OPERATIONS.md tidy β the lane-worktree convention + ADOPTION.md link (#1172) by @OrangePeachPink in #1182
- ci(observability): per-hook job-summary table on every run (#1190) by @OrangePeachPink in #1198
- docs(schema): land the open_adc + rate_spike fault reasons (#1152 Placement A) by @OrangePeachPink in #1200
- design(chart): focus-tap β legend saturates one series to ink (#1186) by @OrangePeachPink in #1204
- feat(dx): board-hygiene lint β the board must tell the truth (#732) by @OrangePeachPink in #1205
- fix(voice): the last chrome straggler β the channels caption joins the reading register (#1099 class) by @OrangePeachPink in #1208
- process(cut-prep): v0.7.3 doctrine amendments β shelf ruling Β· metadata sweep Β· board-hygiene Β· force-push clarity by @OrangePeachPink in #1207
- docs(bands): #995/#1174 ratification derivation β both envelopes measured by @OrangePeachPink in #1210
- fix(voice): close the '= truth' form β two instances + the guard learns it (#1161 follow-up) by @OrangePeachPink in #1209
- test(analytics): band_for_raw + forecast boundary helpers (#1094, #1095) by @OrangePeachPink in #1213
- design(front-door): the title joins the canon β 'Sprout β plants with a pulse' (#1181 tail) by @OrangePeachPink in #1216
- docs(adr): ADR-0035 β Accepted β the #1174/#1211 ratification landed (#995) by @OrangePeachPink in #1217
- design(front-door): scale-safe first-person count β 'a windowsill of plants' / 'every pot' (#1219 tail) by @OrangePeachPink in #1222
- feat(cal): #995-ratified 7-in-soil band ladder β shipped defaults (option A) by @OrangePeachPink in #1218
- feat(bands): host sibling of the #1218 ratified cal ladder (#1153) by @OrangePeachPink in #1220
- release(v0.7.3): version sync β pyproject Β· CITATION Β· PLANTS_FW_VERSION Β· JSON-LD (+ the RELEASE_CUT target line) by @OrangePeachPink in #1223
New contributors π±
Three people joined Sprout in this release β the first outside hands on the project, arriving within hours of the good-first shelf opening. Every one of them is named in CONTRIBUTORS.md:
- @rushika1503 β hover tooltips on the dashboard time-range buttons (#1102)
- @siddhanttiwari19 β warm, sentence-case empty-state copy in the Lab detail view (#1115)
- @Thanazar β two merged PRs: the front-door OpenGraph head + favicon set (#1117) and the full FD-3 indexing package β
sitemap.xml,robots.txt,llms.txt, and the alt-text register (#1129)
Thank you β the door stays open. Tend well.
Full Changelog: v0.7.2...v0.7.3