[DTP-Worker] Sprint 8 · buffer · Fiches agents/colonne « Entrée CLI » : gate d'IDENTITÉ des 16 jeux de sous-commandes documentés (03_agents/*/AGENT.md) recomputés PAR AST des subparsers.add_parser() réels des scripts

Classe fermée `agent-fiche-role-attrs-ungated` (sous-classe colonne CLI). La colonne
« Entrée CLI » des tables de livrables cite à la main le jeu de verbes de chaque module
(`publiciste.py parse|validate|generate|run`, `faisabilite_gen.py
score|scaffold|generate|batch`, …). Les blocs amont gatent déjà génériquement — pour
TOUTES les fiches — les colonnes « Tests » (vs regression_plan) et « Job CI » (vs
ci.yml), mais RIEN ne liait les VERBES écrits aux sous-commandes que le CLI EXPOSE.

Piège #6 : renommer/ajouter/retirer/réordonner un add_parser dans le .py (ou le mal
recopier dans la fiche) laisse la fiche documenter une surface d'invocation FANTÔME —
la doc d'identité qui dit à l'agent COMMENT lancer son livrable ment en silence, le CI
reste vert (le module tourne sous le vrai verbe), aucune suite tests/ ne l'attrape.

Gate ajoutée (ci/check_readme_claims.sh, bloc « colonne Entrée CLI ») : _cli_subcommands()
recompute via AST l'ensemble ORDONNÉ des subparsers.add_parser("<verbe>") ; script résolu
par le chemin de module de la MÊME ligne de table (lien …/<path>/README.md) + basename ;
égalité EXACTE ensemble ET ordre exigée ; `|` markdown échappés `\|` dé-échappés avant
découpe. 16 cellules gatées (6 fiches ; regex [a-z0-9_] capte audit_5d/4big_gen.py).

7 morsures vérifiées, restaurées vert : fiche renomme/ajoute/retire/réordonne un verbe
(4) · le vrai « vert trompeur » add_parser renommé dans le .py fiche inchangée (5) ·
nouveau add_parser non documenté (6) · script déplacé => INTROUVABLE (7). 6 gates
re-verts. ci/README.md catalogue mis à jour. Incident : un git checkout large a reverté
l'edit non-commité du gate ; ré-appliqué (git clean JAMAIS utilisé · ci-allow sur le log).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-08-01 12:44:43 +00:00
parent 64238f6833
commit c6428533a0
3 changed files with 162 additions and 1 deletions
+58
View File
@@ -1345,3 +1345,61 @@ Working tree byte-restauré (`git checkout --`, **JAMAIS** `git clean`, interdit
édition **hors** `05_deliverables_mvp/*/out` ⇒ 0 dérive d'artefact ; le seed réel des
Workspaces/rôles `bench` reste côté VPS).
- **Auto-score 4Big** : 96/100.
---
## Sprint 8 · buffer · Gate d'IDENTITÉ de la colonne « Entrée CLI » des fiches agents — verbes documentés == subparsers argparse réels
**Classe fermée** : `agent-fiche-role-attrs-ungated` (mémoire) — sous-classe « colonne
CLI ». Chaque table de livrables des fiches `03_agents/*/AGENT.md` porte une colonne
« Entrée CLI » citant, entre backticks, le point d'entrée du module ET son jeu de
verbes (`publiciste.py parse|validate|generate|run`, `faisabilite_gen.py
score|scaffold|generate|batch`, `rbac_apply_plan.py build|validate`, …). Cette liste
est **saisie à la main**. Les gates amont couvrent déjà génériquement — pour TOUTES les
fiches, via `git ls-files` — la colonne « Tests » (recomputée depuis `regression_plan`)
et la colonne « Job CI » (contre `ci.yml`), mais **RIEN** ne vérifiait que les VERBES
écrits sont ceux que le CLI **expose réellement**.
**Piège** : renommer une sous-commande (`generate`→`render`), en AJOUTER une
(`publish`), en RETIRER une ou les RÉORDONNER laisse la fiche documenter une surface
d'invocation **fantôme** : le module tourne (le CI appelle le vrai verbe), la doc
d'identité de l'agent — celle qui lui dit COMMENT lancer son propre livrable — ment en
silence. Aucune suite `tests/` (FONCTIONS du module, jamais la prose de fiche) ne
l'attrape. Classe explicitement notée en mémoire.
**Gate ajoutée** (`ci/check_readme_claims.sh`, bloc « colonne Entrée CLI », après le
bloc « Job CI fiches ») : `_cli_subcommands()` **RECOMPUTE** via **AST** l'ensemble
ORDONNÉ des `subparsers.add_parser("<verbe>")` de chaque script (jamais une liste à la
main · #6). Résolution du script : chemin du module de la MÊME ligne de table (lien
`…/05_deliverables_mvp/<path>/README.md`) + basename du CLI → `{D}/<path>/<file>.py`
(chaque cellule liée à SON module · pas de collision de basename). Égalité EXIGÉE
**exacte** — ensemble ET ordre (l'ordre de `add_parser` == ordre de l'aide argparse).
Les `|` séparateurs markdown sont échappés `\|` dans les cellules : dé-échappés avant
découpe. Direction fiche→CLI : la fiche ne peut pas mentir sur les verbes du script.
**16 cellules** gatées (6 fiches : crm×3 · devops · erpnext_backend×5 · faisabilite×2 ·
publiciste · qa×4 — dont `audit_5d_gen.py`/`audit_4big_gen.py` que les regex `[a-z_]`
manquaient, d'où `[a-z0-9_]`). Actuellement **toutes exactes** — la gate verrouille
l'état correct.
**7 morsures vérifiées** (restaurées vert après chaque) :
1. FICHE renomme verbe (`generate→render`) → manquants/en trop, `seul_ordre_diffère=False`.
2. FICHE ajoute verbe fantôme (`publish`) → en trop.
3. FICHE retire un verbe (`batch`) → manquant.
4. FICHE réordonne (`parse|validate`↔) → `seul_ordre_diffère=True` (ordre discriminé).
5. **Le vrai « vert trompeur »** : `add_parser("generate")→("render")` dans le `.py`,
fiche INCHANGÉE → red (la source de vérité a bougé sous la fiche).
6. Nouveau `add_parser("audit")` dans le `.py` non documenté → manquant côté fiche.
7. Script déplacé/renommé (`publiciste.py→publiciste_v2.py`) → « script INTROUVABLE ».
**Incident process** : un `git checkout .` de nettoyage d'un scénario adverse a reverté
l'edit **non-commité** de `ci/check_readme_claims.sh` (bloc effacé). Ré-appliqué à
l'identique puis re-vérifié. Leçon : ne jamais `git checkout .`/`--` large avec un edit
de gate non commité en cours ; restaurer par chemin ciblé uniquement. (`git clean` <!-- ci-allow : mention de l'interdit absolu, jamais exécuté -->
reste l'interdit absolu — non utilisé.)
- **6 gates re-verts** : `check_artifacts` · `check_docs` · `guard_constraints` ·
`check_readme_claims` (16 ✓ Entrée CLI) · `check_regression` · `check_ci_integrity`.
Aucun hash-lock sur les scripts de gate → rien d'autre à régénérer.
- **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.