En esta página
Propiedad de arquitectura
COADF P-8, tal como se publica: las reglas contra las que se mide una decisión son datos, el motor que las evalúa no cambia cuando cambia una regla, y un registro de decisión queda atado a la versión del conjunto de reglas que lo produjo, lo que extiende la traza de P-4 hasta la procedencia de las reglas. COADF nombra él mismo el estado de la técnica: ya existen conjuntos de reglas que pueden recargarse, con registros de decisión vinculados a su versión, y Open Policy Agent es el ejemplo evidente.
COADF retiene una parte de P-8, y lo dice en su página de principios. Nada en esta página describe esa parte. Los ejemplos usan un tema deliberadamente genérico: qué funcionalidades puede activar un entorno de despliegue.
Por qué importa
Las reglas cambian más a menudo que el código, y por razones distintas: la orientación de un regulador, un contrato, un mercado nuevo. Cuando una regla vive en el código, cada cambio es una entrega, varios servicios se van separando y nadie puede decir qué versión de una regla produjo una decisión tomada el trimestre pasado.
El último problema es el caro. Una decisión que no puede reconstruirse no puede explicarse, y una decisión que no puede explicarse no puede defenderse.
Estrategias de implementación válidas
La forma es pequeña: la aplicación pregunta a través de una interfaz que le pertenece, la interfaz consulta material de políticas versionado, y la decisión que vuelve lleva la versión de ese material.
Arquitectura de ejemplo · No normativa
Política como datos
- Flujo de datos en este ejemplo
Descripción textual. Una aplicación envía su pregunta, como entrada, a una interfaz de política que pertenece a la aplicación. La interfaz consulta un motor de política, que no cambia cuando cambian las reglas. El motor lee material de política versionado, revisión r, como datos. La respuesta del motor se registra como un registro de decisión que lleva la respuesta y la revisión r.
- Una interfaz de políticas que pertenece a la aplicación. La aplicación hace una pregunta en sus propios términos, y el motor queda detrás de un adaptador.
- Material de políticas versionado. Las reglas y sus datos son artefactos con un identificador por versión, desplegados con independencia de la aplicación.
- La versión en cada decisión. El registro de decisión lleva la respuesta, la versión y lo suficiente de la entrada para reproducirla.
- Las versiones antiguas, recuperables. Una reproducción necesita el material tal como era, no tal como es.
- Evaluación reproducible. Una política que obtiene datos o lee el reloj mientras se evalúa no puede reproducirse solo a partir de su entrada y su versión. Esos hechos se pasan como entrada, y se registran.
- También el motor versionado. Una actualización del motor puede cambiar el significado: OPA 1.0 hizo obligatorias las palabras clave
ifycontains, por ejemplo. Se registra la versión del motor allí donde importe la reproducción. - Fallo controlado. Una versión desconocida, una versión ausente, una respuesta mal formada o un motor inalcanzable producen un resultado que quien es responsable de la regla eligió de antemano, nunca un valor por defecto sin registrar. No hay una respuesta correcta universal: rechazar la acción es lo correcto para una regla de acceso a funcionalidades como la del ejemplo del perfil de Python; para otra decisión, quien es responsable de ella define qué significa el fallo, y registra la elección.
Opciones tecnológicas
- Open Policy Agent. Un motor de políticas de propósito general que desacopla las decisiones de política de su aplicación, con políticas escritas en Rego. Un bundle puede llevar un manifiesto con una versión, y los logs de decisiones de OPA registran la versión del bundle usada en cada decisión. Su API REST devuelve un
decision_idcuando el registro de decisiones está activado. - Tablas de reglas que pertenecen a la aplicación. Filas con una versión y un periodo de vigencia, evaluadas por código que no cambia cuando cambian las filas.
- Tablas de decisión y DMN, donde quienes son responsables de las reglas son analistas y no desarrolladores.
- Otros lenguajes y motores de políticas. OPA es aquí un ejemplo. COADF no lo exige.
Modos de fallo
Reglas duplicadas o fijadas en el código de varios servicios
Cada copia se cambia según su propio calendario, y la misma petición se permite en un sitio y se rechaza en otro.
La versión no se conserva con el resultado
La decisión existe; qué reglas la produjeron, no.
Una recarga de reglas cambia el significado de decisiones históricas
Un informe recalcula las decisiones del mes pasado con las reglas de hoy y las presenta como las del mes pasado.
Entornos que ejecutan versiones distintas sin procedencia
Durante una actualización progresiva, las versiones antigua y nueva se ejecutan a la vez, y un ConfigMap leído a través de variables de entorno no se actualiza hasta que el pod se reinicia. Durante un tiempo responden dos versiones, y solo el registro de decisión puede decir cuál lo hizo.
Una decisión antigua no puede reconstruirse
El material se sobrescribió, o la evaluación dependía de datos obtenidos en el momento en que se ejecutó.
Lo indefinido leído como respuesta
En Rego, una regla cuya entrada falta queda indefinida, y responde en su lugar un valor por defecto. Una clave de entrada mal escrita cae así en silencio al valor por defecto, algo que fijan las propias pruebas del ejemplo. Una prueba de contrato del lado de quien llama detecta la errata.
Una caché de decisiones que ignora la versión
Las respuestas almacenadas en caché con el material antiguo sobreviven al despliegue del nuevo.
Un motor inalcanzable tratado como permiso
Un cliente que permite cuando el motor no responde convierte una caída en una política.
Verificación
Prueba unitaria
Pasa cuando: Las pruebas propias de las reglas se ejecutan contra su material:
opa testejecuta cada regla con el prefijotest_, y una tabla de reglas tiene el equivalente.Prueba de dientes: Se cambia el material: las pruebas que fijan las respuestas antiguas fallan mientras la regla misma no cambia.
Prueba de integración
Pasa cuando: Cada decisión registrada nombra una versión, igual a la versión del material cargado.
Prueba de dientes: Se carga material sin versión: el cliente se niega a registrar una decisión.
Prueba de integración
Pasa cuando: La misma entrada con la misma versión da la misma respuesta, reproducida contra el material archivado.
Prueba de contrato
Pasa cuando: La entrada que envía la aplicación es la entrada que lee la política.
Prueba de dientes: Se renombra un campo de entrada en un lado: la prueba de contrato falla, en lugar de que la política caiga en su valor por defecto.
Prueba de despliegue o de admisión
Pasa cuando: Cada entorno informa la versión que ejecuta, y el informe se compara con el registro de la entrega.
Evidencia manual
Pasa cuando: Una muestra de decisiones históricas se reproduce contra las versiones que registraron.
Realizaciones alternativas
- Reglas en el código, con la versión de compilación registrada en cada decisión. Viable para un sistema pequeño. Cada cambio de regla es entonces una entrega, y el motor cambia cada vez que cambia una regla, algo que P-8 excluye.
- Servicios de feature flags. Parecidos a las políticas, y a menudo sin procedencia de las decisiones: con frecuencia no se registra qué configuración de flags respondió a una petición concreta.
- Un servicio de decisiones de otro equipo, consumido a través de la misma interfaz, con la versión en su respuesta.
Limitaciones
- El patrón da procedencia, no corrección. Una regla errónea bien versionada sigue siendo errónea.
- No cubre las partes de P-8 que COADF no publica, ni cómo una decisión de política se encuentra con cualquier otro control.
- Open Policy Agent es un motor de ejemplo. Nada de lo que aquí figura lo convierte en requisito.
Fuentes
- Open Policy Agent: Upgrading to OPA 1.0 · documentación oficial · OPA 1.20 · Comprobado el 2026-09-11
- Open Policy Agent: Open Policy Agent: introduction · documentación oficial · OPA 1.20 · Comprobado el 2026-09-11
- Open Policy Agent: Bundles: bundle file format · documentación oficial · OPA 1.20 · Comprobado el 2026-09-11
- Open Policy Agent: Decision logs · documentación oficial · OPA 1.20 · Comprobado el 2026-09-11
- Open Policy Agent: REST API: get a document with input · documentación oficial · OPA 1.20 · Comprobado el 2026-09-11
- Kubernetes: Deployments: rolling update · documentación oficial · Kubernetes 1.37 · Comprobado el 2026-09-11
- Kubernetes: ConfigMaps: updates and immutability · documentación oficial · Kubernetes 1.37 · Comprobado el 2026-09-11
- Open Policy Agent: Policy testing · documentación oficial · OPA 1.20 · Comprobado el 2026-09-11
