🌱 Empieza aquí · Guardián de Modelos Vigentes
Esta semilla le pone a tu asistente un candado para que no se quede pegado usando un modelo de IA viejo. Los proveedores sacan modelos nuevos seguido, y es facilísimo dejar el ID de un modelo antiguo escrito a mano en un script y seguir usándolo por meses sin darte cuenta, perdiendo calidad y a veces dinero. Este candado revisa, justo antes de que tu asistente corra un comando o escriba código, si se está usando uno de los modelos que TÚ marcaste como obsoletos y, si es así, lo frena y le recuerda resolver el modelo vigente.
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 candado de modelos obsoletos", "haz el setup de esto". Te entiende igual.
Para el asistente que siembra 🤖
Instala este hook (gancho de automatización) del evento PreToolUse (justo antes de
que el asistente use una herramienta). Sigue estos pasos y no inventes rutas: usa
$HOME siempre.
1. Copia el script del kernel (el corazón de la semilla)
Copia kernel/obsolete-model-blocker.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/obsolete-model-blocker.sh "$HOME/.claude/hooks/obsolete-model-blocker.sh"
chmod +x "$HOME/.claude/hooks/obsolete-model-blocker.sh"
Windows (Git Bash / WSL): misma ruta ~/.claude/hooks/. El script usa bash, jq y
grep. jq no viene por defecto en Windows: si no está, instálalo (por ejemplo con
winget install jqlang.jq) o avísale al usuario. En macOS puede instalarse con
brew install jq; en Linux con el gestor de paquetes de su distribución.
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. Si ya hay hooks de PreToolUse, suma este objeto al arreglo
existente en lugar de reemplazarlo. El matcher limita el hook a las herramientas que
corren comandos o escriben código:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash|Write|Edit|MultiEdit",
"hooks": [
{
"type": "command",
"command": "bash $HOME/.claude/hooks/obsolete-model-blocker.sh",
"timeout": 5
}
]
}
]
}
}
3. Define la lista de modelos obsoletos del usuario (IMPORTANTE)
Este candado no trae una lista de modelos "de fábrica" a propósito: los modelos vigentes cambian con el tiempo y son distintos para cada persona. Sin lista, el hook no bloquea nada. Así que ayuda al usuario a armar la suya:
cp kernel/obsolete-model-blocker.obsolete.ejemplo.txt "$HOME/.claude/obsolete-model-blocker.obsolete.txt"
Abre ese archivo y, con el usuario, escribe los IDs de los modelos que ya NO quiere usar
(uno por línea). Formato de cada línea: etiqueta <TAB> regex <TAB> sugerencia, o el atajo
de escribir solo el ID en una línea. Hay un tip dentro del archivo para que la regex no
marque por error los modelos NUEVOS que se parecen al viejo.
Truco fino: si el usuario ya resuelve el modelo vigente con un comando o variable propia (por ejemplo, un script que consulta el modelo más nuevo del proveedor), dile al hook el nombre de esa "marca" para que no lo moleste cuando ya lo está usando bien: exporta
MODEL_GUARD_RESOLVER_MARKER="nombre-de-su-comando-o-variable".
4. (Opcional) Ajusta el comportamiento con variables de entorno
Todas opcionales, con valores por defecto sensatos:
MODEL_GUARD_EXTENSIONS— qué extensiones de código vigilar en Write/Edit (por defecto.sh .mjs .js .ts .py).MODEL_GUARD_CONTEXT— la señal de "esto es uso real de un modelo" (por defecto detecta una asignación tipomodel=/model:/"model":).MODEL_GUARD_EXEMPT_FILE— archivo con fragmentos de ruta a exentar, uno por línea (útil para archivos que usan el patrón a propósito).MODEL_GUARD_HINT— el mensaje que se muestra al bloquear (cámbialo por la forma exacta en que el usuario resuelve su modelo vigente).MODEL_GUARD_BLOCK—1bloquea (por defecto),0solo avisa sin frenar.
5. Verificación post-siembra (obligatoria)
Primero, para probar, crea una lista mínima con un modelo obsoleto de ejemplo:
printf 'Modelo de prueba\tmodelo-viejo-1\tUsa el vigente.\n' > "$HOME/.claude/obsolete-model-blocker.obsolete.txt"
a) Caso que DEBE bloquear (usa el modelo obsoleto en contexto real, espera EXIT=2):
printf '%s' '{"tool_name":"Bash","tool_input":{"command":"curl ... -F \"model=modelo-viejo-1\""}}' \
| bash "$HOME/.claude/hooks/obsolete-model-blocker.sh"; echo "EXIT=$?"
Salida esperada: un bloque 🚫 MODELO OBSOLETO HARDCODEADO y EXIT=2.
b) Caso limpio (menciona el modelo pero SIN contexto de uso, espera EXIT=0):
printf '%s' '{"tool_name":"Bash","tool_input":{"command":"echo el modelo-viejo-1 ya no se usa"}}' \
| bash "$HOME/.claude/hooks/obsolete-model-blocker.sh"; echo "EXIT=$?"
Salida esperada: sin bloqueo y EXIT=0 (era solo una mención, no un uso).
c) Confirma que el hook quedó registrado en settings.json:
grep -q 'obsolete-model-blocker' "$HOME/.claude/settings.json" && echo 'REGISTRADO'
Salida esperada: REGISTRADO.
Cuando las tres pruebas den lo esperado, borra la lista de prueba si la creaste solo para probar, deja la lista real del usuario, y avísale en una línea qué gana con esto.
✅ ¿Cómo sé que funcionó?
De ahora en adelante, si a tu asistente se le ocurre dejar pegado el ID de un modelo que tú marcaste como viejo dentro de un comando o de tu código, el candado lo frena en el momento y le recuerda resolver el modelo vigente. No tienes que estar vigilando: el hueco lo tapa solo.
Y cuando salga un modelo aún más nuevo, solo dile a tu asistente "agrega el modelo viejo a mi lista de obsoletos" y él edita el archivo por ti. Eso es todo. 🌱
