Prepare v2.0.8 release candidate#76
Conversation
Adds report-only Maintenance Review Queue parsing and rendering to the issue triage helper. Documents the official proposal and maintainer-facing usage while preserving no GitHub mutation, no runtime authority, no entity semantics changes, and no generated dashboard impact. Validation: python3 -m unittest 'tests 2/test_issue_triage.py'; python3 scripts/check_proposal_links.py; python3 -m unittest 'tests 2/test_proposal_links.py'; python3 scripts/check_version_governance.py; python3 -m py_compile scripts/issue_triage.py; git diff --check.
Preserve manifest version at 2.0.7 pending explicit beta adoption gate. Includes default-safe V2 dashboard updates, admin-gated pause/resume services, sanitized diagnostics/reporting, fail-closed tracked secret scanning, and targeted regression coverage.
Bump manifest to 2.0.8-beta.1 and extend the existing v205_release_check contract to cover the v2.0.8 beta/rc/stable line.
Match the generated V2 Stability Score badge outer frame to the passive Ready/Zone/AQ badge treatment while keeping the inner 2.1 gauge and 10 BPM shimmer unchanged. Validation: runtime card sanity, diff check, py_compile, version governance, and tracked secret scan.
This reverts commit 6e77d98.
Scope: update the GitHub Pages intro heading and environmental context copy only. Reason: make the public project page more human, current, and clear about why humidity stability matters without changing runtime behavior. Validation: git diff --check -- site/index.html; python3 -m unittest "tests 2/test_pages_site.py".
|
Thanks for opening your first Humidity Intelligence pull request. Contributions help improve the project, and your time here is appreciated. Humidity Intelligence values deterministic behaviour, runtime truthfulness, stability over time, and maintainable changes. Review will focus on preserving those principles as much as on the code itself. A strong PR usually:
Community discussion, proposal submissions, and constructive feedback are welcome, especially when a change touches runtime semantics, generated UI truth, diagnostics, or long-term project direction. |
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (2)
🚧 Files skipped from review as they are similar to previous changes (2)
📝 WalkthroughWalkthroughThis PR bumps the integration to v2.0.8, adds Setup Assist config-flow guidance and telemetry defaults, reshapes diagnostics and support exports into summary-based sanitized payloads, gates entry-less pause/resume on admin context, replaces the Pause dashboard tile with a passive Stability Score badge, hardens issue-triage and secret-scan tooling, and updates release/governance documentation. ChangesSetup Assist Config Flow Feature
Diagnostics and Support Export Sanitization
Stability Score Badge and Dashboard Card Export Changes
v2.0.8 Release, Governance and Support Documentation
Issue Triage Maintenance Queue and Secret Scan Hardening
Estimated code review effort: 4 (Complex) | ~75 minutes 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 4
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (4)
ui/cards/v2_tablet.yaml (2)
1733-1764: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winManual card also missing
box-shadowvs. mobile equivalent.Same pattern as
ui-gallery/default-v2-tablet-zone-2/card.yaml's Manual card.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@ui/cards/v2_tablet.yaml` around lines 1733 - 1764, The Manual button-card in the tablet YAML is missing the same box-shadow styling used by the mobile equivalent, so align this card’s `styles.card` block with the matching Manual card pattern from the other tablet card definition. Update the `custom:button-card` for `input_boolean.air_control_manual_override` to include the missing shadow styling while keeping the existing layout, state text, and label behavior unchanged.
1541-1550: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winSystem card loses
box-shadowpresent inui/cards/v2_mobile.yaml.Same visual regression as
ui-gallery/default-v2-tablet-zone-2/card.yaml: the box-shadow glow present on the mobile "System" card is absent here after themin-heightedit.🎨 Proposed fix
card: - border-radius: 20px - padding: 14px - min-height: 132px - background: rgba(2,6,23,0.35) - border: 1px solid rgba(148,163,184,0.22) + - box-shadow: 0 0 18px rgba(148,163,184,0.12) - backdrop-filter: blur(12px) - "-webkit-backdrop-filter": blur(12px)🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@ui/cards/v2_tablet.yaml` around lines 1541 - 1550, The System card style in the custom:button-card block is missing the box-shadow glow that exists in the mobile version, causing a visual regression. Update the card styles for this System card to include the same box-shadow used in ui/cards/v2_mobile.yaml and the matching v2 tablet card variant, keeping the existing border-radius, padding, min-height, and backdrop-filter settings intact. Locate the affected custom:button-card definition by its card styles section and restore the shadow there.ui-gallery/default-v2-tablet-zone-2/card.yaml (1)
1734-1764: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winManual card also lacks
box-shadowcompared to mobile.Same visual-consistency gap as the System card above; the mobile "Manual" card has
box-shadow: 0 0 18px rgba(148,163,184,0.12)in its style block while this tablet version does not.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@ui-gallery/default-v2-tablet-zone-2/card.yaml` around lines 1734 - 1764, The tablet Manual custom:button-card is missing the same box-shadow used in the mobile version, creating a visual inconsistency. Update the styles block in the Manual card definition to include the matching shadow value already used on the mobile “Manual” card, keeping the rest of the card styling unchanged.diagnostics.py (1)
355-385: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick winBucket entity status before adding it to diagnostics.
_entity_statusreturns the raw Home Assistant state string, somapped_runtime_entitiescan expose sensor readings or tracker zones in the diagnostics payload. Map non-unknown/unavailablestates to a privacy-safe bucket here.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@diagnostics.py` around lines 355 - 385, The entity state reporting in _entity_status is leaking raw Home Assistant values into diagnostics; bucket the state before returning it so mapped_runtime_entities only exposes privacy-safe categories. Update _entity_status (and any callers like _mapped_entity_states/_entity_state) to map states to generic buckets instead of str(state), while preserving missing/configured handling and keeping attributes filtered through _SAFE_STATE_ATTRIBUTES.Source: Coding guidelines
🧹 Nitpick comments (7)
scripts/issue_triage.py (1)
317-362: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value
"public_safety"special-cased container key appears unused.
_parse_simple_action_yamlspecial-caseskey in {"source", "public_safety"}to initialize a dict, but no code path readsdata.get("public_safety")(required fields,_action_from_data, etc. never reference it). Looks like dead code from an earlier design.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@scripts/issue_triage.py` around lines 317 - 362, The special-cased container initialization in _parse_simple_action_yaml for "public_safety" appears unused, so clean up the dead branch by removing it from the set of keys that create a dict. Keep the existing "source" handling intact, and ensure _parse_simple_action_yaml still parses nested values correctly for the remaining supported keys without changing any callers such as _action_from_data.config_flow.py (2)
3637-3651: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueDead fallback branch:
friendly_namecan never be reached.In both
_render_existing_telemetryand_telemetry_label,roomis computed asitem.get("room") or ent(never falsy sinceentitself falls back to"unknown"), so the subsequentdisplay = room or item.get("friendly_name") or entcan never actually fall through tofriendly_name. Since telemetry entries no longer collect a distinctfriendly_namefrom the user (it's now always set equal to the computedroom/display value), this is harmless today but is confusing dead code.♻️ Suggested simplification
- room = item.get("room") or ent - display = room or item.get("friendly_name") or ent + display = item.get("room") or entAlso applies to: 3661-3666
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@config_flow.py` around lines 3637 - 3651, Simplify the dead fallback logic in _render_existing_telemetry and _telemetry_label by removing the unreachable friendly_name branch. Since room already falls back to ent (and ent to "unknown"), update the display selection to use the computed room/display value directly and keep the formatting consistent with the telemetry entries that now mirror room/display.
737-810: 🎯 Functional Correctness | 🔵 Trivial | 💤 Low valueSlope "required" error for calculated mode is now effectively unreachable.
slope_sources = _sanitize_entity_ids(user_input.get("slope_sources") or temp_entities)(and the options-flow equivalent usingdefault_sources) meansslope_sourcescan only be empty iftemp_entities/default_sourcesis also empty — but the function already returns/skips earlier when there are no temperature entities. Soerrors["slope_sources"] = "required"forSLOPE_MODE_CALCULATEDcan no longer trigger in practice. This looks like an intentional trade-off (per the PR's "empty advanced inputs fall back to temperature sensors" behavior), but it silently removes the ability for a user to see a validation error if they intentionally clear all sources — worth a quick sanity check that this fallback-over-validation behavior is the desired UX.Also applies to: 3102-3181
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@config_flow.py` around lines 737 - 810, The validation for calculated slope mode in async_step_slope is now unreachable because slope_sources always falls back to temp_entities after _sanitize_entity_ids, so the required error can never fire once temperature sensors exist. Confirm the intended UX and either remove the dead validation or change the fallback so an empty user-provided slope_sources still triggers the existing errors["slope_sources"] path in async_step_slope (and the matching options-flow logic).helpers/setup_assist.py (1)
85-96: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueConsider logging on swallowed registry-lookup exceptions.
Lines 90, 95, and 242 catch blind
Exceptionand silently degrade to "unsupported"/Nonewith no log line. This is reasonable defensive coding to keep the config flow HA-version-tolerant, but a silent swallow makes it hard to diagnose why Setup Assist stopped working on a given HA install. Consider a_LOGGER.debug(...)call in these except blocks (module currently has no logger).♻️ Suggested addition
+import logging + +_LOGGER = logging.getLogger(__name__) + ... try: entity_reg = er.async_get(hass) area_reg = ar.async_get(hass) device_reg = dr.async_get(hass) if dr is not None else None label_reg = lr.async_get(hass) if lr is not None else None except Exception: + _LOGGER.debug("Setup Assist registry lookup failed", exc_info=True) return unsupported_setup_assist_suggestion("registry_lookup_failed", clean_entity_id)Static analysis also flags these as blind-exception catches (BLE001); logging addresses the maintainability concern without changing the fail-safe behavior.
Also applies to: 240-243
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@helpers/setup_assist.py` around lines 85 - 96, Add debug logging to the swallowed exception paths in setup_assist.py so registry lookup failures are visible without changing the fail-safe behavior. Introduce a module logger and, in the exception handlers around er.async_get/hass registry access and the entity_entry lookup (and the other related catch block near the suggested lines), emit _LOGGER.debug with the relevant context such as clean_entity_id before returning unsupported_setup_assist_suggestion or None. Keep the defensive fallback logic in place, but avoid silently swallowing Exception in these registry lookup paths.Source: Linters/SAST tools
diagnostics.py (3)
257-286: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick winRedundant
_unavailable_configured_entitiescomputation.
_runtime_summaryrecomputes_unavailable_configured_entities(hass, config, entity_map)and re-wraps it via_unavailable_entity_summary, even thoughdiagnostics_summary(passed in as a parameter) already contains the exact same summarized value underunavailable_or_unknown_entities. This duplicates a fullhass.states.get()sweep over every configured/mapped entity for no functional benefit.♻️ Reuse the already-computed summary
- "unavailable_or_unknown_entities": _unavailable_entity_summary( - _unavailable_configured_entities(hass, config, entity_map) - ), + "unavailable_or_unknown_entities": diagnostics_summary.get("unavailable_or_unknown_entities", {}),🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@diagnostics.py` around lines 257 - 286, The _runtime_summary function is recomputing unavailable entity data instead of reusing the already-built diagnostics_summary value. Update _runtime_summary to read unavailable_or_unknown_entities directly from diagnostics_summary and pass that through, avoiding the extra _unavailable_configured_entities and _unavailable_entity_summary work. Keep the change scoped to _runtime_summary and use the existing diagnostics_summary parameter as the source of truth.
601-653: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winCount/summary helpers are duplicated between
diagnostics.pyandservices.py.
_pm25_normalization_status(here) vs.services.py's_pm25_normalization_status+_support_pm25_normalization_summary,_unavailable_entity_summaryvs._support_unavailable_summary, and_count_byvs._count_config_rowsimplement effectively the same aggregation logic independently in both files. This PR already demonstrates a real divergence risk (the raw-vs-bucketed_entity_statusinconsistency noted above), so consolidating these into a shared module (similar to the existinghelpers/zone_validation.pypattern already used by both files) would reduce future drift.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@diagnostics.py` around lines 601 - 653, The count/summary aggregation logic is duplicated across diagnostics.py and services.py, which risks behavior drift between matching helpers like _pm25_normalization_status, _support_pm25_normalization_summary, _unavailable_entity_summary, _support_unavailable_summary, _count_by, and _count_config_rows. Extract the shared summarization functions into a common module following the existing helpers/zone_validation.py pattern, then update both diagnostics.py and services.py to call the shared implementations instead of maintaining separate copies.
364-376: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueRemove the unused
_entity_statehelper._mapped_entity_statesnow calls_entity_statusdirectly, and nothing else references this function.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@diagnostics.py` around lines 364 - 376, Remove the unused _entity_state helper from diagnostics.py, since _mapped_entity_states now uses _entity_status directly and there are no remaining call sites. Delete the entire _entity_state(hass, entity_id) function and make sure no imports or nearby code still depend on it after the removal.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@config_flow.py`:
- Around line 3732-3743: The setup-assist preview detection in
_is_setup_assist_preview_input is matching a partial payload that does not occur
in the normal Home Assistant form submit path, so the preview branch is
effectively unreachable. Update the telemetry save flow around
_is_setup_assist_preview_input and the telemetry add handlers to either move
entity selection into a separate step or wire this logic into the actual HA
preview flow, rather than relying on a partial payload check on the normal save
path.
In `@scripts/issue_triage.py`:
- Around line 120-126: The public-safety path filter in
MAINTENANCE_QUEUE_PUBLIC_SAFETY_PATTERNS only detects macOS /Users paths, so
extend the regex set in scripts/issue_triage.py to catch Linux absolute paths
like /home/... and Windows absolute paths like C:\Users\... as well. Update the
pattern list used by issue triage rendering so private local paths are redacted
consistently across platforms, and keep the existing token/secret patterns
intact.
In `@ui-gallery/default-v2-tablet-zone-2/card.yaml`:
- Around line 1543-1550: The System card styling in the tablet variant is
missing the glow effect used in the mobile variant. Update the card definition
in the tablet layout’s card block to include the same box-shadow value as the
mobile “System” card, alongside the existing border-radius, padding, min-height,
and backdrop-filter settings, so the two layouts stay visually consistent.
In `@ui/cards/v2_tablet.yaml`:
- Around line 1551-1616: The Stability Score gauge in the card template is
treating a null display_score as a real numeric value because Number(rawValue)
converts null to 0. Update the gauge logic in the entity card template to
explicitly guard rawValue before converting it, so null/undefined falls back to
the existing future/default state instead of being rendered as score 0. Use the
gauge custom_fields block and the rawValue/value/hasValue logic as the place to
adjust the fallback handling.
---
Outside diff comments:
In `@diagnostics.py`:
- Around line 355-385: The entity state reporting in _entity_status is leaking
raw Home Assistant values into diagnostics; bucket the state before returning it
so mapped_runtime_entities only exposes privacy-safe categories. Update
_entity_status (and any callers like _mapped_entity_states/_entity_state) to map
states to generic buckets instead of str(state), while preserving
missing/configured handling and keeping attributes filtered through
_SAFE_STATE_ATTRIBUTES.
In `@ui-gallery/default-v2-tablet-zone-2/card.yaml`:
- Around line 1734-1764: The tablet Manual custom:button-card is missing the
same box-shadow used in the mobile version, creating a visual inconsistency.
Update the styles block in the Manual card definition to include the matching
shadow value already used on the mobile “Manual” card, keeping the rest of the
card styling unchanged.
In `@ui/cards/v2_tablet.yaml`:
- Around line 1733-1764: The Manual button-card in the tablet YAML is missing
the same box-shadow styling used by the mobile equivalent, so align this card’s
`styles.card` block with the matching Manual card pattern from the other tablet
card definition. Update the `custom:button-card` for
`input_boolean.air_control_manual_override` to include the missing shadow
styling while keeping the existing layout, state text, and label behavior
unchanged.
- Around line 1541-1550: The System card style in the custom:button-card block
is missing the box-shadow glow that exists in the mobile version, causing a
visual regression. Update the card styles for this System card to include the
same box-shadow used in ui/cards/v2_mobile.yaml and the matching v2 tablet card
variant, keeping the existing border-radius, padding, min-height, and
backdrop-filter settings intact. Locate the affected custom:button-card
definition by its card styles section and restore the shadow there.
---
Nitpick comments:
In `@config_flow.py`:
- Around line 3637-3651: Simplify the dead fallback logic in
_render_existing_telemetry and _telemetry_label by removing the unreachable
friendly_name branch. Since room already falls back to ent (and ent to
"unknown"), update the display selection to use the computed room/display value
directly and keep the formatting consistent with the telemetry entries that now
mirror room/display.
- Around line 737-810: The validation for calculated slope mode in
async_step_slope is now unreachable because slope_sources always falls back to
temp_entities after _sanitize_entity_ids, so the required error can never fire
once temperature sensors exist. Confirm the intended UX and either remove the
dead validation or change the fallback so an empty user-provided slope_sources
still triggers the existing errors["slope_sources"] path in async_step_slope
(and the matching options-flow logic).
In `@diagnostics.py`:
- Around line 257-286: The _runtime_summary function is recomputing unavailable
entity data instead of reusing the already-built diagnostics_summary value.
Update _runtime_summary to read unavailable_or_unknown_entities directly from
diagnostics_summary and pass that through, avoiding the extra
_unavailable_configured_entities and _unavailable_entity_summary work. Keep the
change scoped to _runtime_summary and use the existing diagnostics_summary
parameter as the source of truth.
- Around line 601-653: The count/summary aggregation logic is duplicated across
diagnostics.py and services.py, which risks behavior drift between matching
helpers like _pm25_normalization_status, _support_pm25_normalization_summary,
_unavailable_entity_summary, _support_unavailable_summary, _count_by, and
_count_config_rows. Extract the shared summarization functions into a common
module following the existing helpers/zone_validation.py pattern, then update
both diagnostics.py and services.py to call the shared implementations instead
of maintaining separate copies.
- Around line 364-376: Remove the unused _entity_state helper from
diagnostics.py, since _mapped_entity_states now uses _entity_status directly and
there are no remaining call sites. Delete the entire _entity_state(hass,
entity_id) function and make sure no imports or nearby code still depend on it
after the removal.
In `@helpers/setup_assist.py`:
- Around line 85-96: Add debug logging to the swallowed exception paths in
setup_assist.py so registry lookup failures are visible without changing the
fail-safe behavior. Introduce a module logger and, in the exception handlers
around er.async_get/hass registry access and the entity_entry lookup (and the
other related catch block near the suggested lines), emit _LOGGER.debug with the
relevant context such as clean_entity_id before returning
unsupported_setup_assist_suggestion or None. Keep the defensive fallback logic
in place, but avoid silently swallowing Exception in these registry lookup
paths.
In `@scripts/issue_triage.py`:
- Around line 317-362: The special-cased container initialization in
_parse_simple_action_yaml for "public_safety" appears unused, so clean up the
dead branch by removing it from the set of keys that create a dict. Keep the
existing "source" handling intact, and ensure _parse_simple_action_yaml still
parses nested values correctly for the remaining supported keys without changing
any callers such as _action_from_data.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: 6bf23c53-2efb-4cdb-8126-0064fd73b84d
📒 Files selected for processing (36)
.github/pull_request_template.mdARCHITECTURE.mdCHANGELOG.mdCONTRIBUTING.mdREADME.mdconfig_flow.pyconst.pydiagnostics.pydocs/issue-triage.mddocs/proposals/2026-06-08-v207-degraded-alert-ui-truth-separation.mddocs/release-governance.mddocs/runtime-simulation-validation.mddocs/support.mdhelpers/setup_assist.pyhelpers/zone_validation.pylegacy/README.mdmanifest.jsonscripts/issue_triage.pyscripts/security/scan_secrets.shsensor.pyservices.pyservices.yamlstrings.jsontests 2/test_config_flow_sanity.pytests 2/test_diagnostics.pytests 2/test_issue_triage.pytests 2/test_runtime_card_sanity.pytests 2/test_setup_assist.pytests 2/test_workflows.pytranslations/en.jsonui-gallery/default-v2-mobile-aq/card.yamlui-gallery/default-v2-tablet-zone-2/card.yamlui/README.mdui/cards/v2_mobile.yamlui/cards/v2_tablet.yamlui/cards/view_cards_button.yaml
|
@coderabbitai review |
✅ Action performedReview finished.
|
|
@coderabbitai review |
✅ Action performedReview finished.
|
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@helpers/setup_assist.py`:
- Around line 101-111: The entity lookup in SetupAssistSuggestion is swallowing
exceptions from entity_reg.async_get and incorrectly falling through to
status="not_found". Update the try/except around async_get in setup_assist.py so
lookup failures are treated like the registry-acquisition failure path in the
same function and return status="unsupported" (or an equivalent failure status),
while keeping genuine missing entities as "not_found". Make the change in the
SetupAssistSuggestion construction flow and preserve the debug logging for the
caught exception.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: 50a066d5-df7f-4627-9cba-46357a44c7a4
📒 Files selected for processing (16)
CHANGELOG.mdREADME.mdconfig_flow.pydiagnostics.pydocs/release-governance.mdhelpers/setup_assist.pyscripts/issue_triage.pytests 2/test_config_flow_sanity.pytests 2/test_diagnostics.pytests 2/test_issue_triage.pytests 2/test_runtime_card_sanity.pytests 2/test_setup_assist.pyui-gallery/default-v2-mobile-aq/card.yamlui-gallery/default-v2-tablet-zone-2/card.yamlui/cards/v2_mobile.yamlui/cards/v2_tablet.yaml
✅ Files skipped from review due to trivial changes (1)
- CHANGELOG.md
🚧 Files skipped from review as they are similar to previous changes (12)
- ui-gallery/default-v2-tablet-zone-2/card.yaml
- docs/release-governance.md
- tests 2/test_issue_triage.py
- ui/cards/v2_mobile.yaml
- tests 2/test_setup_assist.py
- ui/cards/v2_tablet.yaml
- ui-gallery/default-v2-mobile-aq/card.yaml
- diagnostics.py
- tests 2/test_config_flow_sanity.py
- README.md
- tests 2/test_runtime_card_sanity.py
- config_flow.py
|
Follow-up pushed in Resolved the setup-assist entity lookup finding by returning Validation:
Runtime/UI impact: advisory setup-assist error classification only. No deterministic lane-ordering, entity semantics, generated UI, migration, restart, or reload impact. Current PR state: CI is green and CodeRabbit reports no new actionable comments. Ready for merge to |
Scope: correct release-facing wording now that PR #76 has merged and develop is the v2.0.8 release-review source. Rationale: remove stale senyo888-patch-1-to-develop language before the later develop-to-main handoff. Validation: git diff --check; VERSION_GOVERNANCE_BRANCH=develop python3 scripts/check_version_governance.py; python3 scripts/check_proposal_links.py.

Summary
Prepares Humidity Intelligence v2.0.8 for review on
develop.This promotes the v2.0.8 release-candidate package from
senyo888-patch-1, including setup guidance improvements, telemetry setup assistance, safer generated dashboards, passive Stability preview UI, admin-gated global pause/resume behavior, diagnostics/support-output hardening, release-governance updates, and matching tests/docs.Scope
Release-candidate promotion from
senyo888-patch-1todevelop.Primary surfaces:
site/index.htmlmay appear in branch history, but the dry merge leaves it unchanged against currentdevelopbecause the priormain -> developsync already landed that content.Reason
v2.0.8 is ready for
developreview after the pre-releasemain -> developsync.This PR keeps the release candidate separate from stable-branch housekeeping and gives reviewers one focused v2.0.8 package to validate before any later
develop -> main, tag, or GitHub Release step.Files affected
Main affected files/folders:
.github/pull_request_template.mdARCHITECTURE.mdCHANGELOG.mdCONTRIBUTING.mdREADME.mdmanifest.jsonconfig_flow.pyconst.pydiagnostics.pysensor.pyservices.pyservices.yamlstrings.jsontranslations/en.jsonhelpers/setup_assist.pyhelpers/zone_validation.pyscripts/issue_triage.pyscripts/security/scan_secrets.shdocs/legacy/ui/ui-gallery/default-v2-mobile-aq/ui-gallery/default-v2-tablet-zone-2/tests 2/Runtime impact
Deterministic lane ordering is preserved.
Runtime impact:
pause_control/resume_controlnow require admin user context.entry_idpause/resume remains available for the supplied config entry.v205_release_checkkeeps its service name and accepts the v2.0.8 beta/rc/stable line.UI impact
Generated UI changes are included.
UI impact:
Migration impact
None.
No Home Assistant storage migration is required. Users should restart Home Assistant after installing/updating so HA reloads the manifest version and service code. Config-entry reload is only appropriate after the updated code is already loaded and options change.
Users relying on generated dashboard YAML or pasted Manual cards should run
humidity_intelligence.dump_cardsorhumidity_intelligence.refresh_uias appropriate, then refresh dashboard/browser cache.Rollback safety
Rollback is a normal Git revert of this PR before release promotion.
Runtime rollback safety:
Validation performed
Branch and merge checks:
git fetch origin --prunesenyo888-patch-1 -> developPR.origin/develop...origin/senyo888-patch-1is9 10.origin/senyo888-patch-1into currentorigin/develop; merge completed cleanly with no conflicts.Release and code checks run against the dry-merge result:
git diff --cached --checkgit diff --checkpython3 -m py_compile config_flow.py sensor.py diagnostics.py services.py helpers/setup_assist.py helpers/zone_validation.py scripts/issue_triage.pypython3 -m compileall -q .bash -n scripts/security/scan_secrets.shscripts/security/scan_secrets.sh trackedVERSION_GOVERNANCE_BRANCH=develop python3 scripts/check_version_governance.pyVersion governance OK: branch=develop version=2.0.8 state=stablepython3 scripts/check_proposal_links.pypython3 -m unittest "tests 2/test_proposal_links.py"python3 "tests 2/test_diagnostics.py"python3 "tests 2/test_issue_triage.py"python3 "tests 2/test_workflows.py"python3 "tests 2/test_runtime_card_sanity.py"75 direct sanity checks passedpython3 "tests 2/test_config_flow_sanity.py"39 config-flow sanity checks passedpython3 "tests 2/test_setup_assist.py"3 setup-assist sanity checks passedpython3 "tests 2/test_doc_banners.py"manifest.json,hacs.json,services.yaml,strings.json, andtranslations/en.jsonRead-only Home Assistant / HA Lab checks:
scripts/local/bella_hi_health_check.sh --pre-releasescripts/local/ha_validate_hi.shPrivacy/security checks:
Not run:
humidity_intelligence.refresh_uicall was made during PR validation.HA Lab advisory evidence
Status: pass with notes.
Advisory evidence only. HA Lab does not approve release, merge, tag, GitHub Release publication, or
mainpromotion.2.0.8live loaded-state proof still belongs to post-install/restart validation.Current advisory interpretation:
developreview.develop -> main.Type
Checks
develop.humidity_intelligence.refresh_uior refreshed dashboards where UI output changed.no-opfor this PR body; public repo docs carry the release-facing changes.not applicable.UI Gallery submissions
Existing UI Gallery examples were updated, not added as new community submissions.
/ui-gallery/<card-id>/.README.md,preview.png, andcard.yamlordashboard.yaml.ui-gallery/README.mdis updated.ui-gallery/reference.txtformat.Review gates
Bella: PASS for
developreview.Aetherwing: PASS for
developreview.AetherCore: WARN / conditional.
2.0.8ondevelop.main, or treat HA Lab evidence as release authority without the final gates.Release authority:
developreview.main.Summary by CodeRabbit