allow, deny, instruct que las políticas integradas.
Ejemplo rápido
Dos formas de cargar políticas personalizadas
Opción 1: Basada en convención (recomendada)
Coloca archivos*policies.{js,mjs,ts} en .failproofai/policies/ y se cargarán automáticamente, sin necesidad de flags ni cambios de configuración. Funciona como los git hooks: suelta un archivo y listo.
- Se escanean tanto el directorio del proyecto como el del usuario (unión — no gana el primero en alcance)
- Los archivos se cargan en orden alfabético dentro de cada directorio. Usa prefijos
01-,02-para controlar el orden - Solo se cargan los archivos que coincidan con
*policies.{js,mjs,ts}; los demás se ignoran - Cada archivo se carga de forma independiente (fail-open por archivo)
- Funciona junto con
--customexplícito y las políticas integradas
Opción 2: Ruta de archivo explícita
policies-config.json como customPoliciesPath. El archivo se carga de nuevo en cada evento de hook; no hay caché entre eventos.
Usar ambas opciones juntas
Las políticas de convención y el archivo--custom explícito pueden coexistir. Orden de carga:
- Archivo
customPoliciesPathexplícito (si está configurado) - Archivos de convención del proyecto (
{cwd}/.failproofai/policies/, orden alfabético) - Archivos de convención del usuario (
~/.failproofai/policies/, orden alfabético)
API
Importación
customPolicies.add(hook)
Registra una política. Llama a este método tantas veces como necesites para múltiples políticas en el mismo archivo.
Funciones de decisión
deny(message) — el mensaje aparece ante Claude con el prefijo "Blocked by failproofai:". Un único deny interrumpe toda evaluación posterior.
instruct(message) — el mensaje se agrega al contexto de Claude para la llamada de herramienta actual. Todos los mensajes instruct se acumulan y se entregan juntos.
Mensajes allow informativos
allow(message) permite la operación y envía un mensaje informativo a Claude. El mensaje se entrega como additionalContext en la respuesta stdout del handler del hook, el mismo mecanismo que usa instruct, pero con significado diferente: es una actualización de estado, no una advertencia.
Casos de uso:
- Confirmaciones de estado:
allow("All CI checks passed.")— le indica a Claude que todo está bien - Explicaciones de fail-open:
allow("GitHub CLI not installed, skipping CI check.")— le indica a Claude por qué se omitió una verificación para que tenga contexto completo - Los mensajes múltiples se acumulan: si varias políticas devuelven
allow(message), todos los mensajes se unen con saltos de línea y se entregan juntos
Campos de PolicyContext
Campos de SessionMetadata
Tipos de eventos
Orden de evaluación
Las políticas se evalúan en este orden:- Políticas integradas (en orden de definición)
- Políticas personalizadas explícitas de
customPoliciesPath(en orden de.add()) - Políticas de convención del proyecto en
.failproofai/policies/(archivos en orden alfabético, orden de.add()dentro de cada uno) - Políticas de convención del usuario en
~/.failproofai/policies/(archivos en orden alfabético, orden de.add()dentro de cada uno)
El primer
deny interrumpe todas las políticas posteriores. Todos los mensajes instruct se acumulan y se entregan juntos.Importaciones transitivas
Los archivos de políticas personalizadas pueden importar módulos locales usando rutas relativas:from "failproofai" a la ruta real de dist y creando archivos .mjs temporales para garantizar la compatibilidad con ESM.
Filtrado por tipo de evento
Usamatch.events para limitar cuándo se dispara una política:
match por completo para disparar en cada tipo de evento.
Manejo de errores y modos de fallo
Las políticas personalizadas son fail-open: los errores nunca bloquean las políticas integradas ni hacen fallar el handler del hook.Ejemplo completo: múltiples políticas
Ejemplos
El directorioexamples/ contiene archivos de políticas listos para ejecutar:

