[DTP-Worker] Sprint 8 · buffer L75 · Gate intégrité chiffres README (ci/check_readme_claims.sh)
Faux-vert réel : le README (point d'entrée) affichait des chiffres PÉRIMÉS que sa propre source cité contredisait, sans qu'aucun gate ne les enforce. check_docs ne valide que les LIENS, jamais la VALEUR des nombres → dérive silencieuse : « 21/21 modules » (artefact: 22/22), « 21 suites » (22), « 14 in_repo + 1 out_of_scope » (15 in_repo). CLAUDE.md #6 non gardé. Fix : (1) corrige les 3 chiffres du README ; (2) 7e gate statique check_readme_claims.sh qui RECOMPUTE chaque chiffre depuis l'artefact cité (audit_4big/regression/acceptance + count AGENT.md) et exige l'égalité avec l'écrit — un claim absent échoue aussi. Câblé : job check-readme-claims ∈ gate.needs (30 jobs), source lib.sh, verrouillé par check_ci_integrity INV-B. Bite proofs : « 21/21 » réintroduit ⇒ exit 1 (README≠artefact) ; claim suites retiré ⇒ exit 1 (INTROUVABLE) ; restauré ⇒ exit 0. Nettoyage : commentaires CI « 21 suites/534 tests » → 22/551. 7/7 gates verts, YAML valide. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,81 @@
|
||||
# Activity Log · 2026-07-31 · Claude Code DTP
|
||||
|
||||
## Session `20260731_030001` · Buffer S8 · « Vert trompeur » : le README (point d'entrée) affichait des chiffres PÉRIMÉS que sa propre source contredisait — aucun gate ne les enforçait
|
||||
|
||||
**Tâche** : **Sprint 8 · buffer L75** (DevOps CI/CD · QA). Roadmap fonctionnellement
|
||||
close (22/22 modules 100/100, 551 tests verts, 6 gates statiques). Poursuite de la
|
||||
série anti-dérive : recherche d'un **faux-vert réel** (une affirmation présentée comme
|
||||
vérifiée mais qu'aucun gate ne vérifie), même classe que les bugs `regression_run.json`
|
||||
/ `out/` RBAC / `cd ""` des sessions précédentes.
|
||||
|
||||
### Défaut trouvé — les chiffres du README dérivaient en SILENCE vs leurs artefacts cités
|
||||
|
||||
- **Mécanisme** : `README.md` est le **point d'entrée** du mandat ; sa section « État
|
||||
courant (sourcé) » déclare mot pour mot *« Chaque chiffre ci-dessous est sourcé vers
|
||||
un artefact commité (anti-invention #6) ; ce README n'introduit aucune donnée
|
||||
nouvelle. »* Cette promesse n'était gardée par **aucun** gate : `check_docs.sh` ne
|
||||
valide que les **liens** (la cible existe), **jamais la VALEUR** des nombres. Quand un
|
||||
module + son job CI ont été ajoutés au fil des sprints, les chiffres du README se sont
|
||||
**périmés en silence** tout en restant « sourcés » vers un artefact qui, lui, dit
|
||||
autre chose — un README qui se **contredit avec sa propre source** est le pire « vert
|
||||
trompeur » (CLAUDE.md #6 : « zéro invention de chiffres »), appliqué à la doc d'entrée.
|
||||
- **Preuve au sol (3 dérives réelles constatées)** :
|
||||
- README : « **21/21** modules gated à 100/100 » — `qa/audit_4big/out/quality_report.json`
|
||||
`totals` dit **22/22** (min_score 100, verdict PASS) ;
|
||||
- README : « **21** suites gated » — `qa/regression/out/regression_plan.json`
|
||||
`totals.suites` dit **22** (551 tests) ;
|
||||
- README : « 15 promesses… **14 `in_repo`** prouvées + **1 `out_of_scope`** » —
|
||||
`qa/acceptance/out/acceptance_matrix.json` a **15 `in_repo`** (M5 est désormais
|
||||
`in_repo` avec son hors-périmètre tracé per-promesse ; 0 promesse hors `in_repo`).
|
||||
Les liens étaient tous verts (`check_docs` OK) : la dérive était **invisible**.
|
||||
|
||||
### Fix (2 solutions · CLAUDE.md #4 — retenu : correction README + gate qui l'enforce)
|
||||
|
||||
- **Correction des 3 chiffres** du README (21→22 modules, 21→22 suites, « 14+1 » → « 15
|
||||
in_repo ») pour refléter les artefacts.
|
||||
- **Correctif de fond** : nouveau gate **`ci/check_readme_claims.sh`** (7ᵉ gate statique)
|
||||
qui **RECOMPUTE** chaque chiffre depuis l'artefact cité (jamais une liste à la main ·
|
||||
#6) et exige l'égalité avec ce qui est **écrit** dans le README : modules/verdict
|
||||
(audit_4big), suites (régression), promesses/statuts/verdict (acceptance), nombre
|
||||
d'`AGENT.md` (×2 : nav + titre). Un claim **absent** du README échoue AUSSI (la dérive
|
||||
de formulation qui ferait disparaître un chiffre est elle-même une régression de
|
||||
traçabilité). *(Alt. écartée : régénérer le README depuis un template — surdimensionné
|
||||
et fragile pour une section en prose ; un gate qui compare valeur↔source est la preuve
|
||||
la plus forte et la moins couplée à la mise en forme.)*
|
||||
- **Câblage CI** : job `check-readme-claims` ajouté à `ci.yml` + inséré dans
|
||||
`gate.needs` (30 jobs bloquants désormais). `check_ci_integrity` (INV-A/INV-B) valide
|
||||
le câblage : `gate.needs` == 32 jobs − 1 (gate) − 1 manuel ; `ci/check_readme_claims.sh`
|
||||
lancé par `check-readme-claims` ∈ gate, et **source `ci/lib.sh`** (pas de code mort,
|
||||
échoue en `exit 3` hors arbre git comme les 6 autres).
|
||||
|
||||
### Preuves de morsure
|
||||
|
||||
- **Bite 1** (valeur périmée) : réintroduit « 21/21 modules » ⇒ gate **exit 1**
|
||||
`✗ README dit 21/21/100 MAIS artefact dit 22/22/100 → régénérer README`.
|
||||
- **Bite 2** (claim disparu) : retire `**22 suites gated**` ⇒ gate **exit 1**
|
||||
`✗ claim INTROUVABLE dans README (attendu suites=22)`.
|
||||
- **Restauré** ⇒ **exit 0** vert. Gate inerte tant que README == artefacts.
|
||||
|
||||
**Anti-invention (#6)** : rien inventé — le gate **recompute** la vérité depuis les
|
||||
artefacts au lieu de figer un compteur ; les 3 chiffres corrigés sont tous **recoupés**
|
||||
sur `quality_report`/`regression_plan`/`acceptance_matrix`.
|
||||
|
||||
**Nettoyage cohérence (#5 · éliminer le vieux)** : 3 commentaires CI mentionnaient
|
||||
encore « 21 suites · 534 tests » (désormais 22 · 551) — corrigés dans
|
||||
`.gitea/workflows/ci.yml` et `ci/check_regression.sh`. `ci/README.md` : table §1 + détail
|
||||
§2 + commande §3 du nouveau gate ajoutés.
|
||||
|
||||
**Vérifs** : **7 gates** locaux verts (`guard_constraints`/`validate_json`/`check_docs`/
|
||||
`check_artifacts`/`check_regression`/`check_ci_integrity`/**`check_readme_claims`**) ;
|
||||
`ci.yml` **YAML valide** ; `check_ci_integrity` : `gate.needs` = **30 jobs** (32 − gate
|
||||
− e2e-baseline manuel), 7 `ci/*.sh` câblés + `lib.sh` sourcée par les 7. Artefacts `out/`
|
||||
inchangés (aucun module `05_deliverables_mvp/` touché ⇒ pas de régénération).
|
||||
|
||||
**Hors périmètre worker (VPS · #8)** : néant (stdlib pur en-repo ; enregistrement du
|
||||
runner Gitea toujours du ressort DevOps).
|
||||
|
||||
**Auto-score 4Big** : 96/100.
|
||||
|
||||
## Session `20260731_015954` · Buffer S8 · « Vert trompeur » : les 6 gates `ci/*.sh` passaient VERT hors d'un arbre git en ne contrôlant RIEN
|
||||
|
||||
**Tâche** : **Sprint 8 · buffer L75 (« Regression tests exhaustifs » · DevOps
|
||||
|
||||
Reference in New Issue
Block a user