Al terminar este módulo, vas a ponerle reflejos a tu Claude: avisos automáticos y candados que se cumplen SIEMPRE, se acuerde o no.
En el módulo 5 conociste los cuatro cajones de la oficina de tu empleado: el contrato, la constitución, la nómina y el recetario. En el 7 abriste el recetario. Hoy abres el contrato — settings.json — pero ya no de reojo como en el 5: hoy le metes mano por dentro, para colgarle reflejos que se cumplen solos.
Le has dicho a Claude cosas como "cuando termines, avísame", o lo metiste a tu constitución: "siempre notifícame al acabar". Funciona… la mayoría de las veces. Hasta que un día no: la sesión se puso larga, la regla quedó enterrada entre otras quince, o de plano se te olvidó pedirlo esa vez. Nada está roto — es que una regla en tu CLAUDE.md es una intención que el empleado LEE y procura cumplir. Procura. No es ley.
Un hook es un reflejo: "cuando pase X, ejecuta Y" — y no depende de que el empleado se acuerde, igual que tu rodilla no depende de que pienses en moverla cuando el doctor la golpea. Cuelgas la regla de un hook y deja de ser una petición: se vuelve ley física de la oficina. Pasa SIEMPRE que ocurre el evento, se acuerde Claude o no, esté "cansado" o fresco, sea la sesión uno o la ciento diez.
La diferencia en una frase: regla en la constitución = el empleado LO INTENTA (y casi siempre lo logra). Hook = PASA, sin excepción.
Un hook cuelga de un evento: un momento preciso del ciclo de tu empleado (¿te acuerdas del ciclo lee→piensa→usa una mano→mira→repite, del módulo 2?). Hay más de dos decenas de eventos en Claude Code — desde que arranca la sesión hasta que cambias de carpeta — pero como negocio, con cinco te alcanza para el 90% de lo que se te va a ocurrir:
| Evento | Cuándo dispara |
|---|---|
| Stop | Cuando Claude termina de responder |
| PreToolUse | Justo ANTES de que use una mano (herramienta) — el único momento en que se puede FRENAR algo antes de que pase |
| PostToolUse | Justo DESPUÉS de que la usó |
| UserPromptSubmit | Cuando TÚ mandas un mensaje |
| Notification | Cuando Claude Code tiene que avisarte algo por su cuenta (como que se quedó esperando tu firma) |
Para el resto —hay eventos hasta para cuando cambias de carpeta o conectas algo nuevo a tu Claude— no necesitas memorizar la lista: se lo describes a Claude ("quiero que pase algo cuando ocurra X") y él encuentra el evento correcto.
Teclea (o pega) esto (dentro de Claude Code):
/hooks
Vas a ver algo así:
Hooks configured: 0
Stop: (none)
PreToolUse: (none)
...
Qué significa: es el navegador de reflejos — de solo lectura. Te dice qué eventos existen y cuántos reflejos tienes colgados en cada uno. Ahorita, en cero.
Si en vez de eso ves una lista larguísima que no reconoces: tranquilo, es la lista completa de eventos disponibles. Los cinco de la tabla de arriba son los únicos que necesitas hoy.
¿Dónde vive un hook? En el cajón del contrato — el mismo settings.json del módulo 5, dentro de un bloque llamado hooks. Así se ve por dentro (esto lo escribe Claude; tú entiendes la FORMA, no la sintaxis):
{
"hooks": {
"Stop": [
{ "hooks": [ { "type": "command", "command": "ruta/a/tu-script.sh" } ] }
]
}
}
En llano: el nombre del evento (Stop), y colgado de ahí, el reflejo — un mini-programa (script) que corre cuando ese evento pasa. Si ya tenías hooks de antes, el nuevo se AGREGA junto a los que ya existían — nunca se reemplaza el bloque completo. Lo vas a comprobar tú mismo en el HAZLO TÚ de hoy, cuando instales dos reflejos distintos uno después del otro.
Cuando el script termina, deja una señal numérica — y esa señal es lo que decide si Claude sigue o se frena.
Exit code (código de salida): verde (el número 0) significa "sigue, todo en orden". Un número especial (2) significa rojo: "frena esta acción" — y el motivo se le explica a Claude para que lo intente distinto. (Cualquier otro número raro solo dice "el script se rompió a medias", no fue un frenazo a propósito. Eso lo distingue Claude solo; tú no tienes que memorizarlo.)
Ese semáforo es lo que convierte un hook de "solo un aviso" a "un candado real". Un reflejo colgado de PreToolUse (el único momento ANTES de que la acción ocurra) puede literalmente impedir que pase — no solo enterarse después.
Un hook corre CON TUS PERMISOS, en tu compu, cada vez que se cumple el evento — sin volver a pedirte confirmación en el momento (esa confirmación ya la diste cuando lo instalaste). Revisa SIEMPRE lo que Claude te proponga colgar ahí antes de aceptarlo: es la única puerta de tu oficina que no vuelve a tocar el timbre.
Con esto —evento + script + semáforo— ya tienes todo lo que necesitas para tres reflejos que le sirven a cualquier negocio:
Stop: un sonido, una voz, una notificación cuando Claude termina. (Hoy instalas el tuyo.)PreToolUse: protegen una carpeta sagrada de que se edite o se borre algo ahí sin que tú lo autorices en el momento. (Hoy instalas uno también.)PostToolUse: van registrando en un archivo todo lo que Claude hizo hoy, para que tengas rastro sin estar viendo la pantalla.Así luce un candado real por dentro — este es el ejemplo oficial de la documentación, para proteger archivos delicados (.env, .git/) de que se toquen sin querer:
#!/bin/bash
# esto lo escribe Claude — tú solo entiendes la idea
INPUT=$(cat)
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')
if [[ "$FILE_PATH" == *".env"* ]]; then
echo "Bloqueado: $FILE_PATH está protegido" >&2
exit 2
fi
exit 0
Fíjate en la última línea del semáforo (exit 2): ahí está el freno. Tú nunca vas a escribir esto a mano — se lo dictas a Claude describiendo QUÉ quieres proteger, y él escribe la versión que aplica a TU carpeta.
Síntoma: "Instalé el hook y no pasa nada — ni aviso, ni bloqueo."
Causa: casi siempre el settings.json quedó mal formado (una coma de más, una comilla rota) o el nombre del evento no coincide exacto con la tabla de arriba.
Salida: pídele a Claude "revisa mi settings.json, ¿por qué no dispara mi hook de X?" — lo detecta y lo corrige en segundos; tú no tienes que leer el JSON.
Síntoma: "Mi candado bloqueó algo que sí quería hacer."
Causa: el patrón que le diste para "qué proteger" quedó más amplio de lo que pensabas — por ejemplo, bloqueaste cualquier archivo con la palabra "reporte" y ahora ni tus reportes buenos pasan.
Salida: igual que con un skill (módulo 7), la corrección va EN el reflejo, no a mano cada vez: "afina el candado para que solo bloquee X, no Y".
Si esto te suena a chino, bríncatelo: no lo necesitas para seguir. Un candado en el evento Stop no es infinito: si frena la misma respuesta 8 veces seguidas, Claude Code rompe el ciclo y deja que la respuesta pase de todos modos — para que nunca te quedes viendo a Claude reintentar lo mismo para siempre. Es una válvula de escape que ya trae la casa, no algo que tengas que programar tú.
En SmartProcess el hook estrella se llama el Loro: "lo inverso a Wispr Flow — en vez de que tú hables y se escriba, Claude Code te habla". Cuando termina una respuesta, condensa la conclusión a 1–3 frases y te la dice en voz, para que no tengas que leer la terminal.
Por dentro son seis pasos, y cada uno es una lección: (1) un hook Stop dispara el script; (2) el script es DELGADO — lanza la voz en segundo plano y suelta la terminal al instante, para no congelarla; (3) otro script saca del mensaje SOLO la conclusión final, sin el "pensamiento" ni las herramientas usadas; (4) si el mensaje es largo, un Claude Haiku corriendo sin conversación (headless — lo destripas en el módulo 12) lo condensa a algo hablable; (5) la voz nativa de la Mac lo dice en voz alta; (6) un guard anti-bucle evita que ese Haiku interno dispare el mismo hook Stop y se ponga a hablar solo, en bucle, para siempre — la trampa real de cualquier reflejo que usa a Claude por dentro: si tu automatización se llama a sí misma, necesita candado contra el bucle.
El detalle premium: hay un SEGUNDO hook, colgado de UserPromptSubmit, que calla al Loro en cuanto tú vuelves a escribir. Así se ve, uno junto al otro, en el settings.json real de la casa:
{
"hooks": {
"Stop": [
{ "hooks": [ { "type": "command", "command": "~/.claude/loro/loro.sh" } ] }
],
"UserPromptSubmit": [
{ "hooks": [ { "type": "command", "command": "~/.claude/loro/loro-active.sh" } ] }
]
}
}
Nadie lo programó a mano: se lo dictaron a Claude y él lo escribió — el mismo patrón de todo este manual. Y trae su interruptor humano: un archivo llamado OFF que, con solo existir, apaga al Loro entero. Toda automatización necesita una forma de apagarse en un solo paso.
Qué vas a lograr: un aviso que te avisa cuando Claude termina, y un candado que protege una carpeta sagrada de borrados — los dos DICTADOS por ti, escritos por Claude, viviendo juntos en tu settings.json.
Qué necesitas: tu carpeta ~/Curso-Claude/. Para el aviso, hay una referencia por si te atoras en ejercicios/m08/loro-chico/ (notify-mac.sh + settings-ejemplo.json). Para el candado, la carpeta dummy ejercicios/m08/carpeta-contabilidad/ (facturas, nómina, respaldos de mentira — nada real, así que puedes intentar romperla sin miedo).
Pasos:
carpeta-contabilidad dentro de ~/Curso-Claude/ (arrástrala, o pídele a Claude que la copie él).Quiero un hook que me avise con voz cuando termines de responder — usa el comando say en Mac (en Windows, un beep de PowerShell). Cuélgalo del evento Stop en mi settings.json. Si ya tengo hooks ahí, agrégalo, no lo reemplaces. Si te atoras, hay un ejemplo de referencia en ejercicios/m08/loro-chico/.
settings.json — es la misma pregunta de firma del módulo 1, ahora tocando el cajón del contrato. Revisa y firma.Vas a ver (o mejor dicho, vas a OÍR) algo así:
(sin texto nuevo en pantalla — vas a escuchar, en voz:
"Listo, terminé.")
Qué significa: el hook Stop disparó tu script en cuanto Claude terminó de responder. Este reflejo no se ve, se oye.
Si en vez de eso ves silencio total: revisa que sí cerraste y reabriste Claude Code por completo — es el atorón más común, y ya lo conoces del módulo 1.
Confirmado para este manual: el hook Stop SÍ dispara incluso fuera de una sesión interactiva — se probó con claude -p (el modo headless que ves en el módulo 12) y el archivo que el hook debía crear apareció de inmediato, sin nadie viendo la pantalla. Si tu Loro no suena en la sesión normal, el hook en sí no es sospechoso — casi siempre es el atorón de arriba (cerrar y reabrir).
Crea un hook PreToolUse que bloquee cualquier intento de editar o borrar archivos dentro de mi carpeta carpeta-contabilidad. Si detecta un intento, que me explique por qué lo frenó.
Cuando el candado actúe, vas a ver algo así (transcripción real, verificada para este manual con un candado equivalente):
Intenté editar estado-cuenta-junio.txt y el hook lo frenó con este mensaje:
> Bloqueado: carpeta-contabilidad/estado-cuenta-junio.txt está
> protegido por tu candado.
El archivo quedó intacto — no le busqué la vuelta por otro lado:
un candado denegado se respeta, no se rodea.
Qué significa: el hook frenó la acción ANTES de que ocurriera — por eso el archivo real sigue intacto. Claude recibió el motivo del freno (el texto que TU hook mande a stderr) y te lo traduce en español; la redacción exacta varía según cómo hayas escrito el mensaje del hook, pero el resultado — archivo intacto, freno explicado — es el mismo siempre.
Si en vez de eso ves que sí lo borró: revisa con Claude "¿por qué mi candado de carpeta-contabilidad no frenó esto?" — casi siempre el patrón no cubría esa acción exacta.
¿LO LOGRASTE?
settings.json quedaron los dos reflejos, y cómo apagar cualquiera de los dos (quitar su bloque, o pedírselo a Claude).hook — el reflejo: "cuando pase X, ejecuta Y"; es ley, no sugerencia.
evento (de hook) — el momento del ciclo que dispara el reflejo (al terminar, antes de una herramienta…).
exit code — el semáforo con que un script dice "pasa" (0) o "frena" (2).
script — mini-programa que Claude escribe y tu compu ejecuta.
La demo de 5 minutos: instala TU Loro chico en vivo frente al grupo, pídele a Claude cualquier cosa, y deja que el "listo, terminé" hablado sorprenda a la sala. El "¿eso se instala así de fácil?" te compra el resto del módulo.
El error que el alumno VA a cometer: editar el settings.json (o pedir el hook) y NO cerrar Claude Code por completo — y jurar que "no sirvió". Provócalo a propósito, muéstrales que basta reabrir, y la lección del módulo 1 (la terminal solo se entera de lo nuevo al nacer) se les vuelve a confirmar aquí.
La pregunta de arranque: "¿Qué regla le repites a Claude cada sesión porque nunca se le queda del todo?"
Verificado contra documentación oficial el 2026-07-12.