[DTP-Worker] Sprint 8 · buffer · Faisabilité/generator : les PARAMÈTRES CANONIQUES du générateur 4 volets (« 3 % édition · 8.5 % marketing · 52 % point d'équilibre · USD+DOP · Cardnet · Letter US ») — la garantie anti-invention (#6) imposée à CHAQUE faisabilité — étaient RECOPIÉS dans genlib/model.py::CANONICAL (le dict émis dans chaque rendu, HORS out/ donc invisible à check_artifacts) ET dans la prose README:28, sans AUCUN ancrage à leur source faisant autorité : les contraintes NON-NÉGOCIABLES #9/#10 de CLAUDE.md. Preuve reproduite : changer CLAUDE.md #9 « Point équilibre 52% → 55% » laisse model.py, le test tests/ ET le README à « 52 % » — tous internement cohérents, TOUS contredisant CLAUDE.md → le générateur émettrait 52 % dans chaque faisabilité alors que le mandat dit 55 %, une invention silencieuse de la classe même que #6 interdit. PIÈGE : model.py n'est pas un out/*.json (check_artifacts aveugle) et le SEUL contrôle existant (test_generator.py::test_canonical_params_always_present) assert que le RENDU contient « 3 % »/« 52 % »… mais ces marqueurs sont HARDCODÉS DANS le test — une copie de plus, JAMAIS comparée à CLAUDE.md → aucune suite tests/ (qui teste des FONCTIONS, pas l'ancrage) n'attrape la dérive. Même esprit que le catalogue projets dossier_vente et le roadmap-anchor (INV11) : on ANCRE les consommateurs à leur source. Nouveau bloc dans ci/check_readme_claims.sh : RECOMPUTE les 6 valeurs depuis les lignes #9/#10 de CLAUDE.md (zéro duplication · source unique) et exige qu'elles égalent EXACTEMENT (1) model.py::CANONICAL (% par valeur numérique · textes accent/espace-insensibles via NFKD) et (2) l'énumération de la prose README (set-diff absent ET en trop). Sanity CLAUDE.md en bonus (3 pcts + 3 valeurs en gras lisibles). Un claim absent échoue AUSSI. 7 morsures vérifiées : CLAUDE.md #9 52 %→55 % (model + README stale · model.py DÉRIVE point_equilibre) · model.py marketing 8.5 %→9 % · CLAUDE.md #10 Cardnet→Azul (model stale · paiement) · README retire Letter US (absents=[letterus]) · README ajoute token IBAN (en trop=[iban]) · énumération README supprimée (INTROUVABLE) · model.py USD + DOP → USD (devises) ; restauré = green : CLAUDE.md #9/#10 == model.py CANONICAL (6 valeurs) == prose README · exit 0. État courant : aucune valeur périmée (anti-invention #6, rien à réécrire) — le défaut est la surface ungated. ci/README.md (table + détail « paramètres canoniques ancrés sur CLAUDE.md #9/#10 ») mis à jour · 7 gates re-verts.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-07-31 20:08:05 +00:00
parent 7934081bc2
commit 342b571b29
3 changed files with 208 additions and 1 deletions
+62
View File
@@ -1,5 +1,67 @@
# Activity Log · 2026-07-31 · Claude Code DTP
## Session `20260731_200130` · Buffer S8 · Domaine Faisabilité/generator : les **paramètres canoniques** du générateur 4 volets (« `3 %` édition · `8.5 %` marketing · `52 %` point d'équilibre · `USD+DOP` · `Cardnet` · `Letter US` ») — la garantie anti-invention (#6) du module, imposée à CHAQUE faisabilité — étaient **RECOPIÉS** dans `genlib/model.py::CANONICAL` (dict émis dans chaque rendu, **hors `out/`** donc invisible à check_artifacts) **et** dans la prose README:28, **sans aucun ancrage** à leur source faisant autorité : les contraintes NON-NÉGOCIABLES **#9/#10 de CLAUDE.md**.
**Tâche** : **Sprint 8 · buffer** (DevOps CI/CD · QA). Roadmap fonctionnellement
close ; poursuite de la série anti-dérive (CLAUDE.md #6). Cette session ANCRE une
surface data-derived jamais gatée — les 6 valeurs canoniques du générateur de
faisabilité — à CLAUDE.md, comme le catalogue projets `dossier_vente` et le
roadmap-anchor (INV11).
**Dérive silencieuse fermée** :
- Source faisant autorité : **CLAUDE.md #9** (« Frais édition doc 3% · Marketing
8.5% · Point équilibre 52% ») + **#10** (« USD + DOP devises · Letter US format
· Cardnet paiements »).
- Consommateurs NON gatés : (a) `05_deliverables_mvp/faisabilite/generator/genlib/model.py`
`CANONICAL` — le dict émis TEL QUEL dans chaque rendu, qui n'est **pas** un
`out/*.json` → jamais vu par `check_artifacts` ; (b) `README.md:28` qui les
énumère.
- **Seul contrôle existant** : `tests/test_generator.py::test_canonical_params_always_present`
assert que le RENDU contient « `3 %` », « `52 %` »… — mais ces marqueurs sont
**hardcodés DANS le test**, une copie de plus, JAMAIS comparée à CLAUDE.md. Donc
si la contrainte #9 change (`52 %→55 %`), model.py, le test ET le README restent
`52 %` : **tous internement cohérents, TOUS contredisant CLAUDE.md** → le
générateur émettrait `52 %` dans chaque faisabilité alors que le mandat dit
`55 %` : une **invention silencieuse** de la classe même que #6 interdit, qu'aucune
suite `tests/` (qui teste des FONCTIONS, pas l'ancrage à CLAUDE.md) n'attrape.
- **État courant** : **aucune valeur périmée** — les 6 canoniques recoupent
CLAUDE.md exactement (anti-invention #6, rien à réécrire). Le défaut est la
**surface ungated**.
**Nouveau bloc dans `ci/check_readme_claims.sh`** : RECOMPUTE les 6 valeurs depuis
les lignes #9/#10 de CLAUDE.md (zéro duplication · source unique) et exige qu'elles
égalent **exactement** (1) `model.py::CANONICAL` (% par valeur numérique · textes
accent/espace-insensibles via NFKD) et (2) l'énumération de la prose README (set-diff
absent ET en trop). Sanity CLAUDE.md en bonus (les 3 pcts + 3 valeurs en gras lisibles).
Un claim absent échoue AUSSI (traçabilité).
### Preuve (7 morsures vérifiées + restauration verte)
| Injection | Résultat |
|---|---|
| CLAUDE.md #9 `52 %→55 %` (model + README stale) | ✗ model.py DÉRIVE : `point_equilibre_pct='52 %'` attendu 55% (+ README) · exit 1 |
| model.py marketing `8.5 %→9 %` | ✗ model.py DÉRIVE : `marketing_pct='9 %'` attendu 8.5% · exit 1 |
| CLAUDE.md #10 `Cardnet→Azul` (model stale) | ✗ model.py DÉRIVE : `paiement='Cardnet'` attendu 'Azul' (+ README) · exit 1 |
| README retire `Letter US` | ✗ prose absents=`[letterus]` · exit 1 |
| README ajoute un token `IBAN` | ✗ prose en trop=`[iban]` · exit 1 |
| README énumération supprimée (reformulée) | ✗ « paramètres canoniques (… CLAUDE.md #9/#10) » INTROUVABLE · exit 1 |
| model.py `USD + DOP → USD` | ✗ model.py DÉRIVE : `devises='USD'` attendu 'USD + DOP' · exit 1 |
| restauré | ✓ CLAUDE.md #9/#10 == model.py CANONICAL (6 valeurs) == prose README · exit 0 |
- **`ci/README.md`** — surface ajoutée à la table récap du pipeline + paragraphe
descriptif (« paramètres canoniques ancrés sur CLAUDE.md #9/#10 »).
Suite CI complète re-verte (7 gates) : `guard_constraints` · `validate_json` ·
`check_docs` · `check_artifacts` · `check_regression` · `check_ci_integrity` ·
`check_readme_claims`.
**Hors périmètre worker (VPS · #8)** : néant (gate bash/python3 stdlib en-repo ;
édition **hors** `05_deliverables_mvp/*/out` ⇒ 0 dérive d'artefact).
**Auto-score 4Big** : 96/100.
---
## Session `20260731_183124` · Buffer S8 · Domaine CRM/dossier_vente (2ᵉ surface) : le **catalogue de projets** du DocType porteur (« Projet (`Select` **P01..P09** ancré sur CLAUDE.md) ») était **ancré à CLAUDE.md EN PROSE** sans AUCUN gate d'identité — le bloc CRM pipeline existant ne recompute que le COMPTE d'états (« les **9 états** du pipeline ») du même README.
**Tâche** : **Sprint 8 · buffer L60** (DevOps CI/CD · QA). Roadmap fonctionnellement