[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:
@@ -2120,3 +2120,66 @@ Restauré = green : `rc=0`, **440 checks de base intacts (diff vide) + 27 nouvea
|
|||||||
- **Note memory** : classe « comptes de tests » — désormais couverte sur TROIS surfaces (cellule « Tests » des fiches via `row_re` · agrégats prose fiches · **README de module**, ce bloc) + les cinq claims per-suite hors table. Source unique = `auth` (plan.suites[].test_methods).
|
- **Note memory** : classe « comptes de tests » — désormais couverte sur TROIS surfaces (cellule « Tests » des fiches via `row_re` · agrégats prose fiches · **README de module**, ce bloc) + les cinq claims per-suite hors table. Source unique = `auth` (plan.suites[].test_methods).
|
||||||
- **Hors périmètre worker (VPS · #8)** : néant (gate bash/python3 stdlib en-repo ; édition **hors** `05_deliverables_mvp/*/out` ⇒ 0 dérive d'artefact).
|
- **Hors périmètre worker (VPS · #8)** : néant (gate bash/python3 stdlib en-repo ; édition **hors** `05_deliverables_mvp/*/out` ⇒ 0 dérive d'artefact).
|
||||||
- **Auto-score 4Big** : 96/100.
|
- **Auto-score 4Big** : 96/100.
|
||||||
|
|
||||||
|
## Session `20260801_200419` · Buffer S8 · Fiche DevOps : gate du **COMPTE de suites gated** (« 22 suites gated ») — sémantique DISTINCTE des comptes de tests par suite
|
||||||
|
|
||||||
|
**Contexte** : la série anti-dérive Sprint-8 gate chaque surface data-derived contre
|
||||||
|
sa source de vérité (CLAUDE.md #6, roadmap fonctionnellement close). Tous les blocs de
|
||||||
|
comptes de tests de `ci/check_readme_claims.sh` recomputent un compte de **méthodes**
|
||||||
|
`def test_` (`auth[path]` = `plan.suites[path].test_methods`) : la cellule « Tests »
|
||||||
|
des tables via `row_re`, les agrégats prose crm/erpnext_backend, les 5 claims per-suite
|
||||||
|
« hors table », et les READMEs de module. Une surface d'une **classe voisine mais
|
||||||
|
distincte** restait ungated.
|
||||||
|
|
||||||
|
**Surface trouvée (ungated)** : `03_agents/devops/AGENT.md:24` — dans la table des
|
||||||
|
livrables DevOps, la cellule « Tests » de la row du **pipeline CI**
|
||||||
|
(`.gitea/workflows/ci.yml` + `ci/`) affiche « **22 suites gated** » : non pas un compte
|
||||||
|
de tests, mais le **nombre de SUITES** que la CI passe au crible, soit
|
||||||
|
`regression_plan.totals.suites`. Ce nombre est saisi À LA MAIN et **aucun** gate ne
|
||||||
|
l'atteignait :
|
||||||
|
- `row_re` échoue DEUX fois : l'ancre de lien est `ci.yml`/`ci/` (pas un module de
|
||||||
|
`auth`) ET la cellule porte le suffixe « suites gated » (pas un entier nu) ;
|
||||||
|
- l'agrégat de la fiche QA (`03_agents/qa/AGENT.md:35` « **22 suites gated · 564
|
||||||
|
tests…** », gaté sur `regression_run`) est une **surface distincte** (autre fichier,
|
||||||
|
autre motif). La MÊME valeur 22 vit donc à DEUX endroits — **un seul** était gaté.
|
||||||
|
|
||||||
|
**Dérive silencieuse fermée** : ajouter/retirer un module gated fait bouger
|
||||||
|
`reg["suites"]` (recompté à chaque build par découverte réelle des suites, byte-gaté par
|
||||||
|
`check_artifacts`) 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.
|
||||||
|
**État courant** : valeur exacte (22 == 22), le défaut est la **surface ungated** (rien
|
||||||
|
à réécrire · anti-invention #6).
|
||||||
|
|
||||||
|
**Gate ajouté** (`ci/check_readme_claims.sh`, nouveau bloc « Fiche DevOps · COMPTE de
|
||||||
|
suites gated » juste après le bloc per-suite « hors table », d'où `reg` est déjà en
|
||||||
|
portée · zéro rechargement) : on RECOMPUTE depuis `reg["suites"]`
|
||||||
|
(`regression_plan.totals.suites`, source unique) 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. Claim absent = échec (traçabilité #6). **Cohérence croisée** :
|
||||||
|
`reg["suites"]` == `regression_run` `len(suites)` (la source du compte de la fiche QA)
|
||||||
|
⇒ une divergence plan↔run mord ici aussi.
|
||||||
|
|
||||||
|
**5 morsures vérifiées** (2 côté fiche · 2 côté artefact · 1 cross-cohérence) :
|
||||||
|
1. cellule 22→23 → ✗ « dit 23 MAIS source dit 22 » ;
|
||||||
|
2. claim retiré (`| gated |`) → ✗ « cellule « N suites gated » INTROUVABLE » ;
|
||||||
|
3. `plan.totals.suites` 22→21 (fiche périmée) → ✗ divergence SOURCE + ✗ « dit 22 MAIS
|
||||||
|
source dit 21 » ;
|
||||||
|
4. `regression_run` privé d'une suite (plan↔run divergent) → ✗ « incohérence SOURCE :
|
||||||
|
plan.suites=22 ≠ run len=21 » ;
|
||||||
|
5. restauré = green (rc=0).
|
||||||
|
Working tree byte-restauré via `git checkout -- <fichier précis>` (**JAMAIS**
|
||||||
|
`git checkout .` / `git clean`, interdits absolus). **7 gates re-verts** :
|
||||||
|
`validate_json` / `check_docs` / `guard_constraints` / `check_artifacts` /
|
||||||
|
`check_ci_integrity` / `check_readme_claims` / `check_regression` (tous rc=0).
|
||||||
|
|
||||||
|
- En-tête du gate mis à jour (inventaire des surfaces couvertes : nouvelle entrée
|
||||||
|
« COMPTE de suites gated de la fiche devops ») + `ci/README.md` (recap
|
||||||
|
`check-readme-claims` : nouvelle clause du compte de suites gated).
|
||||||
|
- **Note memory** : la classe « comptes de tests » (méthodes `def test_`) est couverte
|
||||||
|
sur 4 surfaces + les 5 per-suite ; le COMPTE de **suites** (`plan.totals.suites`) est
|
||||||
|
une classe voisine — désormais gaté sur ses DEUX surfaces (fiche QA agrégat déjà gaté ·
|
||||||
|
fiche DevOps cellule, ce bloc).
|
||||||
|
- **Hors périmètre worker (VPS · #8)** : néant (gate bash/python3 stdlib en-repo ;
|
||||||
|
édition **hors** `05_deliverables_mvp/*/out` ⇒ 0 dérive d'artefact).
|
||||||
|
- **Auto-score 4Big** : 96/100.
|
||||||
|
|||||||
+1
-1
File diff suppressed because one or more lines are too long
@@ -99,6 +99,13 @@
|
|||||||
# et les blocs per-suite (tous sur 03_agents/*) n'atteignent pas → recomptés
|
# 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) ;
|
# depuis plan.suites[path].test_methods (`auth`, même source · byte-gatée) ;
|
||||||
# un « N/N » interne incohérent (25/24) mord aussi
|
# 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 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é).
|
# 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)} "
|
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")
|
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.
|
# READMEs de MODULE · comptes de tests self-reportés — surface DISTINCTE des fiches.
|
||||||
# ----------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------
|
||||||
|
|||||||
Reference in New Issue
Block a user