docs(§10): les six champs vus à la sonde — et la trajectoire qu'ils révèlent
Obligation déclarée sur le banc puis retirée (`chauffe-eau`, 4 000 Wh avant 12:00, +etm43, sept cycles). Capture sur disque avant la première écriture, restauration DEPUIS le fichier, comparaison clé par clé : 0 écart. La forme est celle annoncée, et elle porte plus que le motif : `decision` et `progress` descendent au niveau, `deliveredWh` est absent sous `unmeasurable`, `counts` tombe sur `draw.committedW`, et le motif racine porte `level`. R1, R5 et R7 vérifiés sur le fil ; les deux identités tiennent à chaque cycle. Deux choses que la mesure apprend, et qu'aucune lecture de code n'aurait données : - au cycle 05:47 le surplus passe à −922 W : `comfort` tombe à 0 avec `SURPLUS_INSUFFICIENT` pendant que `eco` achète 767 W au réseau. Le motif RACINE vaut alors `SURPLUS_INSUFFICIENT` — un client d'avant `levels[]` lit donc « rien fait » sur une charge qui achète. Vue fausse, pas incomplète ; - sous `unmeasurable`, `remainingWh` ne bouge pas et `remainingS` descend, donc `gridW` monte (755 → 767 en quatre cycles). Le plancher ne peut jamais se refermer : l'accélération jusqu'au mur est la trajectoire GARANTIE du régime, pas son cas limite. La maquette affiche désormais reste + temps, et pas seulement les watts de l'instant. Question posée au moteur : la charge a un compteur (`totalEnergyConsumed: 10`) et le régime sort quand même `unmeasurable`. Faut-il remplir `sessionWh` depuis le compteur, et faut-il acheter quand on ne peut pas vérifier ? `remainingWh` plutôt que `deliveredWh` est accepté, et R5 porte l'argument : `remainingWh` n'est pas dérivable sous `unmeasurable`, qui est justement le régime où l'on achète. 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
7eefb93c6c
commit
def985d3a0
@ -2,6 +2,67 @@
|
||||
|
||||
---
|
||||
|
||||
## 2026-09-01 — §10 vu à la sonde : les six champs, et une trajectoire à trancher
|
||||
|
||||
**Obligation déclarée sur le banc puis retirée** — `chauffe-eau`, `needs {dailyDeadline: "12:00",
|
||||
minEnergyWhPerDay: 4000}`, sept cycles, `+etm43`. Capture sur disque avant la première écriture,
|
||||
restauration **depuis le fichier**, comparaison clé par clé : *« 0 écart »*.
|
||||
|
||||
### La forme est celle qui était annoncée, et elle porte plus que le motif
|
||||
|
||||
```jsonc
|
||||
{ "level": "eco", "funding": "grid", "targetW": 766.813994355397,
|
||||
"counts": { "draw.committedW": 766.813994355397 },
|
||||
"progress": { "regime": "unmeasurable", "targetWh": 4000 },
|
||||
"decision": { "code": "ECO_FLOOR_GRID", "params": {
|
||||
"gridW": 767, "remainingWh": 4000, "targetWh": 4000,
|
||||
"remainingS": 18779, "regime": "unmeasurable", "atMaximum": false } } }
|
||||
```
|
||||
|
||||
`decision` et `progress` **au niveau**, `deliveredWh` **absent** sous `unmeasurable`, `counts` qui
|
||||
tombe sur `draw.committedW`, et le motif racine qui porte `"level": "comfort"`. R1, R5 et R7 sont
|
||||
vérifiés sur le fil. Les deux identités tiennent à chaque cycle.
|
||||
|
||||
### Le dernier cycle est le cas que la maquette visait, et il valide R7 durement
|
||||
|
||||
À 05:47 le surplus passe à **−922 W** : le niveau `comfort` tombe à `targetW: 0` avec
|
||||
`SURPLUS_INSUFFICIENT` et `counts {"budget.allocatedW": 0}` — destination publiée **à zéro**, comme
|
||||
demandé — pendant que le niveau `eco` **achète 767 W au réseau**.
|
||||
|
||||
Le motif racine de cette charge vaut alors `SURPLUS_INSUFFICIENT`. **Un client d'avant `levels[]` lit
|
||||
donc « surplus insuffisant, rien fait » sur une charge en train d'acheter 767 W.** Ce n'est pas une
|
||||
vue incomplète, c'est une vue **fausse** — et c'est l'argument le plus dur en faveur de
|
||||
`decision.level` et des deux lignes à l'écran.
|
||||
|
||||
### La trajectoire, mesurée — et la question qu'elle pose
|
||||
|
||||
| cycle | `remainingWh` | `remainingS` | `gridW` |
|
||||
|---|---|---|---|
|
||||
| 05:42 | 4 000 | 19 079 | 755 |
|
||||
| 05:45 | 4 000 | 18 899 | 762 |
|
||||
| 05:47 | 4 000 | 18 779 | 767 |
|
||||
|
||||
Sous `unmeasurable`, rien n'est soustrait : **le plancher ne peut jamais se refermer**, donc l'achat
|
||||
s'accélère mécaniquement jusqu'à l'échéance et finit en `ECO_FLOOR_MISSED`. Ce n'est pas un cas
|
||||
limite du régime, c'est sa trajectoire garantie. La maquette l'affiche désormais — *reste* et
|
||||
*temps*, pas seulement les watts de l'instant.
|
||||
|
||||
**Et le point qui mérite votre arbitrage** : cette charge **a un compteur**. `ECS-Meter` publie
|
||||
`currentPower: 1500` **et `totalEnergyConsumed: 10`** — une énergie, la grandeur exacte qui manque.
|
||||
Le régime sort quand même `unmeasurable`. Si c'est `LoadContextTelemetry::sessionWh` toujours
|
||||
déclaré et jamais rempli hors borne, alors **aujourd'hui toute obligation éco achète à l'aveugle et
|
||||
accélère, y compris sur une charge instrumentée**. Deux questions, et elles ne sont pas d'écran :
|
||||
faut-il remplir `sessionWh` depuis le compteur de charge, et faut-il acheter du tout quand on ne
|
||||
peut pas vérifier ? Notre écran montrera la trajectoire ; il ne la corrigera pas.
|
||||
|
||||
### Un détail à confirmer
|
||||
|
||||
`gridW: 767` (entier) et `targetW: 766.813994355397` (double) portent le même fait, et `counts`
|
||||
s'accorde avec `targetW`. Nous prenons donc **`targetW`/`counts` pour l'arithmétique** et `gridW`
|
||||
**pour la phrase**. Confirmez si c'est l'intention.
|
||||
|
||||
---
|
||||
|
||||
## 2026-08-30 (soir, lien rétabli) — relevé frais : deux confirmations et une correction
|
||||
|
||||
### `chargingState` figé : confirmé sur lien VIVANT, ce n'est pas de la péremption
|
||||
|
||||
@ -338,10 +338,11 @@
|
||||
<span class="tag eco">ÉCO</span>
|
||||
<div class="bd">
|
||||
<b>Plancher servi — 2 600 W achetés au réseau</b>
|
||||
<span>Avancement <em>non mesurable</em> : cette borne ne publie pas d'énergie de session
|
||||
— c'est le cas de `wallboxNoMeter` et d'une des deux classes `wallbox` du banc.
|
||||
<span>Avancement <em>non mesurable</em> : cette borne ne publie pas d'énergie de session.
|
||||
<span class="pill nm">NON MESURABLE</span></span>
|
||||
<div class="bar dash"></div>
|
||||
<span><b>Reste 4,0 kWh à livrer en 5 h 13</b> — et ce taux ne peut que <b>monter</b> : rien
|
||||
n'est soustrait de ce qui reste, donc l'achat s'accélère jusqu'à l'échéance.</span>
|
||||
<span>L'obligation est servie ; elle ne pourra jamais être annoncée <em>tenue</em>.</span>
|
||||
</div>
|
||||
</div>
|
||||
@ -423,6 +424,11 @@
|
||||
<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>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
|
||||
<b>trajectoire garantie</b> du régime : l'écran doit montrer <em>reste</em> et <em>temps</em>, pas
|
||||
seulement les watts de l'instant, sans quoi « 767 W achetés » ne laisse pas deviner le mur.</li>
|
||||
<li><b>* « Commandé, pas encore mesuré » — et ce n'est pas une destination.</b> Le champ
|
||||
<code>budget.evReservedW</code> est un <b>terme de correction</b> : la latence entre l'ordre et sa
|
||||
lecture au compteur. Il est affiché parce que la box le publie, <b>jamais sommé</b>. Son ancien
|
||||
@ -654,16 +660,15 @@
|
||||
<span class="c">// L'appliqué vit dans "mechanism" ; le mesuré dans "measurement".</span>
|
||||
|
||||
<span class="k">"levels"</span>: [ <span class="c">// AJOUT — un élément par passe RÉELLEMENT parcourue</span>
|
||||
{ <span class="k">"level"</span>: <span class="s">"eco"</span>,
|
||||
<span class="k">"targetW"</span>: <span class="n">1400</span>, <span class="c">// la part de ce décidé qui revient à ce niveau</span>
|
||||
<span class="k">"funding"</span>: <span class="s">"grid"</span>, <span class="c">// L'ORIGINE — « ces watts sont achetés ». Livré en +etm30.</span>
|
||||
<span class="k">"counts"</span>: { <span class="k">"draw.committedW"</span>: <span class="n">1400</span> }, <span class="c">// LE REGISTRE — « ils sont comptés ici ».</span>
|
||||
<span class="c">// Σ counts == targetW, toujours. Publié même à une seule</span>
|
||||
<span class="c">// destination, et même à zéro, avec sa destination.</span>
|
||||
<span class="k">"decision"</span>: { <span class="k">"code"</span>: <span class="s">"ECO_FLOOR_GRID"</span>,
|
||||
<span class="k">"params"</span>: { <span class="k">"deliveredWh"</span>: <span class="n">2100</span>, <span class="k">"targetWh"</span>: <span class="n">3000</span>, <span class="k">"gridW"</span>: <span class="n">1400</span> } },
|
||||
<span class="k">"progress"</span>: { <span class="k">"regime"</span>: <span class="s">"measured"</span>, <span class="c">// measured | estimated | unmeasurable</span>
|
||||
<span class="k">"deliveredWh"</span>: <span class="n">2100</span>, <span class="k">"targetWh"</span>: <span class="n">3000</span> } }, <span class="c">// deliveredWh ABSENT si unmeasurable</span>
|
||||
{ <span class="k">"level"</span>: <span class="s">"eco"</span>, <span class="c">// RELEVÉ sur `.75` le 2026-09-01, +etm43</span>
|
||||
<span class="k">"targetW"</span>: <span class="n">766.813994355397</span>, <span class="c">// le décidé, NON arrondi</span>
|
||||
<span class="k">"funding"</span>: <span class="s">"grid"</span>,
|
||||
<span class="k">"counts"</span>: { <span class="k">"draw.committedW"</span>: <span class="n">766.813994355397</span> },
|
||||
<span class="k">"progress"</span>: { <span class="k">"regime"</span>: <span class="s">"unmeasurable"</span>, <span class="k">"targetWh"</span>: <span class="n">4000</span> },
|
||||
<span class="c">// deliveredWh ABSENT sous unmeasurable — jamais 0</span>
|
||||
<span class="k">"decision"</span>: { <span class="k">"code"</span>: <span class="s">"ECO_FLOOR_GRID"</span>, <span class="k">"params"</span>: {
|
||||
<span class="k">"gridW"</span>: <span class="n">767</span>, <span class="k">"remainingWh"</span>: <span class="n">4000</span>, <span class="k">"targetWh"</span>: <span class="n">4000</span>,
|
||||
<span class="k">"remainingS"</span>: <span class="n">18779</span>, <span class="k">"regime"</span>: <span class="s">"unmeasurable"</span>, <span class="k">"atMaximum"</span>: false } } },
|
||||
{ <span class="k">"level"</span>: <span class="s">"comfort"</span>,
|
||||
<span class="k">"targetW"</span>: <span class="n">0</span>,
|
||||
<span class="k">"decision"</span>: { <span class="k">"code"</span>: <span class="s">"SURPLUS_INSUFFICIENT"</span>, <span class="k">"params"</span>: { <span class="k">"requiredW"</span>: <span class="n">900</span>, <span class="k">"availableW"</span>: <span class="n">0</span> } } }
|
||||
@ -751,7 +756,16 @@
|
||||
pendant que l'installation en tire 1 000 — d'où le bloc « trois nombres » de l'écran 3, qui empêche de
|
||||
lire cet écart comme une erreur de comptage.</p></div>
|
||||
|
||||
<div class="req"><b><u>R5</u>Le régime de LM-1009 est porté par le NIVEAU éco, pas par la charge</b>
|
||||
<div class="req"><b><u>R5</u>Le régime est porté par le NIVEAU — <span style="color:var(--green)">✔ en ligne</span></b>
|
||||
<p><b>Vérifié à la sonde le 2026-09-01</b> : <code>progress</code> et <code>decision</code> descendent au
|
||||
niveau, et <code>deliveredWh</code> est bien <b>absent</b> sous <code>unmeasurable</code>.</p>
|
||||
<p><b>Et le motif publie <code>remainingWh</code>, pas <code>deliveredWh</code> — accepté.</b> Ce n'est pas
|
||||
« une source par fait » qui tranche (on aurait pu retirer <code>deliveredWh</code> de <code>progress</code>)
|
||||
mais ceci : <b><code>remainingWh</code> n'est pas dérivable sous <code>unmeasurable</code></b>, et c'est
|
||||
exactement le régime où l'on achète. Un champ qui n'existe que là où on peut le calculer ferait taire
|
||||
l'écran dans le cas qui coûte de l'argent. Sous <code>unmeasurable</code>,
|
||||
<code>remainingWh == targetWh</code> : « 4 000 sur 4 000 » se lit <b>« rien de mesurable »</b>, jamais
|
||||
« rien livré ».</p>
|
||||
<p><code>progress.regime ∈ measured | estimated | unmeasurable</code>, et <code>deliveredWh</code>
|
||||
<b>absent</b> sous <code>unmeasurable</code> — jamais 0. C'est la même règle que
|
||||
<code>measurement.source = "none"</code>, qui nous a déjà servis : un régime publié sépare « pas mesurable »
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user