[DTP-Worker] Sprint 8 · buffer L75 · Gate intégrité chiffres : étendu à la fiche QA (vert-trompeur 21/534)
Fix vert-trompeur hors périmètre du gate README (session précédente) : - 03_agents/qa/AGENT.md « Verdict agrégé courant » affichait 21 suites·534 tests (PASS) en se disant « jamais compté à la main » — figé à la main, périmé vs le run réel 22/551. Corrigé 21/534→22/551. - ci/README.md : exemple 21·534→22·551 + checklist DevOps 6→7 gates statiques. - Correctif de fond : ci/check_readme_claims.sh RECOMPUTE désormais aussi le compte agrégé de la fiche QA depuis regression_run.json (somme des suites commitées) ; un claim absent échoue aussi. Portée du gate élargie README + fiche QA (en-tête script + ci/README.md §1/§2). Bites : 21/534 → exit1 diff explicite ; claim retiré → exit1. 7 gates verts (dont check_artifacts : aucune dérive out/). Matrice 551/22 PASS inchangée. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -19,14 +19,18 @@
|
||||
# (« demo 18→21 ») ou l'orphan_tests_dirs (INV4) — appliqué à la doc d'entrée.
|
||||
#
|
||||
# Ce gate RECOMPUTE chaque chiffre depuis l'artefact cité (jamais une liste à la
|
||||
# main · #6) et exige l'égalité avec ce qui est ÉCRIT dans le README :
|
||||
# main · #6) et exige l'égalité avec ce qui est ÉCRIT dans les docs d'entrée :
|
||||
# README.md :
|
||||
# • Qualité 4Big N/M modules gated à K/100, verdict → qa/audit_4big totals
|
||||
# • Régression N suites gated → qa/regression plan
|
||||
# • Recette N promesses (X sprint + Y métriques), Z in_repo, verdict
|
||||
# → qa/acceptance matrix
|
||||
# • Agents « 13 agents » (×2 : nav + titre) → 03_agents/*/AGENT.md
|
||||
# Un claim absent du README échoue AUSSI (la dérive de formulation qui
|
||||
# ferait disparaître un chiffre est elle-même une régression de traçabilité).
|
||||
# 03_agents/qa/AGENT.md (fiche QA · « Verdict agrégé courant ») :
|
||||
# • N suites · M tests · M passés · E échec · E erreur · verdict
|
||||
# → qa/regression run
|
||||
# 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é).
|
||||
#
|
||||
# Dépendances : bash, git, python3 (stdlib pur · CLAUDE.md #2 — runner sans pip).
|
||||
# ============================================================================
|
||||
@@ -135,6 +139,46 @@ if re.search(r"verdict `true`", norm):
|
||||
else:
|
||||
bad("Recette · verdict `true` non cité dans README (attendu)")
|
||||
|
||||
# ============================================================================
|
||||
# Fiche QA (03_agents/qa/AGENT.md) · même classe de « vert trompeur » —
|
||||
# ----------------------------------------------------------------------------
|
||||
# Sa section « Verdict agrégé courant » affiche un compte agrégé (« N suites
|
||||
# gated · M tests · M passés · 0 échec · 0 erreur → verdict PASS ») en déclarant
|
||||
# « jamais compté à la main » et en citant qa/regression/out/regression_run.json.
|
||||
# Ce compte se PÉRIME pourtant en silence quand une suite est ajoutée : la fiche
|
||||
# affichait « 21 suites · 534 tests » alors que le run dit 22 / 551. Comme pour
|
||||
# le README, aucun gate ne comparait la VALEUR au run. On la RECALCULE ici depuis
|
||||
# le compte agrégé faisant autorité (regression_run.json, commité · déterministe).
|
||||
# ============================================================================
|
||||
QA = "03_agents/qa/AGENT.md"
|
||||
try:
|
||||
qa_txt = re.sub(r"\s+", " ", open(QA, encoding="utf-8").read())
|
||||
except OSError as e:
|
||||
bad(f"Fiche QA · {QA} illisible : {e}"); qa_txt = ""
|
||||
|
||||
run = load("qa/regression/out/regression_run.json")
|
||||
suites = run["suites"]
|
||||
agg = (
|
||||
str(len(suites)), # suites
|
||||
str(sum(s["ran"] for s in suites)), # tests exécutés
|
||||
str(sum(s["passed"] for s in suites)), # passés
|
||||
str(sum(s["failures"] for s in suites)), # échecs
|
||||
str(sum(s["errors"] for s in suites)), # erreurs
|
||||
run["verdict"], # verdict
|
||||
)
|
||||
qa_pat = (r"\*\*(\d+) suites gated · (\d+) tests · (\d+) passés · "
|
||||
r"(\d+) échec · (\d+) erreur → verdict `(PASS|FAIL)`")
|
||||
qa_src = (f"suites={agg[0]} tests={agg[1]} passés={agg[2]} "
|
||||
f"échec={agg[3]} erreur={agg[4]} verdict={agg[5]}")
|
||||
mqa = re.search(qa_pat, qa_txt)
|
||||
if mqa is None:
|
||||
bad(f"Fiche QA · verdict agrégé — claim INTROUVABLE dans {QA} (attendu {qa_src})")
|
||||
elif mqa.groups() == agg:
|
||||
good(f"Fiche QA · verdict agrégé — {QA} {'/'.join(mqa.groups())} == regression_run ({qa_src})")
|
||||
else:
|
||||
bad(f"Fiche QA · {QA} dit {'/'.join(mqa.groups())} MAIS regression_run dit "
|
||||
f"{'/'.join(agg)} ({qa_src}) → régénérer la fiche")
|
||||
|
||||
sys.exit(1 if FAIL else 0)
|
||||
PY
|
||||
rc=$?
|
||||
|
||||
Reference in New Issue
Block a user