Guardas del repositorio

Qué guardas existen, qué impide cada una y cómo se diseñan para que no se degraden.

Implementado. La lista es la de las guardas que están en el repositorio; cada tabla dice cuáles corren en CI y cuáles son locales u operativas. Dos guardas más (check:docs-contract y check:headless-parity) son parte del ADR de documentación como contrato, que está propuesto: no se describen aquí como obligatorias hasta su bloqueo, y su estado está en la vista del roadmap.

Cómo se diseña una guarda

Una guarda es una decisión convertida en código que falla. Para que no se degrade:

  1. Cada guarda tiene su mutante rojo. Una guarda que nunca se ha visto fallar no es evidencia. El cambio que la crea incluye el caso que debe ponerla en rojo (un catch {} en un parser, un @ptrCast sin comentario, una ruta sin policy…) y su salida cruda.
  2. Los trinquetes sólo bajan. Las deudas conocidas viven en un fichero de base (por ejemplo safety_baseline.zon, check-consumer.baseline.json) que puede encogerse y nunca crecer; un fichero nuevo parte de cero. Bajar el baseline es un commit explícito.
  3. Una guarda que no corre en CI no cuenta como cierre. Las guardas de las tablas están enganchadas a .github/workflows/guard.yml (directamente, dentro de check:roadmap o dentro de bun run test) o a zig build / zig build test, salvo las que se marcan como locales u operativas: necesitan Docker, root o la infraestructura levantada, y su resultado sólo cuenta como evidencia con la salida cruda adjunta al ticket.
  4. Comprueban presencia y forma, no calidad. Una guarda mecaniza una exigencia (por ejemplo que un gate no se pueda escribir en verde sin evidencia), no sustituye la verificación independiente. Ver evidencia adversarial.
  5. Declarar lo que no cubren. Cada guarda dice sus límites en su cabecera.

Gobernanza del roadmap

bun run check:roadmap ejecuta de una vez estas comprobaciones y dice cuáles fallan. Corre en CI como paso propio del job ssot-and-foundation:

ComprobaciónQué impide
roadmap-consistencyQue el spec congelado se desvíe de su integridad interna; el contador agregado de gates (r31 D1)
check:roadmap-viewQue ROADMAP.md (vista generada) quede viejo respecto de styx.model.yml
context-consistencyQue los CLAUDE.md y las reglas se desvíen del árbol real, o que congelen estado
axon-gen --checkQue las vistas generadas queden viejas respecto de su fuente
check-configQue la configuración de axon no cumpla su esquema
check-modelQue el model rompa sus reglas: tipos de nodo, forma de los ids, zonas, autoridad única
check-gatesQue un gate se «autore» en verde sin evidencia (ver abajo)
check-consumerQue aparezcan exportaciones nuevas sin ningún consumidor (principio anti-especulativo)
docs-views --checkQue las vistas roadmap/ y decisiones/ de esta documentación queden viejas respecto del model
check-docs-contractQue una página de esta documentación contradiga el model, los manifests de gate o los ADR que cita (ver páginas de contrato)
check-headless-parityQue la web ofrezca algo que no exista también sin interfaz: operación, OpenAPI, SDK y CLI

check-gates hace dos cosas, en este orden: congela la clase de cada gate para impedir reclasificaciones silenciosas (reclasificar es editar un baseline visible en el cambio), y exige que un gate se derive de un manifiesto de evidencia: todo item que no esté abierto debe tener un comando ya ejecutado, su salida, y un autor distinto del verificador. El veredicto es por item, nunca un contador agregado.

Comunicaciones y contratos

GuardaQué impide
check:busQue la tabla BUS_ROUTES, el espejo Zig y la ACL de NATS se desvíen: lo versionado debe ser lo generado
test:bus-aclQue un servicio publique o se suscriba fuera de su tabla, o cree o cambie un stream, sobre un NATS real
Test de transporte directoQue algo fuera de @styx/bus importe NATS o los transportes de spire
Test de importsQue packages/ importe de apps/ (con la excepción documentada del tipo del cliente)

Data plane

GuardaQué impide
audit:safetyPrimitivas en bruto en el daemon (rutas, sincronización, errores tragados, abortos, casts); incluye Z1
check:zkit-no-reimplReimplementar un símbolo de zkit en el daemon
check:no-media-spawnLanzar ffmpeg o ffprobe como proceso desde código de producto
Auditoría de imports C15Dependencias entre crates que rompan la taxonomía del data plane
test:zig:tsanCarreras de datos en el data plane (con un canario que prueba que el carril discrimina)

Despliegue y cadena de suministro

GuardaDónde correQué impide
check:supply-chainCI (paso propio)Acciones sin fijar por commit, token de CI con escritura, Bun distinto del fijado, instalaciones sin lockfile congelado, curl sin hash, toolchain sin fijar
check:deployCI (dentro de bun run test)Un compose que se salga del endurecimiento: contenedores, redes, secretos, borde, direcciones de confianza
check:deploy-renderCI (dentro de los tests de apps/cli)Que el compose versionado de deploy/ deje de ser el render de deploy/model/styx.deploy.yml
check:docker-contextCI (paso propio)Un Dockerfile que no se pueda construir desde un checkout limpio (un COPY de algo que ya no existe)
check:infra-liveLocal u operativa (infra levantada, Docker)Una infraestructura real que contradiga lo declarado (por ejemplo un puerto alcanzable por donde no debe)
test:deploy-egressLocal u operativa (Docker y root)Que un servicio llegue a donde su política de salida no permite

Versionado y release

GuardaDónde correQué impide
check:release-mapCI (paso propio)Un fichero de apps/, native/, deploy/ o docker/ sin componente en release/components.yml, o con dos
check:interfacesCI (paso propio)Que cambie el esquema de un contrato entre componentes (bus, socket del daemon) sin subir su versión
check:migrationsCI (paso propio)Una migración SQL sin cabecera -- styx:kind=expand|contract|data o que el código del tren anterior no aguante sin declararlo contract
check:cli-referenceCI (paso propio)Que apps/cli/REFERENCE.md o las guías de operador mencionen órdenes, opciones o códigos de error que el CLI no tiene, o al revés
check:licensesLocal (necesita build/release/ de release:build y los SBOM de release:sbom)Un artefacto de release con una dependencia GPL o AGPL, o con una licencia que pide revisión y no tiene excepción en release/license-policy.json

release:plan y release:version no son guardas: calculan versiones. Cómo encajan con el resto del recorrido está en Ciclo de vida.

Calidad de código

bun run typecheck, bun run lint y bun run test corren en CI. Los tests incluyen guardas de arquitectura y de seguridad (rutas sin policy, lecturas de secretos desde el entorno, imports prohibidos, endurecimiento del despliegue).

bun run format:check valida el formato, pero es local: no corre en CI.

check:vision-ledger (CI, paso propio) valida docs/overview/vision-ledger.yml: esquema, ids únicos y que cada referencia a un nodo, un ADR o una página exista.

Documentación

scripts/docs/gen-roadmap-adrs.ts --check regenera en memoria las vistas roadmap/ y decisiones/ y falla si difieren del contenido versionado o si sobra un fichero (ver generadores). Corre en CI dentro de check:roadmap (fila docs-views --check), así que un verdict, un nodo o un ADR cambiado sin bun run docs:gen pone CI en rojo, y una copia a mano metida en esas carpetas también. Qué se exige de cada página y cómo se cruzan las páginas con el roadmap está en páginas de contrato.