From 5a53332f961a40c48feab2da3818104abc38a64e Mon Sep 17 00:00:00 2001 From: Daniel Allaire Date: Mon, 20 Jul 2026 21:03:20 -0400 Subject: [PATCH] make verifier inclut les preuves (make prouver --verifier) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - prouver.py : nouveau mode --verifier — exécute toutes les preuves du registre (verdict + code de sortie) sans écrire de rapport, pour ne pas écraser la pièce justificative committée docs/audit/preuve-.md. - Makefile : make verifier se termine par `python3 scripts/prouver.py --verifier` → verifier échoue si une preuve échoue. make prouver seul écrit toujours le rapport. - docs/audit/README.md : section « Rapport avec make verifier » mise à jour. Vérifié : make verifier → CONFORME 16/16 (voûte), aucun churn du rapport ; make prouver écrit toujours ; ansible-lint 0 failure. Co-Authored-By: Claude Opus 4.8 --- CHANGELOG.md | 8 ++++++++ Makefile | 2 ++ docs/audit/README.md | 14 ++++++++++---- scripts/prouver.py | 17 ++++++++++++----- 4 files changed, 32 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0613122..8dd5a10 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,14 @@ ## 2026-07-20 ### Modifié +- **`make verifier` inclut désormais les preuves (`make prouver`).** `make verifier` se + termine par `python3 scripts/prouver.py --verifier` : nouveau mode qui exécute toutes les + preuves du registre (verdict + code de sortie) **sans écrire de rapport**, pour ne pas + écraser la pièce justificative committée `docs/audit/preuve-.md`. `make verifier` + échoue donc si une preuve échoue. `make prouver` seul (sans `--verifier`) continue d'écrire + le rapport horodaté. Vérifié : `make verifier` → CONFORME 16/16 (voûte exportée), aucun + churn du rapport committé ; `make prouver` écrit toujours. Doc mise à jour + (`docs/audit/README.md` § « Rapport avec `make verifier` »). - **Conformité Phase 2 — 3 incohérences internes corrigées (documentation d'autorité).** Aucun code Ansible touché ; le code SSH était déjà conforme à `AGENTS.md`. - **`CLAUDE.md` réduit à un pointeur mince** : autorité unique d'`AGENTS.md` + les cinq diff --git a/Makefile b/Makefile index bd5a0ad..74c3f85 100644 --- a/Makefile +++ b/Makefile @@ -212,9 +212,11 @@ test: .PHONY: verifier verifier: lint test inventaire-verifier site-verifier flux-verifier syntaxe + python3 scripts/prouver.py --verifier # Harnais de preuve : rejoue les preuves automatisables du registre et ecrit # docs/audit/preuve-.md (piece justificative horodatee, rejouable). +# `make verifier` l'appelle en mode --verifier (preuves seules, aucun rapport ecrit). .PHONY: prouver prouver: ansible-runtime _instance-requise python3 scripts/prouver.py diff --git a/docs/audit/README.md b/docs/audit/README.md index c32c6f8..d3309f5 100644 --- a/docs/audit/README.md +++ b/docs/audit/README.md @@ -69,7 +69,13 @@ et liste à part les **déclarations d'intention** (⚪ invérifiables localemen ## Rapport avec `make verifier` -`make verifier` est la **porte de validation** au fil de l'eau (lint, tests, cohérence, -syntaxe) et s'arrête au premier échec. `make prouver` est complémentaire : il **exécute -tout** (sans s'arrêter au premier échec), **horodate** et **relie** chaque résultat aux -affirmations — pour produire une pièce présentable. Les deux réutilisent le même outillage. +`make verifier` **inclut désormais les preuves** : il enchaîne ses vérifications au fil de +l'eau (lint, tests, cohérence, syntaxe — arrêt au premier échec) puis termine par +`python3 scripts/prouver.py --verifier` — les preuves du registre **sans écrire de rapport** +(pour ne pas écraser la pièce justificative committée). Ainsi, `make verifier` échoue si une +preuve échoue. + +`make prouver` (sans `--verifier`) reste le mode **pièce justificative** : il exécute tout, +**horodate** et **écrit** `docs/audit/preuve-.md`. Les deux réutilisent le même +outillage. (Quelques vérifications se recouvrent entre les deux étapes — coût assumé : la +sortie détaillée de `verifier` est conservée, et `prouver` ajoute les preuves manquantes.) diff --git a/scripts/prouver.py b/scripts/prouver.py index 2b82874..d429fac 100644 --- a/scripts/prouver.py +++ b/scripts/prouver.py @@ -15,6 +15,7 @@ requise absente — ne sont pas des echecs) ; 1 sinon. Usage : python3 scripts/prouver.py # execute + ecrit docs/audit/preuve-.md + python3 scripts/prouver.py --verifier # preuves seules (verdict + code sortie), sans rapport """ from __future__ import annotations @@ -275,7 +276,11 @@ def _executer(preuve: dict) -> tuple[str, str]: return "OK", dernier -def main() -> int: +def main(argv: list[str] | None = None) -> int: + argv = sys.argv[1:] if argv is None else argv + # --verifier : execute les preuves (verdict + code de sortie) sans ecrire de rapport, + # pour un appel depuis `make verifier` (evite d'ecraser la piece justificative committee). + ecrire_rapport = "--verifier" not in argv date = _dt.date.today().isoformat() resultats: list[tuple[dict, str, str]] = [] @@ -300,6 +305,11 @@ def main() -> int: n_echec = sum(1 for _, s, _ in resultats if s == "ECHEC") n_saute = sum(1 for _, s, _ in resultats if s == "SAUTE") conforme = n_echec == 0 + print(f"{'CONFORME' if conforme else 'NON CONFORME'} : " + f"{n_ok} OK, {n_echec} echec, {n_saute} saute.") + if not ecrire_rapport: + return 0 if conforme else 1 + icone = {"OK": "✅", "ECHEC": "❌", "SAUTE": "⚪"} lignes = [ @@ -353,12 +363,9 @@ def main() -> int: DOSSIER_AUDIT.mkdir(parents=True, exist_ok=True) rapport = DOSSIER_AUDIT / f"preuve-{date}.md" rapport.write_text("\n".join(lignes), encoding="utf-8") - - print(f"{'CONFORME' if conforme else 'NON CONFORME'} : " - f"{n_ok} OK, {n_echec} echec, {n_saute} saute.") print(f"Rapport : {rapport.relative_to(RACINE)}") return 0 if conforme else 1 if __name__ == "__main__": - raise SystemExit(main()) + raise SystemExit(main(sys.argv[1:])) -- 2.39.5