From 8c0645d3719da8ee4571db6cc809b2ff7153b1b2 Mon Sep 17 00:00:00 2001 From: Patrick Schurig Date: Sat, 17 Oct 2026 14:32:51 +0200 Subject: [PATCH] =?UTF-8?q?feat(tools):=20l'optimiseur=20de=20r=C3=A9f?= =?UTF-8?q?=C3=A9rence=20s'annonce=20powersync-optimizer=20(correctifs=20b?= =?UTF-8?q?rief=204,=20point=201)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- docs/OPTIMIZER_PROTOCOL.md | 3 +++ tests/auto/refoptimizer/testrefoptimizer.cpp | 3 +++ tools/README.md | 3 +++ tools/etm-powersync-ref-optimizer/README.md | 4 ++++ .../etm-powersync-ref-optimizer | 8 +++++++- 5 files changed, 20 insertions(+), 1 deletion(-) diff --git a/docs/OPTIMIZER_PROTOCOL.md b/docs/OPTIMIZER_PROTOCOL.md index cf15fc0..b0df5c0 100644 --- a/docs/OPTIMIZER_PROTOCOL.md +++ b/docs/OPTIMIZER_PROTOCOL.md @@ -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 diff --git a/tests/auto/refoptimizer/testrefoptimizer.cpp b/tests/auto/refoptimizer/testrefoptimizer.cpp index e3da80e..cf1559c 100644 --- a/tests/auto/refoptimizer/testrefoptimizer.cpp +++ b/tests/auto/refoptimizer/testrefoptimizer.cpp @@ -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}})); diff --git a/tools/README.md b/tools/README.md index 4cd7140..9b09b24 100644 --- a/tools/README.md +++ b/tools/README.md @@ -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. diff --git a/tools/etm-powersync-ref-optimizer/README.md b/tools/etm-powersync-ref-optimizer/README.md index ab342b6..92968da 100644 --- a/tools/etm-powersync-ref-optimizer/README.md +++ b/tools/etm-powersync-ref-optimizer/README.md @@ -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. diff --git a/tools/etm-powersync-ref-optimizer/etm-powersync-ref-optimizer b/tools/etm-powersync-ref-optimizer/etm-powersync-ref-optimizer index 02b8701..dc5b72e 100755 --- a/tools/etm-powersync-ref-optimizer/etm-powersync-ref-optimizer +++ b/tools/etm-powersync-ref-optimizer/etm-powersync-ref-optimizer @@ -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 ` 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':