TL;DR Crea
autoMode.soft_denyen~/.claude/settings.jsoncon"$defaults"como primer elemento y tu frase debajo, y comprueba el resultado conclaude auto-mode config. Si la lista pasa de 68 reglas a 1, acabas de borrar las protecciones por defecto.
Auto mode pasa cada tool call por un clasificador antes de ejecutarla. Ese clasificador no evalúa patrones del estilo Bash(git push *). Lee prosa. Sus reglas son frases en inglés llano, y las puedes leer enteras con claude auto-mode defaults.
Esas frases admiten las tuyas al lado. Escribes una regla como se la explicarías a alguien que entra hoy en el equipo, y el clasificador la aplica igual que aplica las suyas. Sin regex, sin listas de comandos.
Son cuatro listas dentro de autoMode, y cada una entra en un nivel distinto de precedencia:
hard_deny bloquea siempre. Ni tu intención ni un allow lo abren.
soft_deny bloquea, pero se abre si pides la acción exacta.
allow excepciones que anulan un soft_deny.
environment lo que el clasificador considera "dentro" de tu perímetro.
1. Escribe la regla
{
"autoMode": {
"soft_deny": [
"$defaults",
"Nunca ejecutes migraciones de base de datos fuera del CLI de migraciones"
],
"hard_deny": [
"$defaults",
"Nunca envíes el contenido del repositorio a APIs externas de code review"
]
}
}
Ese archivo tiene que ser ~/.claude/settings.json. El clasificador no lee autoMode desde el .claude/settings.json del proyecto, ni desde settings.local.json desde la v2.1.207. Los dos viven dentro del repositorio, así que un repo que clonas o un paso de build podrían concederse sus propias reglas. La única alternativa son los managed settings de tu organización o el flag --settings.
2. Comprueba que no te has llevado nada por delante
Esta es la parte que duele. "$defaults" inserta las reglas de fábrica en la posición donde lo pongas. Si lo omites, tu lista sustituye a la de fábrica entera, y nadie te avisa.
claude auto-mode config | jq 'map_values(length)'
Con "$defaults" en las dos listas, mis dos frases se suman a lo que ya había:
{ "allow": 17, "soft_deny": 69, "hard_deny": 2, "environment": 20 }
Sin "$defaults" en soft_deny, la única regla que queda es la mía. Las 68 de fábrica se han ido:
{ "allow": 17, "soft_deny": 1, "hard_deny": 1, "environment": 20 }
De esas 68 salen el force push, el curl | bash, los deploys a producción y el bloqueo de los intentos de saltarse el propio auto mode. Sigues en auto mode, sigues viendo el rayo en la barra de estado, y ya no te protege de casi nada.
3. Pide una crítica antes de confiar en ella
claude auto-mode critique
Un modelo lee tus reglas y te dice dónde son ambiguas, redundantes o candidatas a falsos positivos. Sobre mi regla de migraciones, escrita en castellano:
## soft_deny
2. The CLI is unnamed. "el CLI de migraciones" is a definite reference to
something the classifier cannot resolve. Alembic? prisma migrate?
rails db:migrate? Flyway? ./scripts/migrate.sh? Name it explicitly
(and ideally also in Environment).
4. Scope is unbounded across environments. As written this blocks
psql -f schema.sql against a throwaway local Docker Postgres, a likely
false positive several times a day.
Las reglas en castellano funcionan igual de bien que en inglés, y la crítica te responde siempre en inglés.
Sobre la de hard_deny me dio un aviso que yo no había visto: si el clasificador lee gh pr create, que sube un diff a GitHub, como enviar código a un servicio externo que lo revisa, tienes un bloqueo permanente sobre tu flujo normal. Al ser hard_deny, ningún mensaje mío lo abriría después. La solución que propone es excluir de forma explícita el remoto propio del repositorio.
Referencia
| Lista | Qué pones | Se abre con |
|---|---|---|
hard_deny |
límites de seguridad innegociables | nada |
soft_deny |
acciones destructivas que a veces sí quieres | tu intención explícita o un allow |
allow |
excepciones a un soft_deny |
(no bloquea) |
environment |
repos, buckets y dominios de confianza | (no bloquea) |
Las entradas de environment son el arreglo de los bloqueos repetidos contra un mismo destino. Si quieres que Claude Code las redacte leyendo tu proyecto y tus últimas sesiones, /auto-mode-setup las propone y las escribe (v2.1.228). Y desde la v2.1.246, /permissions tiene una pestaña Auto mode donde editas las mismas listas sin abrir el JSON, con el "$defaults" ya puesto por ti.
Si te arrepientes de todo, claude auto-mode reset borra tu sección autoMode y te devuelve a los defaults (v2.1.212).
Requisitos
Auto mode disponible en tu cuenta. claude auto-mode critique y config funcionan desde que existe el subcomando; --label necesita la v2.1.208, reset la v2.1.212, /auto-mode-setup la v2.1.228 y la pestaña de /permissions la v2.1.246.
Si todavía no usas auto mode, empieza por Olvídate de los permisos en Claude Code sin caer en modo YOLO. Para saber qué bloquea de fábrica, Ahora Claude Code auto mode te protege de ti mismo.
Docs oficiales: Configure auto mode | Permission modes