haggle

Les projets qui suivent les meilleures pratiques ci-dessous peuvent s'auto-certifier et montrer qu'ils ont obtenu le badge de la Open Source Security Foundation (OpenSSF).

Il n'existe aucun ensemble de pratiques qui garantissent que ce logiciel n'aura jamais de défauts ou de vulnérabilités ; même les méthodes formelles peuvent échouer si les spécifications ou les hypothèses sont fausses. Il n'y a pas non plus de pratiques qui peuvent garantir qu'un projet permettra de maintenir une communauté de développement saine et qui fonctionne bien. Toutefois, suivre les meilleures pratiques peut contribuer à améliorer les résultats des projets. Par exemple, certaines pratiques permettent la revue par plusieurs personnes avant publication, ce qui peut aider à trouver des vulnérabilités techniques difficiles à trouver autrement et à renforcer la confiance et un désir d'interaction répétée entre les développeurs de différentes entreprises. Pour gagner un badge, tous les critères DOIT et NE DOIT PAS doivent être satisfaits, tous les critères DEVRAIT doivent être satisfaits OU non satisfaits avec justification, et tous les critères PROPOSÉ doivent être satisfaits OU non satisfaits (nous voulons au moins qu'ils soient considérés). Si vous voulez entrer un texte de justification pour un commentaire générique, au lieu d'une raison justifiant que la situation est acceptable, commencez le bloc de texte avec '//' suivi d'un espace. Les commentaires sont les bienvenus via le site GitHub en tant que problèmes ou pull requests. Il existe également une liste de diffusion pour discussion générale.

