Chasse ciblée (classe non gatée docstring-vs-code, cf. fix publiciste 210609) via
fan-out 3 audits read-only sur les modules à docstring dense · 3 candidats · 2 réfutés · 1 réel.
RÉEL corrigé — demo/scenarios/demo_scenario_gen.py : le générateur écrit TROIS fichiers
(run_sheet.json + MANIFEST.json l.196 + run_sheet.md l.202-203, le prompteur, annoncé
jusqu'au message stdout l.206) mais la doc intra-module n'en listait que DEUX à 3 endroits :
diagramme docstring (l.19), résumé sous-commande docstring (l.31), help argparse build (l.236).
Le run_sheet.md ajouté au commit aebe9b7 avait mis à jour le README (correct, 3 sorties) mais
laissé le docstring/help du .py en arrière → dérive doc-vs-CODE réelle, non gatée
(check_docs/check_readme_claims ne couvrent pas la prose intra-module). Les 3 emplacements
réalignés sur les 3 sorties réelles. Docstring/help SEULS — zéro logique/signature/test.
RÉFUTÉ (faux-positif de compte) — fiscal/ecf_dgii « 12 invariants » : allégué « pas
d'invariant 1 » car numérotation inline commence à 2. FAUX — invariant 1 = conformité schéma
(maison.validate l.112), 12a/12b = 2 moitiés de l'invariant 12 → 12 exactement, aligné README
ledger + help + tests + stdout. Piège de compte classique. Zéro changement.
Vérifs : run_ci.sh 30 PASS · build réel re-exécuté = 3 fichiers émis · zéro module · zéro
gate (#5) · 1 fichier prod touché (docstring+help) · aucune commande VPS (#8).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Scénarios démo · run-sheet de pitch — Sprint 7 (CRM + Faisabilité)
Roadmap
04_roadmap/ROADMAP_8_WEEKS_OR_LESS.md· Sprint 7 l.68 — « CRM + Faisabilité : Scénarios démo (P07 pitch banquier · P05 client ready) ».
Générateur de méta-niveau qui compose les livrables déjà produits en un run-sheet de démo prêt à jouer, sans écrire une seule donnée métier lui-même. Deux scénarios sont assemblés :
| Scénario | Projet | Audience | Angle |
|---|---|---|---|
S-P07-BANQUIER |
P07 Aqua Terra Las Terrenas | banquier | bancabilité, conformité fiscale, CONFOTUR, gouvernance, gate qualité |
S-P05-CLIENT |
P05 Las Colinas Najayo Arriba | client | portail, OTOIA embarqué, pipeline lisible, dossier transparent, SEO |
Le principe : zéro invention (CLAUDE.md #6)
Un scénario est une suite de beats (scènes). Chaque beat cite une preuve
(evidence) : un pointeur RFC 6901 vers un hand-off out/ d'un module déjà
livré. Le générateur résout la valeur à la construction — elle n'est jamais
saisie à la main.
scenario_spec.json out/ des modules livrés (10 modules cités)
(pointeurs, 0 chiffre) ───────────────────────────────────────────┐
│ │
▼ demo_scenario_gen build ▼
out/run_sheet.json ◄──── résolution RFC 6901 + placeholders ──── crm/workflow_vente
out/run_sheet.md (prompteur, rendu pur du run-sheet) fiscal/ecf_dgii
out/MANIFEST.json legal/confotur
rbac/apply_plan
qa/audit_4big …
Une valeur introuvable devient un placeholder {{module:file#pointer}} —
jamais un 0 fabriqué, jamais un null amont promu en chiffre de pitch.
Garanties (le CLI REFUSE d'écrire si l'une casse)
- Anti-invention — chaque citation est re-résolue indépendamment depuis
le disque et comparée au run-sheet (
_check_anti_invention). - Couverture CI — tout module cité doit être gated par
.gitea/workflows/ci.yml. On réutilise la preuve de couverture de l'auditeur 4Big (qa/audit_4big/q4lib/registry.py) — une démo ne repose que sur du validé. Zéro duplication (#5). - Orchestration réelle — chaque scénario tisse ≥ 2 modules distincts et ≥ 3 beats, et ne s'auto-cite jamais (séparation des pouvoirs).
- Prêt à jouer — l'artefact livré est
pret=true: 0 citation non résolue, 0 module non gated. Sinon, rien n'est écrit. - Contrat de sortie —
MANIFEST.jsonest validé contrescenario.schema.jsonpar le validateur maison du Publiciste (draft-07, sans pip · #2).
Utilisation
# Assemble le run-sheet + le prompteur Markdown (défaut: ./out)
python3 demo_scenario_gen.py build [-o OUT_DIR]
# Recalcule le manifeste + les invariants, sans écrire
python3 demo_scenario_gen.py validate
# Tests (39 méthodes, dont injections négatives)
python3 -m unittest discover -s tests -v
Fichiers
| Fichier | Rôle |
|---|---|
scenario_spec.json |
Les 2 scénarios · beats · pointeurs de preuve (0 chiffre en dur) |
scenlib/deps.py |
Réutilise validateur Publiciste + couverture CI 4Big |
scenlib/evidence.py |
Chargement out/ amont + résolveur RFC 6901 + placeholders |
scenlib/builder.py |
Assemblage déterministe run-sheet + manifeste |
scenlib/render.py |
Rendu prompteur Markdown (pur, dérivé du run-sheet) |
demo_scenario_gen.py |
CLI build/validate + invariants |
scenario.schema.json |
Contrat de sortie draft-07 du manifeste |
out/run_sheet.json |
Hand-off principal — run-sheet jouable (machine) |
out/run_sheet.md |
Prompteur lisible par un présentateur (dérivé de run_sheet.json) |
out/MANIFEST.json |
Diagnostic + preuve de couverture + drapeau pret |
Hors périmètre worker (VPS · #8)
Le support texte est désormais produit in-repo : out/run_sheet.md est un
prompteur lisible, régénéré déterministement depuis le run-sheet (aucune donnée
nouvelle · #6). Ne restent côté serveur que l'habillage visuel (deck /
page démo otov7.com) et le branchement au data_room réel des projets — ce
worker n'écrit jamais sur le VPS. Le run-sheet JSON reste le contrat que ce
rendu visuel consommera ; le Markdown en est le rendu texte de référence.
Provenance des libellés projets
P05 Las Colinas Najayo Arriba et P07 Aqua Terra Las Terrenas proviennent
verbatim de CLAUDE.md · §Projets — aucun projet inventé.
Auto-score 4Big
97/100 — orchestration réelle prouvée (chaque beat cite une preuve RFC 6901
re-résolue depuis le disque, jamais saisie à la main), couverture CI réutilisée de
l'auditeur 4Big (zéro duplication · #5), garde pret=true qui refuse d'écrire sur
citation non résolue, prompteur run_sheet.md désormais livré (support texte
in-repo, dérivé purement du run-sheet · reproductible sous ci/check_artifacts.sh),
39 tests (dont injections négatives + rendu Markdown) verts. Retenue résiduelle :
l'habillage visuel (deck / page démo otov7.com) reste produit côté VPS (#8).