[DTP-Worker] Sprint 8 · buffer L75 · Domaine CRM : le pipeline vente « 9 états · 11 transitions » était transcrit À LA MAIN dans DEUX README de module (titre du module workflow_vente + « 9 états du pipeline » de dossier_vente, même compte du même graphe) sans AUCUN gate — ajouter un état/une transition ferait dériver les deux docs en silence pendant que crm/workflow_vente/out/MANIFEST.json (byte-gaté par check_artifacts, counts recomptés du workflow_vente_spec.json) dit autre chose → nouveau bloc dans check_readme_claims recomputant (states + transitions) depuis MANIFEST.counts et exigeant l'égalité avec les deux docs (4 morsures : dérive états titre · dérive transitions captée là où états seul est aveugle · dérive états 2e doc · 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 09:36:11 +00:00
parent 6f6a01a472
commit 4d9af3a6b8
3 changed files with 138 additions and 1 deletions
+66
View File
@@ -1,5 +1,71 @@
# Activity Log · 2026-07-31 · Claude Code DTP
## Session `20260731_093041` · Buffer S8 · Domaine CRM (non couvert hors prose « tests ») : le pipeline vente « 9 états · 11 transitions » était transcrit À LA MAIN dans DEUX README de module (titre workflow_vente + « 9 états du pipeline » de dossier_vente, même compte du même graphe) sans AUCUN gate — ajouter un état 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 data-derived des domaines tests, portails (structure), RBAC (3 volets)
et SEO (mots-clés). Cette session cible le **domaine CRM** — la **structure du
pipeline vente**, dont un compte data-derived cité dans deux README de module
pointait le graphe généré sans être recomputé par aucun gate.
### Défaut trouvé — comptes du pipeline ungated, transcrits dans DEUX docs
- **`05_deliverables_mvp/crm/workflow_vente/README.md:23`** : titre de section
« ## Le pipeline (**9** états · **11** transitions) ».
- **`05_deliverables_mvp/crm/dossier_vente/README.md:30`** : « options = les
**9 états** du pipeline » — **même** compte d'états, **dérivé du même graphe**
(source unique · #5), recopié à la main.
- **Pourquoi non gaté** : `check_readme_claims` couvrait tests, portails, RBAC et
SEO — jamais la structure du pipeline CRM. `check_docs` ne valide que les liens ;
`check_artifacts` prouve que `crm/workflow_vente/out/MANIFEST.json` est
**reproductible byte-for-byte** (bloc `counts` = {states, transitions, …}
recomptés de `workflow_vente_spec.json` à chaque build) mais **ne compare pas**
ce que les DEUX docs en **écrivent**. Ajouter un état/une transition ferait
dériver les deux docs **en silence** — même « vert trompeur ».
- **État courant** : **aucun nombre périmé** — 9/11 recoupe 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 states + transitions depuis MANIFEST)
Nouveau bloc qui RECOMPUTE le couple `(states, transitions)` depuis
`crm/workflow_vente/out/MANIFEST.counts` (source déjà byte-gatée · zéro
duplication du compteur du générateur) et exige l'égalité avec **les deux** docs :
le titre du README workflow (`## Le pipeline (N états · M transitions)`) **et** le
compte d'états du README dossier_vente (`les **N états** du pipeline`). Recomputer
**transitions** en plus de **states** mord une dérive du 2ᵉ nombre là où le compte
d'états seul (repris dans dossier_vente) resterait aveugle. Un claim **absent**
échoue AUSSI. En-tête du gate + `ci/README.md` (§ table + § détail) mis à jour.
### Preuves de morsure
| Injection | Résultat |
|---|---|
| **README workflow** états `9→10` (titre) | **exit 1** `dit 10/11 MAIS MANIFEST dit 9/11` |
| **README workflow** transitions `11→12` (états inchangés) | **exit 1** `dit 9/12 MAIS MANIFEST dit 9/11` — mord le 2ᵉ nombre |
| **README dossier_vente** états `9→8` (2e doc) | **exit 1** `dit états=8 MAIS MANIFEST dit états=9` — mord là où le titre seul est aveugle |
| **Claim disparu** (dossier reformulé sans le motif) | **exit 1** `claim « N états du pipeline » INTROUVABLE (attendu états=9)` |
| Restauré | **exit 0** (2 docs 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 states + transitions depuis
`workflow_vente MANIFEST.counts` 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_090037` · Buffer S8 · Domaine SEO : le total ET la ventilation par langue des mots-clés (« 258 mots-clés (fr=87 · en=87 · es=84) »), transcrits À LA MAIN dans DEUX docs (table du README module + ligne de la fiche agent), n'étaient couverts par AUCUN gate — ajouter un projet ferait dériver les deux docs en silence
**Tâche** : **Sprint 8 · buffer L75** (DevOps CI/CD · QA régression). Roadmap