v0.7.1 β Wave 1: Monitor
What's Changed
β¨ Features
- feat(process): release machinery β auto-draft on milestone close, notes-hygiene warn, turnkey cut checklist by @OrangePeachPink in #745
- feat(design): header orientation copy in Sprout's voice (#722) by @OrangePeachPink in #749
- feat(design): link Docs Front Door + Design Library from Diagnostics & Logs (#758) by @OrangePeachPink in #772
- feat(design): interim fleet palette β distinguish devices by line style (#686) by @OrangePeachPink in #774
- feat(design): within-band urgency on the cards β order by need + a position cue (#715) by @OrangePeachPink in #781
- feat(design): render the header orientation line from the voice pool (#722) by @OrangePeachPink in #787
π Bug fixes
- fix(design): metrically-aware font fallback stacks in the tokens (#116) by @OrangePeachPink in #746
- feat(design): plant-first cards β lead with the plant, no machine IDs (#713 #714 #688) by @OrangePeachPink in #761
- fix(design): standard light/dark toggle β retire 'soil mode' (#723) by @OrangePeachPink in #763
- fix(design): scope Monitor view controls to the tabs where they act (#708) by @OrangePeachPink in #773
- feat(design): split calibration ladder β Watering status (Monitor) + Calibration reference (Diagnostics) (#716) by @OrangePeachPink in #775
- fix(design): render the four-tab nav on /lab pages β Lab stays first-class (#684) by @OrangePeachPink in #777
- fix(design): short-channel device cards keep normal columns, not full-width (#709) by @OrangePeachPink in #779
- fix(design): consolidate the cal-provisional banner to one fleet note (#687) by @OrangePeachPink in #780
- fix(dashboard): Watering-status ladder chips plant-first, retired excluded (#803) by @OrangePeachPink in #815
- fix(dashboard): single-plant navigator jump-list plant-first, retired excluded (#804) by @OrangePeachPink in #817
- fix(dashboard): channel toggle per live plant, plant-first, not channel index (#805) by @OrangePeachPink in #819
- fix(design): card shows friendly short board name + left/right side (#806) by @OrangePeachPink in #820
- fix(dashboard): floor the single-plant detail chart y-axis at 0 (#797) by @OrangePeachPink in #847
- fix(design): SVG geometry moustaches parse-error on public pages β bind via sc-camel- (#886) by @OrangePeachPink in #895
π Documentation
- docs(design): design doctrine β four-question test + two-jobs split rule (#726) by @OrangePeachPink in #742
- docs(process): one verification signal β the Status column (#729 ruling) by @OrangePeachPink in #755
- docs(adr): ADR-0029 β plant/pot/site profile registry, the inference dimension (#675) by @OrangePeachPink in #762
- docs(adr): register hygiene β ADR-0027 row reflects its accepted, shipped state by @OrangePeachPink in #784
- docs(adr): ADR-0020 Β§2 β mDNS hostname = the stable device_id nonce (reconcile #760) by @OrangePeachPink in #786
- docs(adr): register row β ADR-0025 Proposed β Accepted (maintainer-ruled, mechanism live in v4) by @OrangePeachPink in #799
- docs(design): out-of-box fence β golden path never requires soldering/mods (#801) by @OrangePeachPink in #846
- docs(adr): ADR-0030 (Proposed) β version identity, build provenance & display contract (#831) by @OrangePeachPink in #851
- docs(adr): ADR-0029 v2 (Proposed) β harden the profile schema for the three hard cases (#675) by @OrangePeachPink in #854
- docs(adr): ADR-0031 (Proposed) β read-path rollup tiers over immutable raw (#828) by @OrangePeachPink in #858
- docs(readme): stop the opening overclaiming watering β honest in the prose, too (Refs #59) by @OrangePeachPink in #874
- design(concepts): v0.9.0 watering/tank/optionality sketches β Library entry (#597) by @OrangePeachPink in #879
- docs(firmware): correct the stale ESP32-C5 platformio.ini flash comment by @OrangePeachPink in #891
- docs(evidence): clean-machine onboarding log (2026-07-09) + gap map by @OrangePeachPink in #893
π§ 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 displays local (#720) by @OrangePeachPink in #770
- test(fleet-logger): pin the reboot-session dedupe invariant on the restart seed (#703) by @OrangePeachPink in #771
- feat(analytics): per-device gap/continuity surfacing for the WiFi fleet (#699) by @OrangePeachPink in #776
- feat(dashboard): offline/stale gate β stop stale readings reading as live (#698) by @OrangePeachPink in #782
- feat(analytics): resolve firmware + app/server versions with a behind/restart cue (#719) by @OrangePeachPink in #778
- feat(dashboard): always-live refresh model β retire the redundant auto toggle (#724) by @OrangePeachPink in #785
- feat(dashboard): give 'Stop server' its own place, an explanation, and a visible confirm (#721) by @OrangePeachPink in #788
- chore(dx): cspell top-up β clear DesignQA-flagged advisory terms (#789) by @OrangePeachPink in #791
- feat(dashboard): single-plant detail navigator β back / prev / next / jump-to-plant (#725) by @OrangePeachPink in #792
- feat(dashboard): replace the integrity row dump with a log-locator + bounded summary (#685) by @OrangePeachPink in #783
- feat(dashboard): render sensorless plants as first-class 'alive, not probed' cards (#679, ADR-0028) by @OrangePeachPink in #793
- feat(dashboard): trajectory chart readable β plain title, plant-first legend, y-floor 0 (#718, #32) by @OrangePeachPink in #794
- feat(dashboard): retire/archive a device β stale test rigs stop crowding the live fleet (#683) by @OrangePeachPink in #790
- feat(dashboard): band-movement view β which way each plant is heading over time (#627, #717) by @OrangePeachPink in #795
- fix(test): stop the offline-stale test writing fixture CSVs into the repo root (#698) by @OrangePeachPink in #796
- fix(dashboard): wire the stranded #719 version + #698 stale-card render halves by @OrangePeachPink in #798
- docs(sensing): document the ~1-sample band-label lag (anti-flap hysteresis) (#678) by @OrangePeachPink in #800
- fix(logger): never assert DTR/RTS on serial open β kill the reconnect-storm reset (#566-B, #712) by @OrangePeachPink in #802
- feat(fleet): address the WiFi fleet by mDNS hostname + IP fallback + registry self-heal (#676 host half) by @OrangePeachPink in #809
- fix(dashboard): Moisture-history count agrees with the masthead β live channels only (#807) by @OrangePeachPink in #818
- fix(serve): traversal-guarded /docs static route so the front-door links resolve (#808) by @OrangePeachPink in #816
- feat(dashboard): add a 48h range chip between 1d and 7d (#821) by @OrangePeachPink in #823
- feat(firmware): Phase-0 LAN OTA receiver on esp32dev + C5 (#302) by @OrangePeachPink in #824
- feat(firmware): OTA Phase-0 hardening β rollback + WDT-feed + just ota (#302) by @OrangePeachPink in #825
- chore(firmware): C5 recovery/OTA envs + board-aware just ota + evidence packet (#830) by @OrangePeachPink in #838
- fix(dashboard): header + date fields read clean local time, no UTC (#840) by @OrangePeachPink in #845
- fix(logger): bounded absent-port retry with an honest give-up (#813, F5-B) by @OrangePeachPink in #848
- dx(ops): report logical collectors by launch tree, not tree-member rows (#811) by @OrangePeachPink in #849
- fix(serve): /collection/status reports configured vs answering (#812) by @OrangePeachPink in #850
- fix(dashboard): trajectory plots the recent contiguous run past a multi-day gap (#839) by @OrangePeachPink in #855
- perf(serve): parse once, serve from memory β mtime-aware corpus cache (#827) by @OrangePeachPink in #857
- fix(dashboard): trajectory x-axis counts back from now=0 at the right (#841) by @OrangePeachPink in #852
- chore(license): add MIT license β LICENSE + README section + pyproject field (Refs #37) by @OrangePeachPink in #860
- chore(hygiene): genericize the workspace path in the cspell config comment (Refs #861) by @OrangePeachPink in #862
- chore(hygiene): genericize home LAN subnet + hostname in evidence docs (Refs #861) by @OrangePeachPink in #864
- chore(rename): repoint OrangePeachPink/plants -> /sprout across docs + tooling; AGENTS.md go-public note by @OrangePeachPink in #866
- docs(readme): go-public pass β honest "A look" + open/MIT + finish rename (Refs #867) by @OrangePeachPink in #868
- docs: add CONTRIBUTORS β name the maintainer as lead/initial developer (Refs #861) by @OrangePeachPink in #869
- chore(firmware): S3 OTA env (esp32s3_ota) + 2026-07-08 onboard/OTA evidence (#842) by @OrangePeachPink in #843
- docs(experiments): 2026-07-07 watering dose-response report + raw data (#834) by @OrangePeachPink in #844
- docs(readme): dynamic release version badge β tracks releases, no silent staleness (Refs #59) by @OrangePeachPink in #871
- fix(dashboard): exclude retired devices from the fw-mixed version cue (#856) by @OrangePeachPink in #878
- docs(readme): add Releases + CHANGELOG entry points (Refs #870) by @OrangePeachPink in #880
- perf(serve): byte-offset tail-parse of the active log file (#859) by @OrangePeachPink in #881
- data(watering): event-annotated DuckDB view over the 2026-07-06 captures (#835) by @OrangePeachPink in #882
- data(watering): per-plant dose->response arc for the 2026-07-06 session (#836) by @OrangePeachPink in #883
- ci(gate): wire tools/analytics/ into just check β test-analytics recipe (Refs #853, local scope) by @OrangePeachPink in #884
- docs(pages): repoint live .dc.html links to Pages URLs + root index.html (Refs #876) by @OrangePeachPink in #885
- docs(dx): add the DX review lens with the out-of-box check (Refs #801) by @OrangePeachPink in #887
- dx(epic-lint): body-checkbox + unattached-ref checks + idempotent comment + event trigger (Refs #810) by @OrangePeachPink in #888
- chore(deps-dev): Bump ruff from 0.15.20 to 0.15.21 in the python group by @dependabot[bot] in #894
- docs(adr): ADR-0032 β GitHub Pages serving for the Design Library (#876 AC-3) by @OrangePeachPink in #897
- docs(experiments): 2026-07-10 bench closeout β watering + #829 re-cal + C5 portability + placement + sensor map by @OrangePeachPink in #898
Full Changelog: v0.7.0...v0.7.1