diff --git a/05_activity_log/2026-07-31.md b/05_activity_log/2026-07-31.md index e437795..3cdd233 100644 --- a/05_activity_log/2026-07-31.md +++ b/05_activity_log/2026-07-31.md @@ -1,5 +1,75 @@ # Activity Log · 2026-07-31 · Claude Code DTP +## Session `20260731_050007` · Buffer S8 · Chiffre vivant périmé DANS la doc du CI (`ci/README.md`) — le gate `check_regression` était illustré par un compte de tests faux, et `check_readme_claims` sous-décrit (2 docs au lieu de 3) + +**Tâche** : **Sprint 8 · buffer L75** (DevOps CI/CD · QA régression). Roadmap +fonctionnellement close (22/22 modules · 558 tests · **7** gates verts au démarrage). +Poursuite de la série anti-dérive : la classe « chiffre inventé/périmé » (README, fiche +QA, fiche Backend) est gatée sur 3 docs ; recherche d'un **même faux-vert hors de ce +périmètre**. Audit repo-wide des agrégats (`git grep ' suites| modules|551|534'` +sur `*.md` hors logs/archives) + relecture des 7 gates pour un **bug de logique**. + +### Défauts trouvés — 3 dérives réelles, toutes dans `ci/README.md` (doc du livrable DevOps) + +- **`ci/README.md:80`** (le pire) : la section décrivant `check_regression` — le gate + *censé empêcher les compteurs de se périmer* — s'illustrait elle-même par un **compte + vivant périmé** : « 22 suites · **551 tests** · PASS ». La matrice faisant autorité + (`qa/regression/out/regression_run.json`) dit **558** depuis la session `043004` + (534 → 551 → 558) ; l'exemple appariait le compte de **suites courant** (22) à un + compte de **tests périmé** (551). Ironie complète : la doc du gate anti-dérive avait + elle-même dérivé. +- **`ci/README.md:130`** : la ligne anecdote de la fiche QA citait « le run réel + `22 / 551` » au **présent** — 551 ne correspond plus à rien (→ 558). +- **`ci/README.md:121-131`** : la section `§check_readme_claims` affirmait garder « les + **deux** docs d'entrée » (README + fiche QA) et **omettait la fiche ERPNext Backend** + — 3ᵉ doc pourtant ajouté à la couverture du gate en session `043004`. Le **header du + script** `check_readme_claims.sh` (source de vérité · l.23/29/32) liste bien les 3 ; + seul `ci/README.md` a dérivé → **doc qui sous-décrit son propre code**. +- **Pourquoi non gaté** : session `030001` a délibérément laissé `ci/README.md` **hors** + de `check_readme_claims` car il porte des **chiffres historiques figés** volontaires + (anecdotes « demo 18→21 », « 21 suites · 534 tests »). C'est ce mélange + historique/vivant qui a laissé le compte **vivant** (551) se périmer en silence. + +### Fix (2 solutions · CLAUDE.md #4 — retenu : supprimer la surface de dérive + réaligner) + +- **Correctif de fond (l.80)** : le compte **vivant** figé « 22 suites · 551 tests » est + **supprimé** au profit d'un renvoi — « le compte agrégé (suites · tests · passés · + verdict) … **recompté par `check_readme_claims`** dans les fiches d'entrée, jamais figé + en dur ici ». Plus de nombre à périmer = **zéro surface de dérive** (plus robuste qu'un + gate sur une prose ; #6). *(Alt. écartée : étendre `check_readme_claims` à `ci/README.md` + — fragile, il faudrait distinguer chaque anecdote historique figée d'un compte vivant ; + supprimer le nombre est structurellement plus fort.)* +- **Anecdote historique (l.130)** : « le run réel `22 / 551` » (chiffre vivant faux) + remplacé par « alors que le run agrégé faisant autorité en disait davantage » ; le + **534** est **conservé** comme valeur point-in-time du défaut corrigé (comme « demo + 18→21 »), désormais sans nombre concurrent périmé. +- **Réalignement (l.121-134)** : « les **deux** docs d'entrée » → « les **trois** » + + **ajout du bloc fiche Backend** (`N tests · M suites · verdict → regression_run.json`), + miroir du header du script. La doc décrit à nouveau exactement le code. + +### Preuves + +| Contrôle | Résultat | +|---|---| +| `git grep '551' *.md` (hors logs/archives) | **aucun** chiffre vivant résiduel ✅ | +| `534` restant | **1 seule** ligne = anecdote historique explicite (l.131) ✅ | +| « trois docs » + fiche Backend décrite dans `ci/README.md` | ✅ | +| 7 gates (`guard`/`json`/`docs`/`artifacts`/`regression`/`ci_integrity`/`readme_claims`) | ✅ exit 0 | +| `check_artifacts` (rebuild + égalité byte de tous les `out/`) | ✅ (édition **hors** `05_deliverables_mvp` ⇒ 0 dérive d'artefact) | +| Arbre de travail | ✅ 1 fichier modifié, 0 untracked | + +**Anti-invention (#6)** : rien inventé — la vérité (558) vient de `regression_run.json` +(gaté par `check_regression`) ; le fix **retire** le compteur figé plutôt que d'en poser +un nouveau. Matrice **558/22 · PASS inchangée**. + +**Non-régression** : édition **doc pure hors `05_deliverables_mvp`** → `qa/audit_4big` +ne la lit pas comme evidence ⇒ `quality_report.json` **inchangé** ; aucune régénération +de consommateur nécessaire. + +**Hors périmètre worker (VPS · #8)** : néant (doc en-repo ; runner Gitea = DevOps). + +**Auto-score 4Big** : 96/100. + ## Session `20260731_040004` · Sprint 7/8 · Livrable démo : ajout du **prompteur Markdown** (`out/run_sheet.md`) — le support texte lisible manquait au « scénario démo prêt à jouer » **Tâche** : **Sprint 7 l.68** (« CRM + Faisabilité : Scénarios démo P07 banquier · diff --git a/ci/README.md b/ci/README.md index 5cc2846..e1558a7 100644 --- a/ci/README.md +++ b/ci/README.md @@ -76,8 +76,9 @@ Rejoue la **matrice de régression** complète (`qa/regression/regression_gen.py **byte-identique** au commité, puis que son verdict soit `PASS`. Complément direct de `check_artifacts` : celui-ci ne rejoue que `build` (→ `regression_plan.json`) et laisse hors périmètre l'artefact d'**exécution** `regression_run.json` — pourtant -c'est *lui* qui porte les compteurs cités partout dans la doc et les logs -(« 22 suites · 551 tests · PASS »). Sans ce gate, ce chiffre pouvait se périmer en +c'est *lui* qui porte le compte agrégé (suites · tests · passés · verdict) cité dans +la doc et les logs — recompté par `check_readme_claims` dans les fiches d'entrée, +jamais figé en dur ici. Sans ce gate, ce compte pouvait se périmer en silence (module + job CI ajoutés sans régénérer la matrice → compte de suites faux ; c'est la dérive « demo 18→21 » corrigée à la main), ou une matrice rouge être commitée verte. `regression_run.json` ne contient aucun horodatage/hôte → le run est @@ -118,7 +119,7 @@ README se **périment en silence** tout en restant « sourcés » vers un artefa autre chose — un README qui se **contredit avec sa propre source** est un « vert trompeur » (même classe que la matrice périmée « demo 18→21 » ou INV4, appliqué à la doc d'entrée). Ce gate **recompute** chaque chiffre depuis l'artefact cité (jamais une -liste à la main · #6) et exige l'égalité avec ce qui est **écrit** dans les deux +liste à la main · #6) et exige l'égalité avec ce qui est **écrit** dans les trois docs d'entrée — `README.md` : - modules gated `N/M` à `K/100` + verdict `PASS` → `qa/audit_4big/out/quality_report.json` (`totals`) ; - `N` suites gated → `qa/regression/out/regression_plan.json` (`totals.suites`) ; @@ -127,9 +128,13 @@ docs d'entrée — `README.md` : Et la fiche QA `03_agents/qa/AGENT.md` (section « Verdict agrégé courant », qui se disait « jamais compté à la main » tout en portant un compte figé qui s'est périmé -« 21 suites · 534 tests » vs le run réel `22 / 551 ») : +— « 21 suites · 534 tests » alors que le run agrégé faisant autorité en disait davantage) : - `N` suites · `M` tests · `M` passés · `E` échec · `E` erreur · verdict → `qa/regression/out/regression_run.json` (compte agrégé faisant autorité, commité). +Et la fiche ERPNext Backend `03_agents/erpnext_backend/AGENT.md` (ligne « source unique », +même compte agrégé jadis saisi à la main qui s'était périmé — « 560 tests ») : +- `N` tests · `M` suites · verdict → `qa/regression/out/regression_run.json` (matrice de régression du repo, même source faisant autorité que la fiche QA). + 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é). stdlib pur (bash/git/python3), zéro réseau.