Sur cette page
Propriété d'architecture
COADF P-8, tel que publié : les règles auxquelles une décision est mesurée sont des données, le moteur qui les évalue ne change pas quand une règle change, et un enregistrement de décision est lié à la version du jeu de règles qui l'a produit, ce qui prolonge la trace de P-4 jusqu'à la provenance des règles. COADF nomme lui-même l'état de la technique : des jeux de règles rechargeables, avec des enregistrements de décision liés à leur version, existent déjà, et Open Policy Agent en est l'exemple évident.
COADF ne publie pas une partie de P-8, et le dit sur sa page des principes. Rien sur cette page ne décrit cette partie. Les exemples utilisent un sujet volontairement générique : les fonctionnalités qu'un environnement de déploiement peut activer.
Pourquoi elle compte
Les règles changent plus souvent que le code, et pour d'autres raisons : les orientations d'un régulateur, un contrat, un nouveau marché. Quand une règle vit dans le code, chaque changement est une livraison, plusieurs services s'éloignent les uns des autres, et personne ne peut dire quelle version d'une règle a produit une décision prise au trimestre dernier.
Le dernier problème est le plus coûteux. Une décision qu'on ne peut pas reconstruire ne peut pas être expliquée, et une décision qu'on ne peut pas expliquer ne peut pas être défendue.
Stratégies de mise en œuvre valables
La forme est petite : l'application pose sa question à travers une interface qui lui appartient, l'interface consulte un matériau de politique versionné, et la décision qui revient porte la révision de ce matériau.
Architecture d'exemple · Non normative
Les règles comme données
- Flux de données dans cet exemple
Description textuelle. Une application envoie sa question, comme entrée, à une interface de politique qui appartient à l'application. L'interface interroge un moteur de politiques, qui ne change pas quand les règles changent. Le moteur lit le matériau de politique versionné, révision r, comme des données. La réponse du moteur est consignée dans un enregistrement de décision qui porte la réponse et la révision r.
- Une interface de politique qui appartient à l'application. L'application pose une question dans ses propres termes, et le moteur se trouve derrière un adaptateur.
- Un matériau de politique versionné. Les règles et leurs données sont des artefacts avec un identifiant par révision, déployés indépendamment de l'application.
- La révision sur chaque décision. L'enregistrement de décision porte la réponse, la révision, et assez de l'entrée pour la rejouer.
- Les anciennes révisions restent récupérables. Rejouer demande le matériau tel qu'il était, pas tel qu'il est.
- Une évaluation reproductible. Une politique qui va chercher des données ou lit l'horloge pendant qu'elle évalue ne peut pas être rejouée à partir de sa seule entrée et de sa seule révision. Il faut transmettre ces faits comme entrée, et les consigner.
- Le moteur versionné lui aussi. Une mise à jour du moteur peut changer le sens : OPA 1.0 a rendu obligatoires les mots-clés
ifetcontains, par exemple. Consigner la version du moteur partout où le rejeu compte. - Une défaillance maîtrisée. Une révision inconnue, une révision manquante, une réponse mal formée ou un moteur injoignable produit une issue que le responsable de la règle a choisie à l'avance, jamais une valeur par défaut non consignée. Il n'existe pas de bonne réponse universelle : refuser l'action est juste pour une règle d'accès à une fonctionnalité comme celle de l'exemple du profil Python ; pour une autre décision, son responsable définit ce que signifie une défaillance, et consigne ce choix.
Options technologiques
- Open Policy Agent. Un moteur de politiques généraliste qui découple les décisions de politique de leur application, avec des politiques écrites en Rego. Un bundle peut porter un manifeste avec une révision, et les journaux de décisions d'OPA consignent la révision du bundle utilisée pour chaque décision. Son API REST renvoie un
decision_idquand la journalisation des décisions est activée. - Des tables de règles qui appartiennent à l'application. Des lignes avec une révision et une période d'effet, évaluées par un code qui ne change pas quand les lignes changent.
- Des tables de décision et DMN, là où les responsables des règles sont des analystes plutôt que des développeurs.
- D'autres langages et moteurs de politiques. OPA est ici un exemple. COADF ne l'exige pas.
Modes de défaillance
Des règles dupliquées ou codées en dur dans plusieurs services
Chaque copie change selon son propre calendrier, et la même requête est autorisée à un endroit et refusée à un autre.
La révision non conservée avec le résultat
La décision existe ; les règles qui l'ont produite, non.
Un rechargement des règles change le sens de décisions historiques
Un rapport recalcule les décisions du mois dernier avec les règles d'aujourd'hui et les présente comme celles du mois dernier.
Des environnements qui exécutent des révisions différentes sans provenance
Pendant une mise à jour progressive, l'ancienne et la nouvelle version tournent en même temps, et une ConfigMap lue à travers des variables d'environnement n'est pas rafraîchie avant le redémarrage du pod. Pendant un temps, deux révisions répondent, et seul l'enregistrement de décision peut dire laquelle l'a fait.
Une ancienne décision ne peut pas être reconstruite
Le matériau a été écrasé, ou l'évaluation dépendait de données récupérées au moment où elle s'est exécutée.
L'indéfini lu comme une réponse
En Rego, une règle dont l'entrée manque est indéfinie, et une valeur par défaut répond à sa place. Une clé d'entrée mal orthographiée retombe donc silencieusement sur la valeur par défaut, ce que les propres tests de l'exemple fixent. Un test de contrat du côté de l'appelant attrape la faute d'orthographe.
Un cache de décisions qui ignore la révision
Les réponses mises en cache à partir de l'ancien matériau survivent au déploiement du nouveau.
Un moteur injoignable traité comme une permission
Un client qui autorise quand le moteur ne répond pas transforme une panne en politique.
Vérification
Test unitaire
Réussit quand : Les tests propres aux règles s'exécutent contre leur matériau :
opa testexécute chaque règle préfixée partest_, et une table de règles a l'équivalent.Preuve de dents : Changer le matériau : les tests qui fixent les anciennes réponses échouent alors que la règle elle-même est inchangée.
Test d'intégration
Réussit quand : Chaque décision consignée nomme une révision, égale à la révision du matériau chargé.
Preuve de dents : Charger un matériau sans révision : le client refuse de consigner une décision.
Test d'intégration
Réussit quand : La même entrée sous la même révision donne la même réponse, rejouée contre le matériau archivé.
Test de contrat
Réussit quand : L'entrée que l'application envoie est l'entrée que la politique lit.
Preuve de dents : Renommer un champ d'entrée d'un côté : le test de contrat échoue, au lieu que la politique retombe sur sa valeur par défaut.
Test de déploiement ou d'admission
Réussit quand : Chaque environnement indique la révision qu'il exécute, et cette indication est comparée à l'enregistrement de livraison.
Preuve manuelle
Réussit quand : Un échantillon de décisions historiques est rejoué contre les révisions qu'elles ont consignées.
Réalisations alternatives
- Des règles dans le code, avec la révision du build consignée sur chaque décision. Praticable pour un petit système. Chaque changement de règle est alors une livraison, et le moteur change chaque fois qu'une règle change, ce que P-8 exclut.
- Des services de feature flags. Proches des politiques, et souvent sans provenance des décisions : la configuration de flags qui a répondu à une requête donnée n'est souvent pas consignée.
- Un service de décision détenu par une autre équipe, consommé via la même interface, avec la révision dans sa réponse.
Limites
- Le pattern donne la provenance, pas la justesse. Une règle fausse bien versionnée reste fausse.
- Il ne couvre pas les parties de P-8 que COADF ne publie pas, ni la façon dont une décision de politique rencontre un autre contrôle.
- Open Policy Agent est un moteur d'exemple. Rien ici n'en fait une exigence.
Sources
- Open Policy Agent: Upgrading to OPA 1.0 · documentation officielle · OPA 1.20 · Vérifié le 2026-09-11
- Open Policy Agent: Open Policy Agent: introduction · documentation officielle · OPA 1.20 · Vérifié le 2026-09-11
- Open Policy Agent: Bundles: bundle file format · documentation officielle · OPA 1.20 · Vérifié le 2026-09-11
- Open Policy Agent: Decision logs · documentation officielle · OPA 1.20 · Vérifié le 2026-09-11
- Open Policy Agent: REST API: get a document with input · documentation officielle · OPA 1.20 · Vérifié le 2026-09-11
- Kubernetes: Deployments: rolling update · documentation officielle · Kubernetes 1.37 · Vérifié le 2026-09-11
- Kubernetes: ConfigMaps: updates and immutability · documentation officielle · Kubernetes 1.37 · Vérifié le 2026-09-11
- Open Policy Agent: Policy testing · documentation officielle · OPA 1.20 · Vérifié le 2026-09-11