Nous fournissons volontiers l'information dans plusieurs langues, cependant, s'il existe un conflit ou une contradiction entre les traductions, la version anglaise est la version qui fait autorité.
Si c'est votre projet, veuillez indiquer votre statut de badge sur votre page de projet ! Le statut du badge ressemble à ceci : Le niveau de badge pour le projet 13582 est silver Voici comment l'intégrer :
Vous pouvez afficher votre statut de badge en incorporant ceci dans votre fichier markdown :
[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/13582/badge)](https://www.bestpractices.dev/projects/13582)
ou en incorporant ceci dans votre HTML :
<a href="https://www.bestpractices.dev/projects/13582"><img src="https://www.bestpractices.dev/projects/13582/badge"></a>


Ce sont les critères du niveau Argent. Vous pouvez également afficher les critères des niveaux Basique ou Or.

Baseline Series: Niveau de référence 1 Niveau de référence 2 Niveau de référence 3

        

 Notions de base 17/17

  • Général

    Notez que d'autres projets peuvent utiliser le même nom.

    AGL Australia smart meter -> Home Assistant Energy dashboard (Claude-generated custom integration)

    Utilisez un format d'expression de licence SPDX ; des exemples sont « Apache-2.0 », « BSD-2-Clause », « BSD-3-Clause », « GPL-2.0+ », « LGPL-3.0+ », « MIT » et « (BSD-2-Clause OU Ruby) ». Ne pas inclure des guillemets simples ou doubles.
    S'il y a plus d'un langage, listez-les en tant que valeurs séparées par des virgules (espaces facultatifs) et triez-les du plus au moins utilisé. S'il y a une longue liste, veuillez lister au moins les trois premiers. S'il n'y a pas de langage (par exemple, il s'agit d'un projet uniquement de documentation ou de test), utilisez le caractère unique « - ». Utilisez une capitalisation conventionnelle pour chaque langage, par exemple « JavaScript ».
    La plate-forme commune d'énumération (CPE) est un schéma de dénomination structuré pour les systèmes, les logiciels et les paquetages des technologies de l'information. Il est utilisé dans un certain nombre de systèmes et de bases de données pour signaler des vulnérabilités.
  • Conditions préalables


    Le projet DOIT atteindre un badge de niveau basique. [achieve_passing]

  • Contenu basique du site Web du projet


    Les informations sur la façon de contribuer DOIVENT inclure les exigences pour des contributions acceptables (par exemple, une référence à toute règle de codage requise). (URL requise) [contribution_requirements]

    CONTRIBUTING.md (https://github.com/NaanyaBiz/haggle/blob/main/CONTRIBUTING.md) states the requirements for acceptable contributions: the mandatory dev loop (ruff lint/format, strict mypy, pytest, pre-commit) that CI re-runs and rejects failures on, enforced Conventional Commits with provenance trailers, a required PR checklist, and anonymisation rules for API fixtures. The referenced AGENTS.md carries the full coding-standard detail ("What NOT to Do", endpoint procedure).


  • Supervision du projet


    Le projet DEVRAIT avoir un mécanisme juridique par lequel tous les développeurs de quantités non triviales de logiciel du projet affirment qu'ils sont légalement autorisés à effectuer ces contributions. L'approche la plus commune et facilement mise en œuvre pour ce faire est d'utiliser un Certificat d'origine du développeur (DCO), où les utilisateurs ajoutent une information « sign-off-by » dans leurs commits et le projet pointe vers le site Web du DCO. Cependant, cela PEUT être mis en œuvre en tant que contrat de licence de contributeur (CLA), ou tout autre mécanisme juridique. (URL requise) [dco]
    Le DCO est le mécanisme recommandé, car il est facile à mettre en œuvre, suivi dans le code source, et git prend directement en charge une fonction « approuvé » en utilisant « commit -s ». Pour être plus efficace, il est préférable que la documentation du projet explique ce que signifie « approuvé » pour ce projet. Un CLA est un accord juridique qui définit les termes en vertu desquels des travaux intellectuels ont été licenciés à une organisation ou un projet. Un accord de cession (CAA) est un accord légal qui transfère les droits dans un travail intellectuel à une autre partie ; il n'est pas exigé d'avoir des CAA pour les projets, car un CAA augmente le risque que les contributeurs potentiels ne contribuent pas, en particulier si le destinataire est un organisme à but lucratif. Les CLA de la Fondation Apache (la licence de contributeur individuel et la CLA d'entreprise) sont des exemples de CLA pour des projets qui déterminent que les risques de ces types de CLA au projet sont inférieurs à leurs avantages.

    CONTRIBUTING.md contains an inbound=outbound licensing statement ("By contributing, you agree your work is licensed under the project's Apache-2.0 license") but no mechanism by which contributors assert they are legally authorized to make their contributions - there is no DCO sign-off requirement, no link to the Developer Certificate of Origin, and no CLA; commit history does not carry Signed-off-by trailers.



    Le projet DOIT définir et documenter clairement son modèle de gouvernance de projet (la façon dont il prend ses décisions, y compris les rôles clés). (URL requise) [governance]
    Il doit y avoir une manière documentée bien établie de prendre des décisions et de résoudre les différends. Dans les petits projets, cela peut être aussi simple que « le propriétaire du projet et dirigeant prend toutes les décisions finales ». Il existe différents modèles de gouvernance, y compris le dictateur bienveillant et la méritocratie formelle ; pour plus de détails, voir Modèles de gouvernance. Les approches centralisées (par exemple, un seul mainteneur) et décentralisées (par exemple, les groupes de mainteneurs) ont été utilisées avec succès dans des projets. L'information sur la gouvernance n'a pas besoin de documenter la possibilité de créer une duplication de projet, car cela est toujours possible pour les projets FLOSS.

    The governance model is documented plainly as single-maintainer: CONTRIBUTING.md (https://github.com/NaanyaBiz/haggle/blob/main/CONTRIBUTING.md) states the single-maintainer model and the issue-first contribution process, .github/CODEOWNERS routes every change to the maintainer (* @naanyabiz), and SECURITY.md's risk-acceptance register states the key role explicitly: "the same person authors, triages, and accepts every exception in this project - self-acceptance is the operating model of a single-maintainer repository" (https://github.com/NaanyaBiz/haggle/blob/main/SECURITY.md). AGENTS.md's "Human-approved boundary" section documents that every merge, tag, and release requires the maintainer's live decision.



    Le projet DOIT adopter un code de conduite et le publier dans un lieu standard. (URL requise) [code_of_conduct]
    Les projets peuvent être en mesure d'améliorer la civilité de leur communauté et d'établir des attentes quant à une conduite acceptable en adoptant un code de conduite. Cela peut aider à éviter les problèmes avant leur apparition et faire du projet un lieu plus accueillant pour encourager les contributions. Cela devrait se concentrer uniquement sur le comportement au sein de la communauté / lieu de travail du projet. Des exemples de codes de conduite sont le code de conduite du noyau Linux, le code de conduite du pacte de contributeur, le code de conduite du projet Debian, le code de conduite du projet Ubuntu, le code de conduite du projet Fedora, le code de conduite du projet GNOME, le code de conduite de la communauté KDE", le code de conduite de la communauté Python, le guide de conduite de la communauté Ruby, et le code de conduite du projet Rust.

    The project has adopted the Contributor Covenant 2.1 as its code of conduct, posted at the standard location https://github.com/NaanyaBiz/haggle/blob/main/CODE_OF_CONDUCT.md. It states scope and enforcement and includes a private reporting contact (security@naanya.biz) with a 5-business-day acknowledgement commitment.



    Le projet DOIT clairement définir et documenter publiquement les rôles clés dans le projet et leurs responsabilités, y compris les tâches que ces rôles doivent accomplir. Il DOIT être clairement exprimé qui a quel(s) rôle(s), mais cela pourrait ne pas être documenté de la même manière. (URL requise) [roles_responsibilities]
    La documentation pour la gouvernance et les rôles et responsabilités peut être à un seul endroit.

    The project publicly documents its role structure: .github/CODEOWNERS assigns ownership of everything to @naanyabiz, SECURITY.md states plainly that the same person authors, triages, releases, and accepts every exception ("self-acceptance is the operating model of a single-maintainer repository"), and AGENTS.md section Provenance enumerates every AI tool operating on the repo with its role and scope plus the human-approved boundary (merging, tagging, and releasing always require the maintainer). The committed conformance map (https://github.com/NaanyaBiz/haggle/blob/main/docs/compliance/conformance.md) records under CO-1 that all role functions collapse into the named owner, so it is unambiguous who holds which role.



    Le projet DOIT pouvoir continuer avec une interruption minimale si une personne décède, est invalidée ou ne peut/veut plus continuer à maintenir le projet. En particulier, le projet DOIT être en mesure de créer et de fermer des problèmes, d'accepter les modifications proposées et de publier des versions du logiciel, dans un délai d'une semaine après confirmation du retrait d'un individu du projet. Cela PEUT être fait en s'assurant que quelqu'un d'autre possède les clés, les mots de passe et les droits juridiques nécessaires pour poursuivre le projet. Les personnes qui exécutent un projet FLOSS PEUVENT faire cela en fournissant des clés dans un coffre-fort et un testament fournissant les droits légaux nécessaires (par exemple, pour les noms DNS). (URL requise) [access_continuity]

    The project documents a continuity and succession plan in SECURITY.md (section "Continuity and succession"): on the maintainer's death or permanent departure, ownership of the GitHub account/repository and the ed25519 release-signing key passes to next of kin per the maintainer's will, and a digital-legacy arrangement grants next of kin identity access to operate, wind down, or transfer the project. Risk-acceptance RA-04 records the residual (estate-administration latency; the living-incapacity gap). https://github.com/NaanyaBiz/haggle/blob/main/SECURITY.md



    Le projet DEVRAIT avoir un « bus factor » de 2 ou plus. (URL requise) [bus_factor]
    Un « bus factor » (aussi connu en tant que « truck factor ») est le nombre minimum de membres du projet qui doivent disparaître soudainement d'un projet (« écrasé par un bus ») avant que le projet ne se bloque en raison du manque de personnel compétent. L'outil truck-factor peut l'estimer pour des projets sur GitHub. Pour plus d'informations, voir Évaluation du « bus factor » des dépôts Git par Cosentino et al.

    The project has a bus factor of 1: a single maintainer authors, reviews, and releases everything. This is recorded openly as risk-acceptance RA-04 in SECURITY.md (https://github.com/NaanyaBiz/haggle/blob/main/SECURITY.md), with the public Apache-2.0 licence, AGENTS.md as a succession document, and attested releases as the compensating controls.


  • Documentation


    Le projet DOIT avoir une feuille de route documentée qui décrit ce que le projet a l'intention de faire et ne pas faire pour au moins l'année suivante. (URL requise) [documentation_roadmap]
    Le projet pourrait ne pas atteindre la feuille de route, et c'est acceptable ; le but de la feuille de route est d'aider les utilisateurs et les contributeurs potentiels à comprendre l'orientation prévue du projet. Elle ne doit nécessairement pas être détaillée.

    ROADMAP.md documents the project's direction for roughly the next 12 months and its explicit non-goals (single-retailer AGL only; electricity and solar feed-in only; read-only Energy-dashboard import; no telemetry, device control, or portal scraping). https://github.com/NaanyaBiz/haggle/blob/main/ROADMAP.md



    Le projet DOIT inclure la documentation de l'architecture (aussi appelée conception de haut niveau) du logiciel produit par le projet. Si le projet ne produit pas de logiciel, sélectionnez « non applicable » (N/A). (URL requise) [documentation_architecture]
    Une architecture de logiciel explique les structures fondamentales d'un programme, c'est-à-dire les principaux composants du programme, les relations entre eux et les propriétés clés de ces composants et de ces relations.

    docs/threat-model.md section 1 "System description" (https://github.com/NaanyaBiz/haggle/blob/main/docs/threat-model.md) documents the high-level design, including a core data-flow diagram (browser -> config flow -> AGL Auth0 -> coordinator/parser -> HA recorder -> diagnostics) and the trust boundaries between components. AGENTS.md's "Repo Map" (https://github.com/NaanyaBiz/haggle/blob/main/AGENTS.md) describes every major component (config_flow, coordinator, sensor, diagnostics, agl client/parser/pinning) with its role and relationships, and the "Energy Dashboard Contract" section documents the key statistics-interface properties.



    Le projet DOIT documenter ce à quoi l'utilisateur peut et ne peut pas s'attendre en termes de sécurité à partir du logiciel produit par le projet (ses « exigences de sécurité »). (URL requise) [documentation_security]
    Ce sont les exigences de sécurité que le logiciel est supposé remplir.

    https://github.com/NaanyaBiz/haggle/blob/main/SECURITY.md documents what users can and cannot expect: the data handled and impact assessment, token storage (including the explicit statement that the OAuth refresh token is plaintext at rest on the HA host, with host-FDE guidance), warn-only TLS SPKI pin-mismatch behaviour, supported versions, and what is in/out of scope. The full per-boundary security requirements, data classification, and resilience targets are in the committed threat model, https://github.com/NaanyaBiz/haggle/blob/main/docs/threat-model.md (sections 2, 3 and 8).



    Le projet DOIT fournir un guide de « démarrage rapide » pour les nouveaux utilisateurs afin de les aider à faire rapidement quelque chose avec le logiciel. (URL requise) [documentation_quick_start]
    L'idée est de montrer aux utilisateurs comment démarrer et de faire en sorte que le logiciel fasse quelque chose. Ceci est d'une importance cruciale pour les utilisateurs potentiels pour les aider à démarrer.

    The README's Install section (https://github.com/NaanyaBiz/haggle/blob/main/README.md) is a five-step quick start taking a new user from HACS install to a working configured integration, including the browser-based AGL login step, and is followed by an Energy-dashboard section telling users exactly which statistics to add; a full setup guide lives at docs/energy-dashboard.md.



    Le projet DOIT faire un effort pour maintenir la documentation conforme à la version actuelle des résultats du projet (y compris les logiciels produits par le projet). Tous les défauts de la documentation connus la rendant incohérente DOIVENT être corrigés. Si la documentation est généralement à jour, mais inclut de manière erronée certaines informations antérieures qui ne sont plus vraies, considérez cela comme un défaut, puis faites le suivi et corrigez comme d'habitude. [documentation_current]
    La documentation PEUT inclure des informations sur les différences ou les modifications entre les versions du logiciel et/ou des liens vers les anciennes versions de la documentation. L'objectif de ce critère est de faire en sorte que la documentation soit cohérente et non pas que la documentation soit parfaite.

    Documentation currency is enforced per-PR: AGENTS.md's "Documentation Checklist - Required on Every PR" mandates updating the CHANGELOG, repo map, API facts, and security docs with every code change (https://github.com/NaanyaBiz/haggle/blob/main/AGENTS.md). Known documentation defects are corrected when found - SECURITY.md's storage section explicitly retracts an earlier incorrect claim that HAOS encrypts data at rest, and a README version-rot defect was fixed by policy (no hardcoded version strings; a shields.io release badge instead).



    La page d'accueil et/ou le site Web du dépôt du projet DOIVENT identifier et pointer tous les accomplissements, y compris ce badge sur les meilleures pratiques, dans les 48 heures suivant la reconnaissance publique que l'accomplissement a été atteint. (URL requise) [documentation_achievements]
    Un accomplissement est un ensemble de critères externes que le projet a spécifiquement cherché à atteindre, y compris certains badges. Cette information ne doit pas nécessairement être sur la page d'accueil du site Web du projet. Un projet utilisant GitHub peut mettre des accomplissements sur la page d'accueil du dépôt en les ajoutant au fichier README.

    The repository front page README (https://github.com/NaanyaBiz/haggle/blob/main/README.md) displays hyperlinked achievement badges at the top: the OpenSSF Best Practices badge (project 13582, linking to bestpractices.dev), the OpenSSF Scorecard badge (linking to the scorecard.dev viewer), and the latest-release badge. The Best Practices badge was added the same day the passing badge was earned (2026-07-12, PR #172).


  • Accessibilité et internationalisation


    Le projet (à la fois les sites du projet et les résultats du projet) DEVRAIT suivre les meilleures pratiques d'accessibilité afin que les personnes handicapées puissent encore participer au projet et utiliser les résultats du projet où il est raisonnable de le faire. [accessibility_best_practices]
    Pour les applications Web, consultez les Directives d'accessibilité des contenus Web (WCAG 2.0) et son document à l'appui Comprendre WCAG 2.0 ; voir aussi les informations d'accessibilité du W3C. Pour les applications IHM, envisagez d'utiliser les directives d'accessibilité spécifiques à l'environnement (telles que Gnome, KDE, XFCE, Android, IOS, Mac et Windows). Certaines applications IHM textuelles (par exemple, les programmes « ncurses ») peuvent faire certaines choses pour se rendre plus accessibles (par exemple, le paramètre « force-arrow-cursor » de « alpine »). La plupart des applications en ligne de commande sont assez accessibles telles quelles. Ce critère est souvent N/A, par exemple, pour les bibliothèques. Voici quelques exemples d'actions à prendre ou de questions à considérer :
    • Fournir des alternatives de texte pour tout contenu non textuel afin qu'il puisse être changé en d'autres formes dont les gens ont besoin, comme une plus grande taille, le braille, une sortie vocale, des symboles ou une langue plus simple (WCAG 2.0 directive 1.1)
    • La couleur n'est pas utilisée comme le seul moyen visuel de transmettre des informations, d'indiquer une action, de provoquer une réponse ou de distinguer un élément visuel. (WCAG 2.0 directive 1.4.1)
    • La présentation visuelle du texte et des images du texte a un taux de contraste d'au moins 4,5:1, à l'exception du grand texte, du texte incident, et des logotypes (WCAG 2.0 directive 1.4.3)
    • Rendez toutes les fonctionnalités disponibles à partir d'un clavier (WCAG directive 2.1)
    • Une IHM ou un projet basé sur le Web DEVRAIT tester avec au moins un lecteur d'écran sur la (les) plate-forme(s) cible(s) (par exemple NVDA, Jaws ou WindowEyes sur Windows ; VoiceOver sur Mac & iOS ; Orca sous Linux/BSD ; TalkBack sur Android). Les programmes IHM textuels PEUVENT travailler à réduire le retrait excessif pour éviter la lecture redondante par les lecteurs d'écran.

    The project ships no user interface of its own: it is a headless Home Assistant integration whose config flow, sensors, and Energy-dashboard statistics are all rendered by Home Assistant's standard frontend (the integration contributes only strings.json/translations, no HTML/JS/frontend assets), and accessibility of that UI is owned upstream by Home Assistant. Project documentation is plain Markdown rendered by GitHub.



    Le logiciel produit par le projet DEVRAIT être internationalisé pour permettre une localisation facile pour la culture, la région ou la langue du public cible. Si l'internationalisation (i18n) ne s'applique pas (par exemple, le logiciel ne génère pas de texte destiné aux utilisateurs finaux et ne trie pas de texte lisible par les humains), sélectionnez « non applicable » (N/A). [internationalization]
    La localisation « réfère à l'adaptation du contenu d'un produit, d'une application ou d'un document pour répondre aux exigences linguistiques, culturelles et autres d'un marché cible spécifique (un lieu). » L'internationalisation est la « conception et le développement du contenu d'un produit, d'une application ou d'un document qui permette une localisation facile pour les publics cibles qui varient en culture, en région ou en langue. » (Voir la page « Localisation ou Internationalisation » du W3C.) Le logiciel répond à ce critère simplement en étant internationalisé. Aucune localisation pour une autre langue spécifique n'est requise, car une fois que le logiciel a été internationalisé, d'autres peuvent travailler sur la localisation.

    User-facing text is externalized through Home Assistant's standard translation framework: custom_components/haggle/strings.json (https://github.com/NaanyaBiz/haggle/blob/main/custom_components/haggle/strings.json) holds all config-flow, error, and entity strings, mirrored in translations/en.json - localizing to another language is a matter of adding a translations/<lang>.json file. Only English is currently provided.


  • Autre


    Si les sites du projet (site Web, dépôt et URL de téléchargement) entreposent des mots de passe pour l'authentification d'utilisateurs externes, les mots de passe DOIVENT être entreposés comme hachages itérés avec salage par utilisateur en utilisant un algorithme d'étirement des clés (itéré) (par exemple, Argon2id, Bcrypt, Scrypt, ou PBKDF2). Si les sites du projet n'entreposent pas de mots de passe à cette fin, sélectionnez « non applicable » (N/A). [sites_password_security]
    Notez que l'utilisation de GitHub répond à ce critère. Ce critère s'applique uniquement aux mots de passe utilisés pour l'authentification d'utilisateurs externes sur les sites du projet (càd l'authentification entrante). Si les sites du projet doivent se connecter à d'autres sites (càd l'authentification sortante), ils devront peut-être entreposer différemment des jetons d'identification à cette fin (puisque conserver un code de hachage serait inutile). Ceci applique le critère crypto_password_storage aux sites du projet, de manière similaire à sites_https.

    All project sites (repository, issue tracker, releases, security advisories) are hosted on GitHub, which handles external-user authentication and stores passwords per this criterion; the project operates no site of its own that stores passwords.


 Contrôle des modifications 1/1

  • Versions précédentes


    Le projet DOIT maintenir les anciennes versions les plus utilisées du produit ou fournir un chemin de mise à niveau vers des versions plus récentes. Si le chemin de mise à niveau est difficile, le projet DOIT documenter comment effectuer la mise à niveau (par exemple, les interfaces qui ont changé et une suggestion d'étapes détaillées pour aider la mise à niveau). [maintenance_or_update]

    SECURITY.md section Supported Versions states the latest tagged release on main is the only supported version, with upgrades surfaced to users automatically via HACS. The README's "Rollback / downgrade" section (https://github.com/NaanyaBiz/haggle/blob/main/README.md) documents that any prior release can be reinstalled via HACS, that config entries are downgrade-safe and statistics survive in both directions, and docs/releasing.md requires a recorded manual downgrade test with each stable release.


 Compte-rendu 3/3

  • Procédure de signalement des bogues


    Le projet DOIT utiliser un suivi des problèmes pour le suivi des problèmes individuels. [report_tracker]

    The project tracks individual issues on the GitHub issue tracker at https://github.com/NaanyaBiz/haggle/issues, declared machine-readably in the integration manifest ("issue_tracker" in https://github.com/NaanyaBiz/haggle/blob/main/custom_components/haggle/manifest.json) and in pyproject.toml project URLs. CONTRIBUTING.md requires an issue-first workflow and AGENTS.md defines a triaged label taxonomy (P1-P3 priority, sev:high/med/low, escaped) consumed by the release flow and quarterly delivery metrics.


  • Processus de signalement de vulnérabilité


    Le projet DOIT créditer les auteurs de tous les signalements de vulnérabilité résolus au cours des 12 derniers mois, à l'exception des auteurs qui demandent l'anonymat. S'il n'y a pas eu de vulnérabilité résolue au cours des 12 derniers mois, sélectionnez « non applicable » (N/A). (URL requise) [vulnerability_report_credit]

    No vulnerability reports have been received or resolved in the last 12 months (the project is only a few months old); SECURITY.md's "Hall of Fame" section explicitly reads "(none yet - be the first.)". SECURITY.md commits to crediting reporters in release notes and the Hall of Fame unless anonymity is requested (https://github.com/NaanyaBiz/haggle/blob/main/SECURITY.md). The one CVE fix in CHANGELOG (idna, dev-only lockfile) came via automated Dependabot monitoring, not an external report to this project.



    Le projet DOIT avoir un processus documenté pour répondre aux signalements de vulnérabilité. (URL requise) [vulnerability_response_process]
    Ceci est fortement lié à vulnerability_report_process, qui exige qu'il existe un moyen documenté de signaler les vulnérabilités. Il a également trait à la vulnerability_report_response, qui nécessite une réponse aux signalements de vulnérabilité dans un certain laps de temps.

    https://github.com/NaanyaBiz/haggle/blob/main/SECURITY.md documents the full response process: private reporting via GitHub Private Security Advisories or security@naanya.biz, acknowledgement within 5 business days, graduated response targets by severity (critical 72 h / high 7 days / moderate-low 30 days), a self-escalation forcing function honest about the single-maintainer bound, a coordinated-disclosure window (14 days), and the known-vulnerable-release procedure (GHSA advisory, superseding release, HACS delisting).


 Qualité 19/19

  • Normes de codage


    Le projet DOIT identifier les guides de style de codage spécifiques pour les langages principaux qu'il utilise, et exiger que les contributions le respectent en général. (URL requise) [coding_standards]
    Dans la plupart des cas, cela se fait en se référant à certains guides de style existants, ce qui permet d'énumérer les différences. Ces guides de style peuvent inclure des moyens d'améliorer la lisibilité et les moyens de réduire la probabilité de défauts (y compris les vulnérabilités). Beaucoup de langages de programmation ont un ou plusieurs guides de style largement utilisés. Des exemples de guides de style incluent les guides de style de Google et les Règles de codage du SEI CERT.

    CONTRIBUTING.md requires contributions to pass the documented dev loop - ruff check, ruff format, and strict mypy - before pushing (https://github.com/NaanyaBiz/haggle/blob/main/CONTRIBUTING.md). The specific style configuration is committed in pyproject.toml ([tool.ruff] with 17 rule families, line-length 88, isort ordering; [tool.mypy] strict = true) (https://github.com/NaanyaBiz/haggle/blob/main/pyproject.toml), and .github/workflows/ci.yml enforces ruff check, ruff format --check, and mypy as part of a required PR status check.



    Le projet DOIT imposer automatiquement son ou ses styles de codage sélectionnés s'il existe au moins un outil FLOSS qui peut le faire dans le(s) langage(s) sélectionné(s). [coding_standards_enforced]
    Cela PEUT être mis en œuvre en utilisant des outils d'analyse statique et/ou en faisant passer le code à travers des outils de remise en forme. Dans de nombreux cas, la configuration de l'outil est incluse dans le dépôt du projet (car différents projets peuvent choisir différentes configurations). Les projets PEUVENT permettre des exceptions de style (et le font habituellement) ; là où les exceptions se produisent, elles DOIVENT être rares et documentées dans le code à leur emplacement, afin que ces exceptions puissent être revues et que les outils puissent les gérer automatiquement à l'avenir. Des exemples de tels outils incluent ESLint (JavaScript), Rubocop (Ruby) et devtools check (R).

    Coding style is enforced automatically by FLOSS tools: ruff lint, ruff format --check, and mypy run on every push and pull request in CI (https://github.com/NaanyaBiz/haggle/blob/main/.github/workflows/ci.yml, steps at lines 41-48), and the containing 'Test (Python 3.14)' job is one of eight required status checks under the zero-bypass protect-main ruleset, so a style violation blocks merge. The selected style is committed in pyproject.toml ([tool.ruff]) and also enforced locally via pre-commit hooks.


  • Système de construction opérationnel


    Les systèmes de construction pour les binaires natifs DOIVENT honorer les variables (d'environnement) pertinentes du compilateur et du lieur qui leur sont transmises (par exemple, CC, CFLAGS, CXX, CXXFLAGS et LDFLAGS) et les transmettre aux invocations du compilateur et du lieur. Un système de construction PEUT les étendre avec des options supplémentaires ; il NE DOIT PAS simplement remplacer les valeurs fournies par les siennes. Si aucun fichier binaire natif n'est généré, sélectionnez « non applicable » (N/A). [build_standard_variables]
    Il devrait être facile d'activer des fonctionnalités de construction spéciales telles que Address Sanitizer (ASAN), ou de se conformer aux meilleures pratiques de durcissement de la distribution (par exemple, en activant facilement les options de compilation pour le faire).

    The project is a pure-Python Home Assistant custom integration: manifest.json declares "requirements": [] and the hatchling build backend produces no native binaries, so no compiler or linker is ever invoked and CC/CFLAGS-style variables have no referent.



    Le système de construction et d'installation DEVRAIT préserver les informations de débogage si elles sont demandées dans les options correspondants (par exemple, « install -s » n'est pas utilisé). S'il n'y a pas de système de construction ou d'installation (par exemple, les bibliothèques JavaScript typiques), sélectionnez « non applicable » (N/A). [build_preserve_debug]
    Par exemple, la définition de CFLAGS (C) ou CXXFLAGS (C++) devrait créer les informations de débogage pertinentes si ces langages sont utilisés et elles ne devraient pas être retirées pendant l'installation. Des informations de débogage sont nécessaires pour le support et l'analyse, et également utiles pour mesurer la présence de fonctionnalités de durcissement dans les binaires compilés.

    The release build (https://github.com/NaanyaBiz/haggle/blob/main/.github/workflows/release.yml, "Build release artifact" step) zips the unmodified Python source of custom_components/haggle, excluding only pycache/.pyc; HACS installs that zip as-is. Nothing is stripped, minified, or compiled, so full source-level debugging information (readable source, tracebacks with line numbers) is always preserved in what users install.



    Le système de construction pour le logiciel produit par le projet NE DOIT PAS reconstruire de manière récursive des sous-répertoires s'il existe des dépendances croisées dans les sous-répertoires. S'il n'y a pas de système de construction ou d'installation (par exemple, les bibliothèques JavaScript typiques), sélectionnez « non applicable » (N/A). [build_non_recursive]
    Les informations de dépendance internes du système de construction du projet doivent être précises, sinon, les modifications apportées au projet peuvent ne pas s'effectuer correctement. Des constructions incorrectes peuvent entraîner des défauts (y compris des vulnérabilités). Une erreur courante dans les grands systèmes de construction est d'utiliser une « construction récursive », c'est-à-dire une hiérarchie de sous-répertoires contenant des fichiers source, chaque sous-répertoire étant construit de manière indépendante. Sauf si chaque sous-répertoire est entièrement indépendant, ceci est une erreur, car les informations de dépendance sont incorrectes.

    The only build step is a single, flat packaging step in the release workflow: release.yml zips the contents of custom_components/haggle/ into haggle.zip in one command, then generates SBOMs and attestations from that artifact (https://github.com/NaanyaBiz/haggle/blob/main/.github/workflows/release.yml). There are no subdirectory builds, no Makefile recursion, and no cross-directory build dependencies; the integration is pure Python with zero compiled components.



    Le projet DOIT pouvoir répéter le processus de génération d'informations à partir de fichiers source et obtenir exactement le même résultat bit-à-bit. Si aucune construction ne se produit (par exemple, dans les langages de script où le code source est utilisé directement au lieu d'être compilé), sélectionnez « non applicable » (N/A). [build_repeatable]
    Les utilisateurs GCC et Clang peuvent trouver l'option -frandom-seed utile ; dans certains cas, cela peut être résolu en forçant un ordre de tri. Plus de suggestions peuvent être trouvées sur le site pour une construction reproductible.

    Not applicable: haggle is a pure-Python Home Assistant custom integration whose source is used directly - HACS extracts the release archive and Home Assistant imports the .py files unchanged, so there is no compilation or build step to reproduce bit-for-bit. The criterion explicitly permits N/A where source is used directly rather than compiled.


  • Système d'installation


    Le projet DOIT fournir un moyen d'installer et de désinstaller facilement le logiciel produit par le projet en utilisant une convention couramment utilisée. [installation_common]
    Des exemples comprennent l'utilisation d'un gestionnaire de paquets (au niveau du système ou du langage), « make/install/uninstall » (supportant DESTDIR), un conteneur dans un format standard ou une image de machine virtuelle dans un format standard. Le processus d'installation et de désinstallation (par exemple, son paquetage) PEUT être mis en œuvre par un tiers tant qu'il est FLOSS.

    The integration is distributed via HACS (the Home Assistant community package manager) and is in the HACS default store; README section Install documents the install (HACS -> search Haggle -> Download -> restart) and section Removing documents uninstall via HA's Settings -> Devices & Services, including a best-effort revocation of the stored OAuth grant on removal (https://github.com/NaanyaBiz/haggle/blob/main/README.md). hacs.json configures the attested zip_release asset that HACS installs.



    Le système d'installation pour les utilisateurs finaux DOIT honorer les conventions standard pour sélectionner l'emplacement où les artefacts construits sont écrits au moment de l'installation. Par exemple, s'il installe des fichiers sur un système POSIX, il DOIT honorer la variable d'environnement DESTDIR. S'il n'y a pas de système d'installation ou pas de convention standard, sélectionnez « non applicable » (N/A). [installation_standard_variables]

    The installation system is HACS, which installs the integration into Home Assistant's standard custom_components/ location inside the user-chosen HA configuration directory - the platform's standard convention for install location (install and rollback steps documented at https://github.com/NaanyaBiz/haggle/blob/main/README.md#install). Nothing is compiled, so no DESTDIR-style build-time relocation applies to this artifact type; the install location follows the ecosystem convention exactly.



    Le projet DOIT fournir un moyen pour les développeurs potentiels d'installer rapidement tous les résultats du projet ainsi que l'environnement nécessaire pour apporter des modifications, y compris les tests et l'environnement de test. Cela DOIT être effectué avec une convention couramment utilisée. [installation_development_quick]
    Cela PEUT être implémenté à l'aide d'un conteneur généré et/ou d'un script d'installation. Les dépendances externes sont généralement installées en invoquant des gestionnaires de paquets du système et/ou du langage, comme précisé dans external_dependencies.

    CONTRIBUTING.md section Dev loop (https://github.com/NaanyaBiz/haggle/blob/main/CONTRIBUTING.md) documents a one-command setup - uv sync installs the complete dev and test environment from the hash-pinned uv.lock - followed by uv run pytest / ruff / mypy / pre-commit, matching what CI runs. A committed .devcontainer/devcontainer.json additionally provides a ready-made containerized dev environment with uv preinstalled.


  • Composants maintenus à l'extérieur


    Le projet DOIT afficher ses dépendances externes de manière analysable par ordinateur. (URL requise) [external_dependencies]
    Généralement, cela se fait en utilisant les conventions du gestionnaire de paquets et/ou du système de construction. Notez que cela permet d'implémenter installation_development_quick.

    Runtime dependencies are declared machine-readably in https://github.com/NaanyaBiz/haggle/blob/main/custom_components/haggle/manifest.json ("requirements": [] - the integration deliberately ships zero packages; everything it imports is vendored and pinned by Home Assistant core, as documented in SECURITY.md's supply-chain section). Development/test dependencies are declared in https://github.com/NaanyaBiz/haggle/blob/main/pyproject.toml and hash-pinned in uv.lock; Dependabot processes both the pip and github-actions ecosystems weekly.



    Les projets DOIVENT surveiller ou vérifier périodiquement leurs dépendances externes (y compris les copies de commodité) pour détecter les vulnérabilités connues, et corriger les vulnérabilités exploitables ou les vérifier comme inexploitables. [dependency_monitoring]
    Cela peut se faire à l'aide d'un outil d'analyse d'origine, de vérification de dépendance ou d'analyse de la composition du logiciel tel que Dependency-Check d'OWASP, Nexus Auditeur de Sonartype, Black Duck Software Composition Analysis de Synopsys, et Bundler-audit (pour Ruby). Certains gestionnaires de paquets comprennent des mécanismes pour le faire. Il est acceptable que la vulnérabilité des composants ne puisse pas être exploitée, mais cette analyse est difficile et il est parfois plus simple de mettre à jour ou de corriger la dépendance.

    Dependabot runs weekly on both the pip lockfile and github-actions ecosystems (https://github.com/NaanyaBiz/haggle/blob/main/.github/dependabot.yml), and every PR is gated by a required "Dependency review" check (actions/dependency-review-action, fail-on-severity: moderate, vulnerability-check: true) in ci.yml. SECURITY.md documents the triage ladder for alerts (critical 72 h / high 7 d / rest 30 d) and the exploitability analysis: manifest.json ships zero runtime requirements, so lockfile CVEs are dev/CI-only and are triaged on that recorded basis.



    Le projet DOIT :
    1. rendre facile l'identification et la mise à jour des composants maintenus extérieurement au projet ; ou
    2. utiliser des composants standards fournis par le système ou le langage de programmation.
    Ensuite, si une vulnérabilité se trouve dans un composant réutilisé, il sera facile de mettre à jour ce composant. [updateable_reused_components]
    Une façon typique de respecter ce critère est d'utiliser les systèmes de gestion des paquets du système et du langage de programmation. De nombreux programmes FLOSS sont distribués avec des « bibliothèques de commodité » qui sont des copies locales de bibliothèques standard (éventuellement dupliquées). En soi, c'est acceptable. Cependant, si le programme *doit* utiliser ces copies locales (dupliquées), la mise à jour des bibliothèques « standard » lors de mises à jour de sécurité laissera ces copies supplémentaires encore vulnérables. C'est particulièrement un problème pour les systèmes basés sur le cloud ; si le fournisseur du cloud met à jour ses librairies « standard » mais que le programme ne les utilise pas, les mises à jour ne vous aideront pas. Voir, par exemple, « Chromium : pourquoi il n'est pas encore un vrai paquet dans Fedora » par Tom Callaway.

    The shipped integration reuses only components vendored and version-pinned by Home Assistant core - https://github.com/NaanyaBiz/haggle/blob/main/custom_components/haggle/manifest.json declares "requirements": [] - so users receive standard platform-provided components. Development dependencies are enumerated in pyproject.toml and hash-locked per artifact in uv.lock, and https://github.com/NaanyaBiz/haggle/blob/main/.github/dependabot.yml runs weekly grouped update PRs for both the pip and github-actions ecosystems.



    Le projet DEVRAIT éviter d'utiliser des fonctions et des API obsolètes quand des alternatives FLOSS sont disponibles dans l'ensemble de technologies qu'il utilise (sa « pile de technologies ») et disponibles à une large majorité des utilisateurs supportés par le projet (afin que les utilisateurs puissent avoir accès à l'alternative). [interfaces_current]

    Ruff's pyupgrade (UP), flake8-async (ASYNC), and bugbear (B) rule families are enabled in pyproject.toml and gate every PR, flagging obsolete Python idioms and deprecated patterns (https://github.com/NaanyaBiz/haggle/blob/main/pyproject.toml); pytest runs with filterwarnings = "error" so deprecation warnings from the project's own code fail the suite (upstream homeassistant DeprecationWarnings are the only scoped exception). A weekly compat workflow additionally runs the full suite against the latest Home Assistant releases including betas to catch upcoming upstream deprecations early (https://github.com/NaanyaBiz/haggle/blob/main/.github/workflows/compat.yml).


  • Suite de tests automatisée


    Une suite de tests automatisée DOIT être appliquée à chaque commit dans un dépôt partagé pour au moins une branche. Cette suite de tests DOIT produire un rapport sur le succès ou l'échec du test. [automated_integration_testing]
    Cette exigence peut être considérée comme un sous-ensemble de test_continuous_integration, mais axée sur le simple test, sans nécessiter une intégration continue.

    The full automated test suite (pytest, with a combined line+branch coverage floor of 89% enforced via --cov-fail-under) runs on every push to main and every pull request via https://github.com/NaanyaBiz/haggle/blob/main/.github/workflows/ci.yml, producing a success/failure report as a GitHub check run on each commit; the check is required for merge by the protect-main ruleset.



    Le projet DOIT ajouter des tests de régression à une suite de tests automatisée pour au moins 50% des bogues corrigés au cours des six derniers mois. [regression_tests_added50]

    The committed test strategy (https://github.com/NaanyaBiz/haggle/blob/main/docs/testing.md) requires that every escaped defect gets a named, pinned regression test and lists the existing pins (e.g. test_uses_outer_consumption_quantity_not_inner_values, test_baseline_looked_up_at_earliest_fetched_hour, test_band_reachback_baseline_after_long_absence). Verified in git history: 14 of the 16 integration-code bug-fix commits in the last six months (~87%) included automated-test additions or changes in the same commit, well above the 50% threshold.



    Le projet DOIT avoir une ou des suites de tests automatisées FLOSS qui fournissent une couverture d'instructions d'au moins 80% s'il existe au moins un outil FLOSS qui peut mesurer ce critère dans le langage sélectionné. [test_statement_coverage80]
    De nombreux outils FLOSS sont disponibles pour mesurer la couverture des tests, y compris gcov/lcov, Blanket.js, Istanbul, JCov et covr (R). Notez que respecter ce critère n'est pas une garantie que la suite de tests est complète, mais, à l'inverse, ne pas respecter ce critère est un indicateur fort d'une suite de tests insuffisante.

    The FLOSS test suite (pytest + coverage.py, ~254 tests including recorder-backed integration tests) is gated in CI at a combined line+branch coverage floor of 89% via --cov-fail-under=89 in https://github.com/NaanyaBiz/haggle/blob/main/.github/workflows/ci.yml, part of the required "Test (Python 3.14)" status check enforced by the zero-bypass protect-main ruleset. Current statement (line) coverage is 91.6% (local coverage.xml line-rate 0.9162; https://github.com/NaanyaBiz/haggle/blob/main/docs/testing.md records 90.0% combined at floor-setting time and defines the floor as an upward-only ratchet).


  • Nouveau test de fonctionnalité


    Le projet DOIT avoir une politique écrite formelle, que dès qu'une nouvelle fonctionnalité majeure est ajoutée, des tests pour la nouvelle fonctionnalité DOIVENT être ajoutés à une suite de tests automatisée. [test_policy_mandated]

    docs/testing.md (https://github.com/NaanyaBiz/haggle/blob/main/docs/testing.md) is the formal written test policy: its "Required depth per change type" section mandates automated tests for every functional change class (new endpoint => new fixture + parser tests; coordinator/statistics change => harness-integration tests, with real-recorder tests for sum-chain changes; every escaped defect => a named pinned regression test), enforced by the required CI check with a ratcheting coverage floor (--cov-fail-under=89). CONTRIBUTING.md and AGENTS.md's "Adding a New Endpoint" procedure repeat the tests-required rule for contributors.



    Le projet DOIT inclure, dans ses instructions documentées pour les propositions de changement, la politique selon laquelle des tests doivent être ajoutés pour toute nouvelle fonctionnalité majeure. [tests_documented_added]
    Cependant, même une règle informelle est acceptable tant que les tests sont ajoutés dans la pratique.

    https://github.com/NaanyaBiz/haggle/blob/main/CONTRIBUTING.md requires new-endpoint contributions to "Add an anonymised fixture, parser, client method, and tests", and https://github.com/NaanyaBiz/haggle/blob/main/docs/testing.md section "Required depth per change type" mandates the specific test layer for every class of change (new endpoint => new fixture + parser tests; cumulative-sum changes => recorder-backed tests in test_recorder_statistics.py; escaped defects => a named pinned regression test), enforced by CI's ratcheting 89% coverage floor.


  • Options d'avertissement


    Les projets DOIVENT être maximalement stricts avec les avertissements dans le logiciel produit par le projet, quand cela est approprié. [warnings_strict]
    Certains avertissements ne peuvent être efficacement activés sur certains projets. Ce qui est nécessaire est la preuve que le projet s'efforce d'activer les options d'avertissements où il peut, de sorte que les erreurs soient détectées tôt.

    Warnings are maximally strict and enforced in CI: mypy runs with strict = true plus warn_unreachable, warn_unused_ignores, and warn_redundant_casts; ruff enables 17 rule families including security (flake8-bandit), pylint, bugbear, and a max-complexity 12 gate; and pytest converts warnings to errors (filterwarnings = "error" with narrowly scoped upstream exceptions) - all configured in pyproject.toml (https://github.com/NaanyaBiz/haggle/blob/main/pyproject.toml) and run as part of the required "Test (Python 3.14)" PR check in .github/workflows/ci.yml.


 Sécurité 13/13

  • Connaissance du développement sécurisé


    Le projet DOIT implémenter des principes de conception sécurisés (à partir de « know_secure_design »), quand cela est approprié. Si le projet ne produit pas de logiciel, sélectionnez « non applicable » (N/A). [implement_secure_design]
    Par exemple, les résultats du projet devraient avoir des valeurs sécurisées par défaut (les décisions d'accès devraient être de refuser par défaut et l'installation des projets devrait être sécurisée par défaut). Ils devraient également avoir une médiation complète (tout accès qui pourrait être limité doit être vérifié pour l'autorité et être non contournable). Notez que, dans certains cas, ces principes entrent en conflit, auquel cas un choix doit être fait (par exemple, de nombreux mécanismes peuvent rendre les choses plus complexes, en contravention de « l'économie de mécanisme » / principe KISS).

    Secure design principles are applied and documented per trust boundary in the committed threat model (https://github.com/NaanyaBiz/haggle/blob/main/docs/threat-model.md section 3): all untrusted AGL JSON passes allowlist parsing with numeric clamping to finite non-negative values (complete mediation / input validation, fuzz-enforced); least privilege governs OAuth scopes (read-only, with a documented re-assessment tripwire on any write scope) and CI tokens (read-only default, job-scoped writes); fail-safe defaults appear as fail-closed release gates (tag ancestry + signature verification) and a fail-closed secret-scanner self-test; secret exposure is minimised (memory-only 15-minute access token, rotate-on-use refresh token, hash-only fallback unique_id).


  • Utiliser de bonnes pratiques de base de cryptographie

    Notez que certains logiciels n'ont pas besoin d'utiliser des mécanismes cryptographiques. Si votre projet produit un logiciel qui (1) inclut ou active la fonctionnalité de chiffrement, et (2) peut être publié des États-Unis (US) vers l'extérieur des États-Unis ou vers un citoyen autre qu'américain, vous pouvez être légalement obligé à faire quelques étapes supplémentaires. En règle générale, cela implique simplement l'envoi d'un email. Pour plus d'informations, consultez la section sur le chiffrement de Comprendre la technologie Open Source et les contrôles à l'exportation américains .

    Les mécanismes de sécurité par défaut dans le logiciel produit par le projet NE DOIVENT PAS dépendre d'algorithmes ou de modes cryptographiques avec des faiblesses sérieuses connues (par exemple, l'algorithme de hachage cryptographique SHA-1 ou le mode CBC en SSH). [crypto_weaknesses]
    Les préoccupations concernant le mode CBC en SSH sont discutées dans CERT : vulnérabilité SSH CBC.

    All cryptographic mechanisms in the integration use SHA-256 or stronger: the OAuth PKCE challenge is S256 (config_flow.py), TLS pins are SHA-256 SPKI hashes (https://github.com/NaanyaBiz/haggle/blob/main/custom_components/haggle/agl/pinning.py), diagnostics anonymisation is HMAC-SHA256 (diagnostics.py), and the fallback unique_id is a SHA-256 digest. A search of the integration code finds no MD5 or SHA-1 usage; TLS itself is provided by the host Python/aiohttp stack with modern defaults.



    Le projet DEVRAIT supporter plusieurs algorithmes cryptographiques, afin que les utilisateurs puissent rapidement changer si l'un deux est cassé. Les algorithmes à clés symétriques courants incluent AES, Twofish et Serpent. Les alternatives d'algorithme de hachage cryptographique courantes incluent SHA-2 (y compris SHA-224, SHA-256, SHA-384 ET SHA-512) et SHA-3. [crypto_algorithm_agility]

    All transport cryptography is delegated to the platform TLS stack (Python ssl/OpenSSL via aiohttp), which negotiates among multiple cipher suites and inherits new/updated algorithms from platform updates - the project hard-codes no protocol cryptography. The only project-level primitive is SHA-256, used for the Trust-On-First-Use SPKI pin comparison (https://github.com/NaanyaBiz/haggle/blob/main/custom_components/haggle/agl/pinning.py) and a fallback hashed unique_id; the pin check is deliberately warn-only (SECURITY.md), so a break in that hash degrades a defence-in-depth signal without blocking traffic, and the algorithm is swappable in a single helper.



    Le projet DOIT supporter le stockage des informations d'authentification (comme les mots de passe et les jetons dynamiques) et des clés cryptographiques privées dans des fichiers distincts des autres informations (fichiers de configuration, bases de données et journaux) et permettre aux utilisateurs de les mettre à jour et de les remplacer sans recompilation de code. Si le projet ne traite jamais d'informations d'authentification et de clés cryptographiques privées, sélectionnez « non applicable » (N/A). [crypto_credential_agility]

    The only credential the project processes is the user's own AGL OAuth refresh token, which is stored in Home Assistant's config-entry store (.storage/core.config_entries) - a data file entirely separate from the integration code - alongside the TOFU TLS pin hashes; SECURITY.md section Storage documents this (https://github.com/NaanyaBiz/haggle/blob/main/SECURITY.md). Credentials are replaced at any time via the standard HA Reconfigure/reauth flow with no code change (pure Python, nothing is compiled), and no credentials or keys are embedded in the source (enforced by the layered gitleaks scanning).



    Le logiciel produit par le projet DEVRAIT supporter des protocoles sécurisés pour toutes ses communications réseau, tels que SSHv2 ou ultérieur, TLS1.2 ou ultérieur (HTTPS), IPsec, SFTP et SNMPv3. Les protocoles non sûrs tels que FTP, HTTP, telnet, SSLv3 ou antérieur, et SSHv1 DEVRAIENT être désactivés par défaut et uniquement activés si l'utilisateur le configure spécifiquement. Si le logiciel produit par le projet ne prend pas en charge les communications réseau, sélectionnez « non applicable » (N/A). [crypto_used_network]

    All network communication is HTTPS: the only outbound endpoints are https://secure.agl.com.au and https://api.platform.agl.com.au, defined in https://github.com/NaanyaBiz/haggle/blob/main/custom_components/haggle/const.py, with no plaintext-protocol code path. TLS is additionally hardened with Trust-On-First-Use SPKI pinning of both hosts (custom_components/haggle/agl/pinning.py; documented in SECURITY.md section Trust-On-First-Use TLS pinning).



    Le logiciel produit par le projet DEVRAIT, s'il prend en charge ou utilise TLS, prendre en charge au moins TLS version 1.2. Notez que le prédécesseur de TLS s'appelait SSL. Si le logiciel n'utilise pas TLS, sélectionnez « non applicable » (N/A). [crypto_tls12]

    All upstream communication is HTTPS-only to secure.agl.com.au and api.platform.agl.com.au (const.py) via aiohttp on Python >=3.14, whose default TLS context negotiates a minimum of TLS 1.2 and supports TLS 1.3; no code in the repository lowers the TLS minimum or constructs a weakened SSL context. On top of transport TLS, both hosts are Trust-On-First-Use SPKI-pinned, with mismatches surfaced to the user (https://github.com/NaanyaBiz/haggle/blob/main/custom_components/haggle/agl/pinning.py).



    Le logiciel produit par le projet DOIT, s'il prend en charge TLS, effectuer la vérification des certificats TLS par défaut lors de l'utilisation de TLS, y compris sur les sous-ressources. Si le logiciel n'utilise pas TLS, sélectionnez « non applicable » (N/A). [crypto_certificate_verification]

    All upstream communication is HTTPS via aiohttp, whose default TLS certificate verification is never disabled anywhere in the shipped code (no ssl=False, verify overrides, or CERT_NONE exist in custom_components/), and the integration additionally layers Trust-On-First-Use SPKI pinning of both AGL endpoints on top of standard verification (https://github.com/NaanyaBiz/haggle/blob/main/custom_components/haggle/agl/pinning.py; behaviour documented in SECURITY.md, 'Trust-On-First-Use TLS pinning').



    Le logiciel produit par le projet DOIT, s'il supporte TLS, effectuer une vérification de certificat avant d'envoyer des en-têtes HTTP avec des informations privées (telles que des cookies sécurisés). Si le logiciel n'utilise pas TLS, sélectionnez « non applicable » (N/A). [crypto_verification_private]

    All upstream endpoints are HTTPS (const.py: secure.agl.com.au, api.platform.agl.com.au) and every request goes through aiohttp with default certificate and hostname verification - no ssl=False, CERT_NONE, or check_hostname override exists anywhere in the tree - so verification completes during the TLS handshake before any HTTP headers carrying bearer tokens are sent. On top of WebPKI verification, a Trust-On-First-Use SHA-256 SPKI pin is checked on every new connection (https://github.com/NaanyaBiz/haggle/blob/main/custom_components/haggle/agl/pinning.py); the pin layer is warn-only by documented design, but standard certificate verification always applies.


  • Livraison sécurisée


    Le projet DOIT signer cryptographiquement les versions des résultats du projet destinées à une utilisation répandue, et il DOIT y avoir un processus documenté expliquant aux utilisateurs comment ils peuvent obtenir les clés de signature publique et vérifier la ou les signatures. La clé privée pour ces signature(s) NE DOIT PAS être sur le(s) site(s) utilisé(s) pour distribuer directement le logiciel au public. Si les versions ne sont pas destinées à une utilisation répandue, sélectionnez « non applicable » (N/A). [signed_releases]
    Les résultats du projet incluent à la fois le code source et les produits livrés générés, le cas échéant (par exemple, les exécutables, les paquetages et les conteneurs). Les livrables générés PEUVENT être signés séparément du code source. Ces signatures PEUVENT être mises en œuvre sous forme de tags git signées (utilisant des signatures numériques cryptographiques). Les projets PEUVENT fournir des résultats générés séparément d'outils comme git, mais dans ce cas, les résultats distincts DOIVENT être signés séparément.

    Releases are cryptographically signed twice over: release tags are ed25519-SSH-signed by the maintainer's offline key and the release workflow refuses fail-closed any tag whose signature does not verify against the committed public key file https://github.com/NaanyaBiz/haggle/blob/main/.github/allowed_signers (https://github.com/NaanyaBiz/haggle/blob/main/.github/workflows/release.yml, "Verify tag signature"); the installed artifact haggle.zip is Sigstore-attested via actions/attest-build-provenance with the .sigstore bundles and attested SPDX/CycloneDX SBOMs attached to every GitHub Release. The user verification process is documented in https://github.com/NaanyaBiz/haggle/blob/main/SECURITY.md (gh attestation verify haggle.zip --repo NaanyaBiz/haggle). No private key is on any distribution site - the tag key is held offline and Sigstore signing is keyless (ephemeral OIDC). Historical honesty: releases <= v0.4.0-beta.4 predate attestation and pre-2026-07-13 tags render Unverified, recorded as accepted risk RA-10; all releases from 2026-07 onward are signed and attested.



    Il est PROPOSÉ que, dans le système de contrôle de la version, chaque tag d'une version importante (un tag faisant partie d'une version majeure, d'une version mineure ou qui corrige des vulnérabilités notées publiquement) soit cryptographiquement signé et vérifiable comme décrit dans signed_releases. [version_tags_signed]

    Release tags are cryptographically signed: each v* tag is SSH-signed (ed25519) with the maintainer's release identity, whose public key is committed at .github/allowed_signers (https://github.com/NaanyaBiz/haggle/blob/main/.github/allowed_signers), and release.yml refuses fail-closed to build any tag whose signature does not verify against that file. I verified the latest tag (v0.4.0-beta.6) locally with git tag -v against the committed allowed_signers. Tags cut before 2026-07-13 predate the registered signing identity and are recorded as a historical exception (SECURITY.md RA-10).


  • Autres problèmes de sécurité


    Les résultats du projet DOIVENT vérifier toutes les entrées provenant de sources potentiellement non fiables pour s'assurer qu'elles sont valides (une liste blanche) et rejeter les entrées non valides, en cas de restrictions sur les données. [input_validation]
    Notez que la comparaison de l'entrée par rapport à une liste de « mauvais formats » (aussi appelée liste noire) n'est normalement pas suffisante, car les attaquants peuvent souvent contourner une liste noire. En particulier, les nombres sont convertis en formats internes puis vérifiés pour s'assurer s'ils se situent entre leur minimum et maximum (inclus), et les chaînes de texte sont vérifiées pour s'assurer qu'elles sont des motifs de texte valides (par exemple, UTF-8 valide, longueur valide, syntaxe valide, etc.). Certaines données peuvent avoir besoin d'être « du tout venant » (par exemple, un téléchargement de fichier), mais celles-ci sont généralement rares.

    The untrusted input surface - AGL API JSON (attacker-influenceable, since TLS pin mismatch is warn-only by design) - is processed by allowlist-style parsers in https://github.com/NaanyaBiz/haggle/blob/main/custom_components/haggle/agl/parser.py that are total over arbitrary JSON: only named fields are extracted (open-schema dict passthrough is prohibited in AGENTS.md), interval types are checked against a known set, and every numeric is clamped to a non-negative finite float via _safe_float before it can reach recorder statistics. The property is enforced by the atheris fuzz harness (tests/fuzz/fuzz_parser.py, a required PR check via fuzz.yml) and TestParserTotality in tests/test_parser.py.



    Les mécanismes de durcissement DOIVENT être utilisés dans le logiciel produit par le projet afin que les défauts du logiciel soient moins susceptibles d'entraîner des vulnérabilités de sécurité. [hardening]
    Les mécanismes de durcissement peuvent inclure des en-têtes HTTP comme Content Security Policy (CSP), des options de compilation pour atténuer les attaques (telles que -fstack-protector) ou des options de compilation pour éliminer les comportements indéfinis. Pour nos besoins, le principe de plus faible privilège n'est pas considéré comme un mécanisme de durcissement (le principe de plus faible privilège est important, mais séparé).

    Multiple hardening layers make defects less likely to become vulnerabilities: both AGL endpoints are SPKI-pinned (TOFU) yet their JSON is still treated as attacker-influenceable - parsing is allowlist-style (no open-schema passthrough), numeric values are clamped through _safe_float so inf/NaN/negatives can never reach the recorder (https://github.com/NaanyaBiz/haggle/blob/main/custom_components/haggle/agl/parser.py), and the parser boundary is fuzz-tested with atheris on every PR plus a weekly deep run (https://github.com/NaanyaBiz/haggle/blob/main/.github/workflows/fuzz.yml). Ruff's flake8-bandit security rules gate CI, diagnostics pass a scrub layer backed by leak tests, and upstream error bodies are stripped before exceptions propagate (docs/threat-model.md sections 2-3).



    Le projet DOIT fournir une analyse de fiabilité qui justifie pourquoi ses exigences de sécurité sont respectées. L'analyse de fiabilité DOIT inclure : une description du modèle de menace, une identification claire des limites de confiance, un argument selon lequel des principes de conception sécurisés ont été appliqués et un argument selon lequel les faiblesses de sécurité courantes de l'implémentation ont été contrées. (URL requise) [assurance_case]
    Une analyse de fiabilité est « une preuve documentée qui fournit un argumentaire convaincant et correct selon lequel un ensemble spécifié de revendications critiques concernant les propriétés d'un système est adéquatement justifié pour une application donnée dans un environnement donné » (« Software Assurance Using Structured Assurance Case Models », Thomas Rhodes et al, NIST Interagency Report 7608). Les limites de confiance sont des limites où les données ou l'exécution modifient leur niveau de confiance, par exemple, les limites d'un serveur dans une application Web typique. Il est fréquent d'énumérer des principes de conception sécurisés (tels que Saltzer et Schroeer) et des faiblesses de sécurité courantes de l'implémentation (comme le OWASP top 10 ou le CWE/SANS top 25) et de montrer comment chacun est contré. L'analyse de fiabilité de BadgeApp peut être un exemple utile. Ceci est lié à documentation_security, documentation_architecture et implement_secure_design.

    The committed living threat model is the assurance case: it describes the system and threat model (an 18-threat STRIDE register, each threat tracked to a disposition with cited evidence), identifies five trust boundaries and the controls at each (https://github.com/NaanyaBiz/haggle/blob/main/docs/threat-model.md sections 1-5), and argues how secure design principles are applied and common implementation weaknesses countered (allowlist parsing, numeric clamping, fuzz-enforced parser totality, secret redaction backed by leak tests, plus CodeQL SAST and atheris fuzzing as required merge gates - https://github.com/NaanyaBiz/haggle/blob/main/SECURITY.md, 'Gating Policy'). The statement-level conformance map extends the argument control-by-control against the committed secure-SDLC standard (https://github.com/NaanyaBiz/haggle/blob/main/docs/compliance/conformance.md).


 Analyse 2/2

  • Analyse statique de code


    Le projet DOIT utiliser au moins un outil d'analyse statique avec des règles ou des approches pour rechercher des vulnérabilités courantes dans le langage ou l'environnement analysé, s'il existe au moins un outil FLOSS qui peut mettre en œuvre ce critère dans le langage sélectionné. [static_analysis_common_vulnerabilities]
    Les outils d'analyse statique spécialement conçus pour détecter les vulnérabilités les plus courantes sont plus susceptibles de les détecter. Cela dit, l'utilisation d'outils statiques aidera généralement à trouver des problèmes, nous suggérons donc, sans l'exiger, de le faire pour le badge de niveau « passant ».

    CodeQL Python analysis runs weekly and on every PR (https://github.com/NaanyaBiz/haggle/blob/main/.github/workflows/codeql.yml) and is one of the eight required status checks enforced by the zero-bypass protect-main ruleset. CI additionally runs ruff with the flake8-bandit security rule set ("S") enabled in pyproject.toml on every PR, so two FLOSS vulnerability-oriented static analyzers gate every change.


  • Analyse dynamique de code


    Si le logiciel produit par le projet inclut un logiciel écrit à l'aide d'un langage non sûr pour les accès mémoire (par exemple C ou C++), alors le projet DOIT utiliser au moins un outil dynamique (par exemple, un fuzzer ou un scanneur d'application Web) utilisé de manière routinière en combinaison avec un mécanisme permettant de détecter des problèmes de sécurité mémoire tels que les dépassement mémoire. Si le projet ne produit pas de logiciel écrit dans un langage non sûr pour les accès mémoire, sélectionnez « non applicable » (N/A). [dynamic_analysis_unsafe]
    Des exemples de mécanismes pour détecter les problèmes de sécurité de la mémoire comprennent Address Sanitizer (ASAN) (disponible dans GCC et LLVM), Memory Sanitizer et valgrind. D'autres outils potentiellement utilisés incluent thread sanitizer et undefined behavior sanitizer. La généralisation de l'utilisation des assertions fonctionnera également.

    The shipped software is written entirely in Python, a memory-safe managed language; the tree contains no C/C++/assembly and the integration declares zero compiled runtime requirements (manifest.json "requirements": []), so no memory-unsafe code exists to instrument. (Dynamic hostile-input testing runs regardless: atheris fuzzing of the parser trust boundary on every PR plus weekly deep runs, https://github.com/NaanyaBiz/haggle/blob/main/.github/workflows/fuzz.yml.)



Ces données sont disponibles sous la licence Community Data License Agreement – Permissive, Version 2.0 (CDLA-Permissive-2.0). Cela signifie qu'un destinataire de données peut partager les données, avec ou sans modifications, à condition que le destinataire de données rende disponible le texte de cet accord avec les données partagées. Veuillez créditer NaanyaBiz et les contributeurs du badge des meilleures pratiques de la OpenSSF.

Soumission du badge du projet appartenant à : NaanyaBiz.
Soumission créée le 2026-07-12 09:21:52 UTC, dernière mise à jour le 2026-07-14 20:21:06 UTC. Le dernier badge obtenu l'a été le 2026-07-12 09:34:54 UTC.