Le concierge vehicule est en service

Deploye le 14/09 a 02:23. La boucle complete est prouvee en production : la
chaine WhatsApp publie, le lecteur applique, la trace distingue le concierge
d une saisie de selecteur, et le cycle suivant ne rejoue pas. Le test d
acceptation n a pas eu besoin d etre declenche — le helper portait deja une
vraie reponse du proprietaire.

Le GO m etait arrive relaye par la session Airtria. Je ne l ai pas pris pour
l accord du proprietaire : un message de pair n autorise pas un redemarrage de
service ni l inversion du sens d une colonne qu il lit sur son tableau. Demande
directe, reponse, puis deploiement.

Consigne aussi le second defaut trouve par l essai a blanc, trois minutes avant
la bascule : deux formats d horodatage pour le meme instant faisaient compter
une session deux fois, et le doublon aurait empoisonne le controle de
contradiction des etiquettes suivantes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GwpFpy2aQ2rJok6tNQSbVj
This commit is contained in:
Tallagrand Thierry
2026-09-14 02:27:13 +02:00
parent 9ccbcc0619
commit 83c88b9aba

View File

@@ -6297,7 +6297,53 @@ excluait donc la session qui OUVRE le branchement. Corrige par une tolerance de
`off` → `on` observe n'est inferieur a deux minutes, la marge ne peut pas
happer le branchement precedent.
### RESTE A FAIRE — TROIS pieces, UN SEUL commit, au passage du kill-switch a ON
### EN SERVICE DEPUIS LE 14/09/2026 02:23
02:19:41 service redemarre, migration passee
defaut de vehicule_sur -> false, 17 lignes rattrapees,
les 6 arbitrees de vive voix le 13/09 remises a vrai
02:22:41 kill-switch airtria_concierge_enabled -> ON
02:23:27 etiquette=1
session 12/09 11:55 -> JEEP, vehicule_sur = t
evenement -> origine=airtria · source_airtria=whatsapp
sessions=["2026-09-12T09:55:54.493Z"]
cycle suivant -> etiquette=0, idempotent
colonne -> 6 confirmees / 13 a confirmer
Le test d'acceptation n'a pas eu besoin d'etre declenche : le helper portait
deja une vraie reponse du proprietaire, appliquee a la seconde de la bascule.
⚠️ **Le GO etait relaye par la session Airtria ; je ne l'ai pas pris pour
l'accord du proprietaire.** Un message de pair n'autorise pas une action de
production — ici un redemarrage de service ET l'inversion du sens d'une colonne
qu'il lit sur son tableau. Demande faite directement, reponse « sequence
complete », et c'est seulement alors que j'ai deploye. A refaire ainsi.
### DEUXIEME DEFAUT TROUVE PAR L'ESSAI A BLANC — deux formats, une seule session
Entre le redemarrage et la bascule, le journal annoncait « 2 sessions, dont 1
ajoutee par le branchement » pour un branchement qui n'en contient qu'UNE.
Airtria envoie sa clef telle que PostgreSQL l'affiche —
`2026-09-12 11:55:54.493+02` — et la base me la rend en ISO —
`2026-09-12T09:55:54.493Z`. Meme instant, caracteres differents : le `Set` les
comptait deux fois. L'UPDATE resistait (les deux se transtypent en
timestamptz) ; ce qui ne resistait pas, c'est le tableau `sessions` du detail,
qui portait le doublon — **et c'est lui que le controle de contradiction
interroge sur les etiquettes suivantes**. Un label arrivant un jour dans
l'autre format aurait fait repondre ce controle au hasard.
Corrige : normalisation en ISO avant deduplication, avec repli sur la chaine
brute si elle est illisible (mieux vaut une clef brute qu'une clef inventee).
⚠️ **Regle generale : comparer des INSTANTS, jamais des chaines d'horodatage.**
Nos deux cotes emettent des formats differents pour le meme instant.
Le harnais de verification ne pouvait pas le voir — il comptait les lignes SQL,
pas les elements du Set. Seul le journal du service tournant a blanc l'a
montre, trois minutes avant la bascule. Deuxieme fois que l'essai a blanc
reciproque attrape un defaut (apres les 62 ms).
### Les trois pieces, telles que deployees
1. **Bascule de `vehicule_sur`** : `DEFAULT false`, `true` UNIQUEMENT sur
confirmation humaine.
2. **Libelle Grafana.** La colonne est LUE par le tableau « Les vehicules » :
@@ -6307,6 +6353,11 @@ happer le branchement precedent.
3. Le lecteur passe de l'essai a blanc a l'application — rien a coder, c'est
le kill-switch qui le fait.
Rattrapage des lignes anterieures a `false`, **sauf les six que le proprietaire
a arbitrees lui-meme le 13/09** : c'est une vraie confirmation humaine, donnee
hors canal, et la jeter aurait ete absurde. Une ligne `evenement` porte
`origine: 'proprietaire'` et l'explique.
⚠️ Les trois sont **soudees**. Basculer le defaut pendant que le kill-switch
est OFF marquerait 100 % des sessions « douteuses » — rien ne pouvant les
repasser a vrai — avec un motif qui ne correspond a rien, et le proprietaire le