En esta página
Propiedad de arquitectura
COADF P-6: una barrera que vive en un documento es un consejo; una barrera que se ejecuta en la pipeline y bloquea una entrega es un fence. Los fences caen en cuatro categorías (datos, arquitectura, texto y proceso), cada uno con un identificador, una regla y un método de aplicación, y un fence se gana su sitio solo con una prueba de dientes. COADF no publica el vocabulario con el que hace coincidencia su propio fence de publicación, porque una lista de lo que se vigila es un mapa de lo que se protege.
La propiedad no es “hay una comprobación”. Es que el estado prohibido no puede pasar de un punto determinado, y que alguien ha visto cómo se le detiene allí.
Por qué importa
Cualquier otra propiedad de este Companion puede implementarse correctamente una vez y perderse en el cambio siguiente. Un fence es lo que mantiene verdadera una propiedad a través de cambios que nadie revisó pensando en ella. Lo difícil rara vez es escribir la comprobación. Es colocarla en el camino que el estado prohibido tiene que recorrer, y demostrar que salta allí, en el camino real, y no en una prueba unitaria de la función que comprueba.
Estrategias de implementación válidas
Superficies de aplicación
Cada superficie ve algo distinto, y cada una tiene una forma característica de eludirla. Un fence pertenece a la superficie que ve el estado prohibido, y es tan fuerte como lo permita la forma de eludir esa superficie.
| Superficie | Ve | Forma habitual de eludirla |
|---|---|---|
| Compilador y comprobador de tipos | La estructura del código y los tipos declarados | Casts, tipado dinámico, reflexión, código generado |
| Validación en la aplicación | Valores en una frontera, en tiempo de ejecución | Un segundo punto de entrada: una tarea por lotes, un script, una migración |
| Prueba de arquitectura | El grafo de dependencias | Carga por nombre en tiempo de ejecución; un paquete nuevo que la regla no nombra |
| Prueba de contrato y de esquema | La compatibilidad de las interfaces | Un consumidor que nadie registró |
| Integración continua | El repositorio en un commit | Una comprobación obligatoria que se omite y se informa como éxito |
| Barrera de integración | Qué comprobaciones tienen que pasar antes de integrar | Administradores, pushes directos, una protección que el plan de alojamiento no aplica |
| Pipeline de versiones | El artefacto que se promueve | Una subida manual |
| Admisión en el despliegue | Los objetos de la API enviados al clúster | Una política de fallo que ignora los errores; objetos que existían antes de la política |
| Compilación de la publicación | La salida pública renderizada | Contenido servido desde fuera de la compilación |
Los perfiles implementan tres cadenas, cada una terminada en una transición detenida:
- Una violación de arquitectura hace fallar una prueba de arquitectura, y la integración no se produce (Python y FastAPI).
- Una incompatibilidad de contrato hace fallar una comprobación de contrato, y la versión no se publica.
- Un centinela prohibido sintético en el sitio compilado hace fallar el fence de publicación, y la publicación no se produce (Python y FastAPI, cloud-native).
La integración continua es una superficie entre nueve, no la definición de un fence. GitHub Actions, GitLab CI y Jenkins pueden alojar uno; también un comprobador de tipos, una política de admisión o la compilación que renderiza un sitio.
Prueba de dientes
- Introducir un defecto controlado y sintético.
- Ejercitar el camino real de aplicación, no una prueba unitaria de la función que comprueba.
- Verificar que falla, y que falla por el motivo plantado.
- Restaurar el fixture exacto, y demostrarlo comparando un digest antes y después.
- Verificar que vuelve a pasar.
Hay que hacer commit antes de plantar. Restaurar descartando cambios restaura el último commit, que en una rama de trabajo puede no ser el punto de partida, y entonces la prueba destruye el trabajo que debía proteger.
Modos de fallo
El fence está en el camino equivocado
Comprueba el repositorio, mientras que el contenido prohibido se inyecta en la compilación, en el despliegue o en tiempo de ejecución.
Una comprobación obligatoria omitida se lee como éxito
GitHub informa una tarea omitida como correcta, y una tarea omitida no impide una integración aunque sea una comprobación obligatoria. Una tarea obligatoria que depende de un fence fallido se omite, y la integración sigue adelante. Hay que exigir el propio fence, o una tarea de resumen que se ejecute siempre y falle salvo que todos los fences hayan pasado (el consejo del propio GitHub para comprobaciones que dependen de otras tareas).
Consultivo por configuración
continue-on-error,allow_failure: trueen GitLab CI, un webhook de admisión cuya política de fallo ignora los errores, una restricción de Gatekeeper endryrunowarn: cada uno convierte un fence en un consejo sin que nadie escriba la palabra.Nada comprobado, informado como limpio
Una lista de patrones vacía, una selección de pruebas que no coincide con nada, un escaneo de un directorio vacío. El número de comprobaciones realmente ejecutadas pertenece al resultado, y cero es un fallo.
El fence salta con trabajo legítimo y se desactiva
La precisión mantiene vivo un fence. Una regla que coincide con texto corriente acabará desactivada en lugar de obedecida, y un fence desactivado es peor que ninguno, porque todo el mundo sigue creyendo que está ahí.
Se publica la lista del propio fence
Una lista pública de términos vigilados le dice a quien la lee exactamente qué se está protegiendo.
Nunca se comprueba el estado existente
Las comprobaciones de admisión y previas a la integración actúan sobre las peticiones a medida que se hacen, no sobre lo que ya existe. Kubernetes lo documenta para un plugin de admisión con todas las letras: cuando se añade un LimitRange, los pods que ya existen continúan sin cambios. Gatekeeper tiene una auditoría de los recursos existentes precisamente para ese hueco.
El verde se lee como suficiente
Una comprobación que pasa demuestra que la comprobación pasó. Si es la comprobación correcta es una cuestión de arquitectura que ninguna pipeline puede responder; véase la nota técnica.
Verificación
Prueba de arquitectura
Pasa cuando: La regla de dependencias pasa sobre el árbol actual.
Prueba de dientes: Se planta la importación prohibida: falla, y la barrera de integración la rechaza.
Prueba de contrato
Pasa cuando: Los esquemas del productor y del consumidor son compatibles.
Prueba de dientes: Se quita un campo obligatorio del productor: la comprobación falla y la tarea de versión no se ejecuta.
Prueba de extremo a extremo
Pasa cuando: El fence de publicación escanea la salida compilada y pasa.
Prueba de dientes: Se planta un centinela sintético en la salida: la compilación falla. Se retira, se compara el digest y la compilación pasa.
Prueba de despliegue o de admisión
Pasa cuando: Se admite un objeto que sigue la regla.
Prueba de dientes: Se envía uno que la incumple: rechazado, con el mensaje de la regla.
Evidencia manual
Pasa cuando: Al integrar, una persona identificada confirma que cada fence se ejecutó en esta ejecución: el identificador de la ejecución y el número de comprobaciones ejecutadas quedan registrados, no recordados.
Realizaciones alternativas
- Hooks de pre-commit. Respuesta rápida, y eludibles en la propia máquina de quien desarrolla: un consejo, no un fence.
- Guardas en tiempo de ejecución. Detienen un estado prohibido en producción en lugar de antes. Necesarias donde el estado solo existe en tiempo de ejecución.
- Barreras manuales. Una persona identificada ejecuta un procedimiento escrito. COADF informa de un control así honestamente como manual, nunca como aplicado.
- Motores de políticas para reglas de infraestructura. ValidatingAdmissionPolicy de Kubernetes dentro del proceso, u Open Policy Agent con Gatekeeper, donde el estado prohibido es un objeto de la API.
Limitaciones
- Un fence de texto no puede ver un mecanismo expresado mediante flujo de control, identificadores renombrados, flujo de datos o la geometría de un diagrama. Las barreras automatizadas son necesarias y no suficientes; la revisión humana sigue siendo necesaria.
- Un fence detecta lo que se escribió para detectar, y nada más.
- Que los fences pasen establece que los fences pasaron. No establece ningún estatus regulatorio.
Fuentes
- GitHub: Control jobs with conditions · documentación oficial · Comprobado el 2026-09-11
- GitHub: Troubleshooting required status checks · documentación oficial · Comprobado el 2026-09-11
- GitLab: CI/CD YAML: allow_failure · documentación oficial · Comprobado el 2026-09-11
- Kubernetes: Dynamic admission control: failure policy · documentación oficial · Kubernetes 1.37 · Comprobado el 2026-09-11
- Open Policy Agent Gatekeeper: Gatekeeper: enforcement actions · documentación oficial · Gatekeeper 3.23 · Comprobado el 2026-09-11
- Kubernetes: Limit Ranges: admission-time validation · documentación oficial · Kubernetes 1.37 · Comprobado el 2026-09-11
- Open Policy Agent Gatekeeper: Gatekeeper: audit · documentación oficial · Gatekeeper 3.23 · Comprobado el 2026-09-11
- Kubernetes: Validating Admission Policy · documentación oficial · Kubernetes 1.37 · Comprobado el 2026-09-11
