Digital Stealth Care · changelog
Digital Stealth Care, release by release.
Releases, features, incidents and lessons, newest first and dated, each in the state it is really in. Not every release has an entry yet: the releases page lists every brain release.
Changelog · releases, features and lessons, dated
Releases, features and milestones show first. Switch on incidents and lessons with the filters to see the whole record: each entry is shown in the state it is in, and nothing here is rounded up.
How changes are checked
By using the software. A change is checked in daily use on the real hardware. Every row is shown in the state it is in.
No script needed
Changelog: the newest 60, as a plain list
Below the timeline: the newest 60 entries as a plain list. Every entry and write-up also has a page of its own.
Newest first, for when the timeline above is not running. Use the timeline’s search and filters for everything else.
DSC v9.9.1
First downloadable alpha for the reference kit: an owner PIN on first start, keys made per card, the new screens on by default, and signed updates over the air. Image firmware…
DSC v9.8.9
The new screens become the default: five-item navigation (Today, Spaces, Devices, Issues, Settings), Spaces pages, harvest and cure cards, and checked writes.
DSC v9.8.8
Fixes event-loop stalls, so live pages load in under 2 s instead of 13 to 28 s. A camera that comes back clears its unplugged error.
DSC v9.8.7
Overview adds a pre-harvest card from flower day 35, a refused 4×8 target reads Not sent, Settings names who applies stage presets, and flower day 1 is the start day.
DSC v9.8.6
Issues are grouped by tier with possible causes, and Settings offers pickers instead of typing. Harvest now leads into the dry run.
DSC v9.8.5
Overview tent cards show one state word each, Settings opens as a left rail of twelve sections, and the network apply dialog says it restarts the hotspot.
DSC v9.8.4
Climate shows each appliance as one tile with its state, who drives it, Take over, a timed run and its automatic switch. Light adds a second-observer line under each lamp.
DSC v9.8.3
Alert titles in plain sentences with a what-to-do line, a single hub status header, and the curing chamber wording.
DSC v9.8.2
Fixes the fleet status returning an error when a reading was not a number or was infinite, and falls back to the uncached reply if the read cache fails.
DSC v9.4.2
Adds optional phone push alerts, off by default, and makes quiet hours follow the kit's own clock. A bound leak sensor is always called a leak sensor.
DSC v9.8.0
The new device model and planner shipped switched off, so the hub's own control still runs the room and they do not control anything yet.
DSC v9.7.0
The new device model and planner, shipped switched off and not in control of anything.
DSC v9.6.1
Fixes the new device model's import returning an error on a live kit: a step that fails now reports a partial result instead.
DSC v9.6.0
Adds the store, the importer and the harvest and drying flow for the new device model. They ship switched off and do not control anything.
DSC v9.5.1
Prepares the new device screens behind per-screen switches that are all off, adds a first-load state, and uses the words curing chamber throughout.
DSC v9.5.0
Adds an alarm for a flowering lamp lit in its dark period, journals a power restore, and runs the control loop apart from the web server.
DSC v9.4.3
Heating stays off on every path when the hub reports an emergency, a sensor fault or stale data, and a heat run-away alarm is added. Backups no longer carry secrets.
DSC v9.4.1
Restores the relay re-sync fix: a plug whose state disagrees with the brain's request, and whose reading never refreshes, is forced back into line after a set time.
DSC v9.2.0
One write path for any switched device, a host action runner, camera reattach and UX passes.
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.
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.
/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.
User guide re-verified for 9.0.0
All 75 guide pages were checked against the 9.0.0 code, corrected where they disagreed, and restamped 'verified for 9.0.0'.
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.
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.
/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.
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.
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.
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.
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.
Pass G — CannaLib strain detail with ‘runs in DSC-HUB’ journal rollup
LANDED 2026-09-07 on feat/dashboard-v2 (uncommitted, not hotpatched): CannaLib desk header (reveal frame 14), Browse/Detail/Compare as Panels, chips → tags; components/StrainRuns.t
Runoff-tray leak sensors per pot: wet alert, sitting-in-runoff hold, time-to-runoff as water use per plant
Details withheld while the issue is live.
Hub uptime in /fleet freezes at the first post-boot sample (sensor rarely publishes inside the 5 s subscribe window)
SEEN 2026-09-07: after the hub OTA reboot /fleet showed uptime 3.27 s for 10+ minutes while temperatures kept updating and last_seen advanced — the uptime sensor's state only arriv
Zigbee climate binding: Zone → Placement → Position (indoors/outdoors zones, multi-sensor canopy, airflow deltas)
Details withheld. Title and state only.
Root steering targets (dry-back P1/P2/P3, VWC day/night, EC) have no UI
Defaults 10 / 25 / 25 %, 55 / 50 % VWC, 2.2 mS/cm are constants; the brain loads overrides from settings but no route or UI writes them. Plan: Root > Steering card with the P1-P3 e
Placed-sensor stale window and runoff sitting hold were bare settings keys with no settings row (climate_stale_min, runoff_sitting_min)
Found 2026-09-14 (FOLLOWUPS open items from the zone-placement pass): both thresholds could only be changed by PATCHing a raw settings key, and the Placed climate / Runoff trays ca
Compare-scope picking (A/B) has no mid-pick cancel besides full exit
FIX 2026-09-06 (code landed, unverified on live): GrowLogsPage compare mode adds 'Restart pick' (clears A+B, back to picking A, stays in compare mode) and 'Swap A↔B' (once both are
Journals: per-journal retention (0 = indefinite), storage sizes, download, download-before-delete, archive on retire/harvest
Landed 2026-09-07 (feat/dashboard-v2, uncommitted; Pass S3). Settings > System > Journals & storage: database + disk size, one row per journal (plant, tent, room, facility, grow lo
Ingest cadence fast-reading thresholds (moisture step/slope, EC slope, release, event and reinstall holds) were compile-time constants
Found 2026-09-14 (ingest-orchestrator pass left them 'exposed under Settings › Grow › Sensors if they need tuning'). FIXED 2026-09-14 (PR #270, merged eb7d6a5, deployed): six helpe
Pi brain host needs ffmpeg for USB webcams, RTSP sources and timelapse assembly
2026-09-07 hotpatch: ffmpeg 7.1.5 installed inside the running dsc-hub-brain container via .audit/cameras-pi-hotpatch.ps1; GET /cameras on the Pi reports ffmpeg true — RTSP capture
Automation switch targets and the Settings bind row are Zigbee-specific; generalise to lane-tagged devices
The rule action zigbee_switch keys on a zigbee2mqtt friendly_name, the actuatable list at /settings/zigbee/actuatable was Zigbee-only, and the binding validators plus ZigbeeBindRow
4×8 fixture (480 W nameplate) has no CannaLib record — main-tent DLI estimate and control-path honesty stay blank
Found during the 2026-09-14 CannaLib grow-cycle pass. sensor.dsc_4x8_dli_estimate and sensor.dsc_4x8_light_control_path are honest-blank ('no catalog record for this zone's fixture
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
Settings > System transparency cards: failover state, brain routes, developer switches, setup profile, resets (S4)
Details withheld. Title and state only.
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
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
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
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
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
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
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.
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
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
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
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
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
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.
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
