diff --git a/AGENTS.md b/AGENTS.md index c7a95e4..bdecb09 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -869,6 +869,33 @@ Règles absolues : absent = aucun cycle ; `budget` absent = planification suspendue. Un zéro publié se lirait « exécuté, rien à faire ». +## UNE OBLIGATION QUI CHANGE DE MAISON AVEC L'APPELANT SE PERD + +**Classe de défaut, pas incident** — nommée le 2026-09-08 en découpant le lot prévision PV. + +Certaines obligations ne sont pas attachées à une **donnée**, mais à l'acte de **l'aller +chercher** : l'attribution CC BY 4.0 d'une API suit **celui qui appelle**. Déplacer l'appel d'un +dépôt à un autre déplace donc l'obligation — et si le dépôt d'arrivée ne la porte pas déjà, elle +**disparaît sans que personne ne l'ait retirée**. + +Ce qui rend la classe dangereuse : **le déplacement lui-même est invisible**. On discute d'un +découpage de responsabilités, on tranche sur des arguments d'architecture — couplage, cadence, +mode dégradé — et l'obligation voyage en silence dans les bagages. Aucun test ne la vérifie, +aucune revue de code ne la voit, et le manquement se constate dans un dépôt **publié**. + +Même famille : les licences des dépendances, les mentions de brevet, les conditions d'usage +d'une API, et toute condition attachée à un **acte** plutôt qu'à un **fichier**. + +> **La question à poser à chaque déplacement de responsabilité** : *cet acte porte-t-il une +> obligation, et le dépôt d'arrivée l'écrit-il déjà ?* Deux issues seulement — elle est écrite à +> l'arrivée, ou le déplacement n'a pas lieu. **Il n'y a pas de troisième branche où l'on s'en +> souviendra plus tard.** + +*(Cas fondateur : faire appeler l'API Open-Meteo par `ems` aurait fait atterrir l'attribution +dans un dépôt GPL publié qui ne l'écrit nulle part. Le découpage retenu — l'appel reste chez +l'intégration — fait **disparaître** le problème au lieu de le gérer, ce qui est toujours la +meilleure des deux façons de le fermer.)* + ## `setChargingInfo()` DÉCLENCHE UN CYCLE — donc ce qui l'entoure a un ordre **`SmartChargingManager::setChargingInfo()` appelle `update()` avant de rendre la main**