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.

loading entries
Entries come from this site's own records. States are copied from the tracker, never improved.

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