Set-OPS-Public/docs/audit/preuve-2026-09-08.md

97 lines
11 KiB
Markdown
Raw Normal View History

preuves : trois gardes pour ce que ma lecture ne tiendra pas Une revision de documentation vieillit comme le reste. Ce qui tient, c est ce qu une machine verifie — et trois lacunes etaient nommees sans etre gardees. P58 HABILITATIONS. autorisation.md posait la regle (un service nomme un GROUPE, jamais une personne, D-66) et meta/acces.yml la portait ; rien ne la verifiait. P29 gardait les POSITIONS d authentification, personne ne gardait les DROITS. Le controle qui porte la preuve est un croisement : une entree porte_par: role-realm affirme que l habilitation voyage par un role de realm projete depuis un groupe LDAP. P58 le confronte a serveur_keycloak. Sans ca, un service annonce une habilitation que rien ne transporte, et l ecran reste vide sans que personne sache pourquoi. CE QU ELLE N EXIGE PAS, et c est le point le plus important : que les groupes nommes existent dans l annuaire. Ce serait contredire le regime du paragraphe 2 — le depot AMORCE un acces et se retire, les appartenances appartiennent a une personne. dev et personnel n existent dans aucun code, et ce n est pas un defaut. P59 ENUMERATIONS ANNONCEES. Les deux ecarts trouves a la main pendant la tournee — cinq portes annoncees devant une table de six, huit lignes renvoyees vers une fiche qui en compte dix — etaient d une forme que P57 ne voit pas. Ma premiere version a signale CINQ ecarts, et les cinq etaient du bruit : dans « reprise dans les deux devis : », le nombre qualifie autre chose que la liste. Cent pour cent de faux positifs — la preuve qui crie sur un cas sain et qu on apprend a ignorer. Resserree aux deux formes ou le nombre ne peut compter rien d autre. Etroite et vraie plutot que large et devineuse. P60 WIKI PUBLIE. Le wiki est publie DEPUIS le depot ; rien ne mesurait l ecart, et il s est creuse de VINGT-SEPT JOURS en silence. Deux unites jamais publiees, vingt et une differentes : pour qui lit la forge plutot que le depot, toute la revision n existait pas. Le harnais est STATIQUE, zero appel reseau — cloner la forge romprait la seule propriete qui fasse qu une preuve vaille hors de ce poste. La mesure passe donc par un TEMOIN que make wiki-publier depose. Amorce avec la valeur MESUREE : le wiki d eregion porte b6167f2, dont le message dit source: ac85278. Ce qu elle ne prouve pas : un temoin dit ce qui est PARTI, jamais ce qui est ARRIVE. LES TROIS SONT EPROUVEES DANS LES DEUX SENS Douze essais negatifs, douze refus : groupe non projete, acces.yml disparu, personne au lieu d un groupe, mecanisme invente, raison manquante, compte revenu a cinq, septieme porte ajoutee sans toucher au compte, renvoi croise fausse, temoin absent, temoin d un autre depot. Une garantie qu on n a jamais vu dire non n est pas une garantie, c est une habitude. ETAT : NON CONFORME, 58 OK, 1 echec, 1 saute. P60 est rouge, et c est le comportement voulu : le registre a le droit de perdre. Le retard qu elle signale est reel et anterieur a elle. Une commande le ferme, et elle vient ensuite. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
2026-09-08 12:47:18 -04:00
# Preuve de conformite — Set-OPS — 2026-09-08
> Genere par `make prouver` (`scripts/prouver.py`). **Rejouable** : relancer
> reproduit ce rapport. Chaque preuve rejoue l'outillage existant du depot ;
> aucune validation n'est reimplementee ici. Voir le mode d'emploi :
> [`docs/audit/README.md`](README.md), et le registre trace :
> [`docs/audit/affirmations.md`](affirmations.md).
- **Instance** : `/home/danallaire/Espace Chezlepro/DépôtsSurForge/Set-OPS-public/instance` — inventaire `/home/danallaire/Espace Chezlepro/DépôtsSurForge/Set-OPS-public/instance/inventories/principal/hosts.yml`
2026-09-08 12:49:40 -04:00
- **Verdict** : ✅ CONFORME (59 OK · 0 echec · 1 saute)
preuves : trois gardes pour ce que ma lecture ne tiendra pas Une revision de documentation vieillit comme le reste. Ce qui tient, c est ce qu une machine verifie — et trois lacunes etaient nommees sans etre gardees. P58 HABILITATIONS. autorisation.md posait la regle (un service nomme un GROUPE, jamais une personne, D-66) et meta/acces.yml la portait ; rien ne la verifiait. P29 gardait les POSITIONS d authentification, personne ne gardait les DROITS. Le controle qui porte la preuve est un croisement : une entree porte_par: role-realm affirme que l habilitation voyage par un role de realm projete depuis un groupe LDAP. P58 le confronte a serveur_keycloak. Sans ca, un service annonce une habilitation que rien ne transporte, et l ecran reste vide sans que personne sache pourquoi. CE QU ELLE N EXIGE PAS, et c est le point le plus important : que les groupes nommes existent dans l annuaire. Ce serait contredire le regime du paragraphe 2 — le depot AMORCE un acces et se retire, les appartenances appartiennent a une personne. dev et personnel n existent dans aucun code, et ce n est pas un defaut. P59 ENUMERATIONS ANNONCEES. Les deux ecarts trouves a la main pendant la tournee — cinq portes annoncees devant une table de six, huit lignes renvoyees vers une fiche qui en compte dix — etaient d une forme que P57 ne voit pas. Ma premiere version a signale CINQ ecarts, et les cinq etaient du bruit : dans « reprise dans les deux devis : », le nombre qualifie autre chose que la liste. Cent pour cent de faux positifs — la preuve qui crie sur un cas sain et qu on apprend a ignorer. Resserree aux deux formes ou le nombre ne peut compter rien d autre. Etroite et vraie plutot que large et devineuse. P60 WIKI PUBLIE. Le wiki est publie DEPUIS le depot ; rien ne mesurait l ecart, et il s est creuse de VINGT-SEPT JOURS en silence. Deux unites jamais publiees, vingt et une differentes : pour qui lit la forge plutot que le depot, toute la revision n existait pas. Le harnais est STATIQUE, zero appel reseau — cloner la forge romprait la seule propriete qui fasse qu une preuve vaille hors de ce poste. La mesure passe donc par un TEMOIN que make wiki-publier depose. Amorce avec la valeur MESUREE : le wiki d eregion porte b6167f2, dont le message dit source: ac85278. Ce qu elle ne prouve pas : un temoin dit ce qui est PARTI, jamais ce qui est ARRIVE. LES TROIS SONT EPROUVEES DANS LES DEUX SENS Douze essais negatifs, douze refus : groupe non projete, acces.yml disparu, personne au lieu d un groupe, mecanisme invente, raison manquante, compte revenu a cinq, septieme porte ajoutee sans toucher au compte, renvoi croise fausse, temoin absent, temoin d un autre depot. Une garantie qu on n a jamais vu dire non n est pas une garantie, c est une habitude. ETAT : NON CONFORME, 58 OK, 1 echec, 1 saute. P60 est rouge, et c est le comportement voulu : le registre a le droit de perdre. Le retard qu elle signale est reel et anterieur a elle. Une commande le ferme, et elle vient ensuite. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
2026-09-08 12:47:18 -04:00
## Preuves
| # | Preuve | Affirmations | Statut | Detail |
|---|---|---|---|---|
| P01 | Lint (ansible-lint) | AFF-006 | ✅ OK |  |
plan : l ecriture des registres devient atomique — tout, ou rien `path.open("w")` TRONQUE avant d ecrire : entre les deux, le fichier est vide. Une exception dans yaml.safe_dump, un disque plein, un Ctrl-C, et instance/plan/serveurs.yml reste mutile. L asymetrie fait la gravite : hosts.yml se regenere d un make instancier-appliquer, le PLAN ne se regenere de rien. C est la source unique de verite. Git est le filet, mais encore faut-il savoir qu on est tombe. TREIZE SITES, UNE SEULE FONCTION Le defaut n etait pas dans le GUI seul : douze sites dans sept fichiers, dont les miroirs CLI des MEMES registres. Corriger le GUI seul aurait recree la divergence que P41 garde depuis les neuf resolutions d instance. La fonction vit donc dans inventory_rules.py, que les sept importaient deja. Une source, pas douze. TROIS DETAILS QUI FONT LA DIFFERENCE ENTRE « CA MARCHE » ET « CA TIENT » temporaire dans le MEME dossier os.replace n est atomique qu au sein d un meme systeme de fichiers ; un /tmp sur une autre partition casserait la garantie sans rien dire fsync AVANT le rename sinon le renommage peut atteindre le disque avant le contenu : au retour d une coupure brutale, un fichier neuf et VIDE — le defaut qu on ferme, deplace d un cran report des droits mkstemp cree en 0600, le plan est en 0664 et doit rester lisible par le groupe sur les runners LE TEST PORTE SON PROPRE CONTROLE NEGATIF scripts/tests/test_ecriture_atomique.py rejoue D ABORD l ancienne forme et verifie qu elle DETRUIT. Sans ce controle, « le fichier est intact » ne prouverait rien — il pourrait l etre parce que rien n a ete ecrit du tout. Une garantie qu on n a jamais vue echouer n est pas une garantie, c est une habitude. Branche sur P02, dont le titre annoncait « inventory_host » alors qu il lance maintenant trois tests. Corrige au passage. LA VOUTE DU GUI : VERIFIEE, PAS DE DEFAUT Le soupcon etait qu executer_flux pose ANSIBLE_VAULT_PASSWORD_FILE (un seul mot de passe) alors que creer une VM ouvre DEUX voutes depuis « une voute, une cle ». Eprouve contre deux voutes JETABLES a mots de passe distincts — jamais les vraies. Les deux variables se CUMULENT : Ansible essaie tous les secrets, et un PASSWORD_FILE errone n empeche rien. Confirme en sondant l environnement qu une recette make recoit reellement : le mot de passe saisi ET les cinq cles calculees par voutes.py. Ce qui sauve ce chemin n est donc pas le mot de passe saisi, c est l IDENTITY_LIST que make pose par-dessus. Chacun couvre ce que l autre ne couvre pas — le PASSWORD_FILE sert le runner qui n a que sa cle, l IDENTITY_LIST le poste qui les a toutes. Ecrit au-dessus du code, pour que personne ne « simplifie » en retirant l un des deux. make prouver : CONFORME, 59 OK, 0 echec, 1 saute. make instancier : DIFF VIDE, quatre registres relus, droits 664 preserves. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
2026-09-08 14:57:57 -04:00
| P02 | Tests unitaires (inventaire, raser, ecriture atomique) | — | ✅ OK | >>> l'ecriture du plan est atomique, eprouvee contre son propre controle. |
preuves : trois gardes pour ce que ma lecture ne tiendra pas Une revision de documentation vieillit comme le reste. Ce qui tient, c est ce qu une machine verifie — et trois lacunes etaient nommees sans etre gardees. P58 HABILITATIONS. autorisation.md posait la regle (un service nomme un GROUPE, jamais une personne, D-66) et meta/acces.yml la portait ; rien ne la verifiait. P29 gardait les POSITIONS d authentification, personne ne gardait les DROITS. Le controle qui porte la preuve est un croisement : une entree porte_par: role-realm affirme que l habilitation voyage par un role de realm projete depuis un groupe LDAP. P58 le confronte a serveur_keycloak. Sans ca, un service annonce une habilitation que rien ne transporte, et l ecran reste vide sans que personne sache pourquoi. CE QU ELLE N EXIGE PAS, et c est le point le plus important : que les groupes nommes existent dans l annuaire. Ce serait contredire le regime du paragraphe 2 — le depot AMORCE un acces et se retire, les appartenances appartiennent a une personne. dev et personnel n existent dans aucun code, et ce n est pas un defaut. P59 ENUMERATIONS ANNONCEES. Les deux ecarts trouves a la main pendant la tournee — cinq portes annoncees devant une table de six, huit lignes renvoyees vers une fiche qui en compte dix — etaient d une forme que P57 ne voit pas. Ma premiere version a signale CINQ ecarts, et les cinq etaient du bruit : dans « reprise dans les deux devis : », le nombre qualifie autre chose que la liste. Cent pour cent de faux positifs — la preuve qui crie sur un cas sain et qu on apprend a ignorer. Resserree aux deux formes ou le nombre ne peut compter rien d autre. Etroite et vraie plutot que large et devineuse. P60 WIKI PUBLIE. Le wiki est publie DEPUIS le depot ; rien ne mesurait l ecart, et il s est creuse de VINGT-SEPT JOURS en silence. Deux unites jamais publiees, vingt et une differentes : pour qui lit la forge plutot que le depot, toute la revision n existait pas. Le harnais est STATIQUE, zero appel reseau — cloner la forge romprait la seule propriete qui fasse qu une preuve vaille hors de ce poste. La mesure passe donc par un TEMOIN que make wiki-publier depose. Amorce avec la valeur MESUREE : le wiki d eregion porte b6167f2, dont le message dit source: ac85278. Ce qu elle ne prouve pas : un temoin dit ce qui est PARTI, jamais ce qui est ARRIVE. LES TROIS SONT EPROUVEES DANS LES DEUX SENS Douze essais negatifs, douze refus : groupe non projete, acces.yml disparu, personne au lieu d un groupe, mecanisme invente, raison manquante, compte revenu a cinq, septieme porte ajoutee sans toucher au compte, renvoi croise fausse, temoin absent, temoin d un autre depot. Une garantie qu on n a jamais vu dire non n est pas une garantie, c est une habitude. ETAT : NON CONFORME, 58 OK, 1 echec, 1 saute. P60 est rouge, et c est le comportement voulu : le registre a le droit de perdre. Le retard qu elle signale est reel et anterieur a elle. Une commande le ferme, et elle vient ensuite. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
2026-09-08 12:47:18 -04:00
| P03 | Diff-vide du plan — TOUTES les instances | AFF-001, AFF-004, AFF-030, AFF-031, AFF-032 | ✅ OK | 4 instance(s) verifiee(s) — OPS-Chezlepro-lab, OPS-Chezlepro, OPS-Technolibre, OPS-Patient0 : plan et inventaire applique coincident. |
| P04 | Groupes <-> playbooks homonymes | AFF-008 | ✅ OK | |
| P05 | Dependances causales de groupes | AFF-009, AFF-084 | ✅ OK | |
| P06 | Validateurs de registres (serveurs/apps/bases/domaines) | AFF-003 | ✅ OK | Registre des domaines valide. |
| P07 | GUI (node --check) | AFF-033 | ✅ OK | JS du GUI : syntaxe valide (node --check). |
| P08 | Orchestration (couches + graphe) | AFF-070 | ✅ OK | Orchestration coherente : 40 groupes classes, aucun cycle, aucune arete en arriere. |
| P09 | Flux reseau (schema + matrice) | AFF-071 | ✅ OK | Flux coherents : 38 rôles, 99 flux, schéma + matrice OK. |
| P10 | Handlers <-> notify | AFF-034, AFF-035 | ✅ OK | Tout notify pointe vers un handler du meme role (49 roles). |
| P11 | Syntaxe des playbooks (--syntax-check) | AFF-083 | ✅ OK | serveur_resolveur_site |
| P12 | Existence des runbooks cites | AFF-010, AFF-011, AFF-012, AFF-083 | ✅ OK | 17/17 runbooks/registres cites presents. |
| P13 | Invariants structurels/doctrinaux | AFF-015, AFF-022, AFF-037, AFF-038, AFF-062 | ✅ OK | LICENSE, socle dossier, pas de couches paralleles, SSH clef-only, nftables off : OK. |
| P14 | Pas de chemin lab/ code en dur | AFF-097 | ✅ OK | Aucun chemin instance/inventories/lab/group_vars code en dur. |
| P15 | Modele public socle valide | AFF-022, AFF-099 | ✅ OK | Modele public socle : domaines/serveurs/applications/bases valides. |
| P16 | Inventaire Ansible complet (--list) | AFF-030 | ⚪ SAUTE | Voute chiffree sans ANSIBLE_VAULT_PASSWORD_FILE (prerequis AFF-026). |
| P17 | Tous les modeles valident (registres + underlay) | AFF-022, AFF-099 | ✅ OK | Les 1 modele(s) decouvert(s) valident. |
| P18 | Gabarit de voute complet | AFF-026 | ✅ OK | Gabarit de voute complet : 23 secret(s) exige(s), tous presents. (Voute reelle non lisible ici : verification sautee.) |
| P19 | Le GUI couvre le schema du plan | AFF-002, AFF-095 | ✅ OK | GUI : les 28 champ(s) des plans reels sont editables (2 plan(s) inspecte(s)), registres toleres : nomenclature. |
| P20 | Adressage 100% derive du seed (aucun stocke) | AFF-001, AFF-003 | ✅ OK | 2 nomenclature(s) : adressage 100% derive du seed index. |
| P21 | Federation : aucun index en collision | AFF-102 | ✅ OK | Federation coherente : 3 instance(s) federee(s), aucun index en collision. |
| P22 | Plan de recette a jour (genere du wiki) | AFF-002 | ✅ OK | Plan de recette à jour (22 sections). |
| P23 | Underlay sans collision avec la plage tenant | AFF-103 | ✅ OK | Underlay conforme : 13 reseau(x), aucune collision avec la plage tenant. |
| P24 | Frontiere nord/sud : acces d'administration declare | AFF-104 | ✅ OK | note : serveur_powerdns declare un port `derive` que le plan du site ne resout pas — aucune regle emise. |
| P25 | Pare-feu Proxmox : est-ouest intra-tenant derive | AFF-107 | ✅ OK | CONFORME : pare-feu Proxmox, 3 tenant(s), 50 groupe(s), 80 regle(s). |
| P26 | Integrations universelles : aucun hote laisse de cote | AFF-108 | ✅ OK | 14 hote(s) x 5 integration(s) universelle(s) : aucune lacune, aucune recopie (0 exemption(s) derivee(s) du service rendu). |
| P27 | Propriete des intrants : hebergeur et tenant separes | AFF-109 | ✅ OK | 8 cle(s) de cluster chez l'hebergeur, aucune recopiee dans les group_vars du tenant. |
| P28 | Pools Proxmox : un par tenant, sans collision | AFF-110 | ✅ OK | CONFORME : 3 pool(s) Proxmox, 34 VM placee(s), aucun nom ni VMID en collision. |
| P29 | Authentification : chaque role declare sa position | AFF-111 | ✅ OK | 32 role(s) serveur declares (interne-sans-auth 2, ldap-direct 2, sans-auth-humaine 21, socle-identite 2, web-sso 5) ; 2 lacune(s) nommee(s) : serveur_loki, serv |
| P30 | SDN EVPN : zones, VNets et sous-reseaux derives | AFF-112 | ✅ OK | CONFORME : SDN EVPN, 3 zone(s), 15 VNet(s), 15 sous-reseau(x), aucune collision. |
| P31 | Documentation : tout ce que le depot FAIT est nomme | — | ✅ OK | 57 scripts expliques et atteignables, 114 cibles make documentees, 65 roles avec README. |
| P32 | Intrants exiges par les roles : tous fournis | — | ✅ OK | CONFORME : 37 exigence(s) de role, toutes satisfaites (131 cle(s) declaree(s) par l'instance). |
| P33 | Aucune collision de port entre roles co-localises | — | ✅ OK | CONFORME : 33 revendication(s) de port, aucune collision entre roles co-localises (37 groupes). |
| P34 | Chaque document declare son lecteur | — | ✅ OK | 43 document(s) declarent leur lecteur (34 genere(s) exempte(s)). |
| P35 | Toute application exigeant une base en a une au plan | — | ✅ OK | 5 application(s) exigeant une base l'ont toutes (4 entree(s) au registre). |
| P36 | Tout detenteur d'etat porte une sauvegarde | — | ✅ OK | 9 hote(s) de l'ecosysteme et 3 du site detiennent de l'etat, tous porteurs de `client_backup` (9 groupe(s) au catalogue). |
| P37 | Le placement du tenant existe chez son hebergeur | — | ✅ OK | placement confronte a l'hebergeur monte (SITE-Chezlepro) : noeud, stockage, pont — tous offerts. |
| P38 | Catalogue des services : la carte dit ce que le moteur fait | — | ✅ OK | Catalogue a jour : 39 role(s) serveur/client tous nommes, 40 groupe(s) cite(s) en table existent tous. |
| P39 | Glossaire : tout mot employe est enseigne | — | ✅ OK | Glossaire complet : 81 terme(s) du jargon expliques, 15 lien(s) valides, 27 page(s) de wiki toutes atteignables. |
| P40 | Parente : l'ecosysteme sait de quoi il descend | — | ✅ OK | Parente coherente : 4 depot(s), tous retrouves, tous porteurs d'un remote. |
| P41 | Resolution d'instance : une seule, partagee | — | ✅ OK | Resolution unique : 53 script(s) passent par `inventory_rules`, 3 exemption(s) nommee(s). |
| P42 | L'edge porte les noms qu'il publie | — | ✅ OK | 4 edge(s) emettent un certificat portant les noms publies (OPS-Chezlepro-lab/principal, OPS-Chezlepro/principal, OPS-Technolibre/principal, OPS-Patient0/product |
| P43 | Frontiere : le devis voit les machines du site | — | ✅ OK | Devis de la frontiere : 7 machine(s) du plan retrouvees, 104 regle(s) du site. |
| P44 | Integrations : le serveur avant ses clients | — | ✅ OK | 4 integration(s) appliquent leur serveur avant leurs clients. |
| P45 | Pare-feu Proxmox : arme sur les VNet SDN, jamais ailleurs | — | ✅ OK | Le pare-feu Proxmox ne s'arme que sur un VNet SDN (4 cas evalues, dont un qui doit rendre VRAI). |
| P46 | Plancher /etc/hosts : un seul role en decide | — | ✅ OK | Un seul maitre du plancher — roles/hosts_statiques/tasks/main.yml : manage_etc_hosts: false ; et le gabarit maitre est pose (roles/hosts_statiques/templates/hos |
| P47 | Zones inverses : couvrir l'occupe, et rien de plus | — | ✅ OK | Les zones inverses couvrent l'occupe et rien de plus (5 cas evalues, dont un site a quatre zones et un tenant a une). |
| P48 | La carte d'orientation designe ce qui existe, et compte juste | — | ✅ OK | La carte designe 87 chemin(s) qui existent, et ses 7 chiffres correspondent a la mesure. |
| P49 | Registre des flux : la matrice d'audit est a jour | — | ✅ OK | Le registre des flux reproduit exactement ce que les `meta/flux.yml` declarent (117 lignes). |
| P50 | Silences : un refus muet est declare, place en dernier, et motive | — | ✅ OK | 2 silence(s) declare(s), tous en sequence > 1 (la plus haute des 169 regles `pass`), tous non consignes et tous motives. |
| P51 | Collections : toutes declarees, toutes epinglees | — | ✅ OK | 3 collection(s) et 2 bibliotheque(s) Python declarees et epinglees : ansible.posix==1.6.2, community.general==10.3.0, community.postgresql==3.10.2 |
| P52 | Materialiser n'exige pas d'entrer dans le tenant | — | ✅ OK | `creer-vm` confirme par l'agent invite (API des hyperviseurs, deja utilisee pour creer), sans exiger d'entrer dans le tenant. |
| P53 | L'interne refuse a voix haute, la bordure se tait | — | ✅ OK | L'interne parle, la bordure se tait — 15 ruleset(s) nftables refusent a voix haute ; pare-feu est-ouest en REJECT, source unique ; frontiere muette (actions : b |
| P54 | L'insemination ne reclame aucun secret du tenant | — | ✅ OK | 2 couche(s) d'insemination (serveur_debian, serveur_ops), 10 role(s) applique(s), aucun secret de tenant reclame. |
| P55 | La cle du SITE ne nait que sur le runner d'un tenant | — | ✅ OK | 14 hote(s) : la cle du SITE ne nait que sur 1 runner(s) de tenant, celle du tenant sur 14. |
| P56 | Gabarit minimal, et rien de retire n'est perdu | — | ✅ OK | Gabarit minimal : 4 role(s), tous indispensables au premier demarrage ; 14 role(s) retire(s), tous repris par le socle ou le durcissement. |
| P57 | Comptes en prose : les chiffres du depot sur lui-meme | — | ✅ OK | Les comptes ecrits en prose correspondent a la mesure (60 preuves, 65 roles, 40 groupes). |
| P58 | Habilitations : chaque service dit a quel GROUPE, et par quoi | — | ✅ OK | 8 habilitation(s) declarees, toutes nommant un groupe, un mecanisme connu et une raison ; les `role-realm` sont projetees. |
| P59 | Enumerations annoncees : le nombre correspond a ce qui suit | — | ✅ OK | 2 enumeration(s) annoncee(s) correspondent a ce qu'elles annoncent (formes non ambigues seulement). |
positionnement : le gel tient, c est la carte des seuils qui etait fausse La question « et si on retirait le gel du perimetre ? » a mis les cinq seuils a l epreuve. Deux ne tenaient pas — et les garder etait plus dangereux que le gel lui-meme : une carte des seuils fausse ne fait pas perdre du temps, elle fait FRANCHIR UN SEUIL QUI NE L EST PAS. RBAC — couvert, et par un mecanisme plus fort Trois classes d acteurs aux pouvoirs disjoints existent depuis les runners : le poste de l exploitant, le runner de SITE (materialiser, n entre jamais chez un tenant) et les runners de TENANT (configurer). La separation est CRYPTOGRAPHIQUE — une voute, une cle, 2026-08-28 — pas applicative : c est la presence des fichiers qui borne le pouvoir, jamais une table de permissions qu une faille de l application contournerait. Adopter AWX pour ce besoin serait REGRESSER. Le tableau avait ete ecrit avant que les runners existent. IPAM — sans objet par construction Un IPAM sert a ALLOUER. Ici rien ne s alloue : tout derive du seed. Et cinq preuves tiennent deja ce qu il verifierait — P20 (aucun adressage stocke), P21 (collisions d index), P23 (chevauchement d underlay), P28 (pools), P33 (ports). L adopter remplacerait une propriete PAR CONSTRUCTION par un controle a posteriori. LE SEUIL QUI MANQUAIT : L EMANCIPATION Le GUI ecoute sur 127.0.0.1 avec un jeton de session — un modele mono-utilisateur, juste tant que l exploitant est une personne a son poste. La trajectoire de filiation-emancipation.md mene a plusieurs HUMAINS, aux portees disjointes, sur des machines qui ne sont pas les notres. Ce seuil n appelle pas AWX : les runners portent deja la separation des pouvoirs. Il appelle une decision sur la facon dont le GUI s ouvre a quelqu un d autre, et elle n est pas prise. Un seuil qu on ne nomme pas est un seuil qu on franchit sans le voir. CE QUE LE GEL N INTERDIT PAS Il porte sur les FONCTIONS de type NetBox/AWX, jamais sur les VUES. Montrer a l ecran ce que le moteur sait deja — l ecart des dix devis, l etat du diff entre Sauvegarder et Appliquer, le perimetre sur lequel un check vert a porte, les temoins du genome et lequel a decroche — ne franchit aucun seuil : rien de tout cela n existe dans NetBox ou AWX, parce que rien de tout cela n existe hors de ce modele. Le gel n est pas leve. D-84 le consigne, AGENTS.md suit. make prouver : CONFORME, 59 OK, 0 echec, 1 saute. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
2026-09-08 14:02:08 -04:00
| P60 | Wiki publie : la forge sert ce que le depot dit | AFF-002 | ✅ OK | Le wiki publie correspond au depot : `wiki/` n'a pas bouge depuis `e2935ed` (publie le 2026-09-08). |
preuves : trois gardes pour ce que ma lecture ne tiendra pas Une revision de documentation vieillit comme le reste. Ce qui tient, c est ce qu une machine verifie — et trois lacunes etaient nommees sans etre gardees. P58 HABILITATIONS. autorisation.md posait la regle (un service nomme un GROUPE, jamais une personne, D-66) et meta/acces.yml la portait ; rien ne la verifiait. P29 gardait les POSITIONS d authentification, personne ne gardait les DROITS. Le controle qui porte la preuve est un croisement : une entree porte_par: role-realm affirme que l habilitation voyage par un role de realm projete depuis un groupe LDAP. P58 le confronte a serveur_keycloak. Sans ca, un service annonce une habilitation que rien ne transporte, et l ecran reste vide sans que personne sache pourquoi. CE QU ELLE N EXIGE PAS, et c est le point le plus important : que les groupes nommes existent dans l annuaire. Ce serait contredire le regime du paragraphe 2 — le depot AMORCE un acces et se retire, les appartenances appartiennent a une personne. dev et personnel n existent dans aucun code, et ce n est pas un defaut. P59 ENUMERATIONS ANNONCEES. Les deux ecarts trouves a la main pendant la tournee — cinq portes annoncees devant une table de six, huit lignes renvoyees vers une fiche qui en compte dix — etaient d une forme que P57 ne voit pas. Ma premiere version a signale CINQ ecarts, et les cinq etaient du bruit : dans « reprise dans les deux devis : », le nombre qualifie autre chose que la liste. Cent pour cent de faux positifs — la preuve qui crie sur un cas sain et qu on apprend a ignorer. Resserree aux deux formes ou le nombre ne peut compter rien d autre. Etroite et vraie plutot que large et devineuse. P60 WIKI PUBLIE. Le wiki est publie DEPUIS le depot ; rien ne mesurait l ecart, et il s est creuse de VINGT-SEPT JOURS en silence. Deux unites jamais publiees, vingt et une differentes : pour qui lit la forge plutot que le depot, toute la revision n existait pas. Le harnais est STATIQUE, zero appel reseau — cloner la forge romprait la seule propriete qui fasse qu une preuve vaille hors de ce poste. La mesure passe donc par un TEMOIN que make wiki-publier depose. Amorce avec la valeur MESUREE : le wiki d eregion porte b6167f2, dont le message dit source: ac85278. Ce qu elle ne prouve pas : un temoin dit ce qui est PARTI, jamais ce qui est ARRIVE. LES TROIS SONT EPROUVEES DANS LES DEUX SENS Douze essais negatifs, douze refus : groupe non projete, acces.yml disparu, personne au lieu d un groupe, mecanisme invente, raison manquante, compte revenu a cinq, septieme porte ajoutee sans toucher au compte, renvoi croise fausse, temoin absent, temoin d un autre depot. Une garantie qu on n a jamais vu dire non n est pas une garantie, c est une habitude. ETAT : NON CONFORME, 58 OK, 1 echec, 1 saute. P60 est rouge, et c est le comportement voulu : le registre a le droit de perdre. Le retard qu elle signale est reel et anterieur a elle. Une commande le ferme, et elle vient ensuite. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
2026-09-08 12:47:18 -04:00
## Couverture des affirmations ✅ du registre
Chaque affirmation ✅ automatisable est couverte par la preuve indiquee ci-dessus.
Les ✅ **structurelles/doctrinales** non rejouables par une commande (ex. AFF-005
`make`=aide, AFF-014 ciblage groupe, AFF-024 `instancier-appliquer`, AFF-051 autorite
d'AGENTS.md, AFF-073/075 gardes `make`, AFF-090 wiki) ont ete verifiees a l'audit ;
elles restent hors du harnais recurrent (rien d'executable a rejouer).
## Declarations d'intention (⚪ invérifiables localement — assumees)
Ces affirmations ne sont pas rejouables hors production ; elles sont **assumees**
comme declarations d'intention, non comme preuves :
- **AFF-036** — « testables avec `--check` autant que possible » : verifiable seulement
contre une flotte vivante.
- **AFF-091** — contenu pedagogique du wiki : affirmations conceptuelles.
- **AFF-096** — « GUI 100 % francais » : revue exhaustive des libelles rendus, non automatisee.
- **AFF-007** — hote d'exemple `web-frontal-01` : placeholder assume.
_Rapport genere le 2026-09-08._