docs(§10): la baisse mesurée, et l'échéance est à l'heure de la BOX
Sonde en LECTURE SEULE — l'obligation est celle du moteur, rien n'a été écrit. Le critère positif est atteint : `deliveredWh` +25 Wh/min (1 500 W, ce que le compteur ECS annonce), `remainingWh` qui descend d'autant, `gridW` 466 → 463. Décroissance, pas absence de mur. Deux invariants tiennent, et l'écran les vérifiera à chaque trame : - `deliveredWh + remainingWh == targetWh` — et c'est sous `measured` qu'elle mord, là où elle n'est plus le corollaire trivial d'`unmeasurable` ; - `gridW == remainingWh / remainingS` — 466 == 466 puis 463 == 463, donc la loi d'étalement est vérifiable de l'extérieur, sans lire le code. Fuseau : `remainingS` le confirme de notre côté (18 719 s à 06:48 heure box mènent à 12:00 heure box), et `System.GetTime` publie `timeZone` — l'app peut donc être honnête sans attendre l'arbitrage. Règle écrite dans CLAUDE.md et dans la maquette : dire l'horloge au lieu de la choisir, fuseau de la box affiché à côté du champ et divergence signalée. Ce que le lot moteur doit trancher reste entier : d'où vient le fuseau, et ce qu'il fait quand il diverge. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GKM8FDNHZWogAsjjfB8pSw
This commit is contained in:
parent
0564c47569
commit
1d679312c5
24
CLAUDE.md
24
CLAUDE.md
@ -420,6 +420,30 @@ entiers **déjà en pourcentage** (ne pas confondre `reservePercent` = 40 avec
|
||||
|
||||
---
|
||||
|
||||
## Échéances — l'heure saisie n'est pas l'heure du client
|
||||
|
||||
`needs.dailyDeadline` est une chaîne `"HH:MM"` **sans fuseau**, et la box l'interprète dans **le
|
||||
sien**. Mesuré le 2026-09-04 : `.75` est en `Europe/London`, donc une échéance « 12:00 » vaut
|
||||
**13:00 sur une horloge française**. Le moteur a failli imputer l'écart à un décalage d'heure
|
||||
d'été qui n'existe pas.
|
||||
|
||||
Le fuseau franchit la frontière RPC, et l'app peut donc être honnête sans rien supposer :
|
||||
|
||||
```dart
|
||||
System.GetTime -> {"automaticTime": true, "time": 1788500953, "timeZone": "Europe/London"}
|
||||
```
|
||||
|
||||
**Règle d'écran : ne jamais présenter une échéance comme locale sans dire quelle horloge la box a
|
||||
lue.** Afficher le fuseau de la box à côté du champ, et signaler la divergence avec celui de
|
||||
l'appareil quand il y en a une. `remainingS` de la télémétrie permet de le vérifier après coup —
|
||||
18 719 s à 06:48 heure box donnent bien 12:00 heure box, pas 12:00 heure client.
|
||||
|
||||
Vaut aussi pour **toute fenêtre tarifaire** à venir. Un lot moteur est ouvert pour trancher d'où
|
||||
vient le fuseau et ce qu'il fait quand il diverge ; d'ici là, l'app **dit** l'horloge au lieu de
|
||||
la choisir.
|
||||
|
||||
---
|
||||
|
||||
## Règles de modification
|
||||
- Tout nouvel écran → valider maquette avec Patrick avant de coder
|
||||
- Tout nouvel appel RPC → vérifier dans `INTERFACE.md` que la méthode existe
|
||||
|
||||
@ -2,6 +2,53 @@
|
||||
|
||||
---
|
||||
|
||||
## 2026-09-04 (suite) — la baisse, mesurée en lecture seule, et le fuseau qui la datait mal
|
||||
|
||||
Banc laissé tel quel — l'obligation est la vôtre, je n'ai rien écrit.
|
||||
|
||||
### Le critère positif est atteint, et deux invariants tiennent avec lui
|
||||
|
||||
| cycle | livré | reste | gridW | restS |
|
||||
|---|---|---|---|---|
|
||||
| 05:48Z | 575,0 | 2 425 | **466** | 18 719 |
|
||||
| 05:49Z | 600,0 | 2 400 | **463** | 18 659 |
|
||||
|
||||
`deliveredWh` monte de **25 Wh/min**, soit 1 500 W — exactement ce que le compteur ECS annonce.
|
||||
`remainingWh` descend d'autant, et `gridW` **baisse**. Ce n'est plus l'absence de mur, c'est la
|
||||
décroissance.
|
||||
|
||||
Deux vérifications qui ne coûtent rien et que l'écran fera à chaque trame :
|
||||
|
||||
- **`deliveredWh + remainingWh == targetWh`** — 3 000,0000000000364 puis 2 999,999583 pour une
|
||||
cible de 3 000. L'identité que vous aviez épinglée tient sur données réelles, et **c'est ici
|
||||
qu'elle mord** : sous `measured`, elle n'est plus le corollaire trivial qu'elle est sous
|
||||
`unmeasurable`.
|
||||
- **`gridW == remainingWh / remainingS`** — 466 == 466, puis 463 == 463. La loi d'étalement est
|
||||
donc vérifiable **de l'extérieur**, sans lire le code. Un écart futur serait un défaut, pas une
|
||||
approximation.
|
||||
|
||||
Et `purchasedWh` 183 → 191 pour 575 → 600 Wh livrés : le plancher acheté reste le tiers du
|
||||
consommé. La paire diverge, et c'est la divergence qui informe — le second usage, exercé.
|
||||
|
||||
### Le fuseau : l'app peut être honnête aujourd'hui, sans attendre votre arbitrage
|
||||
|
||||
`remainingS` le confirme de notre côté : 18 719 s à 06:48 heure box mènent à **12:00 heure box**,
|
||||
pas 12:00 heure client. Et le fuseau **franchit déjà la frontière RPC** :
|
||||
|
||||
```jsonc
|
||||
System.GetTime -> {"automaticTime": true, "time": 1788500953, "timeZone": "Europe/London"}
|
||||
```
|
||||
|
||||
L'écran n'a donc pas besoin de la décision pour cesser de mentir : il **dira** l'horloge au lieu
|
||||
de la choisir — fuseau de la box affiché à côté du champ d'échéance, divergence signalée quand
|
||||
celui de l'appareil diffère. C'est écrit dans `CLAUDE.md` et dans la maquette.
|
||||
|
||||
Ce que votre lot doit trancher reste entier, et c'est autre chose : **d'où vient le fuseau** et ce
|
||||
qui se passe quand il diverge. Nous ne présumons pas de la réponse — nous rendons seulement
|
||||
impossible qu'un installateur lise « 12:00 » comme son 12:00.
|
||||
|
||||
---
|
||||
|
||||
## 2026-09-04 — `+etm52` : la contradiction est levée, mesurée
|
||||
|
||||
Obligation déclarée puis retirée (`chauffe-eau`, 4 000 Wh avant 12:00, sept cycles, restauration
|
||||
|
||||
@ -281,7 +281,8 @@
|
||||
<span class="tag eco">ÉCO</span>
|
||||
<div class="bd">
|
||||
<b>Plancher servi — 1 400 W achetés au réseau</b>
|
||||
<span>2,1 kWh livrés sur les 3,0 dus avant 07:00 <span class="pill meas">MESURÉ</span></span>
|
||||
<span>2,1 kWh livrés sur les 3,0 dus avant 07:00 <em>(heure box)</em>
|
||||
<span class="pill meas">MESURÉ</span></span>
|
||||
<div class="bar"><i style="width:70%"></i></div>
|
||||
</div>
|
||||
</div>
|
||||
@ -424,6 +425,12 @@
|
||||
<code>setpointW</code>, <code>currentA</code>), qui existe déjà aujourd'hui.</li>
|
||||
<li><b>Et il ne se répartit pas non plus.</b> L'écart appartient à la charge, pas à un niveau :
|
||||
l'adaptateur arrondit une consigne unique, il ne sait pas de quel besoin elle venait.</li>
|
||||
<li><b>L'heure d'une échéance est celle de la BOX</b>, pas celle du client :
|
||||
<code>dailyDeadline</code> est un <code>"HH:MM"</code> sans fuseau, interprété dans celui de
|
||||
la box. Mesuré le 2026-09-04 — <code>.75</code> est en <code>Europe/London</code>, donc
|
||||
« 12:00 » vaut 13:00 sur une horloge française. Le fuseau se lit par
|
||||
<code>System.GetTime</code> : l'écran l'affiche à côté du champ et signale la divergence,
|
||||
plutôt que de choisir une horloge à la place de l'installateur.</li>
|
||||
<li><b>Sous <code>unmeasurable</code>, le plancher ne peut pas se refermer</b> — mesuré le
|
||||
2026-09-01 sur quatre cycles : <code>remainingWh</code> figé à 4 000, <code>remainingS</code> qui
|
||||
descend, <code>gridW</code> qui monte 755 → 767. Ce n'est pas un cas limite, c'est la
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user