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

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.

acme-webafter cycle start CC-58

$ cycle start CC-58

<!-- cc:begin -->

### You are working on CC-58 — Export times out on large boards

Branch `task/CC-58-export-times-out-on-large-boards`. Access expires in about 8 hours.

What it must NOT do. No change to the export format.

No protected zone is open to this task.

<!-- cc:end -->

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 — ~/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.

Pull request · commitcycleCommitCycle's own CI

CC-42: add an index on tasks.updated_at

task/CC-42-add-an-index-on-tasks-updated-at → main

  • ✓ static, test, evals, apps — typecheck, unit tests, evals, builds
  • ◌✓scope — Is this pull request inside what its task declared?

Advisory here: this repository’s plan cannot make a check required.

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 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:

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 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 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

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.