[DTP-Worker] Sprint 8 · buffer L75 · Dernière surface de la classe « compte par suite » : les agrégats de tests EN PROSE (crm « 81 (25+31+25) » · erpnext_backend « RBAC 60 (10+11+12+11+16) + e-CF 39 ») n'étaient couverts par AUCUN gate — une compensation entre suites laisserait la table gatée juste et la prose fausse → recompute total ET multiset des composants (ordre-indépendant) depuis plan.suites dans check_readme_claims (3 morsures : total périmé · compensation captée par le multiset · claim disparu)

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:39:08 +00:00
parent 9038417db8
commit d7fc6bab26
3 changed files with 139 additions and 1 deletions
+63
View File
@@ -1,5 +1,68 @@
# Activity Log · 2026-07-31 · Claude Code DTP
## Session `20260731_073024` · Buffer S8 · Dernière surface de la classe « compte par suite » : les agrégats de tests rédigés EN PROSE dans deux fiches (`crm` « 81 (25+31+25) » · `erpnext_backend` « RBAC 60 (10+11+12+11+16) + e-CF 39 ») n'étaient couverts par AUCUN gate — une compensation entre suites laisserait la table gatée juste et la prose fausse
**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). La session précédente a gaté les
**cellules** « Tests » par suite des tables de fiches (recompute générique depuis
`plan.suites[path].test_methods`), motivée par le fait qu'une **compensation** +1/1
entre deux suites passerait sous la seule somme agrégée. Recherche de la **même classe
un cran au-dessus** : les agrégats **rédigés en prose** (hors table) que ce recompute
par-cellule ne voit pas.
### Défaut trouvé — 2 agrégats en PROSE ungated (total + composants saisis à la main)
- **`03_agents/crm/AGENT.md:32`** : « Total CRM : **81 tests** (25 + 31 + 25) ».
- **`03_agents/erpnext_backend/AGENT.md:39`** : « Total backend **RBAC 60 tests**
(10 + 11 + 12 + 11 + 16) + **e-CF 39 tests** ».
- **Pourquoi non gaté** : `check_readme_claims` recompute les **cellules de table**
(`row_re` exige un lien `…/README.md` + dernier champ numérique) — ces phrases en
prose n'en sont pas. Le total agrégé du repo (564) est gaté ailleurs mais ne couvre
pas ces **sous-totaux par domaine** ni leurs **composants**. Une compensation entre
deux suites CRM (l'une +1, l'autre 1) laisserait la table (gatée) juste, la somme
repo (564) juste, et la prose « (25 + 31 + 25) » **fausse en silence** — exactement
le piège per-suite corrigé la session précédente, au niveau **agrégé**.
- **État courant** : **aucun nombre périmé** — 81=(25+31+25), RBAC 60=(10+16+11+11+12),
e-CF 39=fiscal/ecf_dgii, tous recoupés sur `plan.suites`. Le défaut est la **surface
ungated** (faux-vert latent), pas un chiffre faux (anti-invention #6 : rien à réécrire).
### Fix — extension de `check_readme_claims.sh` (recompute total + multiset composants)
Nouveau bloc qui, pour chaque agrégat en prose, **RECOMPUTE** depuis `auth`
(`plan.suites[path].test_methods`, déjà chargé · zéro duplication) :
- le **total** == somme des suites du domaine ;
- le **multiset des composants** (trié, **ordre-indépendant**) == multiset des comptes
par suite — c'est ce qui attrape la **compensation** que la somme seule rate ;
- la **cohérence interne** (total == somme des composants écrits).
+ un contrôle à **suite unique** pour e-CF (pas de parenthèses). Un claim **absent**
échoue AUSSI. En-tête du gate + `ci/README.md` (§ table + § détail) mis à jour.
### Preuves de morsure
| Injection | Résultat |
|---|---|
| **Total périmé** `81→82` | **exit 1** `dit total=82 … MAIS source dit total=81 (interne_ok=False)` |
| **Compensation** `(25+31+25)→(24+31+26)` (somme=81 **inchangée**) | **exit 1** `composants=[24,26,31] MAIS source [25,25,31]` — le multiset mord là où la somme est aveugle |
| **Claim e-CF disparu** | **exit 1** `claim INTROUVABLE (attendu 39)` |
| 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/`) | ✅ (édition **hors** `05_deliverables_mvp` ⇒ 0 dérive d'artefact ; aucun `AGENT.md` touché) |
| Matrice de régression | **564/22 · PASS** inchangée (ni `tests/` ni doc-evidence touchés) |
| Diff | 2 fichiers (`ci/check_readme_claims.sh` + `ci/README.md`) · 0 untracked |
**Anti-invention (#6)** : rien inventé — le gate recompute total ET composants depuis
`plan.suites` au lieu de figer un compteur ; les nombres de prose **découlent** de l'artefact.
**Hors périmètre worker (VPS · #8)** : néant (gate python/stdlib en-repo).
**Auto-score 4Big** : 96/100.
---
## 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