[DTP-Worker] Sprint 6 · Générateur Chat OTOIA embarqué par portail (Custom Block natif) (ERPNext Backend · roadmap L63)
CI / Contraintes NON-NÉGOCIABLES (CLAUDE.md) (push) Has been cancelled
CI / Validation JSON (schémas Faisabilité) (push) Has been cancelled
CI / Qualité documentaire (liens + 4Big) (push) Has been cancelled
CI / Publiciste · parser + schéma + generator (unittest) (push) Has been cancelled
CI / RBAC · 50 rôles + schéma (unittest) (push) Has been cancelled
CI / Faisabilité · générateur 4 volets + round-trip (unittest) (push) Has been cancelled
CI / RBAC · fixtures ERPNext (Role + Custom DocPerm) (push) Has been cancelled
CI / RBAC · plan User Permission (row-level) (push) Has been cancelled
CI / RBAC · Role Profile (bundles par portail) (push) Has been cancelled
CI / RBAC · run-book d'application unifié (agrégat 3 volets) (push) Has been cancelled
CI / Faisabilité · dossier bancable trilingue FR/EN/ES (push) Has been cancelled
CI / CRM · workflow vente ERPNext (lead → CONFOTUR) (push) Has been cancelled
CI / CRM · DocType porteur OTO Dossier Vente (push) Has been cancelled
CI / CRM · barème commissions vendeurs (push) Has been cancelled
CI / Fiscal · e-CF DGII (Compupar) (push) Has been cancelled
CI / Frontend · Workspaces 5 portails rôle (push) Has been cancelled
CI / Legal · DocType CONFOTUR Application (push) Has been cancelled
CI / QA · Audit 5D conformité (push) Has been cancelled
CI / SEO · mots-clés trilingues + schema.org + hreflang (push) Has been cancelled
CI / Chat OTOIA · montage par portail (Custom Block) (push) Has been cancelled
CI / E2E baseline Playwright (manuel) (push) Has been cancelled
CI / Gate qualité (agrégat) (push) Has been cancelled

