feat(tools): l'optimiseur de référence s'annonce powersync-optimizer (correctifs brief 4, point 1)

Décision du 2026-10-17 : l'exemple GPL annonce `powersync-optimizer` dans le
`name` du handshake ; `etm-optimizer` reste le nom de l'optimiseur ETM,
propriétaire, hors de ce dépôt. Le fichier et son répertoire gardent le
préfixe des artefacts (`tools/etm-powersync-ref-optimizer/`).

README de l'outil, annexe E et tools/README.md le disent en une phrase ;
refoptimizer vérifie le `name` publié par GetOptimizerStatus (1.1 et 1.0).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Patrick Schurig 2026-10-17 14:32:51 +02:00
parent fb017f87a7
commit 8c0645d371
5 changed files with 20 additions and 1 deletions

View File

@ -602,6 +602,9 @@ plan à un créneau qui reproduit le waterfall rule-based. Usages : test de bout
`SocketScheduler` (suite `etm-powersync-refoptimizer`) ; point de comparaison du banc ; exemple
communautaire. Mode d'emploi et modes d'injection de défauts : son `README.md`.
Il s'annonce **`powersync-optimizer`** au handshake (`name`). `powersync-optimizer` = exemple de référence GPL (ce dépôt) ; `etm-optimizer` = optimiseur ETM (propriétaire, hors de ce dépôt).
Le nom n'est pas contrôlé par le moteur (§3) : il n'est qu'affiché.
- Il ne lit **que** le contexte `GetPlan` (aucune connexion sortante, aucun fichier hors le token).
- Il reproduit la **passe confort** : tri (rang, identifiant), surplus net signé, recrédit de la
consommation courante, réserve de stockage, plancher, plafond, verrous, mapping SG-Ready avec

View File

@ -597,6 +597,8 @@ void TestRefOptimizer::testNormalReproducesTheRules()
.arg(i).arg(surplus.at(i - 1)).arg(cleEtat(b.at(i))).arg(i - 1).arg(cleEtat(a.at(i - 1)));
}
QVERIFY2(ecarts.isEmpty(), qUtf8Printable(ecarts.join('\n')));
// L'exemple GPL s'annonce `powersync-optimizer` ; `etm-optimizer` est l'optimiseur propriétaire.
QCOMPARE(rpc("GetOptimizerStatus").value("name").toString(), QString("powersync-optimizer"));
// Régime stable : à la fin de chaque palier, les deux runs coïncident aussi SANS décalage.
for (int i = 3; i < surplus.count(); i += 4) {
QCOMPARE(cleEtat(a.at(i)), cleEtat(a.at(i - 1)));
@ -742,6 +744,7 @@ void TestRefOptimizer::testAProtocol10OptimizerIsAccepted()
QVERIFY(m_arb->socketScheduler()->optimiseurAuDernierCycle());
const QVariantMap st = rpc("GetOptimizerStatus");
QCOMPARE(st.value("optimizerAlive").toBool(), true);
QCOMPARE(st.value("name").toString(), QString("powersync-optimizer"));
QCOMPARE(st.value("protocolVersion").toString(), QString("1.0"));
QVERIFY(!st.contains("capabilities"));
QCOMPARE(cleEtat(etatApplique()), cleEtat(QVariantMap{{"var1", 2000.0}, {"var2", 3000.0}, {"pac", 3}}));

View File

@ -5,6 +5,9 @@ Outils de développement et d'exploitation du plugin. Ce fichier ne décrit que
(`etm-powersync-ref-optimizer/README.md`), les autres scripts portent leur mode d'emploi en
en-tête.
Noms d'optimiseur : `powersync-optimizer` = exemple de référence GPL (ce dépôt) ; `etm-optimizer` = optimiseur ETM (propriétaire, hors de ce dépôt). L'optimiseur de
référence s'annonce `powersync-optimizer` au handshake ; son fichier garde le préfixe des artefacts.
## `etm-powersync-trace-replay` — rejouer des traces de décision
Python 3, bibliothèque standard seule, GPL-3.0 comme le dépôt.

View File

@ -6,6 +6,10 @@ confort : même ordre, même budget, mêmes écrêtages) en ne lisant **que** le
accès réseau sortant, aucun fichier hors le token. Usages : test de bout en bout du moteur, point de
comparaison d'un banc, exemple pour qui écrit son propre optimiseur.
**Nom annoncé au handshake : `powersync-optimizer`** (c'est le `name` que `GetOptimizerStatus`
publie). `powersync-optimizer` = exemple de référence GPL (ce dépôt) ; `etm-optimizer` = optimiseur ETM (propriétaire, hors de ce dépôt). Le fichier et son
répertoire gardent le préfixe des artefacts du dépôt, `etm-powersync-ref-optimizer`.
Ce qu'il ne reproduit pas (le contexte 1.1 ne le porte pas) : passe éco, dérogations, plafond de
soutirage, paliers d'un `relay-router` (il envoie une consigne continue que le routeur arrondit),
refus de commande, proxy VE. L'en-tête du script le détaille.

View File

@ -48,6 +48,9 @@ Le token se lit dans un FICHIER (--token-file), relu à chaque handshake, jamais
se verrait dans `ps`) et jamais affiché. S'il est configuré, un handshake sans lui, ou avec un
autre, reçoit une erreur JSON-RPC -32001 puis la connexion est fermée.
Au handshake, il s'annonce `powersync-optimizer` (exemple de référence GPL) ; `etm-optimizer` est
l'optimiseur ETM, propriétaire, hors de ce dépôt.
Sur la sortie standard, une seule ligne : `ÉCOUTE <endpoint>` quand le serveur écoute (le port
réel d'un `tcp://…:0`). Le journal va sur la sortie d'erreur.
"""
@ -68,6 +71,9 @@ from datetime import datetime, timedelta
ENDPOINT_DEFAUT = 'unix:///run/powersync/optimizer.sock'
VERSION = '1.1'
NOM = 'etm-powersync-ref-optimizer'
# Nom annoncé au handshake : `powersync-optimizer`, l'exemple GPL de référence. `etm-optimizer`
# est le nom de l'optimiseur ETM, propriétaire, hors de ce dépôt.
NOM_ANNONCE = 'powersync-optimizer'
LIGNE_MAX = 1024 * 1024 # E-T2-1 : une ligne de plus de 1 Mio est écartée
CODE_TOKEN_REFUSE = -32001 # E-T2-6
@ -413,7 +419,7 @@ class Connexion(socketserver.StreamRequestHandler):
return
token = attendu
pret = True
reponse = {'protocolVersion': VERSION, 'name': NOM, 'planning': False,
reponse = {'protocolVersion': VERSION, 'name': NOM_ANNONCE, 'planning': False,
'capabilities': {'resolutionS': cfg.horizon_s, 'kinds': ['setpoint', 'state'],
'usesForecast': [], 'reasonCodes': True}}
if mode == 'wrong-major':