Skip to content

Commit be46fc5

Browse files
authored
Merge pull request #70 from senyo888/senyo888-patch-1
Document v2.0.7 validation evidence
2 parents f395762 + 9c3d865 commit be46fc5

10 files changed

Lines changed: 123 additions & 23 deletions

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,14 @@ This project follows a practical changelog format for Home Assistant and HACS us
3131
- Expanded generated-card entity reference checks so stale IDs embedded inside
3232
generated-card JavaScript/string expressions are reported, not only YAML `entity:`
3333
rows.
34+
- Filtered generated-card release-validation extraction so JavaScript service names,
35+
predicate prefixes, object properties, and entity-prefix strings no longer fail
36+
generated-card entity availability checks.
37+
- Recorded HA Lab advisory validation for commit `55dc2b9`: lab identity, HI
38+
presence/diagnostics, scenario-matrix read-only baseline, and Stage 3 six-sensor
39+
runtime-readiness checks passed after lab-only deploy and manual restart, without
40+
stable-instance access, service calls, helper mutation, dashboard mutation,
41+
restart, reload, or output writes by Codex.
3442
- Added diagnostics, `self_check`, and `v205_release_check` reporting for PM2.5
3543
aggregate entity-ID normalization conflicts when a canonical `pm25` target entity
3644
already exists.

README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ It gives you:
5858

5959
Current release: **v2.0.7**.
6060

61-
v2.0.7 is the stable release line prepared from `senyo888-patch-1`; v2.0.6 remains the previous stable release on `main` until promotion, tagging, and GitHub release publication are completed.
61+
v2.0.7 metadata is present on `main`; `senyo888-patch-1` remains the final staging lane for release-validation fixes until those fixes are promoted. HA Lab advisory validation for commit `55dc2b9` passed on 2026-06-23 after the lab-only package deploy and manual restart. Tagging and GitHub release publication remain gated until final validation, promotion, and maintainer approval are complete.
6262

6363
---
6464

@@ -348,6 +348,8 @@ must be reviewable from tracked repository files.
348348
- PM2.5 aggregate runtime truth now exposes canonical `pm25` aggregate entity IDs when PM2.5 telemetry is configured, including setup-time normalization for existing `pm2_5` aggregate IDs
349349
- generated-card validation now checks entity references embedded in exported YAML, so stale Manual-card entity IDs are caught by `self_check` / `v205_release_check`
350350
- generated-card validation now includes entity references embedded inside generated-card JavaScript/string expressions, not just YAML `entity:` rows
351+
- generated-card release validation now filters JavaScript service names, predicate prefixes, object properties, and entity-prefix strings so false-positive card fragments do not fail release checks
352+
- HA Lab advisory validation passed for commit `55dc2b9` with identity, HI presence, scenario-matrix read-only baseline, and Stage 3 six-sensor runtime-readiness checks; this remains lab evidence, not release authority
351353
- PM2.5 aggregate entity-ID normalization now reports blocked canonical-target conflicts through diagnostics, `self_check`, and `v205_release_check`
352354
- generated V2 Current Air Control cards keep selected command lanes in the chip row while moving unmapped alert/no-automation context into reason text
353355
- generated V2 Current Air Control cards now render backend `telemetry_unavailable` as explicit degraded state and avoid falling back to `normal` / `READY` when the mode sensor is missing or unavailable
@@ -821,6 +823,8 @@ CO emergency pressure. Details are in
821823
- fixed PM2.5 aggregate runtime truth so configured PM2.5 telemetry exposes canonical backend-owned PM25 aggregate entities instead of relying on Home Assistant's dotted `pm2_5` name slug
822824
- hardened generated-card AQ output details so unresolved optional AQ aggregate rows are pruned instead of rendering stale `Entity not found` rows, with generated-card entity reference checks in `self_check` and `v205_release_check`
823825
- expanded generated-card entity reference checks so stale IDs embedded inside generated-card JavaScript/string expressions are reported, and PM2.5 aggregate entity-ID normalization conflicts are surfaced through diagnostics, `self_check`, and `v205_release_check`
826+
- filtered generated-card release-validation extraction so JavaScript service names, predicate prefixes, object properties, and entity-prefix strings no longer fail generated-card entity availability checks
827+
- recorded HA Lab advisory validation for commit `55dc2b9`: lab identity, HI presence/diagnostics, scenario-matrix read-only baseline, and Stage 3 six-sensor runtime-readiness checks passed after lab-only deploy and manual restart; no stable-instance access, HA service calls, helper mutation, dashboard mutation, restart, reload, or output writes were performed by Codex
824828
- changed generated V2 Current Air Control cards so red control-row styling follows selected alert/CO runtime truth, while degraded or unmapped alert candidates remain in reason text instead of primary chip-row space
825829
- fixed generated V2 Current Air Control cards so missing or unavailable Air Control Mode telemetry no longer renders as normal/ready, and backend `telemetry_unavailable` is shown as degraded UI truth ahead of stale helper-derived alert or AQ state
826830
- moved optional Level 1 / Level 2 display-label editing into setup Zones and post-configuration Zone Options before Zone 1 / Zone 2 editing, with diagnostics and generated cards using the same sanitized fallback-aware label source
466 KB
Loading

