Documentación / Calidad y gobierno

Gate y Centro de Gobierno

Un solo gate hace cumplir el contrato en cada commit, push y pipeline, y el Centro de Gobierno reúne el ciclo de vida completo.

El contrato de calidad dice qué exige el equipo. El gate lo hace cumplir. Es un único comando del motor que usan igual los hooks de Git, la CI, el comando yuli-mcp gate y los hooks de los agentes. El resultado no depende de quién lo invoque.

El comando

agent-engine gate --project <raíz> --stage pre-commit|commit-msg|pre-push|ci \
  [--message-file <archivo>] [--base <revisión>] [--format text|json]

Si omites --project, se usa la carpeta actual. Una carpeta sin Git pasa siempre.

Código de salida Significado
0 Pasa.
1 Bloqueado: algún control falló.
2 Error de uso.

Qué revisa cada etapa

Etapa Qué compara Controles
pre-commit Lo que está en stage Todos los de abajo.
commit-msg El mensaje del commit Solo atribución a IA y excepciones.
pre-push Contra @{upstream} (o origin/HEAD) Todos los de abajo.
ci Contra la rama destino del PR o MR (o HEAD~1) Todos los de abajo.

Los controles

Control Etiqueta en Yuli Resultado
Secretos en las líneas agregadas Secretos Bloquea. Se informa el tipo y la línea, nunca el valor.
Trampas en los tests Integridad de tests Bloquea si el perfil bloquea trampas; si no, avisa.
Tamaño del cambio Tamaño del cambio Bloquea con aplicación estricta; si no, avisa.
Archivos protegidos tocados Rutas protegidas Bloquea con aplicación estricta; si no, avisa.
Atribución a una IA en los mensajes Atribución a IA Revisa que no haya Co-Authored-By de una IA.
Excepciones vencidas Excepciones Avisa. Nunca bloquea.
Código existente sin pruebas Red de seguridad Avisa. Nunca bloquea.

Anti-trampa en los tests

Un agente presionado por terminar puede «arreglar» una prueba en lugar del código. Yuli lo detecta.

En las pruebas:

  • Aserciones eliminadas o tests borrados.
  • Tests saltados: @Disabled, @Ignore, .skip(, xit, #[ignore], skips de pytest o unittest, t.Skip.
  • Aserciones triviales, como assertTrue(true) o expect(true).toBe(true).
  • Valores esperados cambiados para que el test pase.
  • catch que atrapa todo dentro de un test.

En el build y la CI:

  • Cobertura mínima rebajada.
  • Tests saltados en el build.
  • Fallos ignorados, como npm test || true.
  • Script de pruebas reemplazado por uno vacío.
  • Gate de calidad desactivado o tarea de tests deshabilitada.

Red de seguridad

Si cambian archivos de código existentes sin pruebas de caracterización o unitarias, el gate avisa: el cambio debe preservar el comportamiento. Nunca bloquea el commit.

Instalar los hooks de Git

En el Centro de Gobierno, pestaña Puertas, pulsa Instalar hooks.

  1. Yuli escribe .githooks/pre-commit, .githooks/commit-msg y .githooks/pre-push.
  2. Configura git config --local core.hooksPath .githooks.

Yuli no instala nada si core.hooksPath ya apunta a otra herramienta (por ejemplo, husky) o si existe un hook que no escribió. Si el motor no está disponible, el hook avisa y deja pasar: nunca te deja sin poder hacer commit.

Desinstalar hooks quita la configuración y borra solo los scripts de Yuli.

En la CI

Los pipelines que genera Crear CI incluyen el paso «Puertas del contrato», que ejecuta agent-engine gate --stage ci. Así la CI aplica las mismas reglas que tu equipo local.

El Centro de Gobierno

Ábrelo desde el riel derecho (Más herramientas → Centro de Gobierno) o con la paleta de comandos: Abrir el Centro de Gobierno. Tiene 10 pestañas.

Pestaña Qué contiene
Contrato Criticidad, umbrales, rutas protegidas, excepciones, capas, SLO, política de licencias, revisor independiente, clasificación de datos, presupuestos FinOps e historial.
Puertas Ejecutar el gate para una etapa, instalar o desinstalar los hooks y la tarjeta de CI.
Datos sensibles Valores redactados al salir del equipo, campos clasificados en el código y secretos en el historial de Git.
Análisis Requisitos (patrones EARS, ambigüedad, atributos ISO 25010, Gherkin) y glosario.
Diseño Decisiones (ADR), Amenazas (STRIDE), APIs (OpenAPI), C4, SLO y Legado.
Medición Funciones de aptitud de arquitectura, LCOM4, acoplamiento de cambios, bus factor, registro de deuda, twelve-factor y feature flags.
Pruebas Tests inestables y cuarentena, mutación, tipos de prueba, condiciones de carrera y carga.
Cadena de suministro Dependencias y licencias, SBOM, IaC, contenedores, DAST, procedencia (SLSA, cosign), CODEOWNERS e historial.
Entrega CI, release, rollback, despliegue progresivo, runbook, post-mortems, DORA, SPACE, builds y FinOps.
Agentes Contexto, Revisión, Telemetría, Aprendizaje, Benchmark e Inyección.

Documentos que genera

Documento Ruta
ADR (decisiones de arquitectura) docs/architecture/adr/
Modelo de amenazas STRIDE docs/architecture/threat-model.md
Diagramas C4 docs/architecture/c4.md
SBOM docs/reports/sbom.cdx.json y docs/reports/sbom.spdx.json
Runbook docs/operations/runbook.md
Post-mortems docs/operations/postmortems/

DORA

La pestaña Entrega calcula las cuatro métricas DORA: frecuencia de despliegue, lead time, tasa de fallos en cambios y MTTR, con las bandas Élite, Alta, Media y Baja. Usa los despliegues registrados o la CI. Yuli no ve un APM de producción.

Revisión independiente

Un modelo de otra familia revisa el cambio. Nunca usa la misma familia del modelo que lo escribió. Si no hay ninguno configurado, lo indica como no disponible. Es obligatoria en los perfiles Regulada y Seguridad crítica.

Contexto para todos los agentes

En Agentes → Contexto, la sección «Contexto para todos los agentes» escribe las mismas reglas para cada herramienta:

Destino Archivo
Claude Code (CLAUDE.md) .claude/CLAUDE.md
AGENTS.md (Codex y otros) AGENTS.md
Kiro (.kiro/steering) .kiro/steering/yuli.md
Antigravity .agent/rules/yuli.md
Cursor (.cursor/rules) .cursor/rules/yuli.mdc
GitHub Copilot .github/copilot-instructions.md
Gemini (GEMINI.md) GEMINI.md

El contenido va en un bloque gestionado; lo que escribas fuera se respeta. Por defecto los archivos quedan fuera de Git; actívalo con Versionarlos en Git. Cada destino muestra su estado: Al día, Desactualizado, No existe o Editado a mano.

Reglas aprendidas

Cuando un mismo hallazgo aparece 3 veces o más en al menos 2 tareas dentro de 30 días, se convierte en una regla en .ai/rules/learned.md. Puedes rechazarla en Agentes → Aprendizaje; solo se vuelve a proponer si su evidencia se duplica.

Límites honestos

  • DAST (OWASP ZAP), el escaneo de contenedores (Trivy o Grype) y la firma (cosign) solo se ejecutan si están instalados, y siempre con confirmación. Si faltan, Yuli lo indica y no simula el resultado.
  • Las reglas preventivas y las de IaC son patrones sobre el texto. Cada hallazgo trae su archivo y línea para que una persona lo confirme.