Zones

Nomeie os paths que doeriam. Tudo o resto continua aberto.

A maior parte de um repositório é segura para um agente mudar. Poucas partes não são — o schema, os contracts, o que o seu histórico de incidentes disser. Uma zone é como você diz qual é qual, num arquivo que você revisa como código — e, no modo governance, os únicos paths que o CommitCycle bloqueia. O padrão, o modo memory, não tem zones e impõe uma coisa só: editar exige uma task ativa.

dash.commitcycle.com/boardCC

✓ gate: four fields answered, no high-risk zone to approve

REQ-7 · schema · write · CC-42

Reason: the board query needs an index

Instead: hand the DDL to the owner

1 hour4 hoursUntil the task closes

✓ Approved — schema is open to CC-42 for 4 hours

No console uma task passa pelo gate para In Progress, e o owner de uma zone responde a um access request — por uma hora, quatro, ou até a task fechar.

Claude Code — ~/acme-webplugin · commitcycle

> add an index on tasks.updated_at — the board query is slow

● Write(apps/api/migrations/0042_tasks_updated_at.sql)

⎿ PreToolUse:Write — ✗ Denied by CC

zone schema · risk high

owner ana@acme.dev

task CC-42 declared no protected zones

reason path is in a zone the task never asked for

● The schema zone is closed to CC-42. Asking its owner rather than looking for another way in.

● Bash(cycle request-access --zone schema --mode write --reason "the board query needs an index" --alternative "hand the DDL to the owner")

⎿ REQ-7 is with the zone owner

approve or deny: https://dash.commitcycle.com/requests

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.

Quatro coisas, e uma delas é uma pessoa

Os path patterns dizem onde. Um risk level diz quanto cuidado. Uma default policy diz quem pode lê-la quando nada foi concedido — escrever sempre exige um grant. E um owner diz a quem perguntar — que é o atributo que transforma um muro numa porta.

  • Path patterns — as mesmas formas glob que os rulesets do GitHub usam, nada novo para aprender
  • Risk level — high, medium, low. High significa que o owner é consultado antes do trabalho começar
  • Default policy — deny fecha também a leitura; read-only e open a deixam legível. Em qualquer caso, escrever exige um grant
  • Owner — uma pessoa real, num arquivo, não na memória de alguém
.zones/zones.yml · committed
# O mapa do próprio CommitCycle, recortado. Quatro zones no arquivo real, não trinta,
# todas legíveis desde 2026-10-10 — escrever em qualquer uma ainda exige um grant.
zones:
  - id: schema
    risk: high
    owner: paulo@commitcycle.com
    paths:
      - "apps/api/migrations/**"
      - "apps/api/src/db/schema/**"
    default_policy: open

  - id: enforcement
    risk: high
    owner: paulo@commitcycle.com
    paths:
      - "packages/hook/**"
      - "packages/action/**"
    default_policy: open

  - id: brand
    risk: medium
    default_policy: open

# Tudo que não está aqui fica sem proteção, de propósito.

O acesso chega como um grant, e vai embora sozinho

Mover uma task para In Progress é o que emite isso. Além desse gate, só um owner respondendo a um access request abre uma zone, e cycle renew só reemite o mesmo escopo — não existe comando open-zone, e ninguém precisa lembrar de fechar nada.

Preso a uma task

Abre as zones que aquela task declarou, e nada adjacente. A mudança vizinha tentadora é justamente a que os non-goals existem para nomear.

Preso a um branch

A garantia é por checkout: dois agentes num mesmo diretório compartilham um branch, e com ele uma task e um grant. Essa é a falha que este produto sofreu primeiro nele mesmo (D-43, ainda proposta); a resposta por enquanto é um worktree por agente.

Expira em oito horas, no máximo

O gate o emite por oito horas, no máximo. Um owner que aprovou uma zone de alto risco por uma hora ou quatro antecipa a expiração do grant inteiro para coincidir (CC-1327).

Blocked14:02 · task CC-42

Write apps/api/migrations/0007_add_org_index.sql

Zone
schema · risk high
Task declared
api, web
Owner
paulo@commitcycle.com

O agente é avisado do motivo na mesma resposta que nega, então ele pede acesso em vez de tentar outro caminho. Um bloqueio que só diz não acaba sendo contornado.

Access requestwaiting · 2 min

CC-42 quer schema

