← SCRAM AI Lab
Descubre cómo los hooks en el harness de Claude Code sustituyen validaciones manuales, refuerzan la seguridad del código y eliminan errores en producción.
May 21, 2026
464 lecturas

Llevas tres semanas escribiendo "no hagas commits directos a main" en CLAUDE.md y el modelo lo respeta el 95% del tiempo. El otro 5% es el que rompe producción. La solución no es escribirlo más fuerte; es mover la validación fuera del modelo. Los hooks de Claude Code se ejecutan en el harness, no en el LLM: no se "olvidan", no se distraen, no negocian. Si el matcher dispara, el hook corre. Punto.
Porque los modelos de lenguaje operan bajo probabilidades estadísticas y tienden a degradar el seguimiento de reglas conforme la ventana de contexto se satura. Un hook traslada el cumplimiento normativo a un proceso determinista del sistema operativo, garantizando una tasa de cumplimiento absoluta e inquebrantable frente a políticas críticas de infraestructura y seguridad de código.
Esto vive en .claude/settings.json (proyecto) o ~/.claude/settings.json (global). El matcher filtra por nombre de herramienta:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [{
"type": "command",
"command": "node ~/.claude/hooks/block-dangerous-bash.js"
}]
},
{
"matcher": "Edit|Write",
"hooks": [{
"type": "command",
"command": "node ~/.claude/hooks/block-protected-files.js"
}]
}
],
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [{
"type": "command",
"command": "node ~/.claude/hooks/prettier-format.js"
}]
}
]
}
}
// ~/.claude/hooks/block-dangerous-bash.js
const input = JSON.parse(require("fs").readFileSync(0, "utf-8"));
const cmd = input.tool_input?.command ?? "";
const dangerous = [
/git\s+push\s+.*\s(main|master)\b/,
/git\s+reset\s+--hard/,
/rm\s+-rf\s+\//,
/DROP\s+TABLE/i,
];
for (const re of dangerous) {
if (re.test(cmd)) {
console.error(`Blocked: command matches ${re}. If intentional, run in shell directly.`);
process.exit(2); // exit code 2 = block + show stderr to model
}
}
process.exit(0);
El exit code 2 es la convención: bloquea la herramienta y pasa el stderr al modelo para que entienda por qué falló. El modelo entonces busca otra forma de cumplir la tarea, no se queda peleando con el harness.
Para elegir el nivel de control adecuado dentro de tus flujos de desarrollo, es fundamental entender las diferencias operativas entre las herramientas disponibles:
| Mecanismo | Punto de ejecución | Determinismo | Latencia agregada | Caso de uso principal |
|---|---|---|---|---|
| Instrucción de Prompt (CLAUDE.md) | Inferencia del LLM | Probabilístico (85-95%) | 0 ms (costo en tokens) | Guías de estilo y convenciones semánticas |
| Skills personalizadas | Herramienta orquestada | Condicional al modelo | Media (tiempo de API) | Flujos de trabajo complejos multi-paso |
| Slash Commands | Entrada directa del usuario | Determinado por invocación | Baja (inmediato) | Disparadores manuales de rutinas repetitivas |
| Hooks del Harness | Entorno local del sistema | 100% determinista | Sub-segundo (en scripts locales) | Políticas de seguridad y linters automáticos |
Si te encuentras escribiendo "siempre debes hacer X antes de Y" en un skill, eso es un hook disfrazado. Muévelo.
sk-, AKIA, ghp_. De acuerdo con el reporte anual de seguridad de GitGuardian (2024), la mayor parte de las credenciales expuestas se filtran durante confirmaciones de código en etapas tempranas de desarrollo; interceptarlas en el editor mitiga este riesgo de raíz.vitest related solo sobre archivos tocados.Si tu hook tarda 4 segundos, lo pagas en cada Edit. Multiplica por 80 edits en una sesión y son 5 minutos perdidos. Los hooks deben ser sub-segundo: validación pura, sin red, sin builds. Si necesitas algo pesado, dispáralo en background y deja que falle async (Slack, métricas), no bloquees la conversación.
En empresas tecnológicas y agencias de nearshoring en México y América Latina, la integración acelerada de desarrolladores junior y contractors representa un desafío constante de estandarización. Cuando los equipos delegan la supervisión de arquitectura exclusivamente a revisiones de código entre pares, el costo operativo en horas hombre se dispara. Configurar hooks a nivel de repositorio repositorio centraliza las políticas de gobernanza técnica sin fricción cultural ni curvas de aprendizaje prolongadas.
Asimismo, los contratos de desarrollo nearshore con corporativos en Estados Unidos imponen cláusulas estrictas de cumplimiento como SOC 2 o ISO 27001. Un hook que bloquee la escritura de credenciales o la ejecución de scripts no autorizados en terminal sirve como evidencia auditable frente a clientes exigentes, transformando un archivo de configuración local en un control de seguridad corporativo comprobable.
El error más frecuente al diseñar hooks radica en crear dependencias circulares. Si un hook de PostToolUse ejecuta un script que a su vez invoca una herramienta editada por el harness, puedes provocar un bucle infinito que congele la terminal del desarrollador. Mantén los hooks desacoplados de llamadas anidadas al agente.
Otro problema habitual ocurre cuando las expresiones regulares de validación son excesivamente rígidas. Si una validación bloquea comandos inocuos debido a un regex mal estructurado, los desarrolladores desactivarán el archivo de configuración global. Asegúrate de registrar mensajes de error descriptivos mediante el canal estándar de salida de error (stderr) para que tanto el modelo como el programador entiendan con exactitud qué regla se activó y cómo proceder sin deshabilitar la protección.
Cuenta tus hooks. Si tienes menos de tres, probablemente le estás pidiendo al modelo cosas que el harness debería hacer solo. ¿Cuál validación repites en cada CLAUDE.md y nunca codificaste?
Artículos relacionados
Claude Code en octubre: mods, control de modelos y 20 versiones en tres semanas
De 2.1.272 a 2.1.291: mods en TypeScript, sec-default para equipos, deniedModels, allowedProviders, AGENTS.md y Opus 5.5 por defecto. Qué configurar.
Cómo usamos Claude Code en SCRAM todos los días: el repo como memoria, skills propios y reglas que no se negocian
No usamos Claude Code para "generar código". Lo usamos para operar un sistema de 127 modelos de datos y 655 endpoints con un equipo chico. Así está montado: memoria en el repo, skills escritos desde el código real, hooks, y tres reglas que aprendimos a golpes en producción.
Claude Code en septiembre de 2026: MCP administrado, modo restringido, /skill-doctor y Fable 5.1 por defecto
Once versiones de Claude Code entre el 25 de agosto y el 9 de septiembre de 2026 (2.1.243 a 2.1.267): Fable 5.1 por defecto, managedMcpServers para toda la organización, --restricted, /skill-doctor, /diff, hooks de cambio de modelo y maxEffortLevel. Qué usar y qué configurar.