From 7e458c9c99b50736e086ee39ae606a5ecbd10ce1 Mon Sep 17 00:00:00 2001 From: Tallagrand Thierry Date: Sun, 13 Sep 2026 12:54:18 +0200 Subject: [PATCH] La piste ne recopie plus le constat MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Quand il n y a rien a signaler il n y a pas de piste, et le repli sur le constat faisait afficher la meme phrase deux fois de suite sur la carte — et serait parti en double dans la colonne `piste` de la table d observation, ou elle ne serait plus interrogeable pour rien. « [95%] rien a creuser » garde la confiance visible et dit la verite. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01GwpFpy2aQ2rJok6tNQSbVj --- src/advisor/BUILD_HA_CALLS.js | 6 +++++- workflows/evcs-advisor-shadow-v1.json | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/advisor/BUILD_HA_CALLS.js b/src/advisor/BUILD_HA_CALLS.js index 733b29d..f769895 100644 --- a/src/advisor/BUILD_HA_CALLS.js +++ b/src/advisor/BUILD_HA_CALLS.js @@ -42,7 +42,11 @@ if (status === 'ok' && advice) { setText('input_text.evcs_advisor_constat', advice.constat); setText('input_text.evcs_advisor_gravite', advice.gravite); setText('input_text.evcs_advisor_ce_qui_cloche', advice.ceQuiCloche || 'rien de signale'); - setText('input_text.evcs_advisor_reason', `[${Math.round(advice.confidence * 100)}%] ${advice.piste || advice.constat}`); + // Quand il n'y a rien a signaler il n'y a pas de piste, et recopier le + // constat faisait afficher la meme phrase deux fois sur la carte — et + // partir en double dans la colonne `piste` de la table d'observation. + setText('input_text.evcs_advisor_reason', + `[${Math.round(advice.confidence * 100)}%] ${advice.piste || 'rien a creuser'}`); // Un observateur qui signale en permanence ne sert a rien : on compte le // VOLUME de signalements pour pouvoir le constater. diff --git a/workflows/evcs-advisor-shadow-v1.json b/workflows/evcs-advisor-shadow-v1.json index ac992b3..35b3af4 100644 --- a/workflows/evcs-advisor-shadow-v1.json +++ b/workflows/evcs-advisor-shadow-v1.json @@ -247,7 +247,7 @@ -30 ], "parameters": { - "jsCode": "// =====================================================\n// EVCS ADVISOR SHADOW V1 — BUILD_HA_CALLS\n// Écrit les helpers advisor_* + divergence + compteurs + logbook.\n// GARANTIE MODE OMBRE : ce node ne produit QUE des écritures vers\n// des entités advisor_* et le logbook. AUCUN switch, AUCUNE stratégie\n// réelle, AUCUNE commande borne. Ne pas ajouter d'autres entités ici.\n// =====================================================\n\nconst { status, detail, advice, modelUsed, context } = $input.first().json;\n\nfunction stampParis() {\n const p = new Intl.DateTimeFormat('fr-FR', {\n timeZone: 'Europe/Paris', day: '2-digit', month: '2-digit',\n hour: '2-digit', minute: '2-digit', hour12: false,\n }).formatToParts(new Date());\n const g = t => p.find(x => x.type === t)?.value || '';\n return `${g('day')}/${g('month')} ${g('hour')}:${g('minute')}`;\n}\n\nconst calls = [];\nfunction push(domain, service, data) {\n calls.push({ json: { domain, service, data } });\n}\nfunction setText(entity, value) {\n push('input_text', 'set_value', { entity_id: entity, value: (value ?? '').toString().slice(0, 250) });\n}\nfunction setNumber(entity, value) {\n push('input_number', 'set_value', { entity_id: entity, value });\n}\n\n// Statut + horodatage + modèle : écrits à CHAQUE run\nsetText('input_text.evcs_advisor_status', status + (detail ? `: ${detail}` : ''));\nsetText('input_text.evcs_advisor_last_run', stampParis());\nsetText('input_text.evcs_advisor_model', modelUsed);\n\nif (status === 'ok' && advice) {\n // Observation — la seule sortie desormais. Le conseiller ne planifie plus :\n // la planification est faite par le bilan, qui est calcule et mesure, et la\n // campagne du 12/09 a montre que lui demander les deux degradait les deux\n // (ecart de cible passe de 0 a 35 points sur certains cas des l ajout de la\n // mission d observation).\n setText('input_text.evcs_advisor_constat', advice.constat);\n setText('input_text.evcs_advisor_gravite', advice.gravite);\n setText('input_text.evcs_advisor_ce_qui_cloche', advice.ceQuiCloche || 'rien de signale');\n setText('input_text.evcs_advisor_reason', `[${Math.round(advice.confidence * 100)}%] ${advice.piste || advice.constat}`);\n\n // Un observateur qui signale en permanence ne sert a rien : on compte le\n // VOLUME de signalements pour pouvoir le constater.\n if (advice.gravite === 'aucune') {\n setNumber('input_number.evcs_advisor_agree_count', context.agreeCount + 1);\n } else {\n setNumber('input_number.evcs_advisor_diverge_count', context.divergeCount + 1);\n }\n\n push('logbook', 'log', {\n name: 'EVCS Advisor (observateur)',\n message: `[${advice.gravite}] ${advice.constat}`\n + (advice.ceQuiCloche ? ` || ${advice.ceQuiCloche}` : '')\n + (advice.piste ? ` || piste : ${advice.piste}` : ''),\n entity_id: 'input_text.evcs_advisor_constat',\n });\n}\n\nreturn calls;\n" + "jsCode": "// =====================================================\n// EVCS ADVISOR SHADOW V1 — BUILD_HA_CALLS\n// Écrit les helpers advisor_* + divergence + compteurs + logbook.\n// GARANTIE MODE OMBRE : ce node ne produit QUE des écritures vers\n// des entités advisor_* et le logbook. AUCUN switch, AUCUNE stratégie\n// réelle, AUCUNE commande borne. Ne pas ajouter d'autres entités ici.\n// =====================================================\n\nconst { status, detail, advice, modelUsed, context } = $input.first().json;\n\nfunction stampParis() {\n const p = new Intl.DateTimeFormat('fr-FR', {\n timeZone: 'Europe/Paris', day: '2-digit', month: '2-digit',\n hour: '2-digit', minute: '2-digit', hour12: false,\n }).formatToParts(new Date());\n const g = t => p.find(x => x.type === t)?.value || '';\n return `${g('day')}/${g('month')} ${g('hour')}:${g('minute')}`;\n}\n\nconst calls = [];\nfunction push(domain, service, data) {\n calls.push({ json: { domain, service, data } });\n}\nfunction setText(entity, value) {\n push('input_text', 'set_value', { entity_id: entity, value: (value ?? '').toString().slice(0, 250) });\n}\nfunction setNumber(entity, value) {\n push('input_number', 'set_value', { entity_id: entity, value });\n}\n\n// Statut + horodatage + modèle : écrits à CHAQUE run\nsetText('input_text.evcs_advisor_status', status + (detail ? `: ${detail}` : ''));\nsetText('input_text.evcs_advisor_last_run', stampParis());\nsetText('input_text.evcs_advisor_model', modelUsed);\n\nif (status === 'ok' && advice) {\n // Observation — la seule sortie desormais. Le conseiller ne planifie plus :\n // la planification est faite par le bilan, qui est calcule et mesure, et la\n // campagne du 12/09 a montre que lui demander les deux degradait les deux\n // (ecart de cible passe de 0 a 35 points sur certains cas des l ajout de la\n // mission d observation).\n setText('input_text.evcs_advisor_constat', advice.constat);\n setText('input_text.evcs_advisor_gravite', advice.gravite);\n setText('input_text.evcs_advisor_ce_qui_cloche', advice.ceQuiCloche || 'rien de signale');\n // Quand il n'y a rien a signaler il n'y a pas de piste, et recopier le\n // constat faisait afficher la meme phrase deux fois sur la carte — et\n // partir en double dans la colonne `piste` de la table d'observation.\n setText('input_text.evcs_advisor_reason',\n `[${Math.round(advice.confidence * 100)}%] ${advice.piste || 'rien a creuser'}`);\n\n // Un observateur qui signale en permanence ne sert a rien : on compte le\n // VOLUME de signalements pour pouvoir le constater.\n if (advice.gravite === 'aucune') {\n setNumber('input_number.evcs_advisor_agree_count', context.agreeCount + 1);\n } else {\n setNumber('input_number.evcs_advisor_diverge_count', context.divergeCount + 1);\n }\n\n push('logbook', 'log', {\n name: 'EVCS Advisor (observateur)',\n message: `[${advice.gravite}] ${advice.constat}`\n + (advice.ceQuiCloche ? ` || ${advice.ceQuiCloche}` : '')\n + (advice.piste ? ` || piste : ${advice.piste}` : ''),\n entity_id: 'input_text.evcs_advisor_constat',\n });\n}\n\nreturn calls;\n" } }, {