docs(sonde): +etm31 vérifié — draw.committedW est là, l'exception reste

Sonde contre `.75`, 2026-08-30, `powersync-energy-plugin-nymea 1.15.2+etm31`
confirmé par dpkg. Trois points sur quatre vérifiés :

- `draw` dans la MÊME trame que `budget`, **une seule clé** `committedW` —
  `authorisedW`, `remainingW`, `binding`, `perPhaseBound` absents, pas à zéro ;
- `draw` publié même quand rien n'est acheté (`committedW: 0`, deux cycles) —
  donc son ABSENCE vaudra « box antérieure », jamais « rien acheté ce cycle ».
  Zéro est une valeur quand la grandeur existe, l'absence quand elle n'existe
  pas ;
- identité surplus tenue : 1 200 == `budget.allocatedW`.

Le quatrième ne l'est pas, et c'est celui qui décide : `EV_GRID_START` est
**inobservable sur le banc**. Les deux bornes sont déclarées dans
`GetLoadConfig` (V2C Trydan, Simulated wallbox) et absentes de `loads[]` — hors
arbitrage, rien de branché — donc le motif ne peut pas survenir.

La branche de `surplusShareW` reste. Elle ne partira qu'à l'observation d'un
`EV_GRID_START` réel et de ses deux moitiés dans `budget.allocatedW` et
`draw.committedW`.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GKM8FDNHZWogAsjjfB8pSw
This commit is contained in:
Patrick Schurig 2026-08-30 09:30:45 +02:00
parent faffc43dd9
commit 820e58c13e
2 changed files with 34 additions and 12 deletions

View File

@ -279,13 +279,26 @@ plan, pas de financement.
> véhicule » affirmait deux faussetés : que c'est réservé, et que ça regarde le véhicule
> plutôt que la latence de sa mesure.
>
> Les watts achetés n'auront de registre qu'avec **`draw.committedW`**. **Il n'est PAS sur la
> box** au 2026-08-30, et « annoncé » ne vaut pas « posé » : le code est écrit côté moteur, le
> cross-build n'a pas été fait, **aucun paquet `+etm31` n'existe**. Mesuré :
> `powersync-energy-plugin-nymea 1.15.2+etm30`, et aucune clé `draw` dans la trame.
> Les watts achetés ont enfin un registre : **`draw.committedW`**, posé en `+etm31` et
> **vérifié à la sonde le 2026-08-30** (deux cycles). Publié dans la **même trame que
> `budget`**, avec **une seule clé** — `authorisedW`, `remainingW`, `binding` et
> `perPhaseBound` sont **absents, pas à zéro** : le plafond de soutirage n'existe pas encore,
> et un `authorisedW: 0` afficherait un plafond fictif avec sa source.
>
> **Rien d'autre ne s'écrit ici avant que la sonde ait vu `draw.committedW` sortir** — et
> l'exception `EV_GRID_START` de `surplusShareW` tient jusque-là.
> ```jsonc
> "budget": { … }, "draw": { "committedW": 0 }
> ```
>
> **`draw` est publié même quand rien n'est acheté** (`committedW: 0`, mesuré). Donc `draw`
> **absent** vaut « box antérieure à `+etm31` », **jamais** « rien acheté ce cycle » : zéro est
> une valeur quand la grandeur existe, l'absence est une valeur quand elle n'existe pas.
>
> ⚠️ **L'exception `EV_GRID_START` n'est PAS levée**, faute d'avoir pu l'observer. Le motif est
> **inobservable sur le banc** au 2026-08-30 : les deux bornes sont déclarées dans
> `GetLoadConfig` (V2C Trydan, Simulated wallbox) mais **absentes de `loads[]`** — hors
> arbitrage, aucun véhicule branché. La branche de `surplusShareW` tient tant qu'une sonde n'a
> pas vu un `EV_GRID_START` réel et ses deux moitiés tomber dans `budget.allocatedW` et
> `draw.committedW`.
Le niveau publié est `"comfort"` et ce **n'est pas un rebaptisage** : c'est bien la passe
qui, au §10, servira le confort depuis le surplus. Un niveau à `targetW: 0` est une passe

View File

@ -568,12 +568,21 @@ class LoadTelemetryEntry {
/// Si le motif est là mais `budgetW` absent, on retombe sur zéro plutôt que sur une
/// part devinée — un chiffre faux est pire qu'un chiffre manquant dans un contrôle
/// d'identité.
/// ⚠️ **L'exception `EV_GRID_START` survit à `+etm30`, et elle est ÉCRITE au contrat**
/// (`INTERFACE.md`). Sa contribution au surplus n'est pas `targetW` mais
/// `decision.params.budgetW` : le motif partage une allocation entre les deux compteurs
/// du budget, donc il viole l'identité `Σ targetW(surplus) == budget.allocatedW`. C'est
/// le cas fondateur de R3, **documenté et non résolu** — à traiter comme tel, jamais
/// comme une divergence à diagnostiquer, tant que R3 n'est pas livrée.
/// ⚠️ **L'exception `EV_GRID_START` est toujours là, et son retrait attend une MESURE.**
///
/// Sa contribution au surplus n'est pas `targetW` mais `decision.params.budgetW` : le
/// motif partage une allocation entre deux compteurs, donc il viole l'identité
/// `Σ targetW(surplus) == budget.allocatedW`. C'était le cas fondateur de R3.
///
/// `+etm31` est censé y mettre fin — la part surplus dans `budget.allocatedW`, la part
/// réseau dans le nouveau `draw.committedW`, deux compteurs de même nature. La sonde du
/// 2026-08-30 confirme `+etm31` posé et `draw.committedW` publié, **mais n'a pas pu voir
/// le motif** : les deux bornes du banc sont déclarées et absentes de `loads[]` (hors
/// arbitrage, rien de branché), donc `EV_GRID_START` y est structurellement impossible.
///
/// **Cette branche tient jusqu'à l'observation d'un `EV_GRID_START` réel.** Retirer sur
/// la foi de l'annonce ferait exactement ce que la mesure a déjà démenti une fois cette
/// semaine.
double get surplusShareW {
// L'exception passe avant tout : elle vaut pour les deux formes.
if (decision.code == 'EV_GRID_START' && !isSurplusFunded) {