From 2a584de91343f9604b5a3017dff8500387d22d4e Mon Sep 17 00:00:00 2001 From: Patrick Schurig Date: Sun, 30 Aug 2026 22:38:09 +0200 Subject: [PATCH] =?UTF-8?q?docs:=20les=20quatre=20d=C3=A9cisions=20du=20?= =?UTF-8?q?=C2=A710,=20et=20un=20troisi=C3=A8me=20mode=20d'=C3=A9rosion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 11.1 étalement uniforme, avec les trois choses qui s'écrivent avec lui : recalculé à chaque cycle (une cadence figée ne rattrape pas et manque l'échéance en ayant l'air de travailler) ; il se durcit à l'approche — 2 kWh font 2 kW à une heure et 12 kW à dix minutes, donc la fenêtre d'achat massif arrive d'un coup et c'est le MOTIF qui doit le dire ; et un point de non-retour explicite, parce qu'un seuil nommé se discute là où une asymptote se subit. 11.2 oui aux quatre champs, et la subtilité entre dans le CONTRAT : sous la réserve batterie, draw.remainingW reste non nul pendant que budget.remainingW est à zéro. LM-1203-b vue depuis la frontière — la réserve annule le surplus, jamais l'autorisation de soutirage. 11.3 dissoute, 11.4 par champ explicite. Et un troisième mode d'érosion dans AGENTS.md, symétrique des deux autres : non pas une règle qui se périme faute d'être exécutable, mais une règle rendue IMMORTELLE par sa propre garde. draw.authorisedW a été refusé pour un motif juste, épinglé par un test, puis le motif est tombé — et la formulation a survécu, protégée par un test qui ne savait pas que le monde avait changé. Parade déjà pratiquée ici : quand un test fige une ABSENCE, son commentaire écrit la condition de levée. « Absent tant que rien ne le mesure » se relit et se lève ; « ne doit pas exister » se relit et s'obéit. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_015F7G5VeaPVSMeVNjiGj36p --- AGENTS.md | 19 +++++++++++++++++++ docs/DESIGN_10.md | 42 ++++++++++++++++++++++++++++++++++-------- 2 files changed, 53 insertions(+), 8 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index c9b6a17..1f085c1 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -862,6 +862,25 @@ aucune, la décision est une intention, et elle se périmera à la vitesse du co > d'exploiter une valeur de retour qu'aucun code n'exploitait, **l'épingler d'abord par un > test** — le premier appelant est aussi le premier vérificateur. +> **Un troisième mode d'érosion, et il est le SYMÉTRIQUE des deux autres (2026-08-31).** Le +> garde-fou dit « une règle que rien ne rejoue se périme ». Voici l'inverse : **une règle rendue +> IMMORTELLE par sa propre garde.** +> +> Cas d'école, `draw.authorisedW`. Le champ a été refusé parce qu'il aurait affiché « un plafond +> de soutirage qui n'existe pas » — motif juste. Il a été défendu en prose à trois endroits, puis +> épinglé par un test qui casse si on l'ajoute. Puis le lot délestage a **créé** le plafond. Le +> motif était tombé ; la formulation, elle, a survécu — protégée par un test qui, lui, ne savait +> pas que le monde avait changé. +> +> **La parade est déjà pratiquée ailleurs dans ce dépôt** : le commentaire d'un test d'invariant +> doit dire **à quelle condition il devient faux**. Ceux qui portent « si ça casse, ce n'est pas +> le test qu'il faut corriger » ont bien vieilli, parce qu'ils nomment l'intention. Celui-là +> disait ce qu'il interdisait, jamais **à quel moment il aurait dû mourir**. +> +> **Règle pratique** : quand un test fige une ABSENCE, son commentaire écrit la condition de +> levée. « Ce champ reste absent **tant que** rien ne le mesure » se relit et se lève ; « ce +> champ ne doit pas exister » se relit et s'obéit. + > **Fait de méthode, relevé le 2026-08-30** : la règle d'ECS-415 était **déjà écrite**, dans le > commentaire de la branche voisine du même fichier, **à trois lignes** de la branche fautive > (« ce retour était MUET, si bien que "état déjà bon" ne se distinguait pas de "action jamais diff --git a/docs/DESIGN_10.md b/docs/DESIGN_10.md index c740e2f..91b89cb 100644 --- a/docs/DESIGN_10.md +++ b/docs/DESIGN_10.md @@ -486,30 +486,56 @@ Trois formes possibles, et elles ne se valent pas : | **Étalement uniforme** | `reste / temps restant` | simple, vérifiable, mais ignore le tarif et le soleil à venir | | **Au plus tard** | ne rien acheter tant que le surplus peut encore suffire | optimal, mais suppose une **prévision** — hors modèle | -**Recommandation : l'étalement uniforme**, pour la même raison que `LM-1008` a fait de la cible -de confort un **comparateur** plutôt qu'un dosage : ce qui manque n'est pas la formule, c'est le -modèle qui la rendrait honnête. Un étalement se lit, se teste, et ne prétend rien prévoir. Le -« au plus tard » viendra avec la prévision, pas avant. +**TRANCHÉ (2026-08-31) : l'étalement uniforme**, pour la même raison que `LM-1008` a fait de la +cible de confort un **comparateur** plutôt qu'un dosage : ce qui manque n'est pas la formule, +c'est le modèle qui la rendrait honnête. Un étalement se lit, se teste, et ne prétend rien +prévoir. Le « au plus tard » viendra avec la prévision, pas avant. + +**Trois choses s'écrivent AVEC lui, et aucune n'est un détail :** + +**(a) Recalculé à CHAQUE cycle, jamais figé au départ.** Une cadence calculée une fois au +branchement ne rattrape pas : après une heure sans surplus, elle reste à la cadence initiale et +**manque l'échéance** en ayant l'air de travailler. L'étalement est un rapport entre ce qui +reste à livrer et le temps qui reste — les deux bougent, donc il se relit. + +**(b) Il se DURCIT à l'approche, mécaniquement, et cela doit être DIT.** 2 kWh restants font 2 kW +à une heure de l'échéance et **12 kW à dix minutes**. La fenêtre où l'achat devient massif +n'arrive pas progressivement : elle arrive **d'un coup**. Sans que le motif le nomme, un client +verra sa facture grimper à 6 h du matin sans comprendre — et il aura raison de chercher une +panne. C'est donc le **motif publié** qui porte la cadence et le temps restant, pas seulement les +watts : la même doctrine que partout ici — **publier le régime, ne jamais le laisser déduire.** + +**(c) Un POINT DE NON-RETOUR explicite**, comme la maquette batterie le demandait : passé une +heure limite, on achète ce qu'il faut. Sans lui, l'étalement peut théoriquement tendre vers +l'infini sans jamais décider — et un seuil nommé se discute, là où une asymptote se subit. **11.2 — Publie-t-on `draw.authorisedW` et `remainingW` maintenant ?** Le refus tenait à ce qu'ils n'existaient pas. Ils existent. Mais `remainingW` a une subtilité : sous la réserve batterie, `LM-1203-b` annule le budget de surplus **sans annuler l'autorisation de soutirage** — donc `draw.remainingW` reste non nul quand `budget.remainingW` est à zéro, et c'est **juste**. Il faut le dire, sinon un client conclura à une incohérence. -**Recommandation : oui aux quatre**, et le test qui les interdit se met à jour en même temps — -c'est un changement de contrat assumé, pas une régression. +**TRANCHÉ (2026-08-31) : oui aux quatre**, et le test qui les interdit se met à jour en même +temps — changement de contrat assumé, pas régression. Son nouveau commentaire dira **à quelle +condition il devient faux**, ce que l'ancien ne disait pas (cf. `AGENTS.md`, troisième mode +d'érosion). + +**Et la subtilité s'écrit EN TOUTES LETTRES DANS LE CONTRAT, pas en note de bas de page :** +sous la réserve batterie, **`draw.remainingW` reste non nul pendant que `budget.remainingW` est à +zéro.** C'est `LM-1203-b` vue depuis la frontière — la réserve annule le **surplus**, jamais +l'**autorisation de soutirage**. Un client y verra une incohérence, et il aura raison de la +signaler si personne ne l'a dite. **11.3 — La passe éco achète-t-elle au réseau par DÉFAUT ?** `ECO_FLOOR_GRID` dit « ce plancher est servi en achetant ». Mais faut-il acheter dès que le surplus manque, ou seulement quand l'échéance est menacée ? Avec l'étalement uniforme la question se dissout : on achète ce que l'étalement réclame **et rien de plus**, donc jamais « par défaut » -— toujours parce que le temps restant l'exige. **Recommandation : pas de décision séparée**, elle +— toujours parce que le temps restant l'exige. **TRANCHÉ : dissoute — pas de décision séparée**, elle est absorbée par 11.1. **11.4 — Que devient le recrédit anti-clignotement avec deux passes ?** `LM-1004` fixe qu'il est attribué **une seule fois**. Reste à dire **où** : à la première passe où la charge apparaît. Une charge à plancher éco le reçoit donc en passe 1, une charge sans -obligation en passe 2. **Recommandation : un champ explicite dans la cible** (`recreditAttribue`) +obligation en passe 2. **TRANCHÉ : un champ explicite dans la cible** (`recreditAttribue`) plutôt qu'une discipline — la discipline ne se teste pas, le champ si. ---