Descripción general
failproofai cuenta con dos subsistemas independientes:- Manejador de hooks - Un subproceso CLI rápido que Claude Code invoca en cada llamada a herramienta del agente. Evalúa las políticas y devuelve una decisión.
- Monitor de agentes (Panel de control) - Una aplicación web Next.js para monitorear sesiones de agentes y gestionar políticas.
~/.failproofai/ y en el directorio .failproofai/ del proyecto, pero se ejecutan como procesos separados y se comunican únicamente a través del sistema de archivos.
Manejador de hooks
Integración con Claude Code
Al ejecutarfailproofai policies --install, se escriben entradas como estas en ~/.claude/settings.json:
failproofai --hook PreToolUse como subproceso antes de cada llamada a herramienta, pasando un payload JSON por stdin.
Formato del payload
PostToolUse, el payload también contiene tool_result con la salida de la herramienta.
El manejador aplica un límite de 1 MB en stdin. Los payloads que superen este límite son descartados y todas las políticas permiten implícitamente.
Formato de respuesta
Denegar (PreToolUse):- Código de salida:
2 - Motivo escrito en stderr (no en stdout)
- Código de salida:
0 - stdout vacío
allow(message) permite que una política envíe contexto informativo a Claude incluso cuando la operación está permitida. El manejador de hooks escribe el siguiente JSON en stdout (no en un archivo de configuración — esta es la respuesta del manejador a Claude Code, igual que las respuestas de deny e instruct anteriores):
- Código de salida:
0(la operación está permitida) - Cuando múltiples políticas devuelven
allowcon un mensaje, sus mensajes se unen con saltos de línea en una sola cadenaadditionalContext - Si ninguna política proporciona un mensaje, stdout está vacío (igual que antes)
Pipeline de procesamiento
src/hooks/handler.ts implementa el pipeline completo:
Carga de configuración
src/hooks/hooks-config.ts implementa la carga de configuración en tres ámbitos.
enabledPolicies- unión deduplicada de los tres archivospolicyParams- por clave de política, gana completamente el primer archivo que la definacustomPoliciesPath- gana el primer archivo que lo definallm- gana el primer archivo que lo defina
readHooksConfig() (solo global) para leer y escribir, ya que no se invoca con un cwd de proyecto.
Evaluación de políticas
src/hooks/policy-evaluator.ts ejecuta las políticas en orden.
Para cada política:
- Buscar el esquema
paramsde la política (si tiene uno). - Leer
policyParams[policy.name]de la configuración fusionada. - Fusionar los valores proporcionados por el usuario sobre los valores predeterminados del esquema para producir
ctx.params. - Llamar a
policy.fn(ctx)con el contexto resuelto. - Si el resultado es
deny, detener inmediatamente y devolver esa decisión. - Si el resultado es
instruct, acumular el mensaje y continuar. - Si el resultado es
allow, continuar con la siguiente política.
- Si se devolvió algún
deny, emitir la respuesta de denegación. - Si se recopilaron respuestas
instruct, emitir una única respuesta instruct con todos los mensajes unidos. - En caso contrario, emitir una respuesta de allow (stdout vacío, exit 0).
Políticas integradas
src/hooks/builtin-policies.ts define las 26 políticas integradas como objetos BuiltinPolicyDefinition:
params declaran un PolicyParamsSchema con tipos y valores predeterminados para cada parámetro. El evaluador de políticas inyecta los valores resueltos en ctx.params antes de llamar a fn. Las funciones de política leen ctx.params sin comprobaciones de nulo porque los valores predeterminados siempre se aplican primero.
La coincidencia de patrones dentro de las políticas usa tokens de comando parseados (argv), no coincidencia de cadenas sin procesar. Esto evita elusiones mediante inyección de operadores shell (por ejemplo, un patrón para sudo systemctl status * no puede ser eludido añadiendo ; rm -rf / al comando).
Políticas personalizadas
src/hooks/custom-hooks-registry.ts implementa un registro respaldado por globalThis:
src/hooks/custom-hooks-loader.ts carga el archivo de políticas del usuario:
- Leer
customPoliciesPathde la configuración; omitir si está ausente. - Resolver a una ruta absoluta; verificar que el archivo existe.
- Reescribir todas las importaciones
from "failproofai"a la ruta real de dist para quecustomPoliciesse resuelva al mismo registroglobalThis. - Reescribir recursivamente las importaciones locales transitivas para garantizar compatibilidad con ESM.
- Escribir archivos
.mjstemporales e importar (import()) el archivo de entrada. - Llamar a
getCustomHooks()para recuperar los hooks registrados. - Limpiar todos los archivos temporales en un bloque
finally.
~/.failproofai/hook.log y el cargador devuelve un array vacío. Las políticas integradas no se ven afectadas.
Las políticas personalizadas se evalúan después de todas las políticas integradas. Un deny de una política personalizada sigue deteniendo las políticas personalizadas posteriores (pero todas las integradas ya habrán sido ejecutadas en ese punto).
Registro de actividad
Después de cada evento de hook, el manejador añade una línea JSONL a~/.failproofai/hook-activity.jsonl:
Arquitectura del panel de control
El panel de control es una aplicación Next.js 16 que utiliza el App Router con React Server Components y Server Actions.- Los componentes de página llaman a
lib/projects.tsylib/log-entries.tspara leer datos de proyectos/sesiones directamente desde el sistema de archivos (sin capa de API para lecturas). - La página de políticas usa Server Actions para todas las mutaciones (activar/desactivar, actualización de parámetros, instalar/eliminar).
- El visor de sesión parsea el formato de transcripción JSONL de Claude y renderiza una línea de tiempo de mensajes y llamadas a herramientas.
- Sin base de datos - todo el estado persistente está en archivos planos (
~/.failproofai/,~/.claude/projects/). - Server Actions para mutaciones - no se necesita una API REST para operaciones CRUD.
- React Server Components para páginas de lectura - carga inicial más rápida, sin bundle del cliente para la obtención de datos.
- Componentes cliente solo donde se necesita interactividad (activación de políticas, búsqueda de actividad, visor de logs).

