[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:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user