Le 16/09 Airtria a FABRIQUE un "jeton HA 401, regenere cote HA" alors que le jeton
renvoie 200 : elle raisonnait sur l'etat HA au lieu de le lire. Faute de methode de
lecture fiable, elle confabulait (valeurs a 03:25, puis une panne a 04:35).
- airtria-ha-read.js : lit /api/states, imprime etat + unite + last_changed converti en
heure de Paris + age (marque FIGE si >15 min) ; en echec, imprime le VRAI code HTTP.
Airtria lit via ce script et rapporte ce qu'il imprime. Verifie en live (SOC 46 %,
power -408 W = decharge ; source_mode et night_target correctement marques FIGE).
- AGENTS.md 1.7 : ne jamais fabriquer une panne/cause ; lire pour de vrai via
airtria-ha-read.js, ne pas raisonner sur une valeur.
- AGENTS.md 5ter : pointe vers le lecteur ; rappelle que /api/states est en UTC.
- .gitignore : whitelist elargie workspace/airtria-*.js.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RZsbhyGmRwZogdoBwT6C6y
Suite a une reponse WhatsApp erronee du 16/09 (question SOC VW : grandeur absente, puis
grandeurs voisines servies comme reponse - 5 faux sur 6, dont un compteur fige depuis 8 h
cite comme "cette nuit", et une batterie dite qui "monte" alors qu'elle descendait).
Corrections de domaine fournies par EVCS.
- AGENTS.md 1.7 : ne JAMAIS substituer une grandeur absente (le dire et s'arreter) ;
verifier last_changed avant de citer une valeur comme actuelle ; publier une grandeur
directionnelle avec le SIGNE de sa puissance.
- AGENTS.md 5ter : reference "ou lire quoi" (SOC maison + sens via battery_power,
source_mode, cible de nuit vivante, compteurs gx_device_* empoisonnes a ne pas lire
comme des deltas ; SOC voiture = n'existe pas).
- airtria-charge-session.js : lecteur SQL lecture seule (role airtria_ro, reutilise
makeClient) de la session de charge en cours, pour l'energie reellement prise par la
voiture (dont reseau) sans lire un compteur HA fige.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RZsbhyGmRwZogdoBwT6C6y
Le mot de passe airtria_ro est desormais lu depuis AIRTRIA_RO_PASSWORD
(variable d'environnement, sinon .env monte dans le conteneur), plus depuis
.pg-airtria : EVCS renouvelle ce mot de passe, un fichier fige faisait echouer
l'auth EN SILENCE. readPgPassword LEVE (rattrapable) au lieu de process.exit ;
mot de passe resolu paresseusement dans makeClient.
Nouveau module concierge-health.js (meme patron que le moniteur LLM) : battement
de coeur horodate a CHAQUE cycle detect, statut live dans HA, et alerte WhatsApp
UNIQUEMENT sur transition ok<->erreur (dedup, pas de rappel periodique). Chemin
HA independant de PostgreSQL : l'alerte auth KO part meme quand c'est l'auth qui
tombe. Best-effort : si les helpers HA manquent, le concierge n'echoue pas.
- concierge-health.test.js : machine a etats (dedup + transitions) verifiee, sans reseau
- concierge-health-ha-package.yaml.draft : helpers HA (a integrer cote proprietaire)
- SPEC : source du secret corrigee + section supervision
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RZsbhyGmRwZogdoBwT6C6y
Concierge: declenche au BRANCHEMENT (transition on de evenement) au lieu de la session ;
helper porte 'branchement' (ts::text verbatim) ; fraicheur [on-10, min(now, on+30)].
Moniteur LLM/RAM (llm-monitor.js) : endpoint spark + RAM, alerte WhatsApp sur changement
d'etat, publie l'etat dans HA (last_seen a chaque passage) + interrupteur de pilotage.
Docs: SPEC a jour, MONITORING-LLM.md, brouillons de config HA.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RZsbhyGmRwZogdoBwT6C6y
Complete le commit doc precedent : ajoute le code JS du concierge, exclu jusqu'ici
par la liste blanche workspace/*. Exception ciblee !workspace/concierge-*.js dans
.gitignore (aucun secret : les tokens sont lus depuis .ha-token/.pg-airtria, ignores).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RZsbhyGmRwZogdoBwT6C6y
AGENTS.md : 26 399 -> 14 654 caracteres. La migration 2026.8.1 y avait fusionne
TOOLS.md, portant le fichier bien au-dela de la limite d'injection : l'agent n'en
lisait plus que 19 %. Suppression de trois sections bourse redondantes, du bloc
heartbeat (fonction desactivee), des consignes Discord/Slack (canaux desactives)
et du boilerplate. Correction des references a TOOLS.md, qui n'existe plus, et
du nom de l'outil d'envoi WhatsApp (message, pas whatsapp send_message).
Ajout de trois regles issues d'incidents reels : validation d'un PNG par du -b
et jamais par view_image, absence de parametre de rebase sur le webhook N8N,
et rappel de la limite de 30 000 caracteres de ce fichier.
bourse-config.json : mise sous suivi. Retrait du graphe "normalise", dont le
titre annoncait un rebase 100 inexistant et qui ecrasait ORA.PA (~18 EUR) sous
NVDA (~250 USD) sur un axe commun. Nommage explicite des fichiers de sortie.
TOOLS.md : supprime, son contenu vit desormais dans AGENTS.md.
MEMORY.md et gmail-housekeeping.md : enregistrement d'un etat anterieur
(troncatures des 7 juillet et 5 aout, jamais commitees depuis le 26 juin).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NuEBkGBjkpZGgqJnX1DCrm