allow, deny e instruct das políticas integradas.
Exemplo rápido
Duas formas de carregar políticas personalizadas
Opção 1: Por convenção (recomendado)
Coloque arquivos*policies.{js,mjs,ts} na pasta .failproofai/policies/ e eles serão carregados automaticamente — sem flags ou alterações de configuração. Funciona como git hooks: basta adicionar o arquivo e ele já funciona.
- Os diretórios do projeto e do usuário são verificados (união — sem prioridade por escopo)
- Os arquivos são carregados em ordem alfabética dentro de cada diretório. Use o prefixo
01-,02-para controlar a ordem - Apenas arquivos que correspondem a
*policies.{js,mjs,ts}são carregados; outros arquivos são ignorados - Cada arquivo é carregado de forma independente (fail-open por arquivo)
- Funciona junto com
--customexplícito e políticas integradas
Opção 2: Caminho de arquivo explícito
policies-config.json como customPoliciesPath. O arquivo é carregado novamente a cada evento de hook — não há cache entre eventos.
Usando as duas opções juntas
As políticas por convenção e o arquivo--custom explícito podem coexistir. Ordem de carregamento:
- Arquivo
customPoliciesPathexplícito (se configurado) - Arquivos de convenção do projeto (
{cwd}/.failproofai/policies/, em ordem alfabética) - Arquivos de convenção do usuário (
~/.failproofai/policies/, em ordem alfabética)
API
Importação
customPolicies.add(hook)
Registra uma política. Chame quantas vezes precisar para múltiplas políticas no mesmo arquivo.
Funções auxiliares de decisão
deny(message) — a mensagem aparece para Claude com o prefixo "Blocked by failproofai:". Um único deny interrompe toda avaliação subsequente.
instruct(message) — a mensagem é anexada ao contexto de Claude para a chamada de ferramenta atual. Todas as mensagens instruct são acumuladas e entregues juntas.
Mensagens allow informativas
allow(message) permite a operação e envia uma mensagem informativa para Claude. A mensagem é entregue como additionalContext na resposta stdout do hook handler — o mesmo mecanismo usado por instruct, mas semanticamente diferente: é uma atualização de status, não um aviso.
Casos de uso:
- Confirmações de status:
allow("All CI checks passed.")— informa Claude que tudo está ok - Explicações de fail-open:
allow("GitHub CLI not installed, skipping CI check.")— informa Claude por que uma verificação foi ignorada para que ele tenha contexto completo - Múltiplas mensagens são acumuladas: se várias políticas retornarem
allow(message), todas as mensagens são unidas com quebras de linha e entregues juntas
Campos de PolicyContext
Campos de SessionMetadata
Tipos de evento
Ordem de avaliação
As políticas são avaliadas nesta ordem:- Políticas integradas (em ordem de definição)
- Políticas personalizadas explícitas de
customPoliciesPath(em ordem de.add()) - Políticas por convenção do projeto em
.failproofai/policies/(arquivos em ordem alfabética, ordem de.add()internamente) - Políticas por convenção do usuário em
~/.failproofai/policies/(arquivos em ordem alfabética, ordem de.add()internamente)
O primeiro
deny interrompe todas as políticas subsequentes. Todas as mensagens instruct são acumuladas e entregues juntas.Importações transitivas
Arquivos de políticas personalizadas podem importar módulos locais usando caminhos relativos:from "failproofai" para o caminho real do dist e criando arquivos .mjs temporários para garantir compatibilidade com ESM.
Filtragem por tipo de evento
Usematch.events para limitar quando uma política dispara:
match completamente para disparar em todos os tipos de evento.
Tratamento de erros e modos de falha
As políticas personalizadas são fail-open: erros nunca bloqueiam as políticas integradas nem causam falha no hook handler.Exemplo completo: múltiplas políticas
Exemplos
O diretórioexamples/ contém arquivos de políticas prontos para uso:

