v0.8.0 β Predict: Sprout Sees It Coming
·
141 commits
to main
since this release
Immutable
release. Only release title and notes can be modified.
What's Changed
β¨ Features
- feat(just):
just check-hostβ the no-compiler local gate + exact per-OS compiler commands (#1189) by @OrangePeachPink in #1253 - feat(just): DuckDB/Parquet tier ergonomics β store-rebuild/verify/query + docs (#1249) by @OrangePeachPink in #1288
- feat(operator): launcher-managed daily-compaction hook (#1292) by @OrangePeachPink in #1302
- feat(dx): guard against raw NUL bytes in tracked text files (#1327) by @OrangePeachPink in #1355
- feat(dx): make the firmware-free contributor path the default gate (#1337) by @OrangePeachPink in #1373
- feat(flasher): release channels β stable by default, alpha behind a checkbox (#1334) by @OrangePeachPink in #1398
- feat(launch): pack the new tile app-icon into the desktop shortcut (#1359) by @OrangePeachPink in #1400
- feat(dx): the product version agrees everywhere it is declared (#1407) by @OrangePeachPink in #1409
- feat(dx): the import-layer lint β imports go strictly downward (#1336) by @OrangePeachPink in #1412
π Bug fixes
- fix(home): the watering pass holds β retained state + frozen order (#1229) by @OrangePeachPink in #1250
- fix(just): ota host_ip path reads platformio_local.ini's password (#1268) by @OrangePeachPink in #1271
- design(flash): brand-align the web-flasher to the Sprout tokens (#271) by @OrangePeachPink in #1298
- ci(release): build the exact ref, fail closed, write once (#1346) by @OrangePeachPink in #1351
- ci(release): prove the ref, receipt the bytes, SHA-pin the rest of the fleet (#1346) by @OrangePeachPink in #1363
- ci: pin PlatformIO to 6.1.19 across the whole workflow fleet (#1346) by @OrangePeachPink in #1368
- ci(guard): finish the action pins + guard that they resolve (#1346) by @OrangePeachPink in #1377
- fix(dx): tracked paths stay Windows-clonable β rename + guard (#1337) by @OrangePeachPink in #1381
- fix(dx): the onboarding validator runs the literal
just start(#1337) by @OrangePeachPink in #1391 - ci(release): don't draft a release for a collapsed milestone (#1346) by @OrangePeachPink in #1417
π Documentation
- docs(team): the deliberately-not-at-our-scale ledger with reopen triggers by @OrangePeachPink in #1341
- docs: truth-in-docs sweep β every public statement matches the shipped system (#1332) by @OrangePeachPink in #1345
- docs: conduct reports don't route through the security channel (#1337) by @OrangePeachPink in #1383
- docs(process): record outside-PR approvals as formal GitHub reviews (#1337) by @OrangePeachPink in #1393
- docs(brand): canonical repository topics, in the repo (#1403) by @OrangePeachPink in #1404
- docs(brand): topics to the full 20 + the remaining blind-spot surfaces (#1403) by @OrangePeachPink in #1410
π§ Other changes
- feat(watering): pair a glug with its detected re-water, not compete (#1137) by @OrangePeachPink in #1230
- feat(tier): D0 TRACER β one CSV device-day β Parquet β DuckDB, fidelity-asserted (#1238) by @OrangePeachPink in #1251
- design(concepts): v0.9.0 sketches β pumps, tank, refill, minimum rig (#597) by @OrangePeachPink in #1254
- docs(ota): PLATFORMIO_UPLOAD_FLAGS replace-not-merge + newline-split trap by @OrangePeachPink in #1255
- docs(adr): ADR-0026 β Phase-1 staged amendment; anti-rollback declined (#877) by @OrangePeachPink in #1256
- feat(classifier): C0 TRACER β segments + the valid-for-trend mask, glug-validated (#1244) by @OrangePeachPink in #1257
- fix(workbench): drop the stale INTERIOR-BANDS-PROPOSED badge β the ladder is ratified (#1233) by @OrangePeachPink in #1259
- feat(cards): pulse envelope spans the anchors β all 7 moods draw (#1235) by @OrangePeachPink in #1261
- refactor(classifier): rename the C0 kind suspect β flagged (#1245 containment ruling) by @OrangePeachPink in #1266
- feat(cal): #1236 ratified wet-end re-derivation β shipped defaults by @OrangePeachPink in #1262
- feat(bands): host sibling of the RATIFIED #1236 wet-end ladder β β PAIR-MERGE with Firmware by @OrangePeachPink in #1264
- docs(release): ADR-0009 Decision 7 + RELEASE_CUT Β§7 β release-feed curation (#1258) by @OrangePeachPink in #1265
- feat(ota): local-config override for the OTA password β no secret in git by @OrangePeachPink in #1260
- feat(workbench): one vocabulary β the mood word IS the band word (#1234 render half) by @OrangePeachPink in #1267
- docs(adr): ADR-0035 Status β note the #1236 wet-end re-derivation by @OrangePeachPink in #1270
- feat(control): surface the health latch as
withheldβ the invisible-latch fix (#2) by @OrangePeachPink in #1269 - docs(cal): annotate the two #898 factor/anchor pairs β interval-dependent, both valid (#1215) by @OrangePeachPink in #1275
- migrate(classic): #1142 β retire the watering-status board (the Home grid is its replacement) by @OrangePeachPink in #1279
- feat(tier): D1 β the written store contract + the two ratification folds (#1239) by @OrangePeachPink in #1272
- feat(tier): D2 β backfill loader: all history β the store, idempotent + checked (#1240) [stacked on #1272] by @OrangePeachPink in #1274
- docs(adr): ADR-0036 β sensor-identity layers, ending the s# overload (#1042) by @OrangePeachPink in #1273
- feat(home): #1136 β the band-journey on the hero (start ring + travel arrow + one counted sentence) by @OrangePeachPink in #1276
- feat(telemetry): #1152 emit β open_adc + rate_spike at the source by @OrangePeachPink in #1277
- migrate(classic): #1149 β retire the proposed-interior-bands caveat (the ladder is ratified) by @OrangePeachPink in #1285
- design(concepts): #1148 β the voiced multi-plant history, three DRAFT concepts by @OrangePeachPink in #1286
- migrate(classic): #1143 β retire the band-movement bars (hero ladder + the #1136 journey are the destination) by @OrangePeachPink in #1280
- feat(cal): #963 Layer 1 β the runtime-writable owner-cal slot by @OrangePeachPink in #1290
- feat(tier): D4 β the ADR-0031 rollup tiers + the sparse event table (#1242) by @OrangePeachPink in #1291
- feat(classifier): C1 β the written taxonomy contract + rate-based rebound + the PASS (#1245) by @OrangePeachPink in #1278
- feat(classifier): C2 β full-history classification + per-plant validity (#1246) [stacked on #1278] by @OrangePeachPink in #1287
- feat(registry): #675 β the ADR-0029 profile dimension (loader + hardened template + seed back-fill) by @OrangePeachPink in #1281
- migrate(classic): #1147 + #1145 β the single-plant view's forecast fold + segment-truth label by @OrangePeachPink in #1294
- feat(classifier): C3 β surfaces honor the mask, the Design-ruled hatch (#1247) by @OrangePeachPink in #1295
- feat(classifier): C4 β the predicted-vs-actual backtest harness (#1248) by @OrangePeachPink in #1297
- feat(registry): #1027 data half β the honesty classes under the adopt trigger by @OrangePeachPink in #1299
- docs(spec): #1152 β finalize the instrument-exceptions spec against what shipped by @OrangePeachPink in #1300
- data(voice): #1141 next-touch pass β dashboard.py's three truth-framings to canon by @OrangePeachPink in #1301
- feat(tier): D3 β live ingest + compaction + the Β§8 freshness contract (#1241) [stacked on #1287] by @OrangePeachPink in #1289
- perf(tier): #978 β the long-range trajectory reader over the rollup tiers by @OrangePeachPink in #1305
- feat(watering): #1203 data half β the verdict layer + precision-so-far by @OrangePeachPink in #1306
- feat(registry): #1188 model half β a location edit is a MOVE, with the boundary by @OrangePeachPink in #1308
- feat(lab-notebook): #545 item 1 β planned records reach the catalog by @OrangePeachPink in #1309
- feat(contract): #1042 β the chN wire rename at schema_version=5 by @OrangePeachPink in #1293
- feat(contract): #1042 host sibling β recognize chN at schema_version>=5 [β pair-merge with #1293] by @OrangePeachPink in #1310
- revert(classic): #1311 β the confirmation-cycle restorations (ladder, bars, forecast tiles) by @OrangePeachPink in #1313
- design(concepts): #1148 round two β the directed revisions by @OrangePeachPink in #1312
- feat(operator): wire the daily-compaction hook into the launcher (#1292) by @OrangePeachPink in #1316
- fix(ci): sign a domain-separated message, not the bare image (#1282 Finding 1) by @OrangePeachPink in #1314
- chore(vendor): Monocypher 4.0.3 β the ed25519 primitive for the signing fence (#1282) by @OrangePeachPink in #1307
- feat(tier): D5 β the Predict bridge, one segment shape + the dry-down-rate view (#1243) by @OrangePeachPink in #1303
- feat(predict): #25 β the next-watering predictor + the predicted-vs-actual loop [stacked on #1303] by @OrangePeachPink in #1304
- feat(registry): #1315 β the v5 channel-key migration, built to the dry-run by @OrangePeachPink in #1317
- feat(data): #1148 β the evaluation substrate, one payload for all three candidates by @OrangePeachPink in #1318
- feat(trial): #1148 β the three evaluation surfaces, on Data's shared payload [stacked on #1318] by @OrangePeachPink in #1323
- feat(dashboard): #822 data half β the pass-anchored watering-cycle range by @OrangePeachPink in #1320
- feat(lab-notebook): #545 item 2 β the control-plane status stamp (ruling A) by @OrangePeachPink in #1322
- chore(pages): gate the flasher offer on the verified MARKER, not build-existence (#1012) by @OrangePeachPink in #1325
- feat(ota): #302 S1 β ed25519 firmware-signature verify primitive by @OrangePeachPink in #1321
- fix(firmware): cal_resolver.c carried two raw NUL bytes β the file was binary to every text tool by @OrangePeachPink in #1326
- feat(data): #1330 β the epoch stamp + admissibility sweep, built to the dry-run by @OrangePeachPink in #1347
- fix(ota): public builds have no push receiver at all β arm only when a password is provisioned (#1333) by @OrangePeachPink in #1344
- docs(contract): identity resolves on the covering assignment interval, never the open one (#1331) by @OrangePeachPink in #1342
- docs(adr-0035): drier-than-calibrated is an off-ladder range exception, not an eighth band (#1339) by @OrangePeachPink in #1348
- feat(ota): #302 S2 β the OTA gate: verify before the boot slot switches (replaces #1324) by @OrangePeachPink in #1349
- feat(cal): owner-cal persistence β a storage-agnostic, fail-closed blob codec (#963) (replaces #1329) by @OrangePeachPink in #1350
- feat(watering): #1203 UI half β confirm/reject on detected waterings + the precision readout by @OrangePeachPink in #1354
- feat(identity): #1331 β the temporal interval join, both paths + the oracle premise by @OrangePeachPink in #1356
- docs(adr-0037): the production epoch, data admissibility, and the archive boundary (#1330) by @OrangePeachPink in #1353
- ci(pages): SHA-pin the actions + pin PlatformIO on the Pages/flasher path (#1346) by @OrangePeachPink in #1358
- feat(dashboard): #822 UI half β the pass-anchored cycle range in the chip by @OrangePeachPink in #1357
- feat(data): #1330 execution half β citation amendment + stamp writer + tombstone by @OrangePeachPink in #1361
- design(charter): #1263 β the orientation convention, applied and recorded by @OrangePeachPink in #1364
- design(spec): #1335 β the mapping-UI epic spec (draft for maintainer review) by @OrangePeachPink in #1343
- design(voice): #1138 β the copula sweep (one recast, the rest ruled definitional) by @OrangePeachPink in #1365
- docs(adr-0037): record the n3jhsp ruling β bare, delete under rule 1 (#1330) by @OrangePeachPink in #1360
- docs(adr-0038): module boundaries, the import rule, and one identity implementation (#1336) by @OrangePeachPink in #1362
- fix(pages): setup-uv pinned to a tag-object SHA, not a commit β unblocks flasher publishing (#1346) by @OrangePeachPink in #1367
- docs(adr-0022): record cal ownership β Data owns values, Firmware owns the chain (#963) by @OrangePeachPink in #1370
- feat(identity): #1315 read-path translation β v4 sN folds to chN at join time by @OrangePeachPink in #1366
- docs(adr-0038): Proposed β Accepted, ratified 2026-07-20 (#1336) by @OrangePeachPink in #1372
- feat(cal): #963 β the owner-cal host write path (option 1, ratified) by @OrangePeachPink in #1374
- test(identity): #1335 β semantic pins on the merged base, and two confirmed forks by @OrangePeachPink in #1375
- test(seam): #1338 seam 1 β one identity, checked across implementations by @OrangePeachPink in #1376
- feat(diagnostics): #832 β both cross-board comparisons as selectable renderings by @OrangePeachPink in #1369
- design(brand): #1359 β the desktop app icon on a filled tile by @OrangePeachPink in #1378
- docs(adr-0038): amend Β§5 for the 0.8.x collapse β sequence unchanged, labels corrected (#1336) by @OrangePeachPink in #1382
- feat(cal): #1339 implementation half β above the ceiling the band is withheld by @OrangePeachPink in #1380
- refactor(arch): #1336 leaf extraction β design assets out of the dashboard by @OrangePeachPink in #1387
- design(spec): #963 β the cal-wizard surface against the merged receipt contract by @OrangePeachPink in #1379
- fix(identity): #1335 fork 1 β a deleted plant resolves to None at every instant by @OrangePeachPink in #1389
- feat(cal): #963 β the owner-cal wizard (stored celebrates) by @OrangePeachPink in #1390
- test(mapping): #1335 β the conformance contract (apply β save β reload β attribute) by @OrangePeachPink in #1396
- test(seams): #1338 seam 3 β ratified doctrine vs shipped behaviour by @OrangePeachPink in #1397
- test(seams): #1338 seam 2 host half β wire schema vs host parser by @OrangePeachPink in #1401
- fix(dx): announce untracked files that just check never inspected by @SAY-5 in #1395
- feat(flasher): a build cannot wear a release version it isn't β channel labelling (#1334) by @OrangePeachPink in #1399
- docs(adr-0038): module status β absence means production; mark tier_d0 legacy (#1388) by @OrangePeachPink in #1402
- brand(social): #1403 β crop-safe social card (1280Γ640, safe area in the crop intersection) by @OrangePeachPink in #1405
- feat(ota): #302 S3a β the pull decision core, native-tested (no network, no hardware) by @OrangePeachPink in #1394
- test(arch): #1336 β the build_context golden-output suite (extraction precondition) by @OrangePeachPink in #1411
- feat(workbench): #1150 β a persistent way home by @OrangePeachPink in #1413
- test(seams): #1338 seam 2 emitter half β the wire schema vs the firmware that writes it by @OrangePeachPink in #1414
- docs(status): rule pump_pulse legacy, dose_control pending β the ADR-0038 Β§7 pin (#1338) by @OrangePeachPink in #1415
- feat(ota): #302 S3b β the feed parser, built to the ruled contract by @OrangePeachPink in #1419
- docs(adr-0036): channel declaration and the board-class token (#1027, #302) by @OrangePeachPink in #1422
- refactor(home): #1335 slice 2 β one consumption point for card-to-record matching by @OrangePeachPink in #1416
- fix(serve): #1392 β Stop always stops, and the diagnostic stops giving a false all-clear by @OrangePeachPink in #1418
- test(seams): #1338 seam 1 β tier contract β the store that implements it by @OrangePeachPink in #1420
- refactor(arch): #1336 Β§5.1 β the host_paths leaf, and the extraction it unblocks by @OrangePeachPink in #1421
- feat(registry): #1027 β a channel is a first-class board declaration (+ #1388 Β§7 markers) by @OrangePeachPink in #1424
- refactor(arch): #1336 Β§5.3 β extract card_context (re-cut of #1423 onto fresh main) by @OrangePeachPink in #1425
- feat(registry): #1027 Β§5.3 β a waiting channel is a state, not a gap by @OrangePeachPink in #1426
- release(v0.8.0): the version bump β four declared sites + lockfile agree by @OrangePeachPink in #1436
- docs(credit): SAY-5's entry cites merged PR #1395, matching the file's convention by @OrangePeachPink in #1437
New Contributors
Full Changelog: v0.7.3...v0.8.0