docs(v2c): le compteur d'absences n'avance que sur les polls réussis — propriété load-bearing

Le commentaire disait déjà la propriété ; il ne disait pas qu'elle PORTE. Une
réécriture qui ferait avancer le compteur au timeout, ou le piloterait depuis un
minuteur, la casserait sans qu'aucun test ne le dise.

Ce qu'elle garantit : un faux débranchement est IMPOSSIBLE à fabriquer par une
coupure réseau. Ce n'est pas théorique — 70 % de polls perdus mesurés le
2026-08-28, 40 % encore le 2026-09-06. Un compteur piloté au timeout clôturerait
une session toutes les 90 secondes sur ce lien.

Et elle devient load-bearing au-delà de la session : les dérogations se terminent
au débranchement, et l'asymétrie que leur design exige — prompt à conclure la fin,
lent à conclure la poursuite — existe déjà ici. Quelqu'un y a pensé avant nous.
This commit is contained in:
Patrick Schurig 2026-09-08 06:21:14 +02:00
parent c54718d337
commit 7863517bba

View File

@ -418,6 +418,20 @@ void IntegrationPluginV2c::accumulerEnergieDeSession(Thing *thing, TrydanModbusM
// 1. Confirmation du débranchement. Seuls les polls RÉUSSIS parviennent ici : // 1. Confirmation du débranchement. Seuls les polls RÉUSSIS parviennent ici :
// updateFinished() n'est émis qu'après une séquence de lecture complète. Une // updateFinished() n'est émis qu'après une séquence de lecture complète. Une
// coupure réseau gèle donc le compteur d'absences, elle ne le fait pas avancer. // coupure réseau gèle donc le compteur d'absences, elle ne le fait pas avancer.
//
// ┌─ CETTE PROPRIÉTÉ PORTE. Ne pas la « corriger » en avançant le compteur sur les
// │ polls échoués, ni en le pilotant depuis un minuteur.
// │
// │ Elle rend un faux débranchement IMPOSSIBLE à fabriquer par un lien mort — ce qui
// │ n'est pas théorique ici : la campagne du 2026-08-28 a mesuré jusqu'à 70 % de polls
// │ perdus, et le 2026-09-06 encore 40 % sur l'heure. Un compteur qui avancerait au
// │ timeout clôturerait une session toutes les 90 s sur ce lien.
// │
// │ Et elle devient LOAD-BEARING au-delà de la session : les dérogations (« boost »)
// │ se terminent au débranchement, et une dérogation terminée à tort par un lien qui
// │ bat serait une charge interrompue sans raison. Cf. docs/DESIGN_DEROGATION.md du
// │ dépôt moteur — l'asymétrie qu'il demande existait déjà ici.
// └─
suivi.absences = branche ? 0 : suivi.absences + 1; suivi.absences = branche ? 0 : suivi.absences + 1;
// 2. Clôture, une fois le débranchement confirmé sur k_absencesPourClore polls. // 2. Clôture, une fois le débranchement confirmé sur k_absencesPourClore polls.