# 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__).