Aller au contenu

ADR-056 : Extraction du contrat et de l'outillage RBAC vers forge-mvc-rbac

Statut

Acceptée, Forge 1.0.0-rc (ticket ADR-RBAC-SCHEMA-EXTRACT-001).
Les commandes RBAC (rbac:validate, rbac:audit) sont déjà dispatchées vers l'opt-in forge-mvc-rbac par import paresseux.
Reste à réaliser : l'extraction effective du schéma rbac.schema.json hors de cli/schemas/ vers le paquet.


Date

2026-06-29


Contexte

RBAC est un opt-in (forge-mvc-rbac).
Pourtant, son contrat et son outillage vivent encore dans le cœur :

  • cli/schemas/rbac.schema.json (et sa copie source schemas/rbac.schema.json)
    portent le JSON Schema du fichier mvc/security/rbac.json ;
  • cli/security/rbac_validate.py et cli/security/rbac_audit.py fournissent les
    commandes rbac:validate et rbac:audit ;
  • forge.schema.index.json liste rbac parmi les schémas du cœur.

Le couplage est même inversé : le paquet opt-in forge-mvc-rbac
(forge_mvc_rbac/contract.py) lit le schéma depuis le cœur
(Path(cli.__file__).parent / "schemas").
L'opt-in dépend donc du cœur pour valider son propre contrat.

Cela contredit le principe 8 (noyau minimal, briques opt-in) et le principe 10
(une API publique est un contrat de complétude : l'opt-in doit fournir son
contrat complet, schéma et validation compris).
Un projet sans RBAC embarque aujourd'hui le schéma et les commandes RBAC sans
les utiliser.

L'analyse du graphe des schémas confirme que rbac.schema.json est autonome :
aucun autre schéma ne le référence, et il ne référence aucun autre schéma.
Contrairement à pivot.schema.json (référencé par relations.schema.json du
cœur), il est donc détachable sans redesign de contrat.

L'ADR-014 a fixé l'emplacement du contrat dans un projet
(mvc/security/rbac.json, séparé du schéma d'entité).
Le présent ADR fixe l'emplacement du schéma et de l'outillage de validation.


Décision

Le contrat RBAC et son outillage rejoignent l'opt-in

  1. Schéma : rbac.schema.json est déplacé dans forge-mvc-rbac (donnée de
    paquet, embarquée et packagée avec l'opt-in). Il est retiré de
    cli/schemas/, de schemas/ (racine) et de forge.schema.index.json.
    Son $id (https://forge-mvc.dev/schemas/rbac.schema.json) reste inchangé :
    c'est une identité, pas un chemin.

  2. Validation : forge_mvc_rbac.contract charge le schéma depuis son
    propre paquet
    , plus depuis le cœur.

  3. Commandes : rbac:validate et rbac:audit deviennent des commandes de
    l'opt-in forge-mvc-rbac (précédent établi : mail:*, iot:*, deploy:*,
    admin:* sont fournis par leurs opt-ins). Elles sont retirées du cœur.

  4. Cœur : le cœur ne contient plus aucun artefact RBAC (ni schéma, ni
    commande, ni entrée d'index).

Conséquence d'usage

Utiliser rbac:validate / rbac:audit suppose forge-mvc-rbac installé, ce qui
est cohérent : ce sont des commandes de l'opt-in RBAC.
Sans l'opt-in, le cœur ne propose ni ne mentionne ces commandes.


Conséquences

Le cœur perd le schéma RBAC, les deux commandes et l'entrée d'index : périmètre
réduit, conforme aux principes 8 et 10.
forge-mvc-rbac devient autoporteur : il embarque son schéma, le charge
lui-même et expose sa validation.
La doc embarquée de l'opt-in (ADR-038) accueille la référence du schéma et des
commandes.

Blast radius de l'implémentation (ticket distinct) : déplacer le fichier schéma ;
déplacer rbac_validate.py / rbac_audit.py ; recâbler contract.py sur le
schéma local ; retirer rbac de forge.schema.index.json et des deux dossiers
schemas/ ; mettre à jour le dispatch et l'aide du cœur ; déplacer/adapter les
tests (test_rbac_schema_contract, test_rbac_validate_command, garde
test_schemas_identiques) ; mettre à jour la guidance et la documentation.


Alternatives écartées

Laisser le schéma et l'outillage RBAC dans le cœur.
Maintient un opt-in dont le contrat vit dans le cœur, contre les principes 8 et
10, et impose à tout projet le poids du RBAC inutilisé.

Déplacer le schéma mais garder les commandes dans le cœur.
Le cœur devrait alors lire un schéma absent (il a quitté le cœur) ou en garder
une copie : incohérent. Schéma et validation forment un tout, ils migrent
ensemble.


Charte appliquée

  • Principe 4 (périmètre du cœur) : le RBAC quitte entièrement le cœur.
  • Principe 8 (noyau minimal, briques opt-in) : l'opt-in porte son contrat.
  • Principe 10 (contrat de complétude) : forge-mvc-rbac fournit schéma +
    validation + commandes, pas une moitié.
  • Règle A (retirer la cause) : on supprime le couplage inversé opt-in vers cœur.

Référence

  • ADR-014 : emplacement du contrat RBAC dans un projet.
  • ADR-038 : doc des opt-ins embarquée par paquet.
  • ADR-052 : stratégie et critères des opt-ins.
  • cli/security/rbac_validate.py, cli/security/rbac_audit.py : outillage à déplacer.
  • forge-mvc-rbac/forge_mvc_rbac/contract.py : validation à recâbler sur le schéma local.