diff --git a/docs/DESIGN_PREVISION_PV.md b/docs/DESIGN_PREVISION_PV.md index 49940fe..20f47a3 100644 --- a/docs/DESIGN_PREVISION_PV.md +++ b/docs/DESIGN_PREVISION_PV.md @@ -1343,6 +1343,8 @@ pas un état du code.* 5. **§5 maintenu : aucune correction apprise dans le GPL.** `conversion` ∈ `physics` | `fallback` ; le plugin GPL n'émet jamais `hybrid`. Un optimiseur qui corrige la prévision le déclare de son côté (`OPTIMIZER_PROTOCOL.md` §6, `diagnostics.inputsUsed.pv`). + > *Note du 2026-10-13 : `fallback` est **retiré** — `conversion` vaut `physics`, seule valeur + > émise. Voir §30.1.* 6. **§11 maintenu : la prévision n'entre dans aucune décision sans un lot dédié**, avec sa propre décision écrite. Les décisions 1 à 4 améliorent la courbe ; elles ne la branchent sur rien. @@ -1374,3 +1376,16 @@ pas un état du code.* et par pas (brief 3 T2) portera les paramètres en vigueur ; c'est lui qui rendra la cause lisible. - **`conversion` vaut toujours `physics`.** Aucun émetteur de `fallback` n'existe dans ce dépôt, et le dépôt ne définit nulle part ce qu'il désignerait — point laissé ouvert, pas deviné. + > *Note du 2026-10-13 : point tranché, `fallback` est retiré (§30.1).* + +## 30. Décisions du 2026-10-13 — après les rapports T0/T1 du brief 3 + +*Consignées telles que rendues par Patrick. Rien de ce qui précède n'est réécrit : les §28 et §29 +restent l'état de leur date, et c'est ici qu'on lit ce qui les corrige.* + +1. **`conversion` : `fallback` est retiré.** Le §28 décision 5 écrivait `physics` | `fallback` ; + le §29 relevait que `fallback` n'était défini nulle part. La règle devient : `conversion` vaut + `physics`, **seule valeur émise par le plugin GPL** ; le champ reste pour des valeurs futures. + Une prévision **dégradée** (température absente) se lit dans `corrections: []`, pas dans + `conversion`. Correction **avant publication** (`OPTIMIZER_PROTOCOL.md` §0, 1.1) : aucun + émetteur n'a jamais produit `fallback`. diff --git a/docs/OPTIMIZER_PROTOCOL.md b/docs/OPTIMIZER_PROTOCOL.md index 9667d68..1db7bd1 100644 --- a/docs/OPTIMIZER_PROTOCOL.md +++ b/docs/OPTIMIZER_PROTOCOL.md @@ -40,6 +40,10 @@ optimiseur 1.0 reste conforme (champs inconnus ignorés, §9). rév. 3, avant toute implémentation socket). Aucun consommateur déployé n'en dépend ; ils sont retirés du document sans changement de majeure. +**Correction avant publication (2026-10-13)** : `conversion` n'admet plus `fallback`. La +valeur avait été écrite sans définition ; **aucun émetteur ne l'a jamais produite**. Seule +`physics` est émise ; une prévision dégradée se lit dans `corrections`. + - §5.2 **Prévisions explicites** (`forecast`) : grille temporelle déclarée, PV, consommation de base, température, prix complet. Remplace le renvoi à `CONTRACT_A_openmeteo.md`. - §5.3 **Groupes** (`group`) : clé de tri à deux niveaux. `priority` reste le rang effectif. @@ -240,9 +244,12 @@ Règles : conversion (`DESIGN_PREVISION_PV.md` §4). - `weatherModel` : modèle météo **qui a réellement répondu** (repli `best_match` compris), `null` si inconnu — jamais le modèle configuré. - - `conversion` : `physics` | `fallback`. Le plugin GPL **n'émet jamais `hybrid`** : - la correction apprise vit hors GPL (`DESIGN_PREVISION_PV.md` §5). Un optimiseur qui - corrige la prévision le déclare dans `diagnostics.inputsUsed.pv` (§6). + - `conversion` : `physics` (seule valeur émise par le plugin GPL). Le champ reste pour des + valeurs futures ; un consommateur ignore une valeur qu'il ne connaît pas plutôt que de la + deviner. Une prévision **dégradée** (température absente, par exemple) ne se lit **pas** + ici : elle se lit dans `corrections` (`[]` = aucune correction). Le plugin GPL **n'émet + jamais `hybrid`** : la correction apprise vit hors GPL (`DESIGN_PREVISION_PV.md` §5). Un + optimiseur qui corrige la prévision le déclare dans `diagnostics.inputsUsed.pv` (§6). - `issuedAt` : instant du run s'il est connu, sinon `null`. **Ce n'est pas l'âge de chaque case** (`DESIGN_PREVISION_PV.md` §20-21). `contentChangedAt` : instant d'apparition du contenu courant — un producteur figé ne doit pas se lire comme une prévision stable (§26.2). diff --git a/energyplugin/nymeaenergyjsonhandler.cpp b/energyplugin/nymeaenergyjsonhandler.cpp index f4ed4b8..e1cf734 100644 --- a/energyplugin/nymeaenergyjsonhandler.cpp +++ b/energyplugin/nymeaenergyjsonhandler.cpp @@ -407,7 +407,7 @@ NymeaEnergyJsonHandler::NymeaEnergyJsonHandler(SpotMarketManager *spotMarketMana returns.insert("o:model", enumValueName(String)); returns.insert("o:forecastPoints", QVariantList() << snapPoint); returns.insert("o:corrections", QVariantList() << enumValueName(String)); - returns.insert("o:conversion", enumValueName(String)); // physics | fallback + returns.insert("o:conversion", enumValueName(String)); // physics, seule valeur émise returns.insert("o:acLimitW", enumValueName(Uint)); returns.insert("o:fault", enumValueName(String)); returns.insert("o:faultParams", enumValueName(Variant)); @@ -1281,8 +1281,8 @@ JsonReply *NymeaEnergyJsonHandler::GetForecastSnapshot(const QVariantMap ¶ms // Ce qui a été fait à la courbe, publié AVEC elle (OPTIMIZER_PROTOCOL §5.2) : une liste vide // est une affirmation — conversion brute — pas une absence. ret.insert(QStringLiteral("corrections"), QVariant(rev.corrections).toList()); - // `physics` : le moteur GPL n'a pas d'autre conversion. Ni `hybrid` (correction apprise, hors - // GPL, §5), ni `fallback` (aucun émetteur aujourd'hui). + // `physics` : le moteur GPL n'a pas d'autre conversion. Jamais `hybrid` (correction apprise, + // hors GPL, §5). Une prévision dégradée se lit dans `corrections`, pas ici (§30.1). ret.insert(QStringLiteral("conversion"), QStringLiteral("physics")); if (const std::optional plafond = arb->forecastAcLimitW()) ret.insert(QStringLiteral("acLimitW"), *plafond);