{
  "runbook": "OTO Enterprise OS · Run-book de déploiement VPS unifié",
  "version": "1.0",
  "reference_cadre": "Roadmap Sprint 8 · DevOps « Deployment production complet + monitoring » · CLAUDE.md #8 (VPS pour TOUS projets · le worker n'écrit jamais sur le VPS)",
  "self_module": "devops/deploy_runbook",
  "cible_portage": "agent DevOps / ERPNext Backend",
  "phases": [
    {
      "order": 1,
      "id": "prerequis",
      "titre": "Prérequis VPS : modules custom OTOV7 + spec RBAC validée",
      "responsable": "vps",
      "rationale": "Rien ne s'importe tant que les modules d'application custom (OTOV7 Ventes, OTOV7 CONFOTUR, …) n'existent pas et que le contrat RBAC 50 rôles n'est pas validé comme source de vérité unique.",
      "depends_on": [],
      "confirmations": ["custom_modules"]
    },
    {
      "order": 2,
      "id": "doctypes",
      "titre": "DocTypes custom (structure) avant tout ce qui les référence",
      "responsable": "vps",
      "rationale": "Les Custom DocPerm, le Workflow vente et les Workspaces référencent des DocTypes custom qui doivent exister au préalable (contrainte dure ERPNext v15).",
      "depends_on": ["prerequis"],
      "confirmations": ["custom_doctypes"]
    },
    {
      "order": 3,
      "id": "rbac-apply",
      "titre": "RBAC : Role + Custom DocPerm + User Permission + Role Profile",
      "responsable": "worker+vps",
      "rationale": "Le run-book RBAC (rbac/apply_plan) ordonne déjà ce volet ; on l'insère ici en bloc car les Has Role d'un Role Profile et les DocPerm référencent des Role/DocTypes qui doivent préexister.",
      "depends_on": ["doctypes"],
      "confirmations": []
    },
    {
      "order": 4,
      "id": "workflow-metier",
      "titre": "Workflow vente + règles métier (commissions, e-CF DGII, dépôts CONFOTUR)",
      "responsable": "worker+vps",
      "rationale": "Le Workflow pilote le DocType Dossier Vente et s'appuie sur les rôles ; commissions et e-CF se déclenchent sur ses états soumis. Paramètres réglementaires à confirmer avant activation.",
      "depends_on": ["doctypes", "rbac-apply"],
      "confirmations": ["taux_commission", "rnc_emisor", "itbis_tipocambio", "seuil_uaf"]
    },
    {
      "order": 5,
      "id": "frontend",
      "titre": "Frontend : Workspaces desk portails + Custom Block chat OTOIA + config app mobile",
      "responsable": "worker+vps",
      "rationale": "Les Workspaces (Has Role) et le Custom Block de chat s'ancrent sur les rôles RBAC et les DocTypes déjà en place ; l'endpoint OTOIA reste à renseigner. La config de l'app mobile (Expo/EAS) s'ancre sur la même surface RBAC (navigation par rôle) ; build Expo 54 + submit App Store #32 / Play Store restent hors repo (agent Mobile · #8).",
      "depends_on": ["rbac-apply"],
      "confirmations": ["endpoint_otoia"]
    },
    {
      "order": 6,
      "id": "contenu",
      "titre": "Contenu projets & publication : Publiciste, Faisabilité, Bancable, SEO, Démo",
      "responsable": "worker+vps",
      "rationale": "Génération et publication du contenu projet (data_room, dossiers bancables, balises SEO, run-sheet de démo) une fois la plateforme et le frontend en place.",
      "depends_on": ["workflow-metier", "frontend"],
      "confirmations": []
    },
    {
      "order": 7,
      "id": "verification-qa",
      "titre": "Vérification post-déploiement : HTTP + audits QA (5D · 4Big · régression)",
      "responsable": "vps",
      "rationale": "Gate final : vérification HTTP puis exécution des audits de conformité 5D, de qualité 4Big (≥95/100) et de la matrice de régression sur le desk réel.",
      "depends_on": ["workflow-metier", "frontend", "contenu"],
      "confirmations": []
    }
  ],
  "module_phase": {
    "rbac": "prerequis",
    "crm/dossier_vente": "doctypes",
    "legal/confotur": "doctypes",
    "rbac/fixtures_gen": "rbac-apply",
    "rbac/userperm_gen": "rbac-apply",
    "rbac/roleprofile_gen": "rbac-apply",
    "rbac/apply_plan": "rbac-apply",
    "crm/workflow_vente": "workflow-metier",
    "crm/commissions": "workflow-metier",
    "crm/financement_bancaire": "workflow-metier",
    "fiscal/ecf_dgii": "workflow-metier",
    "frontend/portails": "frontend",
    "frontend/chat_otoia": "frontend",
    "mobile/app_config": "frontend",
    "publiciste": "contenu",
    "faisabilite/generator": "contenu",
    "faisabilite/bancable": "contenu",
    "seo": "contenu",
    "demo/scenarios": "contenu",
    "pie/manifest": "contenu",
    "qa/audit_5d": "verification-qa",
    "qa/audit_4big": "verification-qa",
    "qa/regression": "verification-qa",
    "qa/acceptance": "verification-qa"
  },
  "confirmations": {
    "custom_modules": {
      "libelle": "Créer les modules d'application custom (OTOV7 Ventes, OTOV7 CONFOTUR, …) avant tout import de fixtures",
      "owner": "ERPNext Backend",
      "source": "sessions 12/15/16 · création module OTO Ventes / OTOV7 CONFOTUR (hors périmètre worker · CLAUDE.md #8)"
    },
    "custom_doctypes": {
      "libelle": "Créer les DocTypes custom (OTO Dossier Vente, CONFOTUR Application, Faisabilité, Publiciste Log) avant l'import des Workspaces et du Workflow",
      "owner": "ERPNext Backend",
      "source": "session 15 · DocTypes custom à créer avant import Workspaces (run-book RBAC)"
    },
    "taux_commission": {
      "libelle": "Confirmer les taux de commission vendeurs (barème reste taux_pct null tant que non confirmé)",
      "owner": "Direction",
      "source": "qa/audit_5d contrôle D1.1 (A_CONFIRMER)"
    },
    "rnc_emisor": {
      "libelle": "Confirmer le RNC émetteur pour l'émission e-CF DGII",
      "owner": "Compta",
      "source": "qa/audit_5d contrôle D1.2 (A_CONFIRMER)"
    },
    "itbis_tipocambio": {
      "libelle": "Confirmer le taux ITBIS et le TipoCambio USD/DOP pour l'e-CF",
      "owner": "Compta Fiscaliste eCF",
      "source": "qa/audit_5d contrôle D1.3 (A_CONFIRMER)"
    },
    "seuil_uaf": {
      "libelle": "Confirmer le seuil d'opération de déclaration UAF (Ley 155-17)",
      "owner": "Oficial de Cumplimiento",
      "source": "qa/audit_5d contrôle D2.3 (A_CONFIRMER)"
    },
    "endpoint_otoia": {
      "libelle": "Renseigner l'endpoint runtime du chat OTOIA (reste null / a_confirmer côté livrable)",
      "owner": "ERPNext Backend",
      "source": "session 19 · endpoint OTOIA = null (a_confirmer)"
    }
  },
  "notes": [
    "Agrégateur de MÉTA-NIVEAU, une couche au-dessus du run-book RBAC (rbac/apply_plan) : il ordonne le déploiement VPS de TOUS les livrables gated du mandat en un seul plan de phases, pas seulement des 3 volets RBAC.",
    "Périmètre PROUVÉ, pas déclaré : l'ensemble des modules à déployer est DÉRIVÉ de .gitea/workflows/ci.yml (réutilise q4lib/registry.parse_ci — zéro duplication · #5), jamais listé à la main. La couverture module→phase est BIJECTIVE avec le CI (moins le module lui-même).",
    "Séparation des pouvoirs (ISA 315) : le run-book s'exclut lui-même (self_module) — il ne s'auto-déploie pas et ne se compte pas.",
    "ANTI-INVENTION (#6) : ce spec ne contient AUCUN chiffre métier (taux, montant, seuil). Les paramètres réglementaires non confirmés restent des CONFIRMATIONS sourcées (owner + source), jamais une valeur fabriquée « pour faire PASS ». Chaque confirmation cite sa source (contrôle audit_5d ou session).",
    "Le worker N'ÉCRIT JAMAIS sur le VPS (CLAUDE.md #8) : ce module produit un plan ordonné en-repo ; l'application réelle (bench migrate, imports, vérifications HTTP) reste côté serveur, pilotée par l'agent DevOps / ERPNext Backend."
  ]
}
