Skip to content

Commit ab7b776

Browse files
authored
Merge pull request #88 from senyo888/develop
Release v2.0.9: promote develop to main
2 parents fdbd52d + 30c6f1e commit ab7b776

44 files changed

Lines changed: 5782 additions & 557 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

AGENTS.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ Humidity Intelligence is a deterministic Home Assistant environmental control en
8585
## HA Lab Operational Validation Boundary
8686

8787
- HA Lab may be used as Operational Beta Validation Infrastructure for beta deploys, post-deploy read-only checks, diagnostics review, and generated-card/entity-map sanity evidence.
88-
- HA Lab evidence is advisory process evidence only. It is not release authority, runtime authority, stable Home Assistant authority, or a substitute for Bella, Aetherwing, AetherCore, and Senyo gates.
88+
- HA Lab evidence is advisory process evidence only. It is not release authority, runtime authority, stable Home Assistant authority, or a substitute for Bella, Aetherwing, AetherCore, and maintainer gates.
8989
- HA Lab work must preserve source identity, exact version, target boundary, mutation classification, rollback evidence, and public/private documentation separation.
9090
- HA Lab validation must not authorize autonomous Home Assistant mutation, restarts, reloads, helper changes, dashboard mutation, output writes, stable runtime access, tags, releases, or PR merges.
9191
- Public docs and PRs may summarize HA Lab status in sanitized terms, but local reports, credentials, target URLs, private entity IDs, and machine-specific details must remain local-only.

ARCHITECTURE.md

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,76 @@ and exposed without crashing the control loop.
8080

8181
Optional frontend cards and UI dependencies must never block backend functionality.
8282

83+
## External Service Authority
84+
85+
External Home Assistant calls to `pause_control`, `resume_control`,
86+
`create_dashboard`, `purge_files`, `dump_diagnostics`, `self_check`,
87+
`v205_release_check`, `dump_cards`, `view_cards`, `flash_lights`, and
88+
`create_local_backup` require an admin user context whether they target one config
89+
entry or all entries. The read-only `list_saved_versions` service is also admin-gated
90+
because it exposes package-local snapshot inventory through a persistent
91+
notification. An `entry_id` narrows a target only; it is not an authorization bypass.
92+
93+
Contextless background automation/script calls are intentionally rejected. Supported
94+
external use originates from an authenticated admin UI or API session; any future
95+
automated trusted route requires separate design approval.
96+
97+
First-run dashboard creation may use a trusted internal setup helper only after the
98+
user explicitly selects dashboard creation in config flow. First-run card export,
99+
option-triggered regeneration, and release-check test exports use a separate trusted
100+
internal card exporter so admin-gating the public `dump_cards` and `view_cards`
101+
handlers does not break integration-owned continuity. Startup refresh remains
102+
cache-only and does not claim a filesystem export. Neither helper is exposed as a
103+
contextless service bypass. The config entry records a dashboard identifier only
104+
after registration succeeds. Dashboard creation authorization is separate from later
105+
dashboard visibility.
106+
107+
Runtime-owned visual alerts call a separate trusted internal flashing helper after
108+
the deterministic engine has selected an alert lane. The public `flash_lights`
109+
service is admin-gated and is not the engine's control path; it cannot create,
110+
reorder, or override a lane decision.
111+
112+
Generated-artifact purge must validate its full fixed target set before mutation,
113+
show the exact existing file and configured dashboard targets in a completed blocking
114+
notification before deletion, reject paths outside the direct owned basename set and
115+
non-regular filesystem objects, and report partial failures truthfully.
116+
117+
Caller-selectable diagnostics and release-check report basenames must match
118+
`humidity_intelligence_*.json` and are written only inside the owned
119+
`<config>/humidity_intelligence/exports/` directory. Directory verification,
120+
creation, temporary writes, atomic replacement, cleanup, and report purge stay
121+
descriptor-relative, reject symlink/non-regular targets, and fail closed without a
122+
config-root fallback. In-process writes are serialized; concurrent same-name calls
123+
produce complete JSON and the last atomic replacement wins without promising caller
124+
invocation order. The fixed self-check report uses the same writer and exact
125+
`<config>/humidity_intelligence/exports/humidity_intelligence_self_check.json`
126+
destination. Entry-scoped purge owns no export report. Only an unscoped all-entry
127+
purge may remove the exact default diagnostics and fixed self-check exports;
128+
release-check, custom, and legacy config-root reports remain retained.
129+
130+
Generated card YAML is written only inside
131+
`<config>/humidity_intelligence/ui/`. Directory verification, creation, temporary
132+
writes, atomic replacement, and cleanup are descriptor-relative and no-follow,
133+
reject symlink and non-regular targets, revalidate directory/file identity, and fail
134+
closed without a config-root fallback. Same-name writes are serialized. Multi-entry
135+
installations use entry-qualified filenames; single-entry installations retain the
136+
unqualified default names. Exact default/per-entry card and release-check test-card
137+
exports are purge-owned. Custom card names and legacy root YAML are retained.
138+
Adding a second entry re-exports every loaded entry with qualified names; removing
139+
back to one entry re-exports the remaining entry with unqualified names. Superseded
140+
owned-UI names are retained non-destructively, are no longer refreshed by HI, and
141+
remain externally readable until an exact purge. Config-entry removal owns only the
142+
removed entry's exact default/release-test UI exports and registered dashboard; it
143+
does not own reports, custom card exports, or legacy root files. When removal returns
144+
a multi-entry installation to one entry, the remaining entry's qualified files stay
145+
retained while fresh unqualified exports are written.
146+
Registered Lovelace dashboard YAML remains separately owned at
147+
`<config>/dashboards/<url_path>.yaml`.
148+
149+
Dynamic state or attribute text rendered through generated-card HTML must be escaped
150+
at the HTML sink. The V1 Mobile presentation remains available but deprecated through
151+
v2.0.9; any removal requires a separately approved v2.1 migration contract.
152+
83153
## Home Assistant And HACS Boundaries
84154

