From 9038417db896b54381d397a73c313c4252f6b4e9 Mon Sep 17 00:00:00 2001 From: Claude Code DTP Worker Date: Fri, 31 Jul 2026 07:07:23 +0000 Subject: [PATCH] =?UTF-8?q?[DTP-Worker]=20Sprint=208=20=C2=B7=20buffer=20L?= =?UTF-8?q?75=20=C2=B7=20=C2=AB=20Vert=20trompeur=20=C2=BB=20ironique=20:?= =?UTF-8?q?=20le=20README=20de=20l'auditeur=204Big=20(le=20module=20qui=20?= =?UTF-8?q?COMPTE=20les=20modules)=20figeait=20son=20propre=20total=20?= =?UTF-8?q?=C3=A0=20la=20main=20=C2=AB=2017/17=20modules=20=C2=BB=20alors?= =?UTF-8?q?=20que=20quality=5Freport.json=20en=20dit=2022=20=E2=80=94=20no?= =?UTF-8?q?n=20gat=C3=A9=20(check=5Freadme=5Fclaims=20ne=20couvrait=20que?= =?UTF-8?q?=20le=20README=20d'entr=C3=A9e,=20pas=20ce=20README=20de=20modu?= =?UTF-8?q?le=20;=20auditeur=20auto-exclu=20SoD=20=E2=87=92=200=20signal)?= =?UTF-8?q?=20=E2=86=92=2017=E2=86=9222=20+=20r=C3=A8gle=20L38=20rendue=20?= =?UTF-8?q?count-free=20+=20bloc=20gate=20recomputant=20verdict/pass/modul?= =?UTF-8?q?es/min=5Fscore=20depuis=20totals=20(2=20morsures)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 (1M context) --- 05_activity_log/2026-07-31.md | 58 +++++++++++++++++++++ 05_deliverables_mvp/qa/audit_4big/README.md | 6 +-- ci/check_readme_claims.sh | 36 +++++++++++++ 3 files changed, 97 insertions(+), 3 deletions(-) diff --git a/05_activity_log/2026-07-31.md b/05_activity_log/2026-07-31.md index a598a86..17faee7 100644 --- a/05_activity_log/2026-07-31.md +++ b/05_activity_log/2026-07-31.md @@ -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 diff --git a/05_deliverables_mvp/qa/audit_4big/README.md b/05_deliverables_mvp/qa/audit_4big/README.md index 9ee3a60..e1c05b2 100644 --- a/05_deliverables_mvp/qa/audit_4big/README.md +++ b/05_deliverables_mvp/qa/audit_4big/README.md @@ -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`. diff --git a/ci/check_readme_claims.sh b/ci/check_readme_claims.sh index 2150917..2e40994 100755 --- a/ci/check_readme_claims.sh +++ b/ci/check_readme_claims.sh @@ -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.