Reason
A migração precisa do índice do org
Scope
write · apps/api/migrations/**
Expires
4 horas depois da aprovação
Approve for 4hDeny

Just-in-time: o grant expira sozinho. Ninguém precisa lembrar de fechá-lo, que é justo o passo em que todo processo de acesso falha.

Bloquear é commodity. O modelo por baixo não é.

Melhor dizer antes que você descubra sozinho: negar uma tool call na hora já existe no Claude Code, Codex, Cursor, Augment, Factory e Devin CLI, e é grátis em qualquer um deles que você já use. Se isso fosse o produto, você não precisaria desta página.

O que nenhum deles tem é o modelo que essa negação consulta. As regras deles são por máquina e permanentes. Não há um owner para perguntar, nem um momento de aprovação, nem expiração, nem noção de uma task à qual a permissão possa estar presa.

As regras de todo mundo

Uma lista de paths. Definida uma vez, verdadeira para sempre, igual para qualquer trabalho, sem ninguém associado.

Uma zone mais um grant

Path × owner × risk × esta task × este branch × oito horas, no máximo, e um registro de quem abriu e por quê.

Contra CODEOWNERS e os rulesets de branch a diferença é o quando: mesmo vocabulário, perguntado depois que a mudança já existe, imposto no host. Uma zone é checada na escrita, no seu notebook, offline — e o check de CI que recalcula o diff depois roda só no próprio repositório do CommitCycle.

O que foi medido, e o que isso não prova

Cada número aqui carrega seu limite na mesma frase.

  • 25/25 vetores de escape do Bash contidos — as escritas de shell 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. A contenção fecha quando a chamada retorna, então o que um comando deixa rodando — um comando em segundo plano (o hook pergunta antes), um em primeiro plano que estoura o timeout, um cmd & dentro de outro — escapa dela até o fechamento checar o diff contra as zones (CC-1379). Medido em 2026-08-03 (CC-3). Paths ignorados pelo git não são vistos, então um .env dentro de uma zone não tem contenção. O corpus foi escolhido pelo próprio autor. O eval de falsos positivos ao vivo não rodou.
  • 0/20 falsos positivos nesse mesmo guard. Mesmo corpus autoescolhido. Vinte comandos não são vinte tasks reais.
  • 8/20 falsos positivos no allowlist conservador — a abordagem que recusamos, e o motivo pelo qual a contenção venceu. Mesmo corpus escolhido por nós. O que foi medido é a taxa de 40%; que isso custaria a instalação é a nossa leitura, não uma medição.
  • 68–83 ms no p95 para a decisão, contra um orçamento de 100 ms. Medido em 2026-08-03 na primeira versão do hook, numa máquina ociosa. O p99 encostou em 102 ms num 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 no 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.

Onde as zones param

  • Elas confinam cada agente; não arbitram entre eles. Dois agentes que discordam continuam discordando — cada checkout simplesmente fica preso à sua própria task e ao seu próprio branch.
  • Sem proteção é o padrão, e deveria ser. Um gate exagerado custa mais do que um que falta, então tudo que você não declarar simplesmente fica aberto.
  • Topics nunca impõem. Zones impõem paths; as disciplinas que uma task declara só aconselham. As duas coisas nunca se misturam.
  • O registro sobrevive. O mapa é um arquivo no seu repositório e, por padrão, os registros das tasks e o audit record que um fechamento pela CLI escreve também; o board guarda uma cópia de cada audit record, e a única cópia do que um fechamento pelo console ou por um merge escreveu. Os grants são estado local de vida curta que expira com o trabalho. Desinstale o CommitCycle e você fica com os arquivos, e cycle export --audits imprime o histórico do board, registros incluídos, em Markdown.

Perguntas que esta página responde

Como impeço um agente de código em IA de editar certos arquivos?

Declare esses paths como uma zone com um owner e um risk level. O agente só ganha acesso às zones que a task dele declarou, no branch ao qual essa task está presa, e o acesso expira sozinho. Tudo que você não declarar fica sem proteção, que é o certo para a maior parte de um repositório.

Qual a diferença disso para o CODEOWNERS?

O CODEOWNERS é o mesmo vocabulário aplicado depois do fato, no host: pede uma revisão quando a mudança já existe. Uma zone é checada no momento da escrita, na sua máquina, e carrega uma expiração e um escopo de task que o CODEOWNERS não tem.