From 9e4101723bb30547fcb97813e5eab264511cc3e7 Mon Sep 17 00:00:00 2001 From: Daniel Allaire Date: Tue, 11 Aug 2026 00:52:21 -0400 Subject: [PATCH] preuve : P31 ignorait les scripts invoques par un role ou un playbook MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit En ajoutant la verification de signature, P31 a declare `verifier_signature.py` « injoignable » — alors qu'il tourne a chaque deploiement de Keycloak. Elle ne regardait que le Makefile et les autres scripts, jamais les roles ni les playbooks. Une preuve qui ignore un chemin d'appel reel accuse du code sain, et on apprend a passer outre : le pire sort possible pour une garde. ET J'AI POUSSE AVEC CETTE PREUVE EN ECHEC. Troisieme fois de la session, et toujours la meme faute : `prouver.py | tail -1` rend le code de sortie de `tail`, donc le `&&` qui suit continue quoi qu'il arrive. Le commit precedent (verification de signature Keycloak) est parti avec 34 OK / 1 echec. Corrige ici, et la lecon vaut plus que le correctif : ne jamais lire le verdict d'une garde a travers un tube. Verifie : prouver.py 35 OK, code de sortie lu SANS tube. Co-Authored-By: Claude Opus 5 --- scripts/prouver.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/scripts/prouver.py b/scripts/prouver.py index d662dad..6422e00 100644 --- a/scripts/prouver.py +++ b/scripts/prouver.py @@ -581,6 +581,18 @@ def preuve_documentation_outillage() -> tuple[bool, str]: manques.append(f"{len(muets)} script(s) sans docstring explicative : " + ", ".join(muets[:6]) + ("…" if len(muets) > 6 else "")) + # Un script peut aussi etre invoque par un ROLE ou un PLAYBOOK — `serveur_keycloak` + # appelle `verifier_signature.py` pour controler la signature de son archive. Ne + # regarder que le Makefile et les autres scripts declarait ce script « injoignable » + # alors qu'il tourne a chaque deploiement. Trouve le 2026-08-10, en ajoutant + # justement cette verification : une preuve qui ignore un chemin d'appel reel accuse + # du code sain, et on apprend a passer outre — le pire sort pour une garde. + ansible_yaml = "\n".join( + f.read_text(encoding="utf-8", errors="ignore") + for dossier in ("roles", "playbooks") + for f in (RACINE / dossier).rglob("*.yml") + ) + injoignables = [] for f in scripts: autres = "\n".join(v for k, v in textes.items() if k != f.name) @@ -589,6 +601,8 @@ def preuve_documentation_outillage() -> tuple[bool, str]: continue if module in autres: # importe ou appele par un autre outil continue + if f.name in ansible_yaml: # invoque par un role ou un playbook + continue injoignables.append(f.name) if injoignables: manques.append(f"{len(injoignables)} script(s) qu'aucune cible ni aucun outil "