[DTP-Worker] Sprint 8 · Générateur Run-book de déploiement VPS unifié (7 phases · 20 modules gated · couverture bijective vs CI) (DevOps · roadmap L73)

Agrégateur de méta-niveau au-dessus du run-book RBAC : ordonne le déploiement
VPS de TOUS les livrables gated en 7 phases (Prérequis → DocTypes → RBAC →
Workflow/métier → Frontend → Contenu → Vérification QA), avec graphe de
dépendances inter-phases acyclique et confirmations préalables sourcées.

Anti-invention (#6) : périmètre dérivé du CI (parse_ci réutilisé), couverture
bijective module→phase (un module gated non planifié OU un module planifié non
gated → refus), SoD (auto-exclusion), zéro chiffre métier (confirmations
sourcées via audit_5d D1.1/D1.2/D1.3/D2.3 + endpoint OTOIA).

Vérifs : 29/29 tests module (dont 14 injections négatives) · audit_4big PASS
20/20 à 100 · régression run 20/20 suites · 503 tests · 0 échec · gate CI local
vert. CI job devops-deploy-runbook-tests + gate ; enregistrement audit_4big
(19→20) ; plan régression régénéré (19→20 suites).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-07-30 11:41:43 +00:00
parent 4b0752906d
commit 58ed555db0
19 changed files with 1647 additions and 17 deletions
@@ -0,0 +1,173 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "https://oto-enterprise-os-dtp/devops/deploy.schema.json",
"title": "Run-book de déploiement VPS unifié (agrégat de tous les livrables gated)",
"description": "Contrat de sortie de deploy_runbook_gen.py. Validé par le validateur maison Publiciste (zéro pip) dans le job CI devops-deploy-runbook-tests. Ordonne le déploiement VPS de TOUS les livrables gated du mandat en un plan de phases dérivé de .gitea/workflows/ci.yml. Aucun chiffre métier : les paramètres non confirmés restent des confirmations sourcées.",
"type": "object",
"additionalProperties": false,
"required": ["runbook", "manifest"],
"properties": {
"runbook": {
"type": "array",
"minItems": 1,
"items": { "$ref": "#/definitions/phase" }
},
"manifest": {
"type": "object",
"additionalProperties": false,
"required": [
"generated_from",
"reference_cadre",
"cible_portage",
"self_module",
"counts",
"coverage",
"graph",
"confirmations_ouvertes"
],
"properties": {
"generated_from": { "type": "string", "minLength": 1 },
"reference_cadre": { "type": "string", "minLength": 1 },
"cible_portage": { "type": "string", "minLength": 1 },
"self_module": { "type": "string", "const": "devops/deploy_runbook" },
"counts": {
"type": "object",
"additionalProperties": false,
"required": [
"phases",
"modules",
"modules_mapped",
"confirmations",
"confirmations_referenced"
],
"properties": {
"phases": { "type": "integer", "minimum": 1 },
"modules": { "type": "integer", "minimum": 1 },
"modules_mapped": { "type": "integer", "minimum": 1 },
"confirmations": { "type": "integer", "minimum": 0 },
"confirmations_referenced": { "type": "integer", "minimum": 0 }
}
},
"coverage": {
"type": "object",
"additionalProperties": false,
"required": [
"ci_modules_count",
"mapped_modules_count",
"bijective",
"missing_in_map",
"extra_in_map",
"unknown_phase",
"self_module_excluded"
],
"properties": {
"ci_modules_count": { "type": "integer", "minimum": 1 },
"mapped_modules_count": { "type": "integer", "minimum": 1 },
"bijective": { "type": "boolean", "const": true },
"missing_in_map": {
"type": "array",
"uniqueItems": true,
"items": { "type": "string", "minLength": 1 }
},
"extra_in_map": {
"type": "array",
"uniqueItems": true,
"items": { "type": "string", "minLength": 1 }
},
"unknown_phase": {
"type": "array",
"uniqueItems": true,
"items": { "type": "string", "minLength": 1 }
},
"self_module_excluded": { "type": "string", "const": "devops/deploy_runbook" }
}
},
"graph": {
"type": "object",
"additionalProperties": false,
"required": ["phase_order", "orphan_confirmations", "unknown_confirmations"],
"properties": {
"phase_order": {
"type": "array",
"minItems": 1,
"uniqueItems": true,
"items": { "type": "string", "pattern": "^[a-z0-9-]+$" }
},
"orphan_confirmations": {
"type": "array",
"uniqueItems": true,
"items": { "type": "string", "minLength": 1 }
},
"unknown_confirmations": {
"type": "array",
"uniqueItems": true,
"items": { "type": "string", "minLength": 1 }
}
}
},
"confirmations_ouvertes": {
"type": "array",
"uniqueItems": true,
"items": { "type": "string", "minLength": 1 }
}
}
}
},
"definitions": {
"phase": {
"type": "object",
"additionalProperties": false,
"required": [
"order",
"id",
"titre",
"responsable",
"rationale",
"depends_on",
"modules",
"confirmations"
],
"properties": {
"order": { "type": "integer", "minimum": 1 },
"id": { "type": "string", "pattern": "^[a-z0-9-]+$" },
"titre": { "type": "string", "minLength": 1 },
"responsable": { "type": "string", "enum": ["worker", "vps", "worker+vps"] },
"rationale": { "type": "string", "minLength": 1 },
"depends_on": {
"type": "array",
"uniqueItems": true,
"items": { "type": "string", "pattern": "^[a-z0-9-]+$" }
},
"modules": {
"type": "array",
"minItems": 1,
"items": { "$ref": "#/definitions/module" }
},
"confirmations": {
"type": "array",
"items": { "$ref": "#/definitions/confirmation" }
}
}
},
"module": {
"type": "object",
"additionalProperties": false,
"required": ["module", "ci_job"],
"properties": {
"module": { "type": "string", "minLength": 1 },
"ci_job": { "type": "string", "minLength": 1 }
}
},
"confirmation": {
"type": "object",
"additionalProperties": false,
"required": ["id", "libelle", "owner", "source"],
"properties": {
"id": { "type": "string", "pattern": "^[a-z0-9_]+$" },
"libelle": { "type": "string", "minLength": 1 },
"owner": { "type": "string", "minLength": 1 },
"source": { "type": "string", "minLength": 1 }
}
}
}
}