[DTP-Worker 20260801_200419] Sprint 8 · buffer · Fiche DevOps : gate du COMPTE de suites gated (« 22 suites gated », cellule Tests de la row pipeline CI) — classe DISTINCTE des comptes de MÉTHODES test_ : recomputé de regression_plan.totals.suites (reg[suites], byte-gaté) + cohérence croisée == regression_run len(suites) ; surface non atteinte par row_re (ancre ci.yml/ci · suffixe 'suites gated') ni par l'agrégat de la fiche QA ; 5 morsures vérifiées, 7 gates re-verts

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-08-01 20:09:27 +00:00
parent 18a758045f
commit 17c3d2b104
3 changed files with 124 additions and 1 deletions
+1 -1
View File
File diff suppressed because one or more lines are too long
+60
View File
@@ -99,6 +99,13 @@
# et les blocs per-suite (tous sur 03_agents/*) n'atteignent pas → recomptés
# depuis plan.suites[path].test_methods (`auth`, même source · byte-gatée) ;
# un « N/N » interne incohérent (25/24) mord aussi
# 03_agents/devops/AGENT.md (cellule « Tests » de la row pipeline CI) :
# • le COMPTE de suites gated « N suites gated » — CLASSE distincte des comptes
# de MÉTHODES ci-dessus (un compte de SUITES, pas de tests) — non atteint par
# row_re (ancre `ci.yml`/`ci/`, pas un module de `auth` · suffixe « suites
# gated ») et distinct de l'agrégat de la fiche QA → recompté depuis
# regression_plan.totals.suites (`reg["suites"]`, byte-gaté) + cohérence
# croisée == regression_run len(suites) (mord une divergence plan↔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é).
#
@@ -779,6 +786,59 @@ for path_f, suite_path, pat, label in PER_SUITE_HORS_TABLE:
bad(f"Test par suite (hors table) · {path_f} · {label} — dit {m.group(1)} "
f"MAIS source dit {exp} (plan.suites[`{suite_path}`]) → régénérer la fiche")
# ============================================================================
# Fiche DevOps · COMPTE de suites gated (« N suites gated ») — sémantique DISTINCTE
# des comptes de tests par suite ci-dessus.
# ----------------------------------------------------------------------------
# Tous les blocs de comptes de tests précédents recomputent un compte de MÉTHODES
# `def test_` (`auth[path]`). La table de livrables de la fiche DevOps porte, elle,
# dans la cellule « Tests » de la ROW du pipeline CI (`.gitea/workflows/ci.yml` +
# `ci/`), un compte d'une CLASSE tout autre : « 22 suites gated » — le nombre de
# suites que la CI passe au crible, soit `regression_plan.totals.suites` (déjà chargé
# dans `reg`, byte-gaté par check_artifacts · recompté à chaque build par la
# découverte réelle des suites). Ce nombre est SAISI À LA MAIN dans la fiche et
# NI row_re NI aucun bloc amont ne l'atteint : (a) row_re exige un lien d'ancre
# `<mot>/…/README.md` vers une suite gatée ET une cellule ENTIER NU — or l'ancre ici
# est `ci.yml`/`ci/` (pas un module de `auth`) ET la cellule porte le suffixe
# « suites gated » ; (b) l'agrégat de la fiche QA (« 22 suites gated · 564 tests… »,
# gaté sur regression_run) est une SURFACE distincte (autre fiche, autre motif). La
# MÊME valeur 22 vit donc à DEUX endroits — un seul était gaté. Ajouter/retirer un
# module gated fait bouger `reg["suites"]` tandis que cette cellule DevOps rote en
# silence : la doc d'identité de l'agent DevOps affirmerait un périmètre de couverture
# CI faux (le « vert trompeur » que #6 interdit). Aucune suite tests/ (FONCTIONS, pas
# la prose de fiche) ne l'attrape. On RECOMPUTE depuis `reg["suites"]` (source unique
# déjà en portée · zéro duplication #6) et on exige que la cellule l'écrive EXACTEMENT.
# Motif ANCRÉ sur le label de rôle « CI/CD Gitea Actions » de CETTE row → vise la
# bonne cellule sans capter la valeur 22 de la fiche QA (autre fichier de toute façon).
# Claim absent = échec (traçabilité #6). Cohérence croisée : `reg["suites"]` ==
# regression_run (len(suites)) — la source du compte de tests de la fiche QA — de sorte
# qu'une divergence plan↔run (compte de suites) morde ici aussi.
# ============================================================================
DEVOPS_FICHE = "03_agents/devops/AGENT.md"
try:
dv_txt = re.sub(r"\s+", " ", open(DEVOPS_FICHE, encoding="utf-8").read())
except OSError as e:
bad(f"Fiche DevOps · {DEVOPS_FICHE} illisible : {e}"); dv_txt = ""
run_sc = load("qa/regression/out/regression_run.json")
n_suites_run = len(run_sc["suites"])
if reg["suites"] != n_suites_run:
bad(f"Fiche DevOps · suites gated — incohérence SOURCE : regression_plan.totals."
f"suites={reg['suites']} ≠ regression_run len(suites)={n_suites_run} "
f"(plan↔run divergent → régénérer les artefacts qa/regression)")
dv_pat = r"CI/CD Gitea Actions.*?\| (\d+) suites gated \|"
mdv = re.search(dv_pat, dv_txt)
if not dv_txt:
pass # illisible déjà signalé
elif mdv is None:
bad(f"Fiche DevOps · suites gated — cellule « N suites gated » INTROUVABLE dans "
f"{DEVOPS_FICHE} (row CI/CD Gitea Actions · attendu {reg['suites']})")
elif int(mdv.group(1)) == reg["suites"]:
good(f"Fiche DevOps · suites gated — {DEVOPS_FICHE} {mdv.group(1)} == source "
f"(regression_plan.totals.suites={reg['suites']})")
else:
bad(f"Fiche DevOps · suites gated — {DEVOPS_FICHE} dit {mdv.group(1)} MAIS source "
f"dit {reg['suites']} (regression_plan.totals.suites) → régénérer la fiche")
# ============================================================================
# READMEs de MODULE · comptes de tests self-reportés — surface DISTINCTE des fiches.
# ----------------------------------------------------------------------------