← Volver al cuaderno

ENTENDER / GUÍA 02

Un gate rojo no es un fracaso. Es un freno que funciona.

Qué ocurre cuando la auditoría o las comprobaciones detienen una fase: tres bloqueos reales del run de Stripe y cómo se resuelve cada uno.

Un sistema que nunca se detiene también puede avanzar sobre un error. Los controles existen para impedirlo. Aquí tienes tres bloqueos del mismo run — el de los pagos con Stripe — con su resolución.

Auditoría y validación no son lo mismo

El auditor cuestiona el trabajo hecho y señala riesgos concretos, con fichero y línea. El validator ejecuta comprobaciones automáticas y solo acepta números. Son perspectivas complementarias — una ataca, la otra mide.

Bloqueo 1 — el auditor caza una violación de arquitectura

El builder conectó el panel de cobros directo a la base de datos, que en el repo real se traduce en algo así:

routes/api/pagos/+server.ts importa supabase → VIOLACIÓN de la regla 3 (la hexagonal: las rutas no tocan la base; hablan con puertos).

Veredicto del auditor, numerado:

FALLO 1: routes/api/pagos/+server.ts:14 — import directo de supabase en capa de ruta. FALLO 2: sin contrato de puerto para CreatePayment.

Qué pasa: nada más. La fase vuelve al builder (bucle rojo ④→③), que reimplementa hablando con el puerto PaymentRepository. El architect ya había definido el contrato en su plan: el builder lo había saltado, no lo tenía que inventar. Todo el intercambio queda firmado en el journal (evento blocked).

Bloqueo 2 — el validator no acepta un «casi»

El builder repara, el auditor da PASS, y llega el momento de medir:

arquitectura → check-architecture → VERDE suite billing → 41/42 (1 test en rojo: reintento duplicado) lint → 0 · typecheck → 0 · builds → OK skill-ui lint → PASS · docs check → exit 0

Un solo ROJO. La fase NO avanza: la auto-reparación arranca con presupuesto (máx N intentos). El builder arregla el caso de reintento — un pago duplicado debe rechazarse, que era precisamente un test que él mismo escribió ANTES de implementar. Segunda pasada: 42/42 → release.

Si el presupuesto se agotara, la fase queda BLOQUEADA y se te avisa. Nunca un bucle infinito, nunca un «déjalo así».

Bloqueo 3 — la evidencia falta

Release intenta cerrar f1 y encuentra un criterio sin número:

[x] suite billing verde — 42/42 [x] arquitectura — hexagonal VERDE [ ] webhook idempotente (replay de eventos) — sin evidencia grabada

Resultado: f1 queda ABIERTA. Sin trampas. El replay de eventos se ejecuta, su veredicto se graba en el spec, y solo entonces f1 pasa a CERRADA. El sistema no distingue entre «no lo hice» y «no lo anoté»: ambos dejan la fase abierta.

Un gate rojo de verdad (caso real, 2026-10-29)

Esto NO es ilustrativo: es un gate real del propio desarrollo de Canary, capturado del sistema:

g4-tck-must-level — 48 failed, 17 passed, 170 skipped in 5.47s, exit 1 severity=high · event_type=validation_failure “real MUST-level conformance gap… escalated verbatim per SPEC rule, fail recorded with learning event”

Fíjate en lo que NO pasó: el veredicto no se suavizó, no se «dispositionó» para quedar bien ni se enterró. Quedó grabado como evento de aprendizaje de severidad alta, escalado al owner tal cual — y la entrega siguió su curso con el fallo documentado. El gate no aceptó la realidad que quería; aceptó la que había. (Puedes ver el output completo en la página Verificado.)

Qué conviene revisar cuando algo se detiene

  • La comprobación fallida exacta (¿qué criterio, qué comando?).
  • El alcance afectado (¿una fase, la tarea entera?).
  • La evidencia del fallo (¿dónde quedó firmado?).

Y no conviertas el verde en garantía absoluta: los gates prueban criterios concretos («42/42», «webhook replay idempotente»). Pasarlos no demuestra la ausencia de cualquier defecto. Su valor está en que el criterio y su resultado son visibles y repetibles — el LLM puede equivocarse mil veces; el gate solo acepta la realidad.

Explorar el intake en 8 pasos ↗