# 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/MANIFEST.json fiscal/ecf_dgii 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) 1. **Anti-invention** — chaque citation est **re-résolue indépendamment** depuis le disque et comparée au run-sheet (`_check_anti_invention`). 2. **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). 3. **Orchestration réelle** — chaque scénario tisse **≥ 2 modules distincts** et **≥ 3 beats**, et ne **s'auto-cite jamais** (séparation des pouvoirs). 4. **Prêt à jouer** — l'artefact livré est `pret=true` : 0 citation non résolue, 0 module non gated. Sinon, rien n'est écrit. 5. **Contrat de sortie** — `MANIFEST.json` est validé contre `scenario.schema.json` par le **validateur maison** du Publiciste (draft-07, sans pip · #2). ## Utilisation ```bash # Assemble le run-sheet (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 (32 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 | | `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 | | `out/MANIFEST.json` | Diagnostic + preuve de couverture + drapeau `pret` | ## Hors périmètre worker (VPS · #8) Le rendu final (deck / prompteur / page démo `otov7.com`) et le branchement au `data_room` réel des projets restent **côté serveur** — ce worker n'écrit jamais sur le VPS. Le run-sheet est le **contrat** que ce rendu consommera. ## 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é.