85155
Config flow, options flow, entity registry behavior, services, translations,

CHANGELOG.md

Lines changed: 89 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,98 @@ This project follows a practical changelog format for Home Assistant and HACS us
88

99
## Unreleased
1010

11+
No unreleased changes.
12+
13+
## 2.0.9 - 2026-07-28
14+
1115
- Added the optional HI Support Bundle Inspector to the Pages artifact as a
12-
separate, noindex preflight at `/humidity-intelligence/inspector/`. Diagnostic
13-
parsing and handoff generation remain browser-local with zero automatic or
14-
network diagnostic-content egress; the only export is user-triggered copying of
15-
the allowlisted handoff. Native Home Assistant diagnostics remain the preferred
16+
separate, noindex preflight at `/humidity-intelligence/inspector/`. Diagnostic parsing and
17+
handoff generation remain browser-local with zero automatic or network
18+
diagnostic-content egress; the only export is user-triggered copying of the
19+
allowlisted handoff. Native Home Assistant diagnostics remain the preferred
1620
support attachment and the repository/Wiki remain support truth. Wiki update
17-
status: `no-op` because existing diagnostics guidance remains authoritative.
21+
status: `updated`; existing diagnostics guidance remains authoritative, and the
22+
Services Reference now documents the final external service permission boundaries.
1823
Release-documentation status: `updated` by this entry.
24+
- Set integration metadata to stable `2.0.9`, aligned the release documentation, and
25+
extended the backward-compatible `v205_release_check` manifest contract through
26+
the v2.0.9 beta/rc/stable line. GitHub Releases and HACS remain the authoritative
27+
publication and installed-package records.
28+
- Removed the HACS `country` metadata so Humidity Intelligence can be listed
29+
globally instead of being limited to the GB store scope.
30+
- Restricted custom filenames for `dump_diagnostics` and `v205_release_check` to
31+
the exact lowercase `humidity_intelligence_*.json` namespace so those report
32+
writers cannot overwrite unrelated basename files in the Home Assistant config
33+
folder. Defaults are unchanged. Automations or scripts using another custom
34+
report filename must be updated, and Home Assistant must be fully restarted after
35+
installing the package update; a config-entry reload alone is insufficient.
36+
- Moved caller-selectable diagnostics and release-check reports into the owned
37+
`<config>/humidity_intelligence/exports/` directory with descriptor-relative
38+
no-follow directory creation, same-directory atomic replacement, and no config-root
39+
fallback. Existing config-root reports are retained without automatic migration.
40+
Report consumers must update their full path. Concurrent writes are serialized and
41+
the last atomic replacement wins. Entry-scoped purge does not delete export reports;
42+
only unscoped all-entry purge may remove the exact default diagnostics export,
43+
while release-check and custom reports remain retained.
44+
- Completed the runtime-owned artifact namespace: the fixed entity-bearing
45+
`self_check` report now uses the secure report writer at
46+
`<config>/humidity_intelligence/exports/humidity_intelligence_self_check.json`,
47+
while generated `dump_cards`, `view_cards`, setup/options, and release-test card
48+
YAML now writes under `<config>/humidity_intelligence/ui/`. Startup refresh remains
49+
cache-only. Existing root
50+
JSON/YAML is retained without copy, dual-write, symlink, move, or automatic
51+
deletion; consumers must update paths after verifying fresh owned-directory output.
52+
- Clarified the setup/options UI and service/support guidance for existing users:
53+
first-run and options notifications point to exact owned UI paths, `dump_cards`
54+
versus `view_cards` notification behavior is explicit, legacy root cards are marked
55+
stale, and retained-file manual cleanup is documented without wildcard or
56+
registered-dashboard deletion.
57+
- Added descriptor-relative, no-follow, same-directory atomic YAML replacement with
58+
directory/file identity revalidation and no config-root fallback. External
59+
`self_check`, `dump_cards`, and `view_cards` calls now require authenticated admin
60+
context before work begins; trusted integration-owned UI regeneration calls the
61+
internal exporter directly. Adding a second entry re-exports all loaded entries
62+
with qualified card names; removing back to one re-exports the remaining entry
63+
with unqualified names while retaining the remaining entry's superseded qualified
64+
files for exact purge.
65+
- Narrowed cleanup to exact owned artifacts. Entry-scoped purge may remove the
66+
selected entry's default and release-test card exports plus its registered
67+
dashboard, but no reports. Unscoped all-entry purge may also remove the fixed
68+
default diagnostics and self-check reports. Config-entry removal separately owns
69+
only the removed entry's exact default/release-test card exports and registered
70+
dashboard. Custom card/report names, release-check reports, remaining-entry
71+
superseded qualified files, and legacy root artifacts remain retained.
72+
- Required authenticated admin user context for every `dump_diagnostics` and
73+
`v205_release_check` call. Non-admin, unknown-user, and contextless background
74+
callers are rejected before report lookup, cache work, path resolution, writes, or
75+
notifications. Direct authenticated admin UI/API calls remain supported.
76+
- Required admin user context for targeted and all-entry `pause_control` /
77+
`resume_control` calls, explicit `create_dashboard`, and `purge_files`. Existing
78+
background automations/scripts whose action context has no `user_id` can no longer
79+
invoke those mutation services, even when configured by an admin. Use an
80+
authenticated admin UI or API session; any future automated trusted route requires
81+
separate design approval. First-run dashboard creation remains available through
82+
the trusted config-entry setup path.
83+
- Required authenticated admin user context for every external `flash_lights`,
84+
`create_local_backup`, and `list_saved_versions` call. Non-admin, unknown-user,
85+
and contextless callers are rejected before light, snapshot, or inventory work.
86+
`list_saved_versions` remains read-only but is gated because its persistent
87+
notification exposes package-local snapshot metadata. Engine-owned visual alerts
88+
use a separate trusted internal helper after deterministic lane selection, so
89+
alert continuity, entity semantics, and lane ordering are unchanged.
90+
- Made `purge_files` validate its complete fixed set of direct HI-generated file and
91+
configured-dashboard targets before mutation, publish the exact existing target
92+
preview with a blocking notification, reject unsafe/non-regular filesystem
93+
candidates, and report file or dashboard deletion failures as an incomplete purge.
94+
- Escaped dynamic room, target-profile, condensation, and mould text in the V1 Mobile
95+
source and gallery templates. V1 Mobile remains exportable through v2.0.9 but is
96+
deprecated for new dashboards in favor of V2 Mobile; removal is deferred to a
97+
separate v2.1 migration proposal. Existing pasted V1 cards must be re-exported and
98+
re-copied to receive the escaping fix.
99+
- Redacted private Home Assistant URLs and hosts, local network addresses, bearer
100+
credentials and tokens, device IDs, local user paths, and Home Assistant entity IDs from
101+
locally generated issue-triage body summaries before Markdown/HTML escaping.
102+
Public issue links remain available for maintainer triage.
19103

20104
## 2.0.8 - 2026-07-05
21105

0 commit comments

Comments
 (0)