[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:
Claude Code DTP Worker
2026-07-31 07:07:23 +00:00
parent 402727411d
commit 9038417db8
3 changed files with 97 additions and 3 deletions
+58
View File
@@ -1,5 +1,63 @@
# 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
**Tâche** : **Sprint 8 · buffer L75** (DevOps CI/CD · QA régression). Roadmap
+3 -3
View File
@@ -35,8 +35,8 @@ rapport indicatif.
> `note = round(100 × Σ poids(critères applicables PASS) / Σ poids(applicables))`
4. **Rend un verdict global.** `PASS` **ssi** couverture 100 % **et** les 17
modules ≥ 95/100 ; sinon `FAIL`.
4. **Rend un verdict global.** `PASS` **ssi** couverture 100 % **et** **tous** les
modules gated ≥ 95/100 ; sinon `FAIL`.
## Anti-invention (#6)
@@ -65,7 +65,7 @@ Publiciste** (zéro `pip`, runner Gitea sans réseau · CLAUDE.md #2).
## 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** :
retirer des tests, casser un `MANIFEST` ou supprimer un schéma fait chuter le
module sous 95 → `FAIL`.
+36
View File
@@ -32,6 +32,9 @@
# 03_agents/erpnext_backend/AGENT.md (« source unique ») :
# • N tests · M suites · verdict (matrice de régression du repo)
# → 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 ») :
# • chaque cellule « Tests » par suite gatée → plan.suites[path]
# (+ 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 "
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) —
# même classe de « vert trompeur », au grain le PLUS FIN.