[DTP-Worker] Sprint 7 · Générateur Scénarios démo (run-sheet P07 banquier / P05 client) (CRM+Faisabilité · roadmap L68)

Orchestrateur méta-niveau : compose les hand-offs out/ des 10 modules déjà
livrés en un run-sheet de démo jouable, via pointeurs RFC 6901 résolus à la
construction (zéro chiffre en dur · #6). Réutilise le validateur Publiciste et
la preuve de couverture CI de l'auditeur 4Big (#5) — une démo ne s'appuie que
sur des modules gated. Enregistre demo/scenarios dans l'audit 4Big (17→18,
verdict PASS 18/18 à 100). 32 tests (9 injections négatives) · régression 474
tests verts · guards CI verts · builds déterministes.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-07-30 10:39:24 +00:00
parent a517619432
commit cac65386ab
19 changed files with 1691 additions and 11 deletions
@@ -4,7 +4,7 @@
"audit": "OTO QA · Audit 4Big Qualité",
"version": "1.0",
"verdict": "PASS",
"modules_audited": 17,
"modules_audited": 18,
"min_score": 100,
"pass_score": 95,
"coverage_ok": true,
@@ -5,8 +5,8 @@
"pass_score": 95,
"coverage": {
"ok": true,
"ci_modules_count": 17,
"registry_modules_count": 17,
"ci_modules_count": 18,
"registry_modules_count": 18,
"missing_in_registry": [],
"missing_in_ci": [],
"not_in_gate": [],
@@ -717,11 +717,53 @@
"evidence": "MANIFEST + 3 artefact(s) JSON valides"
}
]
},
{
"id": "demo-scenarios",
"path": "demo/scenarios",
"sprint": "S7",
"archetype": "generator",
"applicable_weight": 100,
"earned_weight": 100,
"score": 100,
"verdict": "PASS",
"checks": [
{
"criterion": "DOC",
"weight": 20,
"passed": true,
"evidence": "README.md (4486 octets)"
},
{
"criterion": "CONTRAT",
"weight": 20,
"passed": true,
"evidence": "scenario.schema.json"
},
{
"criterion": "TESTS",
"weight": 25,
"passed": true,
"evidence": "32 méthodes test_* dans 1 fichier(s) (seuil 8)"
},
{
"criterion": "CLI",
"weight": 15,
"passed": true,
"evidence": "demo_scenario_gen.py (argparse + __main__)"
},
{
"criterion": "HANDOFF",
"weight": 20,
"passed": true,
"evidence": "MANIFEST + 1 artefact(s) JSON valides"
}
]
}
],
"totals": {
"modules": 17,
"pass": 17,
"modules": 18,
"pass": 18,
"fail": 0,
"min_score": 100,
"max_score": 100,
@@ -731,6 +773,6 @@
"notes": [
"Audit de MÉTA-NIVEAU : chaque note de module est CALCULÉE depuis des faits du dépôt (présence README/schéma, nombre de méthodes test_*, entrypoint CLI, intégrité out/) — jamais saisie à la main (#6).",
"Un critère non applicable à l'archétype d'un module est EXCLU du dénominateur (pas de pénalité pour un hand-off qu'un module de contrat n'a jamais vocation à produire) ; les poids restants sont renormalisés à 100.",
"Le verdict global est PASS si et seulement si les 17 modules atteignent ≥ 95/100 ET la couverture == 100% des livrables gated (hors auditeur)."
"Le verdict global est PASS si et seulement si les 18 modules atteignent ≥ 95/100 ET la couverture == 100% des livrables gated (hors auditeur)."
]
}
@@ -77,11 +77,12 @@
{ "id": "legal-confotur", "path": "legal/confotur", "sprint": "S5", "archetype": "generator", "source": "roadmap Sprint 5 · DocType CONFOTUR Application · ci.yml legal-confotur-tests" },
{ "id": "qa-audit-5d", "path": "qa/audit_5d", "sprint": "S5", "archetype": "generator", "source": "roadmap Sprint 5 · Audit 5D conformité · ci.yml qa-audit-5d-tests" },
{ "id": "seo", "path": "seo", "sprint": "S6", "archetype": "generator", "source": "roadmap Sprint 6 · SEO trilingue mots-clés/schema.org/hreflang · ci.yml seo-tests" },
{ "id": "frontend-chat-otoia", "path": "frontend/chat_otoia", "sprint": "S6", "archetype": "generator", "source": "roadmap Sprint 6 · Chat OTOIA embarqué (Custom Block) · ci.yml chat-otoia-tests" }
{ "id": "frontend-chat-otoia", "path": "frontend/chat_otoia", "sprint": "S6", "archetype": "generator", "source": "roadmap Sprint 6 · Chat OTOIA embarqué (Custom Block) · ci.yml chat-otoia-tests" },
{ "id": "demo-scenarios", "path": "demo/scenarios", "sprint": "S7", "archetype": "generator", "source": "roadmap Sprint 7 · Scénarios démo (P07 banquier / P05 client) · ci.yml demo-scenario-tests" }
],
"notes": [
"Audit de MÉTA-NIVEAU : chaque note de module est CALCULÉE depuis des faits du dépôt (présence README/schéma, nombre de méthodes test_*, entrypoint CLI, intégrité out/) — jamais saisie à la main (#6).",
"Un critère non applicable à l'archétype d'un module est EXCLU du dénominateur (pas de pénalité pour un hand-off qu'un module de contrat n'a jamais vocation à produire) ; les poids restants sont renormalisés à 100.",
"Le verdict global est PASS si et seulement si les 17 modules atteignent ≥ 95/100 ET la couverture == 100% des livrables gated (hors auditeur)."
"Le verdict global est PASS si et seulement si les 18 modules atteignent ≥ 95/100 ET la couverture == 100% des livrables gated (hors auditeur)."
]
}
@@ -259,7 +259,7 @@ class BuildTest(unittest.TestCase):
def test_real_build_passes_gate(self):
self.assertEqual(self.report["verdict"], "PASS")
self.assertEqual(self.report["totals"]["fail"], 0)
self.assertEqual(self.report["totals"]["modules"], 17)
self.assertEqual(self.report["totals"]["modules"], 18)
self.assertGreaterEqual(self.report["totals"]["min_score"], 95)
def test_invariants_clean_on_real_report(self):
@@ -318,7 +318,7 @@ class InvariantGuardTest(unittest.TestCase):
m["verdict"] = "PASS" if m["score"] >= 95 else "FAIL"
bad["totals"]["fail"] = sum(1 for x in bad["modules"]
if x["verdict"] != "PASS")
bad["totals"]["pass"] = 17 - bad["totals"]["fail"]
bad["totals"]["pass"] = 18 - bad["totals"]["fail"]
bad["verdict"] = "FAIL"
errs = gen.check_invariants(bad, self.spec)
# Le rapport est cohérent en interne mais porte un FAIL → INV7 le signale.