docs/proposals/2026-06-08-v207-degraded-alert-ui-truth-separation.md

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ title: V2.0.7 Degraded Alert UI Truth Separation
99
created: 2026-06-08
1010
category: ui
1111
target_version: v2.0.7
12-
authority_status: review-only
13-
state: REVIEW
12+
authority_status: implemented
13+
state: IMPLEMENTED
1414
owner: Aetherwing
1515
risk_level: medium
1616
runtime_impact: ui-only
@@ -20,16 +20,30 @@ affected_surfaces:
2020
- public-docs
2121
rollback_defined: true
2222
expiry_or_review_date: 2026-06-22
23-
bella_approved: false
24-
aetherwing_validated: false
25-
ha_lab_validated: false
26-
release_candidate_validated: false
23+
bella_approved: true
24+
aetherwing_validated: true
25+
ha_lab_validated: advisory_read_only
26+
release_candidate_validated: warning_only
2727
entity_contract_changed: false
2828
service_contract_changed: false
2929
lane_order_risk: false
3030
stable_runtime_risk: false
31+
implemented_in: v2.0.7
32+
release_candidate_validation_note: stable-instance availability warnings remain non-blocking advisories
33+
ha_lab_validation_note: 2026-06-23 HA Lab identity, HI presence, scenario-matrix read-only baseline, and Stage 3 runtime readiness passed for commit 55dc2b9; rendered UI was not validated
34+
closed: 2026-06-23
3135
```
3236
37+
## Closure Status
38+
39+
This proposal is now a historical governance record. The v2.0.7 implementation moved
40+
red control-row styling to selected alert/CO runtime truth, kept degraded or unmapped
41+
alert candidates in reason text, and preserved backend lane ordering and entity
42+
semantics. HA Lab validation remains separate advisory evidence and is not claimed by
43+
this proposal record as rendered-UI approval. The 2026-06-23 HA Lab run confirmed the
44+
lab target identity, HI install/diagnostics presence, read-only baseline, and Stage 3
45+
runtime readiness for commit `55dc2b9`.
46+
3347
## Scope
3448

3549
Draft a review-gated v2.0.7 proposal for correcting a stable dashboard truth issue
@@ -363,14 +377,15 @@ All lanes converge on a card-template-first proposal. Backend helper work remain
363377
deferred until there is evidence that card-only logic cannot stay maintainable or
364378
truthful.
365379

366-
## Senyo Approval Gate
380+
## Senyo Approval Gate (Historical)
367381

368-
FINAL VERDICT: PROCEED WITH REVIEW OF THIS PROPOSAL.
382+
FINAL VERDICT: IMPLEMENTED IN V2.0.7.
369383

370-
IMPLEMENTATION ALLOWED: NO.
384+
IMPLEMENTATION ALLOWED: CLOSED; no further implementation is authorized by this proposal.
371385

372-
SENYO REVIEW REQUIRED: YES.
386+
SENYO RELEASE REVIEW REQUIRED: YES.
373387

374-
This proposal may be staged for Senyo review. No implementation, dashboard template
375-
edit, backend helper, docs promotion, release note, commit, push, or branch switch is
376-
authorized by this artifact.
388+
This proposal remains in the repository as the public governance record for the
389+
implemented UI truth correction. Future changes require a new proposal, issue, or
390+
release patch with its own validation evidence. This proposal closure does not
391+
approve tagging, publishing, or GitHub release creation.

docs/release-governance.md

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,14 @@ testing and validation branches.
1212
The integration version in `manifest.json` is the release-state source of truth for
1313
Home Assistant and HACS metadata checks.
1414

15-
v2.0.7 is the current stable release line being prepared from `senyo888-patch-1`.
16-
v2.0.6 remains the previous stable release milestone on `main` until promotion,
17-
tagging, and GitHub release publication are completed. The rules below remain the
18-
active promotion model for future versions and for any maintenance patch.
15+
v2.0.7 is the current stable release line. Stable `2.0.7` metadata is present on
16+
`main`, while `senyo888-patch-1` may still carry final release-validation fixes
17+
ahead of `main` until those fixes are promoted. Tagging and GitHub release
18+
publication remain gated until final validation, promotion, and maintainer
19+
approval are complete. HA Lab advisory validation for commit `55dc2b9` passed on
20+
2026-06-23 after lab-only deploy and manual restart; it remains evidence input,
21+
not release authority. The rules below remain the active promotion model for future
22+
versions and for any maintenance patch.
1923

2024
## Branch Responsibilities
2125

@@ -27,6 +31,9 @@ active promotion model for future versions and for any maintenance patch.
2731
- `vMAJOR.MINOR.PATCH`: release-verification branch for the exact matching stable
2832
manifest version only. For example, `v2.0.7` may carry `2.0.7`, but not
2933
`2.0.7-rc.1` or `2.0.8`.
34+
- `dependabot/*`: automated dependency-maintenance branches may inherit the
35+
current stable manifest version from their base branch. They are not release
36+
lanes and do not approve, tag, or publish a release.
3037
- Short-lived development branches, including `Bella/*`, `codex/*`, `feature/*`,
3138
`fix/*`, `patch/*`, and `test/*`, must not carry stable manifest versions.
3239

@@ -84,7 +91,8 @@ in CI. It rejects:
8491
- stable versions on short-lived testing branches
8592
- prerelease or mismatched stable versions on `vMAJOR.MINOR.PATCH` branches
8693
- stable versions on unapproved branches outside `senyo888-patch-1`, `develop`, and
87-
`main`, plus exact matching `vMAJOR.MINOR.PATCH` release-verification branches
94+
`main`, exact matching `vMAJOR.MINOR.PATCH` release-verification branches, and
95+
automated `dependabot/*` dependency-maintenance branches
8896

8997
This is a release-boundary guard only. It does not alter runtime logic, entity
9098
semantics, generated dashboards, or Home Assistant services.

scripts/check_version_governance.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
"test/",
3232
)
3333

34+
DEPENDENCY_MAINTENANCE_BRANCH_PREFIXES = ("dependabot/",)
35+
3436
STABLE_ALLOWED_BRANCHES = {"senyo888-patch-1", "develop", "main"}
3537

3638

@@ -67,6 +69,10 @@ def _is_testing_branch(branch: str) -> bool:
6769
return branch.startswith(TESTING_BRANCH_PREFIXES)
6870

6971

72+
def _is_dependency_maintenance_branch(branch: str) -> bool:
73+
return branch.startswith(DEPENDENCY_MAINTENANCE_BRANCH_PREFIXES)
74+
75+
7076
def _release_branch_version(branch: str) -> str | None:
7177
match = RELEASE_BRANCH_PATTERN.fullmatch(branch)
7278
if not match:
@@ -114,7 +120,12 @@ def main() -> int:
114120
)
115121
return 1
116122

117-
if not label and branch not in STABLE_ALLOWED_BRANCHES and not release_branch_version:
123+
if (
124+
not label
125+
and branch not in STABLE_ALLOWED_BRANCHES
126+
and not release_branch_version
127+
and not _is_dependency_maintenance_branch(branch)
128+
):
118129
print(
119130
f"Branch '{branch}' must not carry stable version '{version}'.",
120131
file=sys.stderr,

services.py

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1302,15 +1302,57 @@ def _generated_card_entity_availability(hass: HomeAssistant, cards: dict) -> dic
13021302
def _extract_generated_card_entity_ids(card: str) -> List[str]:
13031303
entity_ids: List[str] = []
13041304
seen: set[str] = set()
1305-
for match in _GENERATED_CARD_ENTITY_RE.finditer(card or ""):
1305+
text = card or ""
1306+
for match in _GENERATED_CARD_ENTITY_RE.finditer(text):
13061307
entity_id = match.group(0)
1308+
if not _is_generated_card_entity_reference(text, match):
1309+
continue
13071310
if entity_id in seen:
13081311
continue
13091312
seen.add(entity_id)
13101313
entity_ids.append(entity_id)
13111314
return entity_ids
13121315

13131316

1317+
def _is_generated_card_entity_reference(card: str, match: re.Match[str]) -> bool:
1318+
"""Return true when a generated-card match is an HA entity reference.
1319+
1320+
Card JavaScript also contains object properties such as ``zone.enabled``,
1321+
service names such as ``switch.toggle``, and string prefixes such as
1322+
``sensor.hi_``. Those are not Home Assistant entity references and should
1323+
not fail release validation.
1324+
"""
1325+
entity_id = match.group(0)
1326+
start, end = match.span()
1327+
if entity_id.endswith("_"):
1328+
return False
1329+
1330+
before = card[max(0, start - 80) : start]
1331+
after = card[end : min(len(card), end + 8)]
1332+
before_stripped = before.rstrip()
1333+
1334+
if re.search(r"(?:^|[\s{,])entity(?:_id)?:\s*$", before):
1335+
return True
1336+
1337+
if before_stripped.endswith(("states['", 'states["')):
1338+
return True
1339+
1340+
quote = card[start - 1] if start > 0 else ""
1341+
if quote in {"'", '"'} and after.startswith(quote):
1342+
if re.search(r"(?:^|[\s;])(?:const|let|var)?\s*service\s*=\s*['\"]$", before_stripped):
1343+
return False
1344+
predicate_prefixes = (
1345+
".startsWith(" + quote,
1346+
".endsWith(" + quote,
1347+
".includes(" + quote,
1348+
)
1349+
if before_stripped.endswith(predicate_prefixes):
1350+
return False
1351+
return True
1352+
1353+
return False
1354+
1355+
13141356
def _layouts_from_written_paths(paths: List[str]) -> set[str]:
13151357
layouts = set()
13161358
for path in paths:

site/index.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ <h1 id="hero-title">Humidity Intelligence</h1>
106106
<div class="section-inner two-column">
107107
<div>
108108
<p class="section-kicker">Why it exists</p>
109-
<h2 id="intro-title">A balanced home routine is easier when the signals are joined up.</h2>
109+
<h2 id="intro-title">Clearer home decisions start with connected environmental signals.</h2>
110110
</div>
111111
<p>
112112
A bathroom can go damp after a shower while the rest of the house feels
@@ -158,7 +158,7 @@ <h3>Dashboards you can trust</h3>
158158
<div class="gallery-heading">
159159
<div>
160160
<p class="section-kicker">Home routine examples</p>
161-
<h2 id="gallery-title">Check what is happening before you act.</h2>
161+
<h2 id="gallery-title">Quick Peek.</h2>
162162
</div>
163163
<a class="text-link" href="https://github.com/senyo888/Humidity-Intelligence/wiki/UI-Gallery">Browse the UI Gallery</a>
164164
</div>

tests 2/test_runtime_card_sanity.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3910,6 +3910,9 @@ def test_generated_card_entity_extraction_includes_embedded_js_references():
39103910
" [[[",
39113911
" const pause = states['timer.air_control_pause']?.state;",
39123912
" const output = fanTxt('fan.kitchen_air');",
3913+
" const service = 'switch.toggle';",
3914+
" const prefix = id.startsWith('sensor.hi_');",
3915+
" const rooms = zone && zone.enabled !== false && Array.isArray(zone?.rooms);",
39133916
" const docs = 'https://github.com/senyo888/Humidity-Intelligence';",
39143917
" ]]]",
39153918
]

tests 2/test_version_governance.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,15 @@ def test_testing_branch_still_rejects_stable_version(self) -> None:
6161
self.assertEqual(result, 1)
6262
self.assertIn("must not carry stable version", stderr)
6363

64+
def test_dependabot_branch_may_carry_current_stable_version(self) -> None:
65+
result, stdout, stderr = self._run_check(
66+
branch="dependabot/github_actions/actions/checkout-7.0.0",
67+
version="2.0.7",
68+
)
69+
70+
self.assertEqual(result, 0, stderr)
71+
self.assertIn("Version governance OK", stdout)
72+
6473
def test_active_branch_prefers_github_head_ref_over_base_ref(self) -> None:
6574
env = {
6675
"GITHUB_BASE_REF": "develop",

0 commit comments

Comments
 (0)