e16c4f676d
Nouveau gate CI bloquant : régénère chaque 05_deliverables_mvp/**/out/ depuis son générateur `build` et exige l'égalité byte-for-byte avec le fichier commité (découverte auto · stdlib pur · zéro pip). Attrape la dérive silencieuse d'un artefact qui auto-résout une valeur depuis un autre module et devient périmé quand la source grandit — dérive qu'aucune suite tests/ (fonctions, pas fichier commité) n'attrapait. Défaut détecté et corrigé par ce gate : demo/scenarios/out/run_sheet.json embarquait ci_modules_count=18 (buildé Sprint 7) alors que qa/audit_4big en compte désormais 21. Régénéré (diff 1 ligne). Consistance live re-vérifiée. Wiring : job check-artifacts + needs du gate agrégé (.gitea/workflows/ci.yml) · doc (ci/README.md). Vérifs : test négatif du gate OK (dérive → EXIT 1), 4 gates statiques EXIT 0, suites CI-parsing vertes (regression/acceptance/audit_4big/demo), 21/21 suites · 534 tests, compteurs dérivés stables. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
343 lines
12 KiB
JSON
343 lines
12 KiB
JSON
{
|
|
"doc": "OTO · Run-sheet démo (méta-livrable)",
|
|
"spec_version": "1.0.0",
|
|
"roadmap_ref": "04_roadmap/ROADMAP_8_WEEKS_OR_LESS.md · Sprint 7 l.68 « CRM + Faisabilité : Scénarios démo (P07 pitch banquier · P05 client ready) »",
|
|
"generated_at": null,
|
|
"scenarios": [
|
|
{
|
|
"id": "S-P07-BANQUIER",
|
|
"projet": "P07",
|
|
"projet_libelle": "Aqua Terra Las Terrenas",
|
|
"audience": "banquier",
|
|
"titre": "P07 Aqua Terra — Pitch banquier (bancabilité & gouvernance)",
|
|
"objectif": "Démontrer qu'un dossier de vente OTO est bancable : pipeline structuré, conformité fiscale e-CF DGII, incitation CONFOTUR, gouvernance RBAC et gate qualité 4Big.",
|
|
"duree_min": 12,
|
|
"modules_cites": [
|
|
"crm/dossier_vente",
|
|
"crm/workflow_vente",
|
|
"fiscal/ecf_dgii",
|
|
"legal/confotur",
|
|
"qa/audit_4big",
|
|
"rbac/apply_plan"
|
|
],
|
|
"beats": [
|
|
{
|
|
"ordre": 1,
|
|
"id": "b1-pipeline",
|
|
"titre": "Un pipeline de vente verrouillé de bout en bout",
|
|
"role_narratif": "Ouvrir sur la traçabilité : la vente n'est pas un tableur, c'est un workflow ERPNext soumis (docstatus) piloté par rôle.",
|
|
"duree_min": 2,
|
|
"evidence": [
|
|
{
|
|
"module": "crm/workflow_vente",
|
|
"file": "out/workflow.json",
|
|
"pointer": "/0/workflow_name",
|
|
"label": "Nom du pipeline",
|
|
"valeur": "OTO Vente Pipeline",
|
|
"resolu": true
|
|
},
|
|
{
|
|
"module": "crm/workflow_vente",
|
|
"file": "out/workflow.json",
|
|
"pointer": "/0/document_type",
|
|
"label": "DocType piloté",
|
|
"valeur": "OTO Dossier Vente",
|
|
"resolu": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"ordre": 2,
|
|
"id": "b2-ecf",
|
|
"titre": "Facturation fiscale conforme DGII (e-CF · Compupar)",
|
|
"role_narratif": "Rassurer sur le risque fiscal : chaque encaissement est un e-CF certifié, pas une facture maison.",
|
|
"duree_min": 2,
|
|
"evidence": [
|
|
{
|
|
"module": "fiscal/ecf_dgii",
|
|
"file": "out/MANIFEST.json",
|
|
"pointer": "/provider",
|
|
"label": "Fournisseur e-CF",
|
|
"valeur": "Compupar",
|
|
"resolu": true
|
|
},
|
|
{
|
|
"module": "fiscal/ecf_dgii",
|
|
"file": "out/MANIFEST.json",
|
|
"pointer": "/counts/tipos_en_scope",
|
|
"label": "Types e-CF en périmètre",
|
|
"valeur": 5,
|
|
"resolu": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"ordre": 3,
|
|
"id": "b3-confotur",
|
|
"titre": "Incitation CONFOTUR dé-risquée et outillée",
|
|
"role_narratif": "Montrer l'avantage fiscal touristique comme un actif documenté : DocType soumis, dépôt outillé.",
|
|
"duree_min": 2,
|
|
"evidence": [
|
|
{
|
|
"module": "legal/confotur",
|
|
"file": "out/MANIFEST.json",
|
|
"pointer": "/doctype_name",
|
|
"label": "DocType CONFOTUR",
|
|
"valeur": "CONFOTUR Application",
|
|
"resolu": true
|
|
},
|
|
{
|
|
"module": "legal/confotur",
|
|
"file": "out/MANIFEST.json",
|
|
"pointer": "/is_submittable",
|
|
"label": "Soumissible (verrou légal)",
|
|
"valeur": true,
|
|
"resolu": true
|
|
},
|
|
{
|
|
"module": "legal/confotur",
|
|
"file": "out/MANIFEST.json",
|
|
"pointer": "/counts/depot_events",
|
|
"label": "Étapes de dépôt outillées",
|
|
"valeur": 2,
|
|
"resolu": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"ordre": 4,
|
|
"id": "b4-rbac",
|
|
"titre": "Séparation des pouvoirs (RBAC 50 rôles)",
|
|
"role_narratif": "Répondre à la question d'audit du banquier : qui peut faire quoi ? Permissions dérivées, pas ad hoc.",
|
|
"duree_min": 2,
|
|
"evidence": [
|
|
{
|
|
"module": "rbac/apply_plan",
|
|
"file": "out/MANIFEST.json",
|
|
"pointer": "/counts/roles",
|
|
"label": "Rôles RBAC",
|
|
"valeur": 50,
|
|
"resolu": true
|
|
},
|
|
{
|
|
"module": "rbac/apply_plan",
|
|
"file": "out/MANIFEST.json",
|
|
"pointer": "/counts/custom_docperm",
|
|
"label": "Permissions DocType (Custom DocPerm)",
|
|
"valeur": 116,
|
|
"resolu": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"ordre": 5,
|
|
"id": "b5-qualite",
|
|
"titre": "Un gate qualité 4Big, pas une promesse",
|
|
"role_narratif": "Clore la confiance : la plateforme s'auto-note et bloque sous 95/100 sur 100 % des livrables.",
|
|
"duree_min": 2,
|
|
"evidence": [
|
|
{
|
|
"module": "qa/audit_4big",
|
|
"file": "out/quality_report.json",
|
|
"pointer": "/pass_score",
|
|
"label": "Seuil bloquant 4Big",
|
|
"valeur": 95,
|
|
"resolu": true
|
|
},
|
|
{
|
|
"module": "qa/audit_4big",
|
|
"file": "out/quality_report.json",
|
|
"pointer": "/coverage/ci_modules_count",
|
|
"label": "Modules sous gate qualité",
|
|
"valeur": 21,
|
|
"resolu": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"ordre": 6,
|
|
"id": "b6-dossier",
|
|
"titre": "Le dossier de vente, pièce bancable finale",
|
|
"role_narratif": "Refermer sur l'objet concret que le banquier instruira : un DocType riche et soumis.",
|
|
"duree_min": 2,
|
|
"evidence": [
|
|
{
|
|
"module": "crm/dossier_vente",
|
|
"file": "out/MANIFEST.json",
|
|
"pointer": "/counts/fields",
|
|
"label": "Champs du dossier de vente",
|
|
"valeur": 30,
|
|
"resolu": true
|
|
},
|
|
{
|
|
"module": "crm/dossier_vente",
|
|
"file": "out/MANIFEST.json",
|
|
"pointer": "/counts/pipeline_states",
|
|
"label": "États de pipeline couverts",
|
|
"valeur": 9,
|
|
"resolu": true
|
|
}
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "S-P05-CLIENT",
|
|
"projet": "P05",
|
|
"projet_libelle": "Las Colinas Najayo Arriba",
|
|
"audience": "client",
|
|
"titre": "P05 Las Colinas Najayo Arriba — Parcours client (réservation prête)",
|
|
"objectif": "Faire vivre le parcours d'un acheteur : découverte du portail, assistance OTOIA, pipeline lisible, dossier transparent, et comment le client nous a trouvés (SEO trilingue).",
|
|
"duree_min": 12,
|
|
"modules_cites": [
|
|
"crm/commissions",
|
|
"crm/dossier_vente",
|
|
"crm/workflow_vente",
|
|
"frontend/chat_otoia",
|
|
"frontend/portails",
|
|
"seo"
|
|
],
|
|
"beats": [
|
|
{
|
|
"ordre": 1,
|
|
"id": "b1-portail",
|
|
"titre": "« Choisir mon unité » — 5 portails luxury",
|
|
"role_narratif": "Poser l'expérience d'entrée : un portail par rôle, cohérent et couvert.",
|
|
"duree_min": 2,
|
|
"evidence": [
|
|
{
|
|
"module": "frontend/portails",
|
|
"file": "out/MANIFEST.json",
|
|
"pointer": "/counts/workspaces",
|
|
"label": "Portails (workspaces)",
|
|
"valeur": 5,
|
|
"resolu": true
|
|
},
|
|
{
|
|
"module": "frontend/portails",
|
|
"file": "out/MANIFEST.json",
|
|
"pointer": "/counts/roles_couverts",
|
|
"label": "Rôles couverts par les portails",
|
|
"valeur": 44,
|
|
"resolu": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"ordre": 2,
|
|
"id": "b2-otoia",
|
|
"titre": "OTOIA répond dans le portail",
|
|
"role_narratif": "Montrer l'assistance embarquée : le client n'est jamais seul face à l'écran.",
|
|
"duree_min": 2,
|
|
"evidence": [
|
|
{
|
|
"module": "frontend/chat_otoia",
|
|
"file": "out/MANIFEST.json",
|
|
"pointer": "/deliverable",
|
|
"label": "Assistant embarqué",
|
|
"valeur": "Chat OTOIA embarqué par portail",
|
|
"resolu": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"ordre": 3,
|
|
"id": "b3-parcours",
|
|
"titre": "Du premier contact à la réservation",
|
|
"role_narratif": "Dérouler le pipeline côté client : Lead → … → Réservation confirmée, lisible et rassurant.",
|
|
"duree_min": 2,
|
|
"evidence": [
|
|
{
|
|
"module": "crm/workflow_vente",
|
|
"file": "out/workflow.json",
|
|
"pointer": "/0/states/0/state",
|
|
"label": "Première étape",
|
|
"valeur": "Lead",
|
|
"resolu": true
|
|
},
|
|
{
|
|
"module": "crm/workflow_vente",
|
|
"file": "out/workflow.json",
|
|
"pointer": "/0/states/3/state",
|
|
"label": "Étape réservation",
|
|
"valeur": "Réservation confirmée",
|
|
"resolu": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"ordre": 4,
|
|
"id": "b4-dossier",
|
|
"titre": "Un dossier de vente transparent",
|
|
"role_narratif": "Donner confiance : tout est consigné dans un dossier structuré que le client peut suivre.",
|
|
"duree_min": 2,
|
|
"evidence": [
|
|
{
|
|
"module": "crm/dossier_vente",
|
|
"file": "out/MANIFEST.json",
|
|
"pointer": "/counts/fields",
|
|
"label": "Champs du dossier de vente",
|
|
"valeur": 30,
|
|
"resolu": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"ordre": 5,
|
|
"id": "b5-commissions",
|
|
"titre": "Un conseiller rémunéré à la transparence",
|
|
"role_narratif": "Aligner l'intérêt du conseiller et du client : barème de commissions traçable par événement.",
|
|
"duree_min": 2,
|
|
"evidence": [
|
|
{
|
|
"module": "crm/commissions",
|
|
"file": "out/MANIFEST.json",
|
|
"pointer": "/bareme_name",
|
|
"label": "Barème de commissions",
|
|
"valeur": "OTO Barème Commissions Ventes",
|
|
"resolu": true
|
|
},
|
|
{
|
|
"module": "crm/commissions",
|
|
"file": "out/MANIFEST.json",
|
|
"pointer": "/counts/evenements",
|
|
"label": "Événements déclencheurs",
|
|
"valeur": 5,
|
|
"resolu": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"ordre": 6,
|
|
"id": "b6-seo",
|
|
"titre": "Comment le client nous a trouvés (SEO trilingue)",
|
|
"role_narratif": "Refermer la boucle acquisition : indexation FR/EN/ES, le parcours commence bien avant le portail.",
|
|
"duree_min": 2,
|
|
"evidence": [
|
|
{
|
|
"module": "seo",
|
|
"file": "out/MANIFEST.json",
|
|
"pointer": "/counts/keywords_total",
|
|
"label": "Mots-clés indexés",
|
|
"valeur": 258,
|
|
"resolu": true
|
|
},
|
|
{
|
|
"module": "seo",
|
|
"file": "out/MANIFEST.json",
|
|
"pointer": "/langs",
|
|
"label": "Langues",
|
|
"valeur": [
|
|
"fr",
|
|
"en",
|
|
"es"
|
|
],
|
|
"resolu": true
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|