[DTP-Worker] Sprint 8 · buffer L75 · Domaine QA/Audit 5D : la synthèse de l'audit de conformité (« 17 contrôles · 5 dimensions ») était transcrite À LA MAIN dans DEUX docs (README du module qa/audit_5d + cellule de la fiche agent qa, même couple du même catalogue de contrôles) sans AUCUN gate, et la ventilation du verdict (« 13 PASS · 0 FAIL · 4 à confirmer ») du seul README non plus — ajouter un contrôle/une dimension au catalogue OU faire basculer un contrôle en A_CONFIRMER ferait dériver les docs en silence pendant que les DEUX artefacts byte-gatés par check_artifacts (qa/audit_5d/out/MANIFEST.json = controls_total+dimensions · out/audit_report.json = totals.{pass,fail,a_confirmer}, recomptés du catalogue à chaque build) disent autre chose → nouveau bloc dans check_readme_claims recomputant le couple (contrôles+dimensions) depuis MANIFEST et la ventilation (pass/fail/à-confirmer) depuis audit_report.totals, exigeant l'égalité avec les deux docs + cohérence croisée controls_total==totals.controls (4 morsures vérifiées : dérive contrôles README · bascule 13→12/4→5 captée là où le total de contrôles reste 17 et resterait aveugle · dérive dimensions fiche agent · claim verdict disparu = red)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-07-31 11:06:21 +00:00
parent 8f27b65724
commit 9ac7bdb2de
3 changed files with 146 additions and 1 deletions
+51
View File
@@ -1297,3 +1297,54 @@ verrouillés) · `guard_constraints`.
**Hors périmètre worker (VPS · #8)** : néant (gate bash/python3 stdlib en-repo).
**Auto-score 4Big** : 96/100.
---
## Sprint 8 · buffer L75 · Gate chiffres audit 5D (contrôles/dimensions ×2 docs + ventilation verdict)
**Contexte** : poursuite de la fermeture des surfaces de « vert trompeur » non
gatées dans `check_readme_claims.sh`. Après RBAC, SEO, CRM pipeline, Mobile et
Legal CONFOTUR, restait la **synthèse de l'audit de conformité 5D** (livrable
`qa/audit_5d`), transcrite À LA MAIN dans DEUX docs sans aucun gate.
**Dérive silencieuse fermée** :
- Le README du module (`05_deliverables_mvp/qa/audit_5d/README.md`) ouvre par
« **17 contrôles** répartis en **5 dimensions (5D)** » ET affiche la ventilation
du verdict « **13 PASS · 0 FAIL · 4 à confirmer** ».
- La fiche agent QA (`03_agents/qa/AGENT.md`) recopie le même couple « 17 contrôles
/ 5 dimensions ».
- Les DEUX artefacts source sont byte-gatés par `check_artifacts` (recomptés du
catalogue de contrôles à chaque build) : `out/MANIFEST.json` (`controls_total`,
`dimensions`) ET `out/audit_report.json` (`totals.{pass,fail,a_confirmer}`).
- Aucun gate ne comparait la VALEUR écrite à l'artefact : ajouter un contrôle/une
dimension au catalogue, ou faire **basculer** un contrôle en A_CONFIRMER, ferait
dériver les deux docs (et la ligne verdict) en silence.
**Nouveau bloc dans `ci/check_readme_claims.sh`** : recompute le couple
(contrôles + dimensions) depuis le MANIFEST et la ventilation (pass/fail/à-confirmer)
depuis `audit_report.totals` — **jamais** figés en dur ici, zéro duplication du
compteur du générateur (#6) — et exige l'égalité avec les deux docs. La ventilation
est recomputée SÉPARÉMENT car une bascule (pass 13→12, à confirmer 4→5) est **aveugle**
au seul total de contrôles (reste 17). Cohérence croisée en bonus :
`MANIFEST.controls_total == audit_report.totals.controls`.
### Preuve (4 morsures vérifiées + restauration verte)
| Injection | Résultat |
|---|---|
| README contrôles 17→18 | ✗ dit 18/5 MAIS artefact 17/5 · exit 1 |
| README verdict 13 PASS→12 / 4→5 à confirmer (bascule aveugle au total) | ✗ dit 12/0/5 MAIS totals 13/0/4 · exit 1 |
| fiche QA dimensions 5→6 | ✗ dit 17/6 MAIS artefact 17/5 · exit 1 |
| claim README verdict supprimé (reformulé) | ✗ ventilation verdict INTROUVABLE · exit 1 |
| restauré | ✓ 17/5 + 13/0/4 == artefacts · exit 0 |
- **`ci/README.md`** — surface ajoutée à la table récap du pipeline + paragraphe
descriptif (classe « audit 5D »).
Suite CI complète re-verte : `check_artifacts` · `check_readme_claims` ·
`check_docs` · `check_regression` · `check_ci_integrity` (gates statiques
verrouillés) · `guard_constraints` · `validate_json`.
**Hors périmètre worker (VPS · #8)** : néant (gate bash/python3 stdlib en-repo).
**Auto-score 4Big** : 96/100.