From 820e58c13e218dc415b6ac9498e696febe6b94b1 Mon Sep 17 00:00:00 2001 From: Patrick Schurig Date: Sun, 30 Aug 2026 09:30:45 +0200 Subject: [PATCH] =?UTF-8?q?docs(sonde):=20+etm31=20v=C3=A9rifi=C3=A9=20?= =?UTF-8?q?=E2=80=94=20`draw.committedW`=20est=20l=C3=A0,=20l'exception=20?= =?UTF-8?q?reste?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) Claude-Session: https://claude.ai/code/session_01GKM8FDNHZWogAsjjfB8pSw --- CLAUDE.md | 25 +++++++++++++++++++------ lib/models/load_telemetry.dart | 21 +++++++++++++++------ 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 7487e85..31f045f 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -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 diff --git a/lib/models/load_telemetry.dart b/lib/models/load_telemetry.dart index cfddb1d..ed263b7 100644 --- a/lib/models/load_telemetry.dart +++ b/lib/models/load_telemetry.dart @@ -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) {