Files
oto-enterprise-os-dtp/05_deliverables_mvp/rbac/apply_plan/apply_plan.schema.json
T
Claude Code DTP Worker 75a3b0a471 [DTP-Worker] Sprint 2 · Agrégateur RBAC : run-book d'application VPS unifié (3 volets → 1 plan ordonné SPEC §7)
Clôt le volet RBAC en-repo : recoud fixtures Role+DocPerm, plan User Permission
et Role Profile en un run-book ordonné + manifeste agrégé. Zéro chiffre
recalculé (tout vient d'un manifeste source, #6), graphe de dépendances validé
(Role avant Role Profile), cohérence inter-volets + couverture bijective 50/50.
16 tests + job CI rbac-applyplan-tests · 99 tests de régression au total.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-30 04:33:36 +00:00

138 lines
4.9 KiB
JSON

{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "https://oto-enterprise-os-dtp/rbac/apply_plan.schema.json",
"title": "Run-book d'application RBAC unifié (agrégat des 3 volets)",
"description": "Contrat de sortie de rbac_apply_plan.py. Validé par le validateur maison Publiciste (zéro pip) dans le job CI rbac-applyplan-tests. Consolide les manifestes des 3 générateurs RBAC (fixtures Role+DocPerm, plan User Permission, Role Profile) en un plan d'application VPS ordonné (SPEC §7) + un manifeste agrégé recoupant leur cohérence. Aucun chiffre recalculé : tout compte provient d'un builder source.",
"type": "object",
"additionalProperties": false,
"required": ["manifest", "apply_plan"],
"properties": {
"manifest": {
"type": "object",
"additionalProperties": false,
"required": [
"generated_from",
"source_version",
"cible_rbac_roles",
"counts",
"confirmations_vps",
"consistency"
],
"properties": {
"generated_from": { "type": "string", "const": "rbac_50_roles.json" },
"source_version": { "type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$" },
"cible_rbac_roles": { "type": "integer", "const": 50 },
"counts": {
"type": "object",
"additionalProperties": false,
"required": [
"roles",
"custom_docperm",
"doctypes_uniques",
"user_permission_templates",
"role_profiles"
],
"properties": {
"roles": { "type": "integer", "minimum": 50, "maximum": 50 },
"custom_docperm": { "type": "integer", "minimum": 1 },
"doctypes_uniques": { "type": "integer", "minimum": 1 },
"user_permission_templates": { "type": "integer", "minimum": 0 },
"role_profiles": { "type": "integer", "minimum": 1 }
}
},
"confirmations_vps": {
"type": "object",
"additionalProperties": false,
"required": ["custom_doctypes", "companies", "roles_scope_equipe"],
"properties": {
"custom_doctypes": {
"type": "array",
"uniqueItems": true,
"items": { "type": "string", "minLength": 1 }
},
"companies": {
"type": "array",
"uniqueItems": true,
"items": { "type": "string", "minLength": 1 }
},
"roles_scope_equipe": {
"type": "array",
"uniqueItems": true,
"items": { "type": "string", "minLength": 1 }
}
}
},
"consistency": {
"type": "object",
"additionalProperties": false,
"required": [
"sources_coherentes",
"source_version",
"cible_rbac_roles",
"roles_fixtures",
"userperm_plan_entries",
"roleprofile_roles_couverts",
"couverture_bijective"
],
"properties": {
"sources_coherentes": { "type": "boolean", "const": true },
"source_version": { "type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$" },
"cible_rbac_roles": { "type": "integer", "const": 50 },
"roles_fixtures": { "type": "integer", "minimum": 0 },
"userperm_plan_entries": { "type": "integer", "minimum": 0 },
"roleprofile_roles_couverts": { "type": "integer", "minimum": 0 },
"couverture_bijective": { "type": "boolean", "const": true }
}
}
}
},
"apply_plan": {
"type": "array",
"minItems": 1,
"items": { "$ref": "#/definitions/step" }
}
},
"definitions": {
"step": {
"type": "object",
"additionalProperties": false,
"required": [
"order",
"id",
"titre",
"responsable",
"statut",
"commande",
"produces",
"depends_on",
"confirmations",
"doc"
],
"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"] },
"statut": { "type": "string", "minLength": 1 },
"commande": { "type": ["string", "null"] },
"produces": {
"type": "array",
"uniqueItems": true,
"items": { "type": "string", "minLength": 1 }
},
"depends_on": {
"type": "array",
"uniqueItems": true,
"items": { "type": "string", "pattern": "^[a-z0-9-]+$" }
},
"confirmations": {
"type": "array",
"uniqueItems": true,
"items": { "type": "string", "enum": ["custom_doctypes", "companies", "roles_scope_equipe"] }
},
"doc": { "type": "string", "minLength": 1 }
}
}
}
}