Tres capas Shipped · un adaptador de harness
Cada capa está ahí porque la de encima puede fallar
Un fichero se puede ignorar. Un hook puede no estar. Un pull request no puede ser ninguna de las dos cosas, pero llega demasiado tarde para detener nada. Ninguna de las tres basta, y ésa es toda la razón de que haya tres.
Capa 1 — el contexto, que aconseja
El bloque de AGENTS.md le dice al agente cuál es la task, qué está abierto y qué está cerrado. Se genera en el gate para que no pueda desfasarse, y es honesto en su propio texto sobre ser un consejo: nothing is stopping you, so this one is on you.
Capa 2 — el hook, que deniega
Un hook previo a la llamada a la herramienta responde allow, ask o deny antes de que ocurra la escritura. Dos propiedades importan más que el mecanismo:
- El camino crítico nunca toca la red. La decisión es local, así que una caída no puede abrir una zone — el backend nunca estuvo en el camino de la denegación, para empezar.
- Bash se contiene, no se clasifica. Adivinar qué hará un comando de shell es una apuesta perdida, así que los comandos corren contra un snapshot de git y los cambios fuera de zone se revierten byte a byte. 25/25 vectores de escape contenidos, 0/20 falsos positivos — sobre un corpus que elegimos nosotros; el eval de falsos positivos en vivo no ha corrido.
- 68–83 ms en p95 contra un presupuesto de 100 ms — y el p99 tocó 102 ms en un caso. El margen es estrecho y las palancas están nombradas.
Conviene decirlo claro: este mecanismo es commodity. Claude Code, Codex, Cursor, Augment, Factory y Devin CLI exponen todos un hook que puede devolver deny, y en el que probablemente usas es gratis. Lo que no es commodity es el modelo que consulta — owners, caducidad y permisos acotados a una task declarada.
La admisión que hace creíble el resto
Medimos el harness contra sesiones reales y es fail-open en los cuatro modos de fallo: crash, timeout, salida malformada, no instalado. Eso no es una nota al pie — es la razón por la que las otras dos capas existen con la forma que tienen. Un wrapper cierra tres de esos modos negándose por su cuenta cuando el hook no puede responder, y el cuarto — no instalado en absoluto — es invisible desde dentro de la máquina, así que sólo CI puede verlo.
Un lector escéptico lo descubriría igualmente. Imprimirlo junto a las cifras a las que resta credibilidad es lo más útil que puede hacer esta página.
Capa 3 — CI, que recalcula
El required status check lee el mismo mapa de zones en el pull request y recalcula qué zones tocó de verdad el diff, frente a lo que declaró la task. Es la única capa que puede ver trabajo producido donde CommitCycle nunca se instaló.
Su propio límite, dicho en voz alta: en un plan personal privado gratuito la protección de ramas responde 403, así que ahí esta capa corre en modo aviso y lo dice, en lugar de reportar un enforcement que no ejecutó.
Dónde se detiene el conjunto
- La capa 2 necesita un adaptador por harness. El modelo de zones es agnóstico del agente y las capas 1 y 3 ya lo son hoy — pero el punto de enforcement no. Hay un adaptador publicado; los demás son finos y están sin escribir.
- Una empresa puede bloquear el hook de plano. Los managed settings existen exactamente para eso, y una política que bloquea las fuentes de hooks bloquea el nuestro junto con los de todos los demás.
- Nada de esto arbitra entre agentes. Cada uno queda confinado a su propia task y su propia rama; dos que discrepan siguen discrepando.
Cómo se reparten el trabajo las capas está en la documentación (en inglés), y el mapa que leen las tres es el mapa de zones.