DIGITAL STEALTH CARE · CHANGELOG
Digital Stealth Care, release by release.
Every release and feature, dated, newest first. The bugs, the incidents told in full and the lessons behind them are one filter away, in the state they are really in.
● bug states shown as they are, never rounded up
● releases, features and fixes on one timeline
How fixes are checked
By using the software. A fix is checked in daily use on the real hardware; if it doesn’t hold, the bug gets a new report rather than a quiet edit, so a relapse stays on the record. Every row is shown in the state it is in.
Changelog · every release and feature, dated · fixes one filter away
Releases, features and milestones show first. Switch on bugs, incidents and lessons with the filters to see the whole record: bugs are shown in the state they are in, and nothing here is rounded up.
Below the timeline: the newest 60 entries as a plain list. Every entry and write-up also has a page of its own.
CHANGELOG · THE NEWEST 60, AS A PLAIN LIST
Newest first, for when the timeline above is not running. Use the timeline’s search and filters for everything else.
18 Sep 2026 · Milestone · CannaLib, DSC, Site · Released
Journey and log become one timeline
Write-ups are now journey entries. One vertical timeline, newest first, with a column per product; /log/ opens it filtered to write-ups.
18 Sep 2026 · Decision · CannaLib, DSC, Site · Released
75 held entries published, details withheld
Entries never cleared for private details are now on the timeline with title, date and state only. Their details are not served anywhere.
17 Sep 2026 · Publish · CannaLib, DSC, Site · Released
55 bench logs from the last ten days
55 write-ups dated to the nights they happened (7 to 17 Sep), illustrated only with demo screenshots, charts of recorded numbers and our own photos.
17 Sep 2026 · Publish · DSC, Site · Verified
Copy pass; old DSC help retired
Stale versions, limits and repo links fixed across 12 pages. /dsc/help/ and /dsc/manual/ now redirect into the guide, and /dsc/build/ was rewritten from the v4 firmware.
17 Sep 2026 · Feature · DSC, Site · Released
/dsc/ rebuilt as a product page
The DSC home was regenerated from the capabilities list: 15 feature areas, screenshots and clips from the public demo, a makers wall and a searchable equipment table.
17 Sep 2026 · Publish · DSC, Site · Released
/dsc/supported/: the equipment directory
A searchable directory of 3,095 products from 710 brands, 2,580 of them recognised automatically, built from DSC-KitLib 0.8.0.
17 Sep 2026 · Bug fixed · DSC, Site · Verified · High
Firmware page listed bugs instead of releases
Divi 5's loop keeps only one taxonomy filter, so /dsc/firmware/ dropped 'Kind = Release' and showed the 12 newest DSC bug entries. It now filters on Release alone.
17 Sep 2026 · Publish · DSC, Site · Verified
User guide re-verified for 9.0.0
All 75 guide pages were checked against the 9.0.0-AlphaPi code, corrected where they disagreed, and restamped 'verified for 9.0.0'.
16 Sep 2026 · Feature · DSC, Site · Released
Release manifest and library hosting
A public release manifest for hub update checks, and the site now hosts DSC-KitLib and DSC-NuteLib releases with a manifest hubs can update from.
15 Sep 2026 · Feature · DSC, Site · Released
DSC alpha sign-up; releases hosted here
An alpha sign-up form on /dsc/alpha/, and DSC releases are hosted on this site instead of GitHub. The next release is named on the page.
15 Sep 2026 · Decision · DSC, Site · Released
The DSC user guide lives on the site
The DSC-Brain user guide (nine sections, about 70 pages) is maintained at /dsc/guide/ from now on. The old Notion copy is frozen.
15 Sep 2026 · Feature · DSC, Site · Operational
Version stamps follow the test kit
The test kit reports the versions it is actually running every 15 minutes, and the DSC stamps on the site read that report instead of hand-typed numbers.
14 Sep 2026 · Bug fixed · DSC · Verified · Low
Pre-existing pytest teardown flakiness (paho-mqtt loop_stop)
FIX 2026-09-06 (code landed, unverified — no brain venv here to run pytest): zigbee_mqtt.ZigbeeIngest.stop() now (1) calls disconnect() before loop_stop() so paho winds its loop do
14 Sep 2026 · Bug fixed · DSC · Verified · Low
‘Update available’ false positive: nags to update 8.0.0 to v8.0.0-AlphaPi (same version)
FIX 2026-09-06 (code landed, unverified on live): kit_update.py adds _version_core()/_is_newer() — update_available now true only when the latest tag's numeric core is strictly gre
14 Sep 2026 · Bug fixed · DSC · Verified · Medium
Settings is reachable only through an unlabelled 16px gear tucked behind the status chips — operator could not find it
OPERATOR-RAISED 2026-09-10: “there is no setting tab to get to settings”. NOT A BUG — verified the link exists and works: link "Settings" href="#/settings/preferences" renders, and
14 Sep 2026 · Bug fixed · DSC · Verified · High
Hub grow-mat root-zone vote reads past its arrays: probes[2]/vote[2] looped to i < 4 (undefined behaviour, phantom probe can drive the mat)
Found 2026-09-14 04:2x from a GCC warning during the tent-pressure hub OTA: 'iteration 2 invokes undefined behavior [-Waggressive-loop-optimizations]'. When pot3/pot4 were stripped
14 Sep 2026 · Decision · DSC · Verified · Medium
Four brain tests fail on master independent of any branch: test_alert_correctness (humidifier/heater ineffective) and test_stale_hub_alerts (live hub still rais
CLOSED 2026-09-14 20:50: not reproducible on master 1fe2a69. The two files pass in isolation (17 passed) and inside the full suite (928 passed, 172 s), and Brain CI on master is gr
14 Sep 2026 · Feature · DSC · Verified · Medium
Settings > System transparency cards: failover state, brain routes, developer switches, setup profile, resets (S4)
Details withheld. Title and state only.
14 Sep 2026 · Feature · DSC · New · Medium
Nutrient and medium catalog rows carry no dose / EC / pH data — feed targets cannot come from CannaLib yet
Found during the 2026-09-14 CannaLib grow-cycle pass. /v1/catalogs/nutrients and /mediums return name + brand only (verified live: CANNA Coco A/B, coco plugs), so the tank EC Want
14 Sep 2026 · Bug fixed · DSC · Verified · Low
DashHomeSections grow-stage chip hardcodes tone=”ok”
Chip shows "-" text correctly when the entity is missing but keeps a green/ok tone regardless of availability. Spotted via code read only; confirm live with the entity actually mis
14 Sep 2026 · Bug fixed · DSC · Verified · Low
Settings > System: OS/journal log tab surfaces raw “[Errno 2] … ‘journalctl'” python error
FIX 2026-09-06 (code landed, unverified on live): system_ops.tail_log() no longer returns the raw subprocess error as 'lines' on failure (lines=[] instead); a 127/124 exit folds a
14 Sep 2026 · Bug fixed · DSC · Verified · Low
StatusChip tone=teal is not a valid tone – two type errors in MediaStorageCard
StatusChip's tone union is ok|bad|warn|muted (ui.tsx:271) and does NOT include teal; only StatusTag does (ui.tsx:324). MediaStorageCard passes tone=teal at :41 (SAVING HERE chip) a
14 Sep 2026 · Bug fixed · DSC · In progress · Low
Fleet-heal RF Status lambda: dead first snprintf truncates 4 hex chars into a 4-byte buffer (GCC -Wformat-truncation on every hub build)
Seen 2026-09-14 in both hub OTA builds: dsc-hub-fleet-heal.yaml:381 snprintf(assoc3, sizeof(assoc3) /4/, "%02X%02X", b[4], b[5]) wants 5 bytes. snprintf bounds it (no overflow), an
14 Sep 2026 · Decision · DSC · Verified · Low
Deploy hot-synced SPA static (bundle index-B2R-r53j.js) is not in the dsc-hub-brain:8.3.0 image – the next container recreate reverts the span-picker popover fi
NO LONGER APPLICABLE 2026-09-14 20:40 (verified live): the PR #267 (19:55) and PR #268 (20:22) deploys were both image-builds from master, so the image now carries the current SPA
14 Sep 2026 · Feature · DSC · Verified · Low
Extension: turn the reading-based ‘probe dark’ timer into an actual alert (probe dark > N h) – Runtz Punch probe has been DARK 24h+ on a live D62 flowering plan
WHAT: The reading-based dark timer (built this cycle) shows 'DARK 24H 47M' on the Runtz Punch probe - a live flowering plant with no soil data for over a day - but this only render
14 Sep 2026 · Feature · DSC · Verified · Low
3D twin had no marker for placed climate sensors — the Zigbee/Tuya hygrometers behind the airflow deltas were invisible in the scene
Open item from the 2026-09-14 zone-placement pass (FOLLOWUPS). FIXED 2026-09-14 (PR #274, merged 24c0f79, deployed 21:46 as bundle index-udHOKIJ8.js): placedSensorsFromClimate() tu
14 Sep 2026 · Bug fixed · DSC · Verified · Low
Snapshot chips omit missing values but don’t explain why
FIX 2026-09-06 (code landed, unverified on live): journalFormat gains snapshotGapCount() (keys present in the capture but empty) and snapshotBackfillKeys() (from the brain _backfil
14 Sep 2026 · Bug fixed · DSC · Verified · Medium
/setup/state stuck at phase ‘usb_flash’ with debt ‘not_flashed:control’ on a fully-online fleet
FIX 2026-09-06 (code landed, unverified on live): kit_commission.get_setup_state() now runs _reconcile_flash_debt() — for every 'not_flashed:' debt item, if fleet_firmware_st
14 Sep 2026 · Bug fixed · DSC · Verified · Medium
SF1000 / Twin brightness history is recorded but unreadable through /history
record_hub_chart_history writes ('hub','sf1000_brightness') and ('hub','twin_sf1000_brightness') on every poll, but neither metric name is in HUB_VALUE_KEYS. So resolve_entity_metr
14 Sep 2026 · Bug fixed · DSC · In progress · Medium
Mobile: desks and help tips fall off phone screens
Operator report 2026-09-14: things falling off the display on the phone. At 360 px the scrolling shell (.dsc-root-body) scrolled sideways: Overview 385 px (bare 1fr / implicit grid
14 Sep 2026 · Decision · DSC · New · Low
Live plants’ flip date is a calendar stand-in (day 49) — enter the real flip on the plant panel after deploy
Found during the 2026-09-14 CannaLib grow-cycle pass. Runtz Punch and Grandmommy Purple (sprout 2026-07-09) have no stored or journalled flip, so the expected-finish window will an
14 Sep 2026 · Feature · DSC · Verified · Medium
Light catch-up is opaque: no warning that releasing manual hold turns the lamp ON, no way to cancel a catch-up, and no stated next scheduled light change
OPERATOR-RAISED 2026-09-10. Three gaps around light catch-up. 1. NO WARNING ON HOLD RELEASE. Read from the firmware: manual_light_hold self-heals only when photo_was_want_on && !wa
14 Sep 2026 · Feature · DSC · New · Low
Version statements disagree: README says surface 8.2.0, RELEASE.md says 8.3.0 expects firmware 8.1.0.0, paths.py EXPECTED_FIRMWARE is 8.2.0.0
Details withheld. Title and state only.
14 Sep 2026 · Bug fixed · DSC · Verified · Low
Settings -> General tab is static docs, not configurable settings
PARTIAL 2026-09-06 (code landed, unverified on live): Settings → General now carries a 'Versions' block (Surface, Expected firmware, live SPA bundle id) so it's no longer pure pros
14 Sep 2026 · Bug fixed · DSC · Verified · Low
GET /history?entity_id= (empty) returned 422 instead of an honest empty series
FIX 2026-09-06 (code landed, unverified on live): /history now accepts an empty entity_id (Query default '' instead of min_length=3) and returns {points:[], tracked:false} 200 for
14 Sep 2026 · Bug fixed · DSC · Verified · Medium
lights_on_only never suppresses a capture — it reads a hub key that is not in hub values
lights_on_for() looks up hub_values['window_4x8_open'] / ['window_2x4_open'], but the live hub values dict carries no such top-level keys - the window state only exists nested as v
14 Sep 2026 · Bug fixed · DSC · Verified · Medium
Retired pot3/pot4 came back as offline seats after the one-shot removal gate; in-service dark probes vanished from /fleet
Details withheld. Title and state only.
14 Sep 2026 · Feature · DSC · Verified · Low
Progressive disclosure for collapsed system rows
PARTIAL 2026-09-06 (code landed, unverified on live): consecutive identical system rows already collapse to one with a repeat count (collapseConsecutiveSystemDuplicates). Added the
14 Sep 2026 · Feature · DSC · Verified · Medium
Fan demand scale is ONE global multiplier applied to four physically different fans
OPERATOR-RAISED 2026-09-10: “the fan demand scale needs to have a per fan value not a single value”. TODAY: scale_fan_demand_pct(pct) reads ONE fan_demand_scale from global modifie
14 Sep 2026 · Release · DSC · Released
DSC v8.3.0: Ingest orchestrator
Persistent ESPHome sessions with adaptive cadence, probe fast-reading mode, honest probe-online flag in firmware 8.2.0.0, chart span picker, placed climate sensors, runoff-tray rol
14 Sep 2026 · Bug fixed · DSC · Verified · Low
Root page “thereabouts” idle-probe reading has no independent staleness check
FIX 2026-09-06 (code landed, unverified on live): soil_tests.list_probe_stations() now returns thereabouts_updated_at (source pot last_seen) and thereabouts_stale (>15 min, indepen
14 Sep 2026 · Bug fixed · DSC · Verified · Medium
flash-fleet-remote.sh and bake-firmware.sh still use docker exec dsc-hub-esphome (container removed by deploy)
Details withheld while the issue is live.
14 Sep 2026 · Bug fixed · DSC · Verified · Medium
master does not typecheck — MediaStorageCard uses a badge tone that does not exist
FIXED 2026-09-12 in 9e7fb49 (merged 226083b, pushed; not yet deployed). Both StatusChip tone="teal" uses in MediaStorageCard (the SAVING HERE chip at :41 and the done-job tone at :
14 Sep 2026 · Bug fixed · DSC · In progress · Low
Inspector ‘Limited history’ chip ignores the brain’s recorded:false – a series that has never been written is labelled as thin instead of ‘Not recorded by the b
FIXED in PR #259: get_entity_history forwards 'recorded'; useHistory/useEntitySeries expose it; the inspector and history drawer show 'Not recorded yet' (with a tooltip) when track
14 Sep 2026 · Feature · DSC · Verified · Low
Explicit “show/hide system rows” toggle on journal views
FIX 2026-09-06 (code landed, unverified on live): JournalEntryList gains a hideSystem prop (filters source==='system' before collapse) and shows 'N system rows hidden'. JournalScop
14 Sep 2026 · Feature · DSC · Verified · High
No lamp role for a plug — adopting the 4×8 light plug has nothing to bind to
The operator's 4x8 lamp is on a smart plug not yet in DSC-HUB. The Tuya local lane is live on the Pi (tuya available/running, device_count 0) and smart_plug is can_actuate: true, s
14 Sep 2026 · Bug fixed · DSC · Verified · Low
Possible leftover “pots” language in CropScheduler copy (rendered on Climate)
FIX 2026-09-06 (code landed, unverified on live): CropScheduler.tsx intro copy 'Each tent tracks its own stage rail and pots' → '...stage rail and plants'. Only visible-copy 'pots'
14 Sep 2026 · Bug fixed · DSC · Verified · Medium
Settings > General is prose; subtitle promises ‘kit language and operator notes’ that do not exist
The General tab rendered two paragraphs and a versions block with no control. Pass S1 (2026-09-07): General removed; /settings/general redirects to Preferences; versions live under
14 Sep 2026 · Bug fixed · DSC · Verified · Medium
The brain test suite reaches out to the live hub at 10.42.0.10
Details withheld. Title and state only.
14 Sep 2026 · Bug fixed · DSC · Verified · High
Probe N/P/K and *_raw history is unreachable: recorder writes pot metric ‘nitrogen’ / ‘moisture_pct_raw’, /history resolves ‘soil_nitrogen’ / ‘soil_moisture_raw
FIXED in PR #259 (merged 2026-09-14, master a500003): history_ops.resolve_entity_metric consults ENTITY_FLEET_MAP for pot seats and routes the generic probe shape through esphome_c
14 Sep 2026 · Feature · DSC · Verified · Low
Formalize the snapshot-backfill admin endpoint, or retire it
PARTIAL 2026-09-06 (code landed, unverified on live): kept the endpoint (it's a legit one-time migration for pre-snapshot-column rows) and formalized its contract — backfilled valu
14 Sep 2026 · Feature · DSC · In progress · Medium
Operator-chosen tent pressure: a slider for the target regime (positive / neutral / negative) and how strong the pressure difference should be, per tent or syst
OPERATOR-RAISED 2026-09-14, building on PR #240 (mass_balance_ok is now signed: exhaust-dominant is fine, only over-pressure beyond a fixed tolerance is a fault). The operator want
14 Sep 2026 · Bug fixed · DSC · Verified · Low
Pot-moisture “dry” threshold line is a bare hardcoded constant with no live setting to bind to
FIX 2026-09-06 (code landed, unverified on live): the Root pot-moisture chart 'dry' line is now bound to global_modifiers.moisture_dry_pct (default 30, clamp 5–80). Brain: added to
14 Sep 2026 · Bug fixed · DSC · Verified
History audit: 7-day charts collapsed to the newest ~25 h (list_history LIMIT 2000) — /history now buckets the whole window
Live Pi: hours=168 returned exactly 2000 points from 09-06 04:49 to 09-07 05:50 — the newest 2000 samples at ~2 s cadence, so every 7-day view showed ~a day. Fix on feat/dashboard-
14 Sep 2026 · Bug fixed · DSC · Verified · Medium
An imported-but-unconfigured Tuya device reads OFFLINE, which looks like a network fault
Importing a tinytuya devices.json registers every device with type = '' (import deliberately never guesses a type) and, for any device the wizard's LAN scan did not reach, ip = ''.
14 Sep 2026 · Bug fixed · DSC · In progress · Medium
Zigbee canopy and Tuya tank readings are never written to fleet_history by their lanes – they only reach history via the 60 s computed recorder (change or 5 min
FIXED in PR #259: history_ops.record_lane_row / record_canopy write at receipt from zigbee_mqtt.on_message and TuyaLane.ingest (seat = 'zigbee' / 'tuya', metric = the entity id the
14 Sep 2026 · Feature · DSC · Verified · Low
Surface the live SPA bundle hash/version in Settings
FIX 2026-09-06 (code landed, unverified on live): vite.config.ts bakes import.meta.env.VITE_DSC_SPA_BUILD = '[+dirty] · ' (via execSync at config eva
14 Sep 2026 · Feature · DSC · In progress · Medium
VPD charts with history that read against correct VPD ranges (sleek): reference zones, time-in-zone, temperature × RH VPD map
Operator ask 2026-09-14 (before bed): proper VPD charts with history, sleek, reflecting correct VPD ranges. LANDED PR #246 (6ba5921). Reference zones <0.4 humid / 0.4–0.8 propagati
14 Sep 2026 · Milestone · CannaLib, DSC, Site · Released
The journey opens
The trackers' history went public as dated events: every release, bug, lesson and decision, each shown in the state its tracker records.
14 Sep 2026 · Bug fixed · DSC · Verified · Medium
Trend-chart threshold bands are inconsistently drawn – band prop only recolors the line, doesn’t show a visible band
FIX 2026-09-06 (code landed, unverified on live): viz/charts.tsx MultiLineChart now draws a faint shaded markArea for a per-series band (HEX.neon @ 0.06 opacity), matching what the
