idempotence de la flotte : zero changed, et le zero est verifie

924 (rejeu depuis zero) -> 17 (2e passage) -> 0 (3e). Zero tache changed,
zero echec sur les quatorze hotes. Le depot n'avait jamais fait ce test a
l'echelle de la flotte.

Verification du zero, parce qu'un zero peut signifier que les roles ne font
plus rien : PLUS de taches se sont executees au passage a vide qu'au rejeu
(2266 contre 2152). Elles ont toutes tourne et toutes trouve le systeme
conforme. Un zero obtenu avec MOINS de taches aurait dit l'inverse.

Ce que le test a rapporte : trois defauts, dont deux n'etaient pas des defauts
d'idempotence mais des PANNES SILENCIEUSES — node_exporter mourait a chaque
renouvellement de certificat sur les 14 hotes, et chaque deploiement
invalidait les jetons OAuth2 de la forge.

Le chiffre devient la ligne de base : un deploiement futur qui rapporte
changed sur une flotte non modifiee signale desormais quelque chose.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Daniel Allaire 2026-08-09 15:00:43 -04:00
parent ffb515cf3c
commit c7fe250520
2 changed files with 68 additions and 0 deletions

View file

@ -1,5 +1,32 @@
# CHANGELOG — Set-OPS # CHANGELOG — Set-OPS
## 2026-08-09 — Idempotence de la flotte : zéro, et c'est un zéro qui veut dire quelque chose
```
plays taches ok changed
rejeu depuis zero 61 2152 924
2e passage 30 2249 17
3e passage 30 2266 0
```
**Zéro tâche `changed`, zéro échec, sur les quatorze hôtes.** Le dépôt n'avait jamais fait
ce test à l'échelle de la flotte.
**Vérification du zéro**, parce qu'un zéro peut aussi signifier que les rôles ne font plus
rien : **plus de tâches se sont exécutées au passage à vide qu'au rejeu** — 2266 contre
2152. Elles ont toutes tourné et toutes trouvé le système conforme. Un zéro obtenu avec
*moins* de tâches aurait dit l'inverse.
**Ce que ce test aura coûté et rapporté.** Trois défauts trouvés, dont deux n'étaient pas
des défauts d'idempotence mais des **pannes silencieuses** : node_exporter mourait à chaque
renouvellement de certificat sur les quatorze hôtes, et chaque déploiement invalidait les
jetons OAuth2 de la forge. Aucune des deux ne se signalait autrement — c'est le compte de
`changed` qui les a fait apparaître.
Ce chiffre devient la **ligne de base**. Un déploiement futur qui rapporte `changed` sur
une flotte non modifiée signale désormais quelque chose. Tant que le fond était à 17, ce
signal était noyé.
## 2026-08-09 — Les deux dernières tâches non idempotentes, et ce qu'elles cachaient ## 2026-08-09 — Les deux dernières tâches non idempotentes, et ce qu'elles cachaient
**Prometheus — une liste non ordonnée.** `intersect` rend un *ensemble*, dont l'ordre **Prometheus — une liste non ordonnée.** `intersect` rend un *ensemble*, dont l'ordre

View file

@ -89,3 +89,44 @@ voie. La reconstruction a inversé l'ordre de démarrage et rendu visible un dé
laissé un schéma à moitié migré (`no such column: with_credentials`). Base mise de côté, laissé un schéma à moitié migré (`no such column: with_credentials`). Base mise de côté,
recréée par Grafana — 95 s pour lier son port, ce qui explique la course. recréée par Grafana — 95 s pour lier son port, ce qui explique la course.
- **Rien d'autre.** Ni certificat, ni compte, ni zone DNS, ni base de données. - **Rien d'autre.** Ni certificat, ni compte, ni zone DNS, ni base de données.
---
## Idempotence de la flotte — référence du 2026-08-09
Mesure faite après la seconde reconstruction, en rejouant `make deployer-tout` sur une
flotte intacte. Le dépôt n'avait jamais fait ce test à l'échelle de la flotte.
```
plays taches ok changed sautees
rejeu depuis zero 61 2152 924 443
2e passage 30 2249 17 ...
3e passage (apres) 30 2266 0 227
```
**Zéro tâche `changed`, zéro échec.**
Et ce zéro n'est pas du silence : **plus de tâches se sont exécutées au passage à vide
qu'au rejeu** (2266 contre 2152). Elles ont toutes tourné, et toutes trouvé le système
conforme. Un zéro obtenu avec moins de tâches aurait signifié l'inverse — des rôles qui ne
font plus leur travail.
### Ce que les 17 du deuxième passage cachaient
| Tâche | Ce que c'était vraiment |
|---|---|
| 13× `Activer et demarrer node_exporter` | **le service était mort** — tué par `SIGHUP` à chaque renouvellement de certificat |
| 2× Prometheus | liste de cibles non ordonnée (`intersect` rend un ensemble) |
| 2× Forgejo | **le dépôt faisait tourner le secret JWT du service** à chaque déploiement |
Deux des trois n'étaient pas des défauts d'idempotence : c'étaient des **pannes**, qu'un
compte de `changed` a rendues visibles. La collecte de métriques s'arrêtait toutes les
24 heures sur les quatorze hôtes, et les jetons OAuth2 de la forge étaient invalidés à
chaque passage. Ni l'une ni l'autre ne se signalait autrement.
### À quoi sert ce chiffre
Il devient la **ligne de base**. Un déploiement futur qui rapporte `changed` sur une flotte
non modifiée signale quelque chose : soit une dérive du système, soit un rôle qui a cessé
d'être idempotent. Tant que le fond était à 17, ce signal était noyé.