Carrier natif ERPNext v15 (Custom Block) + config runtime par portail.
Ancrage RBAC : roles_allowed/knowledge_scope = surface exacte du portail,
synchronisés avec les Has Role des Workspaces. Endpoint OTOIA null (a_confirmer).
Persona Amélie + capabilities + langues FR/EN/ES sourcés (anti-invention #6).
14 invariants · 31 tests · régression 408 tests verts.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-07-30 09:37:51 +00:00
parent 0d3b2420c3
commit 17ad5c0a01
17 changed files with 1712 additions and 1 deletions
@@ -0,0 +1,98 @@
{
"deliverable": "Chat OTOIA embarqué par portail",
"sprint": "Sprint 6 · ERPNext Backend",
"roadmap_ref": "04_roadmap/ROADMAP_8_WEEKS_OR_LESS.md · Sprint 6 l.63 « ERPNext Backend : Chat OTOIA embedded dans chaque portail »",
"generated_from": "rbac_50_roles.json (rôles + permissions_cibles par portail) + frontend/portails/portails_spec.json (portails) + frontend/portails/out/workspace.json (Has Role réels) + seo/seo_spec.json (langues trilingues)",
"carrier": {
"doctype": "Custom Block",
"workspace_content_block_type": "custom_block",
"note": "Chaque Custom Block est inséré dans le `content` (editor.js) du Workspace de son portail via un bloc `custom_block` référençant `block_name`. La clé exacte du payload editor.js est a_confirmer selon le patch de version v15 — étape VPS (agent Frontend)."
},
"persona": {
"nom": "Amélie",
"voix": "multilingual_v2"
},
"langues": [
"fr",
"en",
"es"
],
"lang_defaut": "fr",
"capabilities": [
"aec.py",
"knowledge.py",
"prompt_engine.py",
"chat.py"
],
"endpoint_statut": "a_confirmer",
"counts": {
"portails": 5,
"custom_blocks": 5,
"mounts": 5,
"roles_couverts": 44,
"knowledge_doctypes_uniques": 35
},
"portails": [
{
"portail": "ventes",
"workspace": "OTO Ventes",
"custom_block": "OTOIA Chat · OTO Ventes",
"nb_roles": 12,
"nb_knowledge_doctypes": 11
},
{
"portail": "construction",
"workspace": "OTO Construction",
"custom_block": "OTOIA Chat · OTO Construction",
"nb_roles": 10,
"nb_knowledge_doctypes": 9
},
{
"portail": "achat",
"workspace": "OTO Achat",
"custom_block": "OTOIA Chat · OTO Achat",
"nb_roles": 5,
"nb_knowledge_doctypes": 8
},
{
"portail": "compta",
"workspace": "OTO Compta",
"custom_block": "OTOIA Chat · OTO Compta",
"nb_roles": 8,
"nb_knowledge_doctypes": 11
},
{
"portail": "direction",
"workspace": "OTO Direction",
"custom_block": "OTOIA Chat · OTO Direction",
"nb_roles": 9,
"nb_knowledge_doctypes": 14
}
],
"brand": {
"fond": {
"valeur": "#0a0a12",
"source": "CLAUDE.md #4"
},
"accent": {
"valeur": "#f0b429",
"source": "CLAUDE.md #4"
},
"polices": [
{
"valeur": "Fraunces",
"source": "CLAUDE.md #4"
},
{
"valeur": "Cormorant Garamond",
"source": "CLAUDE.md #4"
}
]
},
"handoff_vps": [
"Créer/confirmer le module propriétaire OTO côté app puis importer les fixtures `Custom Block` (bench).",
"Insérer dans le `content` de chaque Workspace (frontend/portails/out/workspace.json) un bloc `custom_block` référençant `block_name` (payload editor.js a_confirmer selon version).",
"Renseigner l'endpoint OTOIA (desk/bim-cloud) dans la config runtime + charger le web-component OTOIA via le thème desk (agent Frontend · #8).",
"Appliquer les tokens de marque dark+doré (#4) au montage via le thème."
]
}
@@ -0,0 +1,259 @@
[
{
"portail": "ventes",
"workspace": "OTO Ventes",
"custom_block": "OTOIA Chat · OTO Ventes",
"html_id": "otoia-chat-ventes",
"persona": {
"nom": "Amélie",
"voix": "multilingual_v2"
},
"langues": [
"fr",
"en",
"es"
],
"lang_defaut": "fr",
"ui_label": {
"fr": "Assistant OTOIA",
"en": "OTOIA Assistant",
"es": "Asistente OTOIA"
},
"roles_allowed": [
"OTO Marketing Directeur",
"OTO Marketing Publiciste",
"OTO Marketing SEO",
"OTO Marketing Social",
"OTO Ventes Après-Vente",
"OTO Ventes CONFOTUR",
"OTO Ventes Chef Équipe",
"OTO Ventes Conseiller",
"OTO Ventes Contrats",
"OTO Ventes Courtier Externe",
"OTO Ventes Directeur",
"OTO Ventes Réservations"
],
"knowledge_scope": [
"CONFOTUR Application",
"Customer",
"Issue",
"Lead",
"Opportunity",
"Payment Entry",
"Publiciste Log",
"Quotation",
"Sales Invoice",
"Sales Order",
"Web Page"
],
"capabilities": [
"aec.py",
"knowledge.py",
"prompt_engine.py",
"chat.py"
],
"endpoint": null
},
{
"portail": "construction",
"workspace": "OTO Construction",
"custom_block": "OTOIA Chat · OTO Construction",
"html_id": "otoia-chat-construction",
"persona": {
"nom": "Amélie",
"voix": "multilingual_v2"
},
"langues": [
"fr",
"en",
"es"
],
"lang_defaut": "fr",
"ui_label": {
"fr": "Assistant OTOIA",
"en": "OTOIA Assistant",
"es": "Asistente OTOIA"
},
"roles_allowed": [
"OTO Construction Architecte",
"OTO Construction BIM",
"OTO Construction Chef Projet",
"OTO Construction Directeur",
"OTO Construction Ingénieur",
"OTO Construction QAQC",
"OTO Construction Sous-traitants",
"OTO Faisabilité IFC Speckle",
"OTO Faisabilité Rendu 3D",
"OTO Faisabilité Économiste"
],
"knowledge_scope": [
"Faisabilité",
"File",
"Item",
"Material Request",
"Project",
"Purchase Order",
"Quality Inspection",
"Task",
"Timesheet"
],
"capabilities": [
"aec.py",
"knowledge.py",
"prompt_engine.py",
"chat.py"
],
"endpoint": null
},
{
"portail": "achat",
"workspace": "OTO Achat",
"custom_block": "OTOIA Chat · OTO Achat",
"html_id": "otoia-chat-achat",
"persona": {
"nom": "Amélie",
"voix": "multilingual_v2"
},
"langues": [
"fr",
"en",
"es"
],
"lang_defaut": "fr",
"ui_label": {
"fr": "Assistant OTOIA",
"en": "OTOIA Assistant",
"es": "Asistente OTOIA"
},
"roles_allowed": [
"OTO Achat Acheteur",
"OTO Achat Directeur",
"OTO Achat Fournisseurs",
"OTO Achat Magasinier",
"OTO Achat Réception"
],
"knowledge_scope": [
"Contact",
"Item",
"Material Request",
"Purchase Order",
"Purchase Receipt",
"Request for Quotation",
"Stock Entry",
"Supplier"
],
"capabilities": [
"aec.py",
"knowledge.py",
"prompt_engine.py",
"chat.py"
],
"endpoint": null
},
{
"portail": "compta",
"workspace": "OTO Compta",
"custom_block": "OTOIA Chat · OTO Compta",
"html_id": "otoia-chat-compta",
"persona": {
"nom": "Amélie",
"voix": "multilingual_v2"
},
"langues": [
"fr",
"en",
"es"
],
"lang_defaut": "fr",
"ui_label": {
"fr": "Assistant OTOIA",
"en": "OTOIA Assistant",
"es": "Asistente OTOIA"
},
"roles_allowed": [
"OTO Compta Audit UAF",
"OTO Compta Clients AR",
"OTO Compta Contrôle Gestion",
"OTO Compta Fiscaliste eCF",
"OTO Compta Fournisseurs AP",
"OTO Compta Général",
"OTO Compta Paie",
"OTO Compta Trésorier"
],
"knowledge_scope": [
"Account",
"Bank Transaction",
"Budget",
"Cost Center",
"Employee",
"GL Entry",
"Journal Entry",
"Payment Entry",
"Purchase Invoice",
"Salary Slip",
"Sales Invoice"
],
"capabilities": [
"aec.py",
"knowledge.py",
"prompt_engine.py",
"chat.py"
],
"endpoint": null
},
{
"portail": "direction",
"workspace": "OTO Direction",
"custom_block": "OTOIA Chat · OTO Direction",
"html_id": "otoia-chat-direction",
"persona": {
"nom": "Amélie",
"voix": "multilingual_v2"
},
"langues": [
"fr",
"en",
"es"
],
"lang_defaut": "fr",
"ui_label": {
"fr": "Assistant OTOIA",
"en": "OTOIA Assistant",
"es": "Asistente OTOIA"
},
"roles_allowed": [
"OTO Conseil Administration",
"OTO Direction Commerciale",
"OTO Direction Financière",
"OTO Direction Générale",
"OTO Direction Opérations",
"OTO Direction Président",
"OTO Faisabilité Analyste",
"OTO Legal Directeur",
"OTO Legal ONAPI"
],
"knowledge_scope": [
"CONFOTUR Application",
"Contract",
"Faisabilité",
"Journal Entry",
"Lead",
"Opportunity",
"Payment Entry",
"Project",
"Purchase Invoice",
"Purchase Order",
"Quotation",
"Sales Invoice",
"Sales Order",
"Task"
],
"capabilities": [
"aec.py",
"knowledge.py",
"prompt_engine.py",
"chat.py"
],
"endpoint": null
}
]
@@ -0,0 +1,27 @@
[
{
"doctype": "Custom Block",
"block_name": "OTOIA Chat · OTO Ventes",
"html": "<div class=\"otoia-chat-mount\" id=\"otoia-chat-ventes\" data-portail=\"ventes\" data-assistant=\"Amélie\"></div>"
},
{
"doctype": "Custom Block",
"block_name": "OTOIA Chat · OTO Construction",
"html": "<div class=\"otoia-chat-mount\" id=\"otoia-chat-construction\" data-portail=\"construction\" data-assistant=\"Amélie\"></div>"
},
{
"doctype": "Custom Block",
"block_name": "OTOIA Chat · OTO Achat",
"html": "<div class=\"otoia-chat-mount\" id=\"otoia-chat-achat\" data-portail=\"achat\" data-assistant=\"Amélie\"></div>"
},
{
"doctype": "Custom Block",
"block_name": "OTOIA Chat · OTO Compta",
"html": "<div class=\"otoia-chat-mount\" id=\"otoia-chat-compta\" data-portail=\"compta\" data-assistant=\"Amélie\"></div>"
},
{
"doctype": "Custom Block",
"block_name": "OTOIA Chat · OTO Direction",
"html": "<div class=\"otoia-chat-mount\" id=\"otoia-chat-direction\" data-portail=\"direction\" data-assistant=\"Amélie\"></div>"
}
]