Files
HomeAssistantVS/custom_components/maintenance_supporter/quality_scale.yaml
T

174 lines
6.6 KiB
YAML

# Self-assessment against Home Assistant's integration quality scale
# (https://developers.home-assistant.io/docs/core/integration-quality-scale/).
#
# As a HACS custom integration this file is informational — hassfest does not
# validate it — but the assessment is kept honest and current so the gaps are
# explicit. Checked against the 52 rules in home-assistant/core
# script/hassfest/quality_scale.py (dev, 2026-09-25). The integration is a
# local, deviceless service integration (no network I/O), so the
# connectivity-related rules are exempt.
rules:
# Bronze
action-setup:
status: done
comment: Service actions are registered in async_setup (re-run only when the last entry was removed and re-added).
appropriate-polling:
status: done
comment: >
5-minute coordinator refresh for time-based status; sensor triggers are
event-driven via state_changed listeners (no polling).
brands:
status: done
comment: Registered in home-assistant/brands (custom_integrations/maintenance_supporter) as part of the HACS default-store listing.
common-modules: done
config-flow: done
config-flow-test-coverage: done
dependency-transparency:
status: done
comment: >
One runtime requirement, pypdf (open source on GitHub, released to PyPI
by its own CI), used for the full-text index of uploaded manuals.
docs-actions:
status: done
comment: services.yaml descriptors + docs/CONFIGURATION.md and docs/EXAMPLES.md.
docs-conditions:
status: done
comment: docs/FEATURES.md "Automation triggers & conditions".
docs-high-level-description: done
docs-installation-instructions: done
docs-removal-instructions:
status: done
comment: docs/TROUBLESHOOTING.md "Uninstalling".
docs-triggers:
status: done
comment: docs/FEATURES.md "Automation triggers & conditions".
entity-event-setup: done
entity-unique-id: done
has-entity-name: done
runtime-data: done
test-before-configure:
status: exempt
comment: Purely local — there is no device or service connection to test.
test-before-setup:
status: done
comment: Storage load + first coordinator refresh fail the setup cleanly.
unique-config-entry:
status: done
comment: Stable unique_id per object entry plus a singleton global entry.
# Silver
action-exceptions:
status: done
comment: Services raise ServiceValidationError / HomeAssistantError.
config-entry-unloading: done
docs-configuration-parameters:
status: done
comment: docs/CONFIGURATION.md documents every parameter.
docs-installation-parameters: done
entity-unavailable: done
integration-owner: done
log-when-unavailable:
status: done
comment: >
Missing/unavailable trigger entities are logged with a grace period and
surfaced as repair issues.
parallel-updates:
status: done
comment: PARALLEL_UPDATES = 0 in all five platforms (sensor, binary_sensor, button, calendar, todo).
reauthentication-flow:
status: exempt
comment: No authentication of any kind.
test-coverage:
status: done
comment: CI enforces >= 98% coverage (--cov-fail-under=98) over 4,300+ backend tests, plus ~900 frontend tests.
# Gold
devices:
status: done
comment: Every maintenance object is a device grouping its task entities.
diagnostics:
status: done
comment: Config-entry diagnostics with PII redaction.
discovery:
status: exempt
comment: Objects are user-defined; there is nothing on the network to discover.
discovery-update-info:
status: exempt
comment: No discovery.
docs-data-update:
status: done
comment: docs/FEATURES.md "Data Updates".
docs-examples: done
docs-known-limitations: done
docs-supported-devices:
status: done
comment: >
Objects model arbitrary real-world equipment (94 object templates); the
devices whose sensors drive tasks automatically are listed in
docs/INTEGRATIONS.md, generated from the suggested-setups catalog
(197 integrations) so it cannot drift.
docs-supported-functions: done
docs-troubleshooting: done
docs-use-cases: done
dynamic-devices:
status: done
comment: >
Objects/tasks created at runtime (panel, WS, services, import) get their
device + entities immediately via entry setup/reload.
entity-category:
status: done
comment: >
The document-storage sensor (integration self-information) is
diagnostic. Task sensors, buttons, the per-task next-due / days-until
sensors and the summary sensors are the maintenance data itself and
stay primary on purpose — they feed dashboards, gauges and voice.
entity-device-class:
status: done
comment: ENUM task sensors, TIMESTAMP next-due, DATA_SIZE storage, problem binary sensors.
entity-disabled-by-default:
status: done
comment: The per-task next-due timestamp and days-until-due sensors are registry-disabled by default.
entity-translations:
status: done
comment: translation_key everywhere; 22 languages with enforced key, placeholder and value parity.
exception-translations:
status: done
comment: >
Every user-facing raise carries translation_domain/translation_key with
the message in strings.json and all 21 translations; the only untranslated
raises are internal codes the WebSocket layer maps to its own error codes.
Tripwired by tests/test_exception_translations.py.
icon-translations: done
reconfiguration-flow:
status: exempt
comment: >
Nothing is fixed at setup time — every setting is editable via the
options flow or the panel settings, so a dedicated reconfigure step
would duplicate them.
repair-issues:
status: done
comment: >
Missing trigger entities, orphaned operator ids, storage hygiene, and
notify-service problems all raise (partly fixable) repair issues.
stale-devices:
status: done
comment: Deleting an object removes its device; task deletion cleans its entities.
# Platinum
async-dependency:
status: exempt
comment: >
The only dependency, pypdf, is a local PDF parser — it talks to no device
or service. Its CPU-bound extraction runs in the executor, so it never
blocks the event loop.
inject-websession:
status: exempt
comment: No HTTP client is used.
strict-typing:
status: done
comment: >
mypy --strict over the whole component is a blocking CI gate — the
websocket package included (its blanket ignore_errors exemption was
removed; only homeassistant.components.websocket_api gets
implicit_reexport, because HA re-exports its decorators without __all__).