← The board

F12 Home Assistant

Area
F — Extensibility
Audience
operator
Kind
feature
Status
accepted
Maturity
built
Labels
extensibility, observability, household, web
Relates to
C10C6B5G2K1

The feature in the specification · Read at

Requirements

  1. F12-R1acceptedMUST

    The integration MUST reach a stack only through sdk-python and only with an integration key, and MUST NOT ask for, accept or store the operator password.

    locked by
    0.18.0 met
    recorded done
    integration-home-assistantcustom_components/lemonfiber/connection.pytests/test_architecture.py::test_the_stack_is_reached_through_sdk_python_alonetests/test_architecture.py::test_no_password_is_asked_for_or_exchanged
    cited by
    integration-home-assistant@9af5206693integration-home-assistant@b1895ad8dcintegration-home-assistant@5dac39142fintegration-home-assistant@3c2fc33b76integration-home-assistant@1b52264b80integration-home-assistant@9c69c3d05aintegration-home-assistant@b762e8c32fintegration-home-assistant@d7f0baa7e3
  2. F12-R2acceptedMUST

    Setup MUST take the stack's address, a key and its certificate pin, MUST verify all three against the stack before creating an entry, and MUST name whichever failed.

    locked by
    0.18.0 met
    recorded done
    integration-home-assistantcustom_components/lemonfiber/config_flow.pytests/test_config_flow.py::test_a_stack_is_added_once_the_address_key_and_pin_are_answered_fortests/test_config_flow.py::test_a_failure_names_the_field_to_change_and_the_form_can_be_answered_againtests/test_config_flow.py::test_a_members_key_is_added_beside_the_stacks_own_as_theirs
    cited by
    integration-home-assistant@4a38e9965cintegration-home-assistant@d7f0baa7e3
  3. F12-R3acceptedMUST

    A refused key MUST start Home Assistant's reauthentication flow, and the address and pin MUST be changeable without removing the entry.

    locked by
    0.18.0 met
    recorded done
    integration-home-assistantcustom_components/lemonfiber/config_flow.pytests/test_config_flow.py::test_a_refused_key_is_replaced_by_asking_for_a_new_one_onlytests/test_config_flow.py::test_the_address_and_pin_move_without_removing_the_entrytests/test_config_flow.py::test_the_address_cannot_move_onto_another_stacktests/test_config_flow.py::test_a_new_key_must_reach_the_stack_the_entry_was_added_for
    cited by
    integration-home-assistant@4a38e9965cintegration-home-assistant@d7f0baa7e3
  4. F12-R4acceptedMUST

    The integration MUST create entities only for what its key's scope admits. A member key MUST yield no technical entity.

    locked by
    0.18.0 met
    recorded done
    integration-home-assistantcustom_components/lemonfiber/__init__.pytests/test_init.py::test_a_members_key_yields_no_technical_entity_and_follows_their_own_streamtests/test_controls.py::test_a_read_key_gets_no_control
    cited by
    integration-home-assistant@ba93c7db14integration-home-assistant@392bf56cf3integration-home-assistant@d7f0baa7e3
  5. F12-R5acceptedMUST

    With a read or act key, the integration MUST provide stack health, doctor findings by severity, disk free per mount, active streams, the download queue and its speed, whether the VPN is up, and updates available.

    locked by
    0.18.0 met
    recorded done
    integration-home-assistantcustom_components/lemonfiber/sensor.pycustom_components/lemonfiber/binary_sensor.pycustom_components/lemonfiber/update.pytests/test_entities.py::test_a_healthy_stack_shows_its_figurestests/test_entities.py::test_the_findings_are_counted_by_severity_and_say_what_happenedtests/test_active_streams.py::test_it_counts_the_sessions_and_says_who_is_watching_whattests/test_update.py::test_a_service_off_its_pin_has_an_update
    cited by
    integration-home-assistant@4a38e9965cintegration-home-assistant@fb83d81427integration-home-assistant@d7f0baa7e3
  6. F12-R6acceptedMUST

    Each alert MUST be fired as a Home Assistant event at onset and at resolution, carrying what happened, what it means and what to do, and never a credential.

    locked by
    0.18.0 met
    recorded done
    integration-home-assistantcustom_components/lemonfiber/alerts.pycustom_components/lemonfiber/event.pytests/test_alerts.py::test_an_alert_is_fired_at_onset_and_at_resolution_with_what_to_dotests/test_alerts.py::test_an_alert_names_nothing_the_entry_holdstests/test_alerts.py::test_the_alerts_entity_shows_the_last_alert_and_which_way_it_went
    cited by
    integration-home-assistant@671f893049
  7. F12-R7acceptedMUST

    State MUST follow the event stream. A value gathered before a gap MUST be shown as unavailable until the stream resumes, and MUST NOT be shown as current.

    locked by
    0.18.0 met
    recorded done
    integration-home-assistantcustom_components/lemonfiber/coordinator.pytests/test_coordinator.py::test_a_gap_shows_every_stream_built_entity_unavailable_until_the_stream_says_it_again
    cited by
    integration-home-assistant@ba93c7db14integration-home-assistant@ece53fa312integration-home-assistant@d7f0baa7e3
  8. F12-R8acceptedMUST

    With an act key, the integration MUST provide restart-service and run-doctor buttons, update entities that apply a stack update, and a pause/resume downloads switch, and no control for an action the contract does not list as callable by a key. Each control MUST report the outcome of the job it started.

    locked by
    0.18.0 met
    recorded done
    integration-home-assistantcustom_components/lemonfiber/button.pycustom_components/lemonfiber/update.pycustom_components/lemonfiber/switch.pycustom_components/lemonfiber/jobs.pytests/test_controls.py::test_a_service_is_restarted_alone_and_the_restart_followedtests/test_controls.py::test_running_the_doctor_follows_its_job_and_reads_the_findings_againtests/test_update.py::test_installing_a_service_agrees_to_its_step_and_reads_the_versions_againtests/test_update.py::test_installing_the_stack_names_no_servicetests/test_controls.py::test_a_call_whose_offer_has_moved_is_refused_in_the_stacks_wordstests/test_controls.py::test_the_downloads_switch_shows_what_the_clients_saytests/test_controls.py::test_toggling_rehearses_then_asks_with_the_offer_and_waits_for_the_clients_to_say_sotests/test_controls.py::test_a_control_whose_action_is_switched_off_is_not_created
    cited by
    integration-home-assistant@4a38e9965cintegration-home-assistant@671f893049integration-home-assistant@392bf56cf3
  9. F12-R9acceptedMUST

    With a member:<account> key, the integration MUST provide that member's requests by state and what they are playing, in the household's words.

    locked by
    0.18.0 met
    recorded done
    integration-home-assistantcustom_components/lemonfiber/member.pycustom_components/lemonfiber/media_player.pycustom_components/lemonfiber/sensor.pytests/test_member.py::test_their_requests_are_counted_by_state_and_named_where_they_have_a_titletests/test_member.py::test_what_they_are_playing_is_shown_without_a_controltests/test_member.py::test_after_a_gap_each_is_unavailable_until_the_stream_says_it_again
    cited by
    integration-home-assistant@4a38e9965cintegration-home-assistant@ba93c7db14
  10. F12-R10acceptedMUST

    Diagnostics MUST withhold the key, the address and the pin.

    locked by
    0.18.0 met
    recorded done
    integration-home-assistantcustom_components/lemonfiber/diagnostics.pytests/test_diagnostics.py::test_the_key_the_address_and_the_pin_appear_nowhere
    cited by
    integration-home-assistant@d7f0baa7e3
  11. F12-R11acceptedMUST

    Every string the integration shows MUST be translated, in English and Dutch at least.

    locked by
    0.18.0 met
    recorded done
    integration-home-assistantcustom_components/lemonfiber/translations/en.jsoncustom_components/lemonfiber/translations/nl.jsontests/test_translations.py::test_every_string_is_translated_with_the_same_placeholders
    cited by
    integration-home-assistant@ece53fa312integration-home-assistant@392bf56cf3integration-home-assistant@fb83d81427integration-home-assistant@d7f0baa7e3
  12. F12-R12acceptedMUST

    The integration MUST meet every rule of Home Assistant's integration quality scale up to and including Platinum.

    locked by
    0.18.0 met
    recorded done
    integration-home-assistantcustom_components/lemonfiber/quality_scale.yamltests/test_quality_scale.py::test_every_rule_is_met_or_exempt_for_a_reason
    cited by
    integration-home-assistant@ece53fa312integration-home-assistant@d7912d8561integration-home-assistant@d7f0baa7e3
  13. F12-R13acceptedMUST

    The integration MUST be installable as a HACS custom repository from this organisation, and MUST NOT require any change to Home Assistant itself.

    locked by
    0.18.0 met
    recorded done
    integration-home-assistanthacs.json.github/workflows/validate.yml
    cited by
    integration-home-assistant@830a9a227dintegration-home-assistant@d7912d8561integration-home-assistant@d7f0baa7e3
  14. F12-R14acceptedMUSTClaim it

    Setup MUST accept a key link (C10-R18) in place of the address, key and pin: it MUST collect the key once over the TLS the link's fingerprint verifies (C10-R20), keep only what the reply carries, and name the reason when the claim is refused.

    locked by
    0.19.0 open
    recorded done
    integration-home-assistantcustom_components/lemonfiber/connection.pycustom_components/lemonfiber/config_flow.pytests/test_key_link.py::test_a_key_link_collects_its_key_once_and_keeps_only_what_the_reply_carriestests/test_key_link.py::test_a_claim_goes_nowhere_but_the_certificate_the_link_pinstests/test_key_link.py::test_a_claim_the_stack_turns_away_says_why_in_the_stacks_words