[DTP-Worker] Sprint 8 · buffer L75 · Hors du domaine « tests » : les comptes PAR WORKSPACE (cartes/liens/rôles) des 5 portails frontend étaient transcrits À LA MAIN dans DEUX docs (table du README module + prose de la fiche frontend_console) sans AUCUN gate — ajouter un rôle/DocType au contrat RBAC ferait dériver les deux docs en silence pendant que frontend/portails/out/MANIFEST.json (byte-gaté par check_artifacts) dit autre chose → nouveau bloc dans check_readme_claims recomputant chaque triplet + le total « N Workspace natifs » depuis MANIFEST.workspaces et exigeant l'égalité avec les deux docs (4 morsures : dérive table · dérive prose captée là où la table est aveugle · cellule disparue · total)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-07-31 08:06:10 +00:00
parent d7fc6bab26
commit 56e64d6089
3 changed files with 155 additions and 1 deletions
+68
View File
@@ -1,5 +1,73 @@
# Activity Log · 2026-07-31 · Claude Code DTP
## Session `20260731_080025` · Buffer S8 · Hors du domaine « tests » : les comptes PAR WORKSPACE (cartes/liens/rôles) des 5 portails frontend, transcrits À LA MAIN dans DEUX docs (table du README module + prose de la fiche agent), n'étaient couverts par AUCUN gate — ajouter un rôle/DocType au contrat RBAC ferait dériver les deux docs en silence
**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 du domaine **tests** (sommes, cellules par-suite, agrégats en prose). Cette
session sort de ce domaine : audit des comptes **data-derived** cités dans les fiches
et README de module qui pointent un artefact mais n'étaient recomputés par aucun gate.
### Défaut trouvé — comptes par workspace ungated, transcrits dans DEUX docs
- **`05_deliverables_mvp/frontend/portails/README.md:29-33`** : table
« Portail | Workspace | **Cartes** | **Liens** | **Rôles restreints** » — 5 lignes
× 3 nombres **saisis à la main**.
- **`03_agents/frontend_console/AGENT.md:28`** : prose « **5 `Workspace` natifs**
(`OTO Ventes` 4 cartes/11 liens/12 rôles · `OTO Construction` 4/9/10 · `OTO Achat`
3/8/5 · `OTO Compta` 4/11/8 · `OTO Direction` 4/14/9) » — **mêmes** triplets recopiés.
- **Pourquoi non gaté** : `check_readme_claims` couvrait les comptes de **tests**
(README racine, fiches QA/Backend, cellules par-suite, prose CRM/RBAC/e-CF) et
`audit_4big`/`acceptance` — jamais les comptes **de structure** des portails.
`check_docs` ne valide que les liens ; `check_artifacts` prouve que
`frontend/portails/out/MANIFEST.json` est **reproductible byte-for-byte** (tableau
`workspaces` = {nb_cartes, nb_liens, nb_roles} recalculés depuis le contrat RBAC à
chaque build) mais **ne compare pas** ce que les DEUX docs en **écrivent**. Ajouter
un rôle/DocType au contrat ferait dériver les deux docs **en silence** pendant que
l'artefact dit autre chose — même « vert trompeur » que les cellules « Tests ».
- **État courant** : **aucun nombre périmé** — les 15 triplets et le total « 5 » des
deux docs recoupent MANIFEST exactement (anti-invention #6 : rien à réécrire). Le
défaut est la **surface ungated** (faux-vert latent), pas un chiffre faux.
### Fix — extension de `check_readme_claims.sh` (recompute par workspace depuis MANIFEST)
Nouveau bloc qui, pour **chaque** workspace de `MANIFEST.workspaces` (source déjà
byte-gatée · zéro duplication du compteur du générateur), RECOMPUTE le triplet
`(nb_cartes, nb_liens, nb_roles)` et exige l'égalité avec **les deux** docs : la ligne
de table du README (ancrée `| <portail> | \`<ws>\` | C | L | R |`) **et** la cellule
de prose de la fiche (`\`<ws>\` C cartes/L liens/R rôles`, forme abrégée `C/L/R`
tolérée). + contrôle du **total** « N `Workspace` natifs » == len(workspaces). Un
workspace **absent** d'un doc échoue AUSSI. En-tête du gate + `ci/README.md`
(§ table + § détail) mis à jour.
### Preuves de morsure
| Injection | Résultat |
|---|---|
| **README table** `OTO Compta` liens `11→12` | **exit 1** `README dit 4/12/8 MAIS MANIFEST dit 4/11/8` |
| **Fiche prose** `OTO Achat` `3/8/5→3/8/6` (table inchangée) | **exit 1** `fiche dit 3/8/6 MAIS MANIFEST 3/8/5` — mord là où la table seule est aveugle |
| **Cellule disparue** (`OTO Direction` retirée de la prose) | **exit 1** `claim INTROUVABLE (attendu 4/14/9)` |
| **Total** `5→6 Workspace natifs` | **exit 1** `fiche dit 6 MAIS MANIFEST dit 5` |
| Restauré | **exit 0** (10 lignes doc + total verts) |
### 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 README/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 chaque triplet depuis
`MANIFEST.workspaces` au lieu de figer un compteur ; les nombres des deux docs
**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_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