From b4b3eece8470c8958d28aea6132d8d617a3c6258 Mon Sep 17 00:00:00 2001 From: Tallagrand Thierry Date: Mon, 14 Sep 2026 21:16:59 +0200 Subject: [PATCH] Une migration unique qui se rejoue n est pas unique MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Le bloc qui inverse la semantique de vehicule_sur n etait pas garde : a chaque redemarrage il remettait les lignes anterieures a faux puis les six arbitrees a vrai. Le resultat restait juste — l operation est idempotente en sortie — mais elle ecrivait une ligne de journal trompeuse a chaque fois. Quatre en une journee, qui seraient apparues en annotation sur tous les tableaux Grafana comme autant de faux evenements. Garde sur la trace elle-meme : si la ligne de journal existe, c est fait. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01GwpFpy2aQ2rJok6tNQSbVj --- tools/historise-evcs.mjs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/tools/historise-evcs.mjs b/tools/historise-evcs.mjs index 1ebdab8..56517f2 100644 --- a/tools/historise-evcs.mjs +++ b/tools/historise-evcs.mjs @@ -537,7 +537,16 @@ async function migrer(client) { // que le proprietaire a lui-meme arbitrees le 13/09 (cf. la reparation // ci-dessus) : c'est une vraie confirmation humaine, seulement donnee de // vive voix. La perdre serait jeter l'information qu'il a fournie. - const { rowCount: bascules } = await client.query( + // ⚠️ REJEU. La premiere version de ce bloc n'etait pas garde : a chaque + // redemarrage elle remettait les lignes anterieures a faux puis les six + // arbitrees a vrai. Le resultat restait JUSTE — l'operation est idempotente + // en sortie — mais elle ecrivait une ligne de journal trompeuse a chaque + // fois, quatre en une journee, qui serait apparue en annotation sur tous les + // tableaux. On garde donc sur la trace elle-meme : si elle existe, c'est + // fait. + const { rows: dejaFait } = await client.query( + `SELECT 1 FROM evenement WHERE resume LIKE 'Semantique de vehicule_sur%' LIMIT 1`); + const { rowCount: bascules } = dejaFait.length ? { rowCount: 0 } : await client.query( `UPDATE session_charge SET vehicule_sur = false WHERE vehicule_sur AND debut < '2026-09-14'::date`); if (bascules) {