Três camadas Shipped · um adaptador de harness
Cada camada está ali porque a de cima pode falhar
Um arquivo pode ser ignorado. Um hook pode não estar lá. Um pull request não pode ser nenhuma das duas coisas, mas chega tarde demais para impedir qualquer coisa. Nenhuma das três basta, e esse é o motivo inteiro de existirem três.
Camada 1 — o contexto, que aconselha
O bloco do AGENTS.md diz ao agente qual é a task, o que está aberto e o que está fechado. Ele é gerado no gate para não ficar desatualizado, e é honesto no próprio texto sobre ser um conselho: nothing is stopping you, so this one is on you.
Camada 2 — o hook, que nega
Um hook anterior à chamada da ferramenta responde allow, ask ou deny antes de a escrita acontecer. Duas propriedades importam mais do que o mecanismo:
- O caminho crítico nunca toca a rede. A decisão é local, então uma queda não abre uma zone — o backend nunca esteve no caminho da negação, para começo de conversa.
- Bash é contido, não classificado. Adivinhar o que um comando de shell vai fazer é um jogo perdido, então os comandos rodam contra um snapshot do git e as mudanças fora de zone são revertidas byte a byte. 25/25 vetores de escape contidos, 0/20 falsos positivos — contra um corpus que nós mesmos escolhemos; o eval de falsos positivos ao vivo não rodou.
- 68–83 ms em p95 contra um orçamento de 100 ms — e o p99 chegou a 102 ms em um caso. A margem é estreita e as alavancas estão nomeadas.
Vale dizer com todas as letras: este mecanismo é commodity. Claude Code, Codex, Cursor, Augment, Factory e Devin CLI expõem todos um hook que pode devolver deny, e naquele que você provavelmente usa ele é gratuito. O que não é commodity é o modelo que ele consulta — owners, expiração e permissão delimitada a uma task declarada.
A admissão que torna o resto crível
Medimos o harness contra sessões reais e ele é fail-open nos quatro modos de falha: crash, timeout, saída malformada, não instalado. Isso não é uma nota de rodapé — é o motivo de as outras duas camadas existirem no formato que têm. Um wrapper fecha três desses modos recusando por conta própria quando o hook não consegue responder, e o quarto — nunca instalado — é invisível de dentro da máquina, então só a CI consegue enxergá-lo.
Um leitor cético descobriria isso de qualquer jeito. Publicá-lo ao lado dos números que ele enfraquece é a coisa mais útil que esta página pode fazer.
Camada 3 — a CI, que recalcula
O required status check lê o mesmo mapa de zones no pull request e recalcula quais zones o diff de fato tocou, contra o que a task declarou. É a única camada que consegue ver trabalho produzido onde o CommitCycle nunca foi instalado.
O limite dela, dito com todas as letras: num plano pessoal privado gratuito a proteção de branch responde 403, então ali esta camada roda em modo aviso e diz isso, em vez de reportar um enforcement que não executou.
Onde o conjunto para
- A camada 2 precisa de um adaptador por harness. O modelo de zones é agnóstico ao agente e as camadas 1 e 3 já são agnósticas hoje — mas o ponto de enforcement não é. Um adaptador está publicado; os outros são finos e ainda não foram escritos.
- Uma empresa pode bloquear o hook de vez. Os managed settings existem exatamente para isso, e uma política que trava as fontes de hooks trava o nosso junto com os de todo mundo.
- Nada disso arbitra entre agentes. Cada um fica confinado à própria task e ao próprio branch; dois que discordam continuam discordando.
Como as camadas dividem o trabalho está na documentação (em inglês), e o mapa que as três leem é o mapa de zones.