{
  "version": "1.0.0",
  "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 »",
  "description": "Spec machine-lisible du montage de l'assistant conversationnel OTOIA (persona Amélie QC) dans CHAQUE portail rôle. Le carrier natif (#1 ERPNext natif) est le DocType Frappe v15 `Custom Block`, inséré dans le `content` du `Workspace` du portail. Ce fichier ne fait QUE la présentation + la persona : la source de vérité des PORTAILS et de la PORTÉE de connaissance reste le contrat RBAC (rbac_50_roles.json) et le hand-off des Workspaces (frontend/portails). Aucune URL de backend, aucun chiffre, aucune capacité n'est fabriqué ici (anti-invention #6).",
  "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)",
  "persona": {
    "nom": "Amélie",
    "voix": "multilingual_v2",
    "note": "Persona vocale québécoise multilingue. Repris verbatim de CLAUDE.md, jamais fabriqué.",
    "source": "CLAUDE.md §Architecture cible « Voix Amélie QC (multilingual_v2) »"
  },
  "capabilities": [
    {"module": "aec.py", "role": "pilotage AEC (Blender/Bonsai/IFC/Speckle/Flux)", "source": "CLAUDE.md §Architecture cible « OTOIA capabilities : aec.py + knowledge.py + prompt_engine.py + chat.py »"},
    {"module": "knowledge.py", "role": "base de connaissance / RAG", "source": "CLAUDE.md §Architecture cible « OTOIA capabilities : aec.py + knowledge.py + prompt_engine.py + chat.py »"},
    {"module": "prompt_engine.py", "role": "moteur de prompt", "source": "CLAUDE.md §Architecture cible « OTOIA capabilities : aec.py + knowledge.py + prompt_engine.py + chat.py »"},
    {"module": "chat.py", "role": "orchestration conversationnelle", "source": "CLAUDE.md §Architecture cible « OTOIA capabilities : aec.py + knowledge.py + prompt_engine.py + chat.py »"}
  ],
  "langues": {
    "source_ref": "05_deliverables_mvp/seo/seo_spec.json · site.langs",
    "note": "Les codes de langue (FR/EN/ES) et la langue par défaut ne sont PAS dupliqués ici : ils sont DÉRIVÉS du seo_spec (source unique · vente.otov7.com trilingue · #5 zéro duplication)."
  },
  "ui_label": {
    "fr": "Assistant OTOIA",
    "en": "OTOIA Assistant",
    "es": "Asistente OTOIA"
  },
  "endpoint": {
    "valeur": null,
    "statut": "a_confirmer",
    "note": "URL du backend conversationnel OTOIA (desk / bim-cloud VPS) — JAMAIS fabriquée par le worker (#6/#8). L'agent ERPNext Backend la renseigne à l'intégration, avec source."
  },
  "brand": {
    "note": "Tokens de marque luxury dark+doré (CLAUDE.md #4). Appliqués par la couche thème desk sur le VPS (agent Frontend · #8). Repris ici pour le hand-off, jamais fabriqués.",
    "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"}
    ]
  },
  "mount": {
    "html_id_prefix": "otoia-chat-",
    "container_class": "otoia-chat-mount",
    "block_name_prefix": "OTOIA Chat · ",
    "note": "Le `Custom Block` porte un `<div>` de montage vide et déterministe (id dérivé de la clé du portail). Le web-component OTOIA réel + la config runtime (rôles autorisés, portée de connaissance, endpoint) sont branchés côté VPS ; la config par portail est livrée structurée dans chat_mount.json."
  }
}
