75a3b0a471
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>
138 lines
4.9 KiB
JSON
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 }
|
|
}
|
|
}
|
|
}
|
|
}
|