🌱 Empieza aquí · Gate de consultar tus fuentes antes de preguntar
¿Te ha pasado que tu asistente te pregunta algo que ya le habías dicho, o que estaba escrito en tus notas? Esta semilla le pone un freno automático a ese impulso.
Justo antes de que tu asistente te lance una pregunta, este guardián revisa que la pregunta traiga evidencia de que primero se asomó a tus fuentes de verdad (tus notas, su memoria, tus registros). Si la trae, la pregunta pasa. Si no, la bloquea y le dice a tu asistente que primero haga la tarea de buscar. Resultado: te pregunta menos, y cuando pregunta, llega afinado.
Es la versión "con dientes" del hábito. Existe una semilla hermana, "Consultar tus fuentes antes de preguntar", que enseña el método como texto. Esta lo obliga con un gancho automático. Puedes usar una, la otra, o las dos juntas.
Para instalarla
Abre esta carpeta con Claude Code o Cowork y dile a tu asistente:
"Siembra esta semilla 🌱"
Con eso basta de tu parte. Tu asistente hace todo lo técnico y al final te dice cómo comprobar que quedó funcionando. Vas a ver algunas palabras en inglés en la pantalla; ni caso, él te guía.
¿Otras formas de pedírselo? "instala esta semilla", "pon a funcionar el gate de consultar antes de preguntar", "haz el setup de esto". Te entiende igual.
Para el asistente que siembra 🤖
Instala este hook (gancho de automatización) del evento PreToolUse, filtrado a la
herramienta AskUserQuestion (la que usa el asistente para preguntarle al usuario).
Sigue estos pasos y no inventes rutas: usa $HOME siempre.
1. Copia el script del kernel (el corazón de la semilla)
Copia kernel/canon-first-asq-gate.sh a la carpeta de hooks del usuario y dale permiso
de ejecución.
Claude Code / Cowork (macOS o Linux):
mkdir -p "$HOME/.claude/hooks"
cp kernel/canon-first-asq-gate.sh "$HOME/.claude/hooks/canon-first-asq-gate.sh"
chmod +x "$HOME/.claude/hooks/canon-first-asq-gate.sh"
Windows (Git Bash / WSL): misma ruta ~/.claude/hooks/. El script usa bash y
grep; para aislar mejor la pregunta aprovecha python3 si está disponible, y si no,
funciona igual con un modo tolerante. Si el usuario corre Claude Code nativo en Windows
sin bash, avísale que este hook necesita un entorno con bash (Git Bash o WSL).
2. Registra el hook en settings.json
Abre $HOME/.claude/settings.json (créalo si no existe) y agrega esta entrada dentro de
hooks.PreToolUse. El matcher en AskUserQuestion hace que el gancho solo se
dispare cuando el asistente está por preguntarle algo al usuario. Si ya hay hooks de
PreToolUse, suma este objeto al arreglo existente en lugar de reemplazarlo:
{
"hooks": {
"PreToolUse": [
{
"matcher": "AskUserQuestion",
"hooks": [
{
"type": "command",
"command": "bash $HOME/.claude/hooks/canon-first-asq-gate.sh",
"timeout": 5
}
]
}
]
}
}
3. (Opcional) Ajusta el comportamiento
El gancho entiende dos ajustes por variable de entorno:
CANON_FIRST_MODE—block(por defecto, bloquea la pregunta sin evidencia) owarn(solo avisa por la salida de errores y deja pasar). Empieza enwarnunos días si el usuario quiere acostumbrarse antes de que bloquee de verdad.- Las palabras que cuentan como evidencia y los marcadores de escape viven en la
parte de arriba del script (
EVIDENCEy la línea del escape hatch). Si el usuario tiene un vocabulario propio para decir "ya lo busqué", agrégalo ahí. Vienen listas en español e inglés por defecto.
Válvula de escape: cuando la pregunta sea de puro gusto del usuario (algo que solo él sabe, sin fuente que consultar), el asistente debe incluir el marcador
[preferencia]en el texto de la pregunta. El gancho la deja pasar sin exigir evidencia. Sinónimos aceptados (por si tu asistente usa otro vocabulario):[preference],[no-canon]y[no-source]; los cuatro funcionan igual.
4. Verificación post-siembra (obligatoria)
Corre estas tres pruebas de comportamiento para confirmar que el gate se dispara de verdad.
a) Pregunta SIN evidencia → debe BLOQUEAR (imprime un JSON con deny):
echo '{"tool_name":"AskUserQuestion","tool_input":{"questions":[{"question":"Que color quieres para el logo?"}]}}' \
| bash "$HOME/.claude/hooks/canon-first-asq-gate.sh"; echo "EXIT=$?"
Salida esperada: una línea JSON que contiene "permissionDecision":"deny" y EXIT=0
(el bloqueo se comunica por el JSON, no por el código de salida).
b) Pregunta CON evidencia → debe DEJAR PASAR (sin salida):
echo '{"tool_name":"AskUserQuestion","tool_input":{"questions":[{"question":"Ya revise tus notas y tu memoria; no encontre el dato. Cual es?"}]}}' \
| bash "$HOME/.claude/hooks/canon-first-asq-gate.sh"; echo "EXIT=$?"
Salida esperada: sin salida y EXIT=0 (la pregunta trae evidencia, así que pasa).
c) Válvula de escape → debe DEJAR PASAR:
echo '{"tool_name":"AskUserQuestion","tool_input":{"questions":[{"question":"[preferencia] Te o cafe?"}]}}' \
| bash "$HOME/.claude/hooks/canon-first-asq-gate.sh"; echo "EXIT=$?"
Salida esperada: sin salida y EXIT=0.
Por último, confirma que el hook quedó registrado en settings.json:
grep -q 'canon-first-asq-gate' "$HOME/.claude/settings.json" && echo 'REGISTRADO'
Salida esperada: REGISTRADO.
Cuando las tres pruebas de comportamiento y el registro (cuatro comprobaciones en total) den lo esperado, avísale al usuario que ya quedó y explícale en una línea qué gana con esto.
✅ ¿Cómo sé que funcionó?
De ahora en adelante, cuando tu asistente esté por preguntarte algo, primero tiene que demostrar que se asomó a tus fuentes. Muchas preguntas que antes te llegaban de golpe, ahora las resuelve solo ("ya lo encontré en tus notas"). Y las que sí te lleguen van a venir afinadas: "revisé esto y esto; lo único que me falta es esto otro".
No tienes que hacer nada especial en el día a día. Solo vas a notar que te interrumpe menos y le atina más. Eso es todo. 🌱
