make verifier inclut les preuves (make prouver --verifier) #3

Merged
danallaire merged 1 commit from prouver-dans-verifier into main 2026-07-20 21:04:09 -04:00
4 changed files with 32 additions and 9 deletions

View file

@ -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-<date>.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

View file

@ -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-<date>.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

View file

@ -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-<date>.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.)

View file

@ -15,6 +15,7 @@ requise absente — ne sont pas des echecs) ; 1 sinon.
Usage :
python3 scripts/prouver.py # execute + ecrit docs/audit/preuve-<date>.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:]))