Nesta página
Propriedade de arquitetura
COADF P-6: uma barreira que vive em um documento é um conselho; uma barreira que roda na pipeline e bloqueia uma liberação é um fence. Os fences caem em quatro categorias (dados, arquitetura, texto e processo), cada um com um identificador, uma regra e um método de aplicação, e um fence só ganha seu lugar por uma prova de dentes. O COADF não publica o vocabulário sobre o qual seu próprio fence de publicação dispara, porque uma lista do que se vigia é um mapa do que se protege.
A propriedade não é “existe uma verificação”. É que o estado proibido não consegue passar de um determinado ponto, e que alguém o viu ser detido ali.
Por que importa
Todas as outras propriedades deste Companion podem ser implementadas corretamente uma vez e perdidas na mudança seguinte. Um fence é o que mantém uma propriedade verdadeira ao longo de mudanças que ninguém revisou com essa propriedade em mente. A parte difícil raramente é escrever a verificação. É colocá-la no caminho que o estado proibido precisa percorrer, e provar que ela dispara ali, no caminho real, e não num teste unitário da função que verifica.
Estratégias de implementação válidas
Superfícies de aplicação
Cada superfície vê algo diferente, e cada uma tem um desvio característico. Um fence pertence à superfície que vê o estado proibido, e só é tão forte quanto o desvio dessa superfície permite.
| Superfície | Vê | Desvio típico |
|---|---|---|
| Compilador e verificador de tipos | Estrutura do código e tipos declarados | Casts, tipagem dinâmica, reflexão, código gerado |
| Validação na aplicação | Valores numa fronteira, em tempo de execução | Um segundo ponto de entrada: um job em lote, um script, uma migração |
| Teste de arquitetura | O grafo de dependências | Carregamento por nome em tempo de execução; um pacote novo que a regra não nomeia |
| Teste de contrato e de esquema | Compatibilidade de interfaces | Um consumidor que ninguém registrou |
| Integração contínua | O repositório num commit | Uma verificação obrigatória que é pulada e informada como sucesso |
| Gate de merge | Quais verificações precisam passar antes de um merge | Administradores, pushes diretos, proteção que o plano de hospedagem não aplica |
| Pipeline de liberação | O artefato que está sendo promovido | Um upload manual |
| Admissão no deploy | Objetos de API submetidos ao cluster | Uma política de falha que ignora erros; objetos que existiam antes da política |
| Build de publicação | A saída pública renderizada | Conteúdo servido de fora do build |
Três cadeias, cada uma terminando numa transição detida, estão implementadas nos perfis:
- Uma violação de arquitetura faz um teste de arquitetura falhar, e o merge não acontece (Python e FastAPI).
- Uma incompatibilidade de contrato faz uma verificação de contrato falhar, e a liberação não acontece.
- Uma sentinela proibida sintética no site gerado faz o fence de publicação falhar, e a publicação não acontece (Python e FastAPI, Cloud-native).
A integração contínua é uma superfície entre nove, não a definição de um fence. GitHub Actions, GitLab CI e Jenkins podem hospedar um; também podem um verificador de tipos, uma política de admissão ou o build que renderiza um site.
Prova de dentes
- Introduzir um defeito controlado e sintético.
- Exercitar o caminho real de aplicação, não um teste unitário da função que verifica.
- Verificar que falha, e que falha pelo motivo plantado.
- Restaurar exatamente o fixture, e provar isso comparando um digest antes e depois.
- Verificar que volta a passar.
Fazer commit antes de plantar. Restaurar descartando mudanças restaura o último commit, que numa branch de trabalho pode não ser o ponto de partida, e a prova então destrói o trabalho que deveria proteger.
Modos de falha
O fence está no caminho errado
Ele verifica o repositório, enquanto o conteúdo proibido é injetado no build, no deploy ou em tempo de execução.
Uma verificação obrigatória pulada é lida como sucesso
O GitHub informa um job pulado como bem-sucedido, e um job pulado não impede um merge mesmo quando é uma verificação obrigatória. Um job obrigatório que depende de um fence que falhou é pulado, e o merge passa. A exigência deve recair sobre o próprio fence, ou sobre um job de resumo que sempre roda e falha a menos que todos os fences tenham passado (a própria orientação do GitHub para verificações que dependem de outros jobs).
Consultivo por configuração
continue-on-error,allow_failure: trueno GitLab CI, um webhook de admissão cuja política de falha ignora erros, uma constraint do Gatekeeper emdryrunouwarn: cada um transforma um fence em conselho sem que ninguém escreva essa palavra.Nada verificado, informado como limpo
Uma lista de padrões vazia, uma seleção de testes que não corresponde a nada, a varredura de um diretório vazio. O número de verificações de fato executadas pertence ao resultado, e zero é uma falha.
O fence dispara em trabalho legítimo e é desligado
A precisão mantém um fence vivo. Uma regra que dispara em texto comum vai ser desativada em vez de obedecida, e um fence desativado é pior do que nenhum, porque todos continuam acreditando que ele está lá.
A própria lista do fence é publicada
Uma lista pública de termos vigiados diz a quem lê exatamente o que está sendo protegido.
O estado existente nunca é verificado
Verificações de admissão e de pré-merge agem sobre requisições no momento em que são feitas, não sobre o que já existe. O Kubernetes documenta isso com todas as letras para um plugin de admissão: quando um LimitRange é adicionado, os pods que já existem continuam inalterados. O Gatekeeper tem uma auditoria de recursos existentes exatamente para essa lacuna.
Verde é lido como suficiente
Uma verificação que passa prova que a verificação passou. Se é a verificação certa é uma questão de arquitetura que nenhuma pipeline consegue responder; ver a nota técnica.
Verificação
Teste de arquitetura
Passa quando: A regra de dependência passa na árvore atual.
Prova de dentes: Plantar a importação proibida: falha, e o gate de merge recusa.
Teste de contrato
Passa quando: Os esquemas de produtor e consumidor são compatíveis.
Prova de dentes: Remover um campo obrigatório do produtor: a verificação falha e o job de liberação não roda.
Teste de ponta a ponta
Passa quando: O fence de publicação varre a saída gerada e passa.
Prova de dentes: Plantar uma sentinela sintética na saída: o build falha. Removê-la, comparar o digest, e o build passa.
Teste de implantação ou de admissão
Passa quando: Um objeto que segue a regra é admitido.
Prova de dentes: Submeter um que a quebra: recusado, com a mensagem da regra.
Evidência manual
Passa quando: No merge, uma pessoa nomeada confirma que cada fence rodou nesta execução: o identificador da execução e o número de verificações executadas ficam registrados, não lembrados.
Realizações alternativas
- Hooks de pre-commit. Retorno rápido, e contornáveis na própria máquina de quem desenvolve: conselho, não fence.
- Guardas em tempo de execução. Detêm um estado proibido em produção em vez de antes dela. Necessários onde o estado só existe em tempo de execução.
- Gates manuais. Uma pessoa nomeada executa um procedimento escrito. O COADF informa esse controle honestamente como manual, nunca como imposto.
- Motores de políticas para regras de infraestrutura. ValidatingAdmissionPolicy do Kubernetes dentro do processo, ou Open Policy Agent com Gatekeeper, onde o estado proibido é um objeto de API.
Limitações
- Um fence de texto não consegue ver um mecanismo expresso por fluxo de controle, identificadores renomeados, fluxo de dados ou a geometria de um diagrama. Guardas automatizados são necessários e não suficientes; a revisão humana continua.
- Um fence detecta o que foi escrito para detectar, e nada mais.
- Fences que passam estabelecem que os fences passaram. Não estabelecem nenhum status regulatório.
Fontes
- GitHub: Control jobs with conditions · documentação oficial · Verificado em 2026-09-11
- GitHub: Troubleshooting required status checks · documentação oficial · Verificado em 2026-09-11
- GitLab: CI/CD YAML: allow_failure · documentação oficial · Verificado em 2026-09-11
- Kubernetes: Dynamic admission control: failure policy · documentação oficial · Kubernetes 1.37 · Verificado em 2026-09-11
- Open Policy Agent Gatekeeper: Gatekeeper: enforcement actions · documentação oficial · Gatekeeper 3.23 · Verificado em 2026-09-11
- Kubernetes: Limit Ranges: admission-time validation · documentação oficial · Kubernetes 1.37 · Verificado em 2026-09-11
- Open Policy Agent Gatekeeper: Gatekeeper: audit · documentação oficial · Gatekeeper 3.23 · Verificado em 2026-09-11
- Kubernetes: Validating Admission Policy · documentação oficial · Kubernetes 1.37 · Verificado em 2026-09-11
