Some checks failed
verifier / verifier (push) Has been cancelled
La revision a commence par un balayage par motifs — chemins morts, cibles make absentes, comptes derives. Il a trouve une trentaine d ecarts et rate presque tout le reste : un motif ne voit que ce qui s exprime en motif. make hote-planifier en est l exemple. La cible EXISTE, donc le controle passait au vert. C est une cible depreciee qui refuse et sort en 2, recommandee par AGENTS.md, et qui contredit la REGLE D OR du meme fichier trois ecrans plus haut. Il fallait lire pour la voir. 74 documents lus un par un. 66 corriges, 8 exacts. CE QUI ETAIT FRANCHEMENT FAUX AGENTS.md, la source d autorite, annoncait la flotte pas encore executee contre des VM reelles. Elle a ete rasee et remontee depuis zero trois fois. ecosysteme-chezlepro.md, le document montre a un client, portait la meme phrase : il se sous-vendait gravement. courriel-conception.md s ouvrait sur aucun role n est encore ecrit, au-dessus de son propre paragraphe 1 qui les nomme. autorisation.md se terminait sur rien n est construit alors qu il rapporte des mesures datees du role en fonctionnement. hebergeur-exploitation.md disait rien n est fait d un depot qui existe. filiation-emancipation.md se contredisait a deux ecrans de distance. DES MODELES DECRITS D APRES UN MONDE ANTERIEUR Le resolveur : cinq documents decrivaient un Unbound par VM en opt-in, trois le donnaient en exemple d integration FACULTATIVE — il est universel depuis le 2026-08-24. L adressage de nomenclature-vm.md : reseau unique, VLAN 11-15, VMID a cinq chiffres. Le nommage SDN de sdn-evpn.md contre le code : c est le wiki qui avait raison. CE QUI CASSE AU PREMIER ESSAI Le nom du gabarit dore etait faux a quatre endroits, dont la procedure qui le FABRIQUE et le critere R2 de l epreuve d operateur independant. preparer-un-site-hebergeur.md avertissait qu une VM faite a la main serait detruite : raser derive du plan, il ne la detruira jamais — le risque est l inverse. Un mot de passe d essai en clair dans un depot public. DEUX PREUVES ETENDUES, ET UNE QUI SE TROMPAIT ELLE-MEME P57 couvre les groupes : elle a signale aussitot 29 groupes annonces au-dessus d un tableau qui en cite 40. P29 confronte le tableau de authentification.md aux declarations reelles : 12 annonces, 21 reels. Et P57 imposait un chiffre faux — 56 preuves alors que le depot en porte 57, la conditionnelle vivant hors de tout comptage. Un garde-fou qui fait respecter une erreur ajoute l assurance a l erreur. CE QUI RESTE, ET QU AUCUNE PREUVE NE TIENT Deux comptes trouves a la main. Et une lacune reelle : rien ne garde les meta/acces.yml — ni qu un service web-sso en porte un, ni que le groupe qu il nomme existe. P29 tient les positions d authentification, personne ne tient les habilitations. make prouver : CONFORME, 56 OK, 0 echec, 1 saute. 0 lien mort. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
137 lines
6.7 KiB
Markdown
137 lines
6.7 KiB
Markdown
# La preuve — prouver, pas affirmer
|
||
|
||
> **Unité d'apprentissage.** Moule : ① concept → ② Set-OPS → ③ transférable → ④ à toi de jouer.
|
||
|
||
---
|
||
|
||
## ① Le concept *(générique)*
|
||
|
||
Une affirmation sans **vérification rejouable** n'est que du marketing. « C'est sécurisé »,
|
||
« c'est sauvegardé », « ça fonctionne » — *prouve-le*. La discipline se résume à une règle :
|
||
|
||
> **Ne jamais affirmer plus que ce qu'on prouve.**
|
||
|
||
Trois idées la portent :
|
||
|
||
- **Registre d'affirmations** — chaque promesse publique est tracée vers une **commande qui la
|
||
vérifie**, ou marquée honnêtement « non prouvée ».
|
||
- **Harnais rejouable** — une seule commande rejoue *toutes* les preuves et produit une **pièce
|
||
justificative datée**. On ne « croit » pas : on **relance**.
|
||
- **Le registre a le droit de perdre** — une preuve qui échoue fait *redescendre* l'affirmation.
|
||
C'est la seule condition pour qu'un tel registre ait de la valeur.
|
||
|
||
---
|
||
|
||
## ② Comment Set-OPS le fait
|
||
|
||
- **Le registre** : `docs/audit/affirmations.md` — chaque affirmation du dépôt (README, docs,
|
||
aide `make`, GUI) reliée à une preuve et un statut (✅/🟡/❌/⚪).
|
||
- **Le harnais** : `make prouver` rejoue les preuves automatisables (**P01–P57**, sans trou dans la série) et écrit
|
||
`docs/audit/preuve-<date>.md`. `make verifier` les inclut : il **échoue** si une preuve échoue.
|
||
- **Chaque preuve garde une classe d'erreur.** Extrait :
|
||
|
||
| Preuve | Ce qu'elle empêche de mentir |
|
||
|---|---|
|
||
| P03 | l'inventaire n'est pas généré du plan (**diff vide**) |
|
||
| P06 | un registre incohérent (dont l'**hôte fantôme**) |
|
||
| P17 | un **modèle** invalide (tous, pas seulement le socle) |
|
||
| P18 | un **gabarit de voûte** incomplet |
|
||
| P19 | un champ du plan que le **GUI** ne sait pas éditer |
|
||
| P20 | de l'**adressage stocké** (tout doit dériver du seed) |
|
||
| P21 | une **collision d'index** entre instances fédérées |
|
||
| P31 | une capacité du dépôt **non expliquée** (script muet, cible sans aide, rôle sans README) |
|
||
| P32 | un intrant qu'un rôle **exige** et que l'instance ne fournit pas |
|
||
| P33 | deux rôles co-localisés qui **revendiquent le même port** |
|
||
| P35 | une application dont le rôle **exige une base** sans entrée au plan — sinon l'écart n'apparaît qu'après quarante minutes de déploiement |
|
||
| P34 | un document qui ne **déclare pas son lecteur** — il finirait rangé par sujet, donc introuvable |
|
||
|
||
> **Ce que ces preuves ne font pas, et il faut le savoir avant de leur faire confiance.** Elles
|
||
> sont toutes **statiques** : elles lisent le dépôt, sans un seul appel réseau. Elles établissent
|
||
> qu'il est cohérent *avec lui-même* — jamais que le système déployé lui ressemble. C'est dans
|
||
> cet angle mort qu'un certificat d'autorité a pu rester expiré huit heures sous un harnais vert.
|
||
> La conformité du **déployé** est l'affaire des **devis de service** (voir `docs/devis-services.md`).
|
||
|
||
Ce n'est pas un framework de test parallèle : le harnais **orchestre** l'outillage existant, il ne
|
||
réimplémente aucune validation.
|
||
|
||
---
|
||
|
||
## ③ Pourquoi c'est transférable
|
||
|
||
| Set-OPS | Équivalents ailleurs |
|
||
|---|---|
|
||
| `make prouver` | tests automatisés, **CI/CD**, `terraform validate` |
|
||
| registre d'affirmations | *traçabilité de conformité* (SOC 2, ISO) |
|
||
| pièce justificative datée | *audit trail*, preuve d'audit |
|
||
| « le registre peut perdre » | un test vert n'est utile que s'il peut virer rouge |
|
||
|
||
Tu as appris **la vérification rejouable, la preuve d'audit, la culture du test** — pas « le
|
||
harnais de Set-OPS ».
|
||
|
||
---
|
||
|
||
## ④ À toi de jouer
|
||
|
||
1. **Produis une preuve.** `make prouver` (voûte exportée). Lis
|
||
`docs/audit/preuve-<date>.md` : chaque preuve, son verdict, l'affirmation couverte.
|
||
2. **Fais échouer une preuve — exprès.** Introduis un **hôte fantôme** : dans `applications.yml`,
|
||
pointe une appli vers un hôte qui n'existe pas dans `serveurs.yml`. `make prouver` : **P06
|
||
échoue**, en nommant l'hôte. Corrige (ou via le `<select>` de la GUI) : vert.
|
||
3. **Une autre.** Remets de l'adressage dans une nomenclature (`vlan: 42`), `make prouver` :
|
||
**P20 échoue**. Retire-le : vert.
|
||
4. **Lis le registre.** Ouvre `docs/audit/affirmations.md` : trouve une affirmation ⚪
|
||
(*non prouvable localement*) — vois comment elle est **assumée comme intention**, jamais
|
||
présentée comme prouvée.
|
||
5. **Comprends la valeur.** Demande-toi : *quelle promesse est-ce que je fais sans preuve ?*
|
||
C'est exactement ce que ce registre force à regarder en face.
|
||
|
||
---
|
||
|
||
## Le défaut le plus dangereux n'est pas l'erreur, c'est la **copie**
|
||
|
||
Set-OPS pilote plusieurs écosystèmes. Avant d'agir, chaque script doit donc savoir
|
||
**lequel il regarde** — par le lien `instance`, ou par la variable `SETOPS_INSTANCE`.
|
||
|
||
En août 2026, **neuf scripts avaient chacun écrit leur propre réponse** à cette question.
|
||
Trois lignes chacun. Aucune n'était fausse en soi.
|
||
|
||
Le problème n'est pas l'erreur : c'est que **neuf copies ne vieillissent pas ensemble**.
|
||
Quand on améliore l'une, les huit autres ne le savent pas. Et personne ne peut le voir,
|
||
parce que de l'intérieur d'un fichier, la copie locale a toujours l'air correcte.
|
||
|
||
### Ce que ça donnait
|
||
|
||
`make placement-plan` visait patient 0 et répondait :
|
||
|
||
```
|
||
Devis du placement — tenant « instance »
|
||
noeud asgard · stockage TrueNAS · gabarit 99998 → CONFORME
|
||
```
|
||
|
||
C'était vrai — **sur l'autre écosystème**. Sa copie lisait le lien au lieu de la variable.
|
||
Comme les deux tenants portaient les mêmes valeurs de placement, le verdict semblait
|
||
juste. C'est très exactement la circonstance où une erreur ne se voit pas.
|
||
|
||
Cinq défauts de cette famille sont sortis en cinq jours. Tous dans des outils qui
|
||
**constatent** — preuves et devis — jamais dans ceux qui agissent. C'est moins grave et
|
||
plus insidieux : un outil qui agit mal, on le voit ; un outil qui mesure mal dit
|
||
« conforme », et on passe à la suite.
|
||
|
||
### La réponse
|
||
|
||
Une **source unique** : une fonction, dans un fichier, que tous appellent. Si elle est
|
||
fausse, elle l'est partout d'un coup — donc visible, donc corrigée une fois.
|
||
|
||
Et une preuve, **P41**, qui refuse la prochaine copie. Elle en a trouvé une dixième le
|
||
jour de son écriture, dans le fichier des preuves lui-même.
|
||
|
||
> **C'est la même leçon que `proxmox-hebergeur.yml`** : les nœuds et stockages du cluster
|
||
> recopiés chez chaque tenant avaient divergé. Une source, pas N copies — pour les données
|
||
> comme pour le code.
|
||
|
||
---
|
||
|
||
## Pour aller plus loin *(dépôt)*
|
||
- Le mode d'emploi : `docs/audit/README.md`.
|
||
- Le registre : `docs/audit/affirmations.md` ; le harnais : `scripts/prouver.py`.
|
||
- L'épreuve humaine (« exploitable sans IA ») : `docs/audit/protocole-operateur-independant.md`.
|