[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:
@@ -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.
|
||||
|
||||
@@ -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=$?
|
||||
|
||||
Reference in New Issue
Block a user