[DTP-Worker] Sprint 8 · buffer L75 · « Vert trompeur » ironique : le README de l'auditeur 4Big (le module qui COMPTE les modules) figeait son propre total à la main « 17/17 modules » alors que quality_report.json en dit 22 — non gaté (check_readme_claims ne couvrait que le README d'entrée, pas ce README de module ; auditeur auto-exclu SoD ⇒ 0 signal) → 17→22 + règle L38 rendue count-free + bloc gate recomputant verdict/pass/modules/min_score depuis totals (2 morsures)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,63 @@
|
|||||||
# Activity Log · 2026-07-31 · Claude Code DTP
|
# Activity Log · 2026-07-31 · Claude Code DTP
|
||||||
|
|
||||||
|
## Session `20260731_070019` · Buffer S8 · « Vert trompeur » ironique : le README de l'auditeur 4Big — le module qui COMPTE les modules — figeait son PROPRE total à la main (« 17/17 modules ») alors que son artefact `quality_report.json` en dit 22 ; ungated
|
||||||
|
|
||||||
|
**Tâche** : **Sprint 8 · buffer L75** (DevOps CI/CD · QA régression). Roadmap
|
||||||
|
fonctionnellement close (22/22 modules · 564 tests · 7 gates verts au démarrage).
|
||||||
|
Poursuite de la série anti-dérive (CLAUDE.md #6). Les sessions précédentes ont gaté les
|
||||||
|
comptes agrégés/par-suite des **docs d'entrée** (README racine, fiches QA/Backend, tables
|
||||||
|
« Tests »). Recherche du même faux-vert **hors de ce périmètre** : audit des comptes
|
||||||
|
`N modules` / `N/N` dans les **README de module** (pas seulement l'entrée + les fiches).
|
||||||
|
|
||||||
|
### Défaut trouvé — 2 comptes vivants « 17 » périmés dans `qa/audit_4big/README.md`
|
||||||
|
|
||||||
|
- **`05_deliverables_mvp/qa/audit_4big/README.md:68`** (« Résultat courant ») :
|
||||||
|
« **Verdict `PASS`** — **17/17** modules à **100/100** » — compte **vivant saisi à la
|
||||||
|
main**, périmé (17 → 22 au fil des ajouts de modules). **Ironie complète** : c'est le
|
||||||
|
README du module qui **COMPTE les modules** ; son propre artefact faisant autorité
|
||||||
|
`qa/audit_4big/out/quality_report.json` (`totals.modules`) dit **22** depuis longtemps.
|
||||||
|
- **`…/README.md:38`** (règle du verdict global) : « `PASS` **ssi** couverture 100 % **et**
|
||||||
|
les **17** modules ≥ 95/100 » — la **règle** (« TOUS les modules ≥ 95 ») ne dépend pas
|
||||||
|
d'un compte ; le « 17 » n'était qu'une **surface de dérive** de plus.
|
||||||
|
- **Pourquoi non gaté** : `check_readme_claims` recomputait `22/22` pour le **README
|
||||||
|
d'entrée** (racine) mais ne couvrait **pas** ce README **de module**. `check_docs` ne
|
||||||
|
valide que les liens ; l'auditeur s'**auto-exclut** (SoD) donc son propre `out/` ne
|
||||||
|
reflète pas l'édition de son README → aucun signal.
|
||||||
|
|
||||||
|
### Fix (2 volets · CLAUDE.md #4 — corriger + supprimer la surface + garder)
|
||||||
|
|
||||||
|
1. **`README.md:38`** : retrait du compte figé → « **tous** les modules gated ≥ 95/100 »
|
||||||
|
(la règle, count-free ⇒ **zéro surface de dérive**, précédent `050007`/`053011`).
|
||||||
|
2. **`README.md:68`** : `17/17` → **22/22** (compte courant, désormais gaté).
|
||||||
|
3. **`ci/check_readme_claims.sh`** : nouveau bloc qui **RECALCULE** verdict + `pass/modules/
|
||||||
|
min_score` depuis `quality_report.json` (`totals`, déjà chargé dans `q`/`qv` · zéro
|
||||||
|
duplication) et exige l'égalité avec ce que « Résultat courant » **écrit**. Un claim
|
||||||
|
absent échoue AUSSI. Header du gate mis à jour (doc couverte).
|
||||||
|
|
||||||
|
### Preuves de morsure
|
||||||
|
|
||||||
|
- **Bite 1** (valeur périmée) : réinjecté `17/17` ⇒ gate **exit 1** `✗ … dit PASS/17/17/100
|
||||||
|
MAIS quality_report dit PASS/22/22/100 → régénérer le README`.
|
||||||
|
- **Bite 2** (claim disparu) : reformulé sans le motif ⇒ **exit 1** `✗ … claim INTROUVABLE`.
|
||||||
|
- **Restauré** ⇒ **exit 0**.
|
||||||
|
|
||||||
|
### Vérifs
|
||||||
|
|
||||||
|
| Contrôle | Résultat |
|
||||||
|
|---|---|
|
||||||
|
| 7 gates (`guard`/`json`/`docs`/`artifacts`/`regression`/`ci_integrity`/`readme_claims`) | ✅ exit 0 |
|
||||||
|
| `check_artifacts` (rebuild + égalité byte des `out/`) | ✅ (auditeur **auto-exclu** SoD ⇒ `quality_report.json` **byte-identique** ; 0 régénération) |
|
||||||
|
| Matrice de régression | **564/22 · PASS** inchangée (README édité, aucun `tests/`) |
|
||||||
|
| Résidu `17` vivant repo-wide | **aucun** (seul restant = daily_report `2026-07-30` point-in-time, conservé) |
|
||||||
|
| Diff | 2 fichiers · +39/−3 · 0 untracked |
|
||||||
|
|
||||||
|
**Anti-invention (#6)** : rien inventé — le gate **recompute** la vérité depuis `totals`
|
||||||
|
au lieu de figer un compteur ; le `22/22` du README **découle** de l'artefact.
|
||||||
|
**Hors périmètre worker (VPS · #8)** : néant (doc + gate bash/stdlib en-repo).
|
||||||
|
**Auto-score 4Big** : 96/100.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Session `20260731_053011` · Buffer S8 · Comptes vivants « 551 tests » périmés DANS la machinerie CI elle-même (`.gitea/workflows/ci.yml` + `ci/check_regression.sh` + `ci/check_readme_claims.sh`) — non couverts par aucun gate
|
## Session `20260731_053011` · Buffer S8 · Comptes vivants « 551 tests » périmés DANS la machinerie CI elle-même (`.gitea/workflows/ci.yml` + `ci/check_regression.sh` + `ci/check_readme_claims.sh`) — non couverts par aucun gate
|
||||||
|
|
||||||
**Tâche** : **Sprint 8 · buffer L75** (DevOps CI/CD · QA régression). Roadmap
|
**Tâche** : **Sprint 8 · buffer L75** (DevOps CI/CD · QA régression). Roadmap
|
||||||
|
|||||||
@@ -35,8 +35,8 @@ rapport indicatif.
|
|||||||
|
|
||||||
> `note = round(100 × Σ poids(critères applicables PASS) / Σ poids(applicables))`
|
> `note = round(100 × Σ poids(critères applicables PASS) / Σ poids(applicables))`
|
||||||
|
|
||||||
4. **Rend un verdict global.** `PASS` **ssi** couverture 100 % **et** les 17
|
4. **Rend un verdict global.** `PASS` **ssi** couverture 100 % **et** **tous** les
|
||||||
modules ≥ 95/100 ; sinon `FAIL`.
|
modules gated ≥ 95/100 ; sinon `FAIL`.
|
||||||
|
|
||||||
## Anti-invention (#6)
|
## Anti-invention (#6)
|
||||||
|
|
||||||
@@ -65,7 +65,7 @@ Publiciste** (zéro `pip`, runner Gitea sans réseau · CLAUDE.md #2).
|
|||||||
|
|
||||||
## Résultat courant
|
## Résultat courant
|
||||||
|
|
||||||
**Verdict `PASS`** — **17/17** modules à **100/100** (min 100), couverture
|
**Verdict `PASS`** — **22/22** modules à **100/100** (min 100), couverture
|
||||||
**100 %** des livrables gated. L'audit servira surtout de **gate anti-régression** :
|
**100 %** des livrables gated. L'audit servira surtout de **gate anti-régression** :
|
||||||
retirer des tests, casser un `MANIFEST` ou supprimer un schéma fait chuter le
|
retirer des tests, casser un `MANIFEST` ou supprimer un schéma fait chuter le
|
||||||
module sous 95 → `FAIL`.
|
module sous 95 → `FAIL`.
|
||||||
|
|||||||
@@ -32,6 +32,9 @@
|
|||||||
# 03_agents/erpnext_backend/AGENT.md (« source unique ») :
|
# 03_agents/erpnext_backend/AGENT.md (« source unique ») :
|
||||||
# • N tests · M suites · verdict (matrice de régression du repo)
|
# • N tests · M suites · verdict (matrice de régression du repo)
|
||||||
# → qa/regression run
|
# → qa/regression run
|
||||||
|
# 05_deliverables_mvp/qa/audit_4big/README.md (« Résultat courant ») :
|
||||||
|
# • N/M modules à K/100, verdict (l'auditeur compte les modules mais figeait
|
||||||
|
# son PROPRE total à la main : 17→22) → qa/audit_4big totals
|
||||||
# 03_agents/*/AGENT.md (tables de livrables · colonne « Tests ») :
|
# 03_agents/*/AGENT.md (tables de livrables · colonne « Tests ») :
|
||||||
# • chaque cellule « Tests » par suite gatée → plan.suites[path]
|
# • chaque cellule « Tests » par suite gatée → plan.suites[path]
|
||||||
# (+ count_tests pour le self_module qa/regression, exclu de la matrice)
|
# (+ count_tests pour le self_module qa/regression, exclu de la matrice)
|
||||||
@@ -219,6 +222,39 @@ else:
|
|||||||
bad(f"Fiche Backend · {BE} dit {'/'.join(mbe.groups())} MAIS regression_run dit "
|
bad(f"Fiche Backend · {BE} dit {'/'.join(mbe.groups())} MAIS regression_run dit "
|
||||||
f"{'/'.join(be_exp)} ({be_src}) → régénérer la fiche")
|
f"{'/'.join(be_exp)} ({be_src}) → régénérer la fiche")
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# README de l'auditeur 4Big (05_deliverables_mvp/qa/audit_4big/README.md) ·
|
||||||
|
# section « Résultat courant » — même classe de « vert trompeur ».
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
# Ironie parfaite : le module qui COMPTE les modules affichait son propre total
|
||||||
|
# SAISI À LA MAIN (« 17/17 modules à 100/100 »). Ce compte s'est PÉRIMÉ en silence
|
||||||
|
# quand des modules ont été ajoutés (17 → 22) — le README de l'auditeur contredisait
|
||||||
|
# son propre artefact `quality_report.json` (totals.modules = 22). Le gate racine
|
||||||
|
# ne couvrait QUE le README d'entrée, pas ce README de module. On RECALCULE ici
|
||||||
|
# depuis le même artefact faisant autorité (totals, déjà chargé dans `q`) et on
|
||||||
|
# exige l'égalité avec ce que la section « Résultat courant » ÉCRIT.
|
||||||
|
# ============================================================================
|
||||||
|
A4 = f"{D}/qa/audit_4big/README.md"
|
||||||
|
try:
|
||||||
|
a4_txt = re.sub(r"\s+", " ", open(A4, encoding="utf-8").read())
|
||||||
|
except OSError as e:
|
||||||
|
bad(f"README audit_4big · {A4} illisible : {e}"); a4_txt = ""
|
||||||
|
|
||||||
|
a4_exp = (qv, str(q["pass"]), str(q["modules"]), str(q["min_score"]))
|
||||||
|
a4_pat = (r"\*\*Verdict `(PASS|FAIL)`\*\* [—-] \*\*(\d+)/(\d+)\*\* "
|
||||||
|
r"modules à \*\*(\d+)/100\*\*")
|
||||||
|
a4_src = f"verdict={a4_exp[0]} pass={a4_exp[1]} modules={a4_exp[2]} min_score={a4_exp[3]}"
|
||||||
|
ma4 = re.search(a4_pat, a4_txt)
|
||||||
|
if ma4 is None:
|
||||||
|
bad(f"README audit_4big · « Résultat courant » — claim INTROUVABLE dans {A4} "
|
||||||
|
f"(attendu {a4_src})")
|
||||||
|
elif ma4.groups() == a4_exp:
|
||||||
|
good(f"README audit_4big · Résultat courant — {A4} "
|
||||||
|
f"{'/'.join(ma4.groups())} == quality_report ({a4_src})")
|
||||||
|
else:
|
||||||
|
bad(f"README audit_4big · {A4} dit {'/'.join(ma4.groups())} MAIS quality_report "
|
||||||
|
f"dit {'/'.join(a4_exp)} ({a4_src}) → régénérer le README")
|
||||||
|
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
# Fiches agents · comptes de tests PAR SUITE (colonne « Tests » des tables) —
|
# Fiches agents · comptes de tests PAR SUITE (colonne « Tests » des tables) —
|
||||||
# même classe de « vert trompeur », au grain le PLUS FIN.
|
# même classe de « vert trompeur », au grain le PLUS FIN.
|
||||||
|
|||||||
Reference in New Issue
Block a user