Architecture rule
Specialized panel existence must be independent of physical device/telemetry availability.
A configured panel route/sidebar entry is application infrastructure. Device reachability may change the content to Нет связи, Недоступно, unknown or unavailable, but must never make the panel itself disappear.
Required lifecycle contract
For integration-owned panels:
- create coordinator/client;
- publish runtime state required by panel bootstrap;
- register stable panel route/sidebar entry;
- perform first device/RCI/Tuya/etc. refresh as a non-fatal operation;
- set up entities;
- keep retrying telemetry on the normal coordinator cadence.
Do not gate panel registration behind async_config_entry_first_refresh() or any successful device read.
For generated subpanels:
- manifest/configuration controls whether the panel exists;
- current entity availability controls only rendered state;
- missing/unavailable entities must fail closed inside the panel, not remove the route.
Evidence
The same anti-pattern has now been found in two separate integrations:
ha-keenetic-hero-4g: panel registration followed async_config_entry_first_refresh(), causing /dashboard-keenetic to disappear when startup RCI polling failed;
ha-s8-omni: _async_register_panel() likewise runs only after async_config_entry_first_refresh(), matching the previously observed disappearing vacuum panel behavior.
Acceptance
Architecture rule
Specialized panel existence must be independent of physical device/telemetry availability.
A configured panel route/sidebar entry is application infrastructure. Device reachability may change the content to
Нет связи,Недоступно,unknownorunavailable, but must never make the panel itself disappear.Required lifecycle contract
For integration-owned panels:
Do not gate panel registration behind
async_config_entry_first_refresh()or any successful device read.For generated subpanels:
Evidence
The same anti-pattern has now been found in two separate integrations:
ha-keenetic-hero-4g: panel registration followedasync_config_entry_first_refresh(), causing/dashboard-keeneticto disappear when startup RCI polling failed;ha-s8-omni:_async_register_panel()likewise runs only afterasync_config_entry_first_refresh(), matching the previously observed disappearing vacuum panel behavior.Acceptance