[DTP-Worker 20260805_194334] GATE NEUF classe fiche-enumeration-completeness : le tableau des gates statiques de la fiche QA se déclare « l'état courant » de git ls-files 'ci/*.sh' mais OMETTAIT le 8ᵉ gate check_mobile_workflow.sh (livré le jour même, cité NULLE PART dans la fiche · grep=0) — check_ci_integrity verrouille le CÂBLAGE CI (ci/*.sh↔gate.needs) mais ignore la fiche, check_readme_claims ne recomputait aucune énumération de gates → surface ungatée. Fix 2 volets : (1) ajout de la ligne manquante (rôle fidèle à l'en-tête du gate, placée après check_ci_integrity) ; (2) extension de check_readme_claims.sh (bloc Python avant sys.exit, réutilise subprocess/bad/good, 0 nouveau gate #5) re-dérivant l'ensemble de git ls-files 'ci/*.sh' (hors lib.sh, #6) et exigeant que chaque basename soit cité (backtické) dans la fiche ; un gate absent échoue. Teeth mutation-prouvés 2 axes : MUT1 retrait de la ligne → RED nommant check_mobile_workflow ; MUT2 ajout d'un 9ᵉ ci/*.sh factice (index seul) → RED (forward-protection : le prochain gate ne pourra être omis) puis --cached retiré, arbre byte-restauré (JAMAIS git clean). Doc ci/README §2 sous check_readme_claims. 0 prod, 0 artefact rebuild (aucun out/ ni doc scoré audit_4big), 0 chiffre saisi (#6, le « 8 » recompté de git ls-files), 0 VPS (#8). run_ci 33 PASS·0 FAIL·0 SKIP.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-08-05 19:51:00 +00:00
parent c14305c170
commit afa61657cb
4 changed files with 100 additions and 0 deletions
+15
View File
@@ -1634,6 +1634,21 @@ contrat » (réservation retiré) · motif du défaut ne cite plus « Cardnet »
vert (exit 0) · working tree **byte-restauré** (`git checkout --`, **JAMAIS** `git clean`) ·
**7 gates re-verts**.
**COMPLÉTUDE de l'énumération des gates statiques dans la fiche QA.** La fiche
`03_agents/qa/AGENT.md` (§« Deuxième étage QA ») énumère les gates `ci/*.sh` en se
**déclarant explicitement** « l'état courant » de `git ls-files 'ci/*.sh'` (« pas une
constante »). Or **rien** ne vérifiait que CHAQUE gate statique y figure vraiment : le 8ᵉ
gate `check_mobile_workflow.sh` (livré le 2026-08-05) a pu rester **omis un jour entier EN
SILENCE** — la fiche promettait la complétude sans la tenir. On **re-dérive** l'ensemble
depuis `git ls-files 'ci/*.sh'` (hors `lib.sh`, #6 — jamais une liste à la main) et on
exige que chaque basename apparaisse (backtické) dans la fiche ; un gate **absent** échoue.
Distinct de `check_ci_integrity` qui verrouille le **câblage CI** (chaque `ci/*.sh` ↔ un
job `gate.needs`) mais **ignore la fiche** ; cette surface ferme le miroir *documentaire* du
même ensemble. **2 morsures vérifiées** : retrait de la ligne `check_mobile_workflow.sh` de
la fiche → mismatch (gate réel non cité) · ajout d'un 9ᵉ `ci/*.sh` tracké non encore
documenté → mismatch (**forward-protection** : le prochain gate ne pourra pas être omis) ;
restauré = vert.
Un claim **absent** échoue aussi (la dérive de formulation qui ferait
disparaître un chiffre est elle-même une régression de traçabilité). stdlib pur
(bash/git/python3), zéro réseau.
+29
View File
@@ -9163,6 +9163,35 @@ if _rm_lines is not None:
good(f"Traçabilité roadmap · {len(_rm_seen)} citation(s) ancrée(s), "
f"4 modules attendus présents")
# ── Complétude de l'énumération des gates statiques dans la fiche QA ─────────
# La fiche 03_agents/qa/AGENT.md §« Deuxième étage QA » énumère les gates
# `ci/*.sh` en se DÉCLARANT « l'état courant » de `git ls-files 'ci/*.sh'` (pas
# une constante). Or rien ne vérifiait que CHAQUE gate statique y figure : le 8ᵉ
# gate `check_mobile_workflow.sh` a pu être omis un jour entier EN SILENCE. On
# re-dérive l'ensemble depuis git (#6 — jamais une liste à la main) et on exige
# que chaque basename apparaisse dans la fiche ; un gate absent échoue.
_QA_FICHE = "03_agents/qa/AGENT.md"
_gate_names = sorted(
f.rsplit("/", 1)[-1]
for f in subprocess.run(["git", "ls-files", "ci/*.sh"],
capture_output=True, text=True).stdout.split()
if f.rsplit("/", 1)[-1] != "lib.sh")
try:
_qa = open(_QA_FICHE, encoding="utf-8").read()
except OSError as e:
bad(f"Énumération gates statiques · {_QA_FICHE} illisible : {e}")
_qa = None
if _qa is not None:
_missing = [n for n in _gate_names if f"`{n}`" not in _qa]
if _missing:
bad(f"Énumération gates statiques · {_QA_FICHE} n'énumère PAS {_missing} "
f"— la fiche se déclare « l'état courant » de git ls-files 'ci/*.sh' "
f"({len(_gate_names)} gates réels hors lib.sh) → ajouter la/les "
f"ligne(s) manquante(s)")
else:
good(f"Énumération gates statiques · les {len(_gate_names)} gates ci/*.sh "
f"(hors lib.sh) sont tous cités dans {_QA_FICHE}")
sys.exit(1 if FAIL else 0)
PY
rc=$?