---
title: "Três camadas, e só uma delas impõe alguma coisa"
description: "O contexto aconselha, o hook nega na tool call e a CI recalcula o diff, só no nosso repo. Cada camada existe porque a de cima pode falhar."
url: https://commitcycle.com/pt-br/three-layers/
language: pt-BR
---

# Cada camada está ali porque a de cima pode falhar

> O contexto aconselha, o hook nega na tool call e a CI recalcula o diff, só no nosso repo. Cada camada existe porque a de cima pode falhar.

Três camadas Shipped · comprovado só no Claude Code

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.

**Editor:** O cycle start escreve a task num CLAUDE.local.md ignorado pelo git, ao lado do mapa de zones do AGENTS.md, e o cycle submit tira de novo.

**Claude Code:** O hook recusa a escrita antes que ela aconteça, nomeia a zone e o owner, e o agente pede acesso em vez de procurar outro caminho. O Claude Code é onde esse bloqueio já foi visto funcionando.

**Pull request:** A camada 3 confere de novo o diff contra o que a task declarou. Hoje roda no próprio CI da CommitCycle, em modo consultivo; nada a instala no seu.

## Camada 1 — o contexto, que aconselha

[O bloco do AGENTS.md](https://commitcycle.com/pt-br/agents-md/) traz o mapa de zones, o board, a nota de entrega que ele espera e a regra de deploy; a task em si — o que está aberto e o que está fechado — é escrita no gate num `CLAUDE.local.md` ignorado pelo git, que o Claude Code carrega — se outros editores carregam nunca foi verificado — e removida na entrega. Ele é 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 antes de a escrita acontecer. O nosso só restringe: pode negar, e desde o CC-1142 nunca responde allow, então os pedidos de permissão do próprio harness continuam valendo. O que importa 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 em paths protegidos que a task não tem abertos são revertidas byte a byte; paths ignorados pelo git não são vistos. A contenção fecha quando a chamada retorna, então o que um comando deixa rodando escapa dela até o fechamento checar o diff contra as zones: um comando em segundo plano (o hook pergunta antes), um em primeiro plano que estoura o timeout, um `cmd &` dentro de outro. **25/25** vetores de escape contidos, **0/20** falsos positivos — em 2026-08-03, 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 — medido em 2026-08-03 na primeira versão do hook, numa máquina ociosa, e o p99 chegou a 102 ms em um caso. O CC-1377 mediu de novo em outubro de 2026 em duas VMs na nuvem: na mais lenta, wrapper e núcleo chegaram a 211–228 ms em p95 (carga 0,74–1,04), e o custo do hook sobre um processo node lançado por shell foi de 84–111 ms lá contra 44–48 ms na mais rápida, com o mesmo código — dois hosts, não um levantamento.

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](https://commitcycle.com/pt-br/zones/) — 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 em 2026-08-03, 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 pode fechar três desses modos recusando por conta própria quando o hook não consegue responder — mas só onde a failure policy do repositório está em closed. Desde o CC-1143 o padrão é open: as chamadas seguem e a sessão é avisada. O quarto — _nunca instalado_ — é invisível de dentro da máquina, então só a CI consegue enxergá-lo, e só onde o check roda.

## Camada 3 — a CI, que recalcula

[O check de CI](https://commitcycle.com/pt-br/ci/) lê o mapa de zones a partir do próprio checkout do pull request e recalcula quais zones o diff de fato tocou, contra o que a task declarou — a declaração, não o grant, então aprovações e expiração não são verificadas. É a única camada que poderia ver trabalho produzido onde o CommitCycle nunca foi instalado.

Os limites dela, ditos com todas as letras: ela só roda no próprio repositório do CommitCycle, e nada a instala no seu. Ali, num plano pessoal privado gratuito, a proteção de branch responde **403**, então ela roda em modo aviso, diz isso e não consegue impedir um merge. Um board que não responde a transforma num skip que passa mesmo assim, e num pull request do mesmo repositório o branch pode reescrever o workflow que o verifica. Um modo que impõe e um check run pelo board estão construídos e não foram ligados.

## Onde o conjunto para

- **A camada 2 está comprovada em um só harness.** O modelo de zones é agnóstico ao agente; o ponto de enforcement não é. `cycle init` escreve arquivos de hook para Claude Code e Codex, e para Cursor e Windsurf se pedido, só onde já existe um wrapper do hook em disco, então na sua máquina ele não escreve nenhum e o hook é o do plugin — só no Claude Code, então Codex, Cursor e Windsurf ficam sem nenhum. Só no [Claude Code](https://commitcycle.com/pt-br/claude-code/) já se viu uma negação numa instalação real — os outros, onde seus arquivos são escritos, não foram exercitados e recebem as respostas no formato do Claude Code. Da metade da task da camada 1 só se sabe que chega ao Claude Code, e a camada 3 não pode ser instalada no seu repositório.
- **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 checkout fica confinado à própria task e ao próprio branch, então dois agentes num mesmo diretório compartilham os dois; dois que discordam continuam discordando.

Como as camadas dividem o trabalho está na [documentação](https://commitcycle.com/docs/concepts/three-layers/) (em inglês), e o mapa que as três leem é [o mapa de zones](https://commitcycle.com/pt-br/zones/).
