Set-OPS-Public/docs/audit/preuve-2026-08-20.md
Daniel Allaire a68b9cd10e
Some checks are pending
verifier / verifier (push) Waiting to run
CI : le harnais ne se declenchait que par memoire
Trente-huit preuves, des tests, un lint — et RIEN ne les executait sans qu'un humain tape
`make`. Le meilleur atout du depot dependait de ne pas oublier. Il a desormais une CI
(.forgejo/workflows/verifier.yml) et une cible qui la rejoue a l'identique : `make ci`.

CE QUE LA CI A TROUVE AVANT D'EXISTER. Ecrire le workflow supposait de repondre a une
question jamais posee : est-ce qu'un depot PUBLIC, seul, se tient ? Mesure sur un clone
nu : non, a cinq endroits.

- `make instancier` echouait sur le modele public — le tout premier geste du QUICKSTART.
  Le Makefile forcait `principal/hosts.yml` alors que le modele vit en `production/` ; sa
  precedence suit desormais celle du code (fichier, puis REPERTOIRE existant, puis defaut).
- P32 parcourait les 54 roles sans regarder ce que l'instance deploie. Elle passait sur
  l'ecosysteme de reference PARCE QU'IL PORTE TOUT. Or les modeles sont des OFFRES : toute
  offre plus petite que l'ecosysteme complet echouait son propre harnais, pour des services
  qu'elle ne vend pas. Le perimetre se lit maintenant du plan (groupes de l'inventaire,
  puis roles composes par leur playbook).
- P24 : le modele public ne declarait aucun reseau d'administration — une flotte qu'on
  construit et ou l'on n'entre plus. `nftables_admin_ssh` est pose, avec le pourquoi.
- P33 : verifier_ports.py codait `instance/inventories/principal/hosts.yml` en dur.
- P32 et P24 lisaient le symlink `instance/` au lieu de SETOPS_INSTANCE.

Toutes de la MEME FAMILLE que P03 avant-hier : une resolution d'inventaire recopiee, une
variable d'environnement qui deborde de sa portee. Le depot en compte SEPT ; deux de plus
sont corrigees ici, et la septieme le dit en commentaire plutot que de le taire.

`make ci` NE TOUCHE AUCUN SYMLINK : le modele public est monte comme instance jetable,
vise par SETOPS_INSTANCE/SETOPS_UNDERLAY, detruit en sortant. Deux details mesures parce
que devines faux d'abord : l'instance jetable est un DOSSIER FRERE (la federation se
decouvre ainsi ; ailleurs, quatre preuves tombent) ; et SETOPS_UNDERLAY n'est pose QUE
pour la verification, sinon l'inventaire est ecrit avec une fabric et regenere avec une
autre — la commande fabriquait l'ecart qu'elle denonce.

RESULTAT : clone nu sans instance ni frere -> 38 OK, 0 echec, 0 saute. Depot de
l'exploitant avec ses 3 instances -> 38 OK, 0 echec, 0 saute. Aucun residu.

Et le lint du depot a refuse mon propre fichier de CI avant qu'il ne tourne une seule fois
(`on:` lu par YAML comme le booleen vrai). Le harnais mordait deja.

A AJUSTER AU PREMIER PASSAGE, ecrit en tete du workflow : l'etiquette `runs-on` doit
correspondre a un runner Forgejo enregistre, et le runner a besoin du reseau pour pip et
ansible-galaxy. Le vert de cette CI dira que le moteur et son modele public se tiennent —
pas que la flotte va bien : aucune VM jointe, aucune voute.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 19:29:46 -04:00

7.1 KiB
Raw Blame History

Preuve de conformite — Set-OPS — 2026-08-20

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, et le registre trace : docs/audit/affirmations.md.

  • Instance : instance — inventaire instance/inventories/principal/hosts.yml
  • Verdict : ✅ CONFORME (38 OK · 0 echec · 0 saute)

Preuves

# Preuve Affirmations Statut Detail
P01 Lint (ansible-lint) AFF-006 ✅ OK 
P02 Tests unitaires (inventory_host) — ✅ OK >>> le verrou tient : aucune VM n'aurait ete touchee
P03 Diff-vide du plan — TOUTES les instances AFF-001, AFF-004, AFF-030, AFF-031, AFF-032 ✅ OK 3 instance(s) verifiee(s) — OPS-Chezlepro-lab, OPS-Chezlepro, OPS-Technolibre : 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 : 30 groupes classes, aucun cycle, aucune arete en arriere.
P09 Flux reseau (schema + matrice) AFF-071 ✅ OK Flux coherents : 29 rôles, 77 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 playbook: playbooks/proxmox/cloner_vm_debian.yml
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 ✅ OK 14 hotes, 31 groupes (inventaire dechiffre et parse).
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 : 26 secret(s) exige(s), tous presents. Voute reelle : 29 cle(s), aucun manque.
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 : 2 instance(s) federee(s), aucun index en collision.
P22 Plan de recette a jour (genere du wiki) AFF-002 ✅ OK Plan de recette à jour (20 sections).
P23 Underlay sans collision avec la plage tenant AFF-103 ✅ OK Underlay conforme : 6 reseau(x), aucune collision avec la plage tenant.
P24 Frontiere nord/sud : acces d'administration declare AFF-104 ✅ OK CONFORME : frontiere nord/sud, 35 regles, 12 routes, admin=10.0.0.0/24,10.17.0.0/24,192.168.254.2/32,192.168.255.2/32.
P25 Pare-feu Proxmox : est-ouest intra-tenant derive AFF-107 ✅ OK CONFORME : pare-feu Proxmox, 2 tenant(s), 42 groupe(s), 68 regle(s).
P26 Integrations universelles : aucun hote laisse de cote AFF-108 ✅ OK 14 hote(s) x 4 integration(s) universelle(s) : aucune lacune, aucune recopie (1 exemption(s) derivee(s) du service rendu).
P27 Propriete des intrants : hebergeur et tenant separes AFF-109 ✅ OK 0 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 : 2 pool(s) Proxmox, 28 VM placee(s), aucun nom ni VMID en collision.
P29 Authentification : chaque role declare sa position AFF-111 ✅ OK 23 role(s) serveur declares (interne-sans-auth 2, ldap-direct 2, sans-auth-humaine 12, 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, 2 zone(s), 12 VNet(s), 12 sous-reseau(x), aucune collision.
P31 Documentation : tout ce que le depot FAIT est nomme — ✅ OK 45 scripts expliques et atteignables, 94 cibles make documentees, 54 roles avec README.
P32 Intrants exiges par les roles : tous fournis — ✅ OK CONFORME : 34 exigence(s) de role, toutes satisfaites (126 cle(s) declaree(s) par l'instance).
P33 Aucune collision de port entre roles co-localises — ✅ OK CONFORME : 32 revendication(s) de port, aucune collision entre roles co-localises (33 groupes).
P34 Chaque document declare son lecteur — ✅ OK 40 document(s) declarent leur lecteur (20 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) 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 (OPS-Chezlepro) : noeud, stockage, pont — tous offerts.
P38 Catalogue des services : la carte dit ce que le moteur fait — ✅ OK Catalogue a jour : 29 role(s) serveur/client tous nommes, 30 groupe(s) cite(s) en table existent tous.

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-08-20.