Anthropic le puso una cifra dura a un problema que todo usuario intensivo de Claude Code ya siente: los usuarios aprobaron alrededor del 93% de las solicitudes de permiso, y la empresa dice que la atención cae a medida que se acumulan los prompts (Anthropic). Eso es fatiga de aprobación, y convierte “humano en el bucle” en “humano manteniendo pulsado Enter”.
La respuesta equivocada es ejecutar --dangerously-skip-permissions en tu portátil y esperar que el modelo se porte bien. La respuesta correcta es ingeniería de seguridad aburrida: mete Claude Code en un dev container, dale solo el repo, restringe el tráfico saliente, desactiva el modo bypass por política y usa el modo auto solo donde realmente esté soportado.
Esta guía muestra una configuración ejecutable que puedes meter hoy mismo en un repo. También cubre la discusión actual de la comunidad: los desarrolladores quieren agentes más autónomos, pero no quieren barreras invisibles ni rastreo de archivos en caja negra. La respuesta práctica no es “confía más fuerte en Claude”. Es “haz que el radio de explosión sea lo bastante pequeño como para que la autonomía sea aceptable”.

El Debate Va Realmente de Observabilidad y Radio de Explosión
El hilo de Hacker News sobre “Anthropic intenta ocultar las acciones de IA de Claude” no es solo teatro de quejas. Un comentarista resumió el miedo de los desarrolladores: si un agente empieza a abrir configuración obsoleta o a rastrear archivos irrelevantes, el operador necesita saberlo lo bastante rápido como para detenerlo (Hacker News). Otro hilo sobre ejecutar Claude Code “de forma peligrosa” terminó convergiendo en el mismo patrón práctico: deja que el agente actúe con libertad, pero solo dentro de un sandbox con acceso limitado a archivos y red (Hacker News).
El propio post de ingeniería de Anthropic aterriza en el mismo sitio. Separa las defensas en entorno, modelo y contenido externo. El entorno es la parte que puedes volver determinista. Si las credenciales nunca entran en el sandbox, Claude no puede exfiltrarlas, ya sea por una inyección de prompt, por exceso de iniciativa del modelo o por una mala instrucción del usuario (Anthropic).
El modo auto encaja aquí, pero no es magia. Anthropic dice que el modo auto usa un clasificador separado para revisar acciones antes de ejecutarlas, y su documentación lo llama una vista previa de investigación, no un reemplazo de la revisión en operaciones sensibles (Claude Code docs). Esa distinción importa. El modo auto reduce prompts. Los contenedores reducen consecuencias.
Esta es la postura que recomiendo para equipos:
| Modo | Úsalo para | No lo uses para |
|---|---|---|
plan | repos desconocidos, cambios arriesgados | ediciones largas sin supervisión |
acceptEdits | trabajo normal de producto | despliegues, secretos, cambios de infraestructura |
auto | dev containers aislados con control de tráfico saliente | sistemas de producción o repos desconocidos |
bypassPermissions | solo VMs desechables | portátiles de desarrolladores |
La documentación de Anthropic dice que el modo auto requiere Claude Code v2.1.83 o posterior. En la API de Anthropic, los modelos soportados incluyen Claude Opus 4.6 o posterior y Sonnet 4.6. En Bedrock, Vertex AI y Microsoft Foundry, la documentación enumera solo Opus 4.7 y Opus 4.8 para el modo auto (Claude Code docs).
Construye el Dev Container
Crea tres archivos en tu repo:
.devcontainer/
devcontainer.json
Dockerfile
managed-settings.json
Empieza con .devcontainer/devcontainer.json:
{
"name": "claude-code-safe",
"build": {
"dockerfile": "Dockerfile"
},
"remoteUser": "node",
"mounts": [
"source=claude-code-config-${devcontainerId},target=/home/node/.claude,type=volume"
],
"runArgs": [
"--cap-add=NET_ADMIN",
"--cap-add=NET_RAW"
],
"containerEnv": {
"CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1",
"DISABLE_AUTOUPDATER": "1",
"ANTHROPIC_BASE_URL": "https://api.onehop.ai/anthropic",
"ANTHROPIC_API_KEY": "${localEnv:ONEHOP_API_KEY}"
},
"postCreateCommand": "sudo /usr/local/bin/init-firewall.sh"
}
La documentación de dev containers de Anthropic recomienda ejecutar Claude Code dentro de un contenedor para que los comandos se ejecuten lejos del host, mientras las ediciones siguen apareciendo en el repo montado (Claude Code docs). También advierten que no montes secretos del host como ~/.ssh o archivos de credenciales cloud. Hazles caso. Si Claude necesita un token de GitHub limitado al repo, pásale uno de corta duración por el entorno. No montes todo tu directorio home solo porque resulta cómodo.
Ahora el Dockerfile:
FROM mcr.microsoft.com/devcontainers/javascript-node:22
RUN npm install -g @anthropic-ai/claude-code@latest
COPY managed-settings.json /etc/claude-code/managed-settings.json
COPY init-firewall.sh /usr/local/bin/init-firewall.sh
RUN chmod +x /usr/local/bin/init-firewall.sh
La documentación de Anthropic también ofrece una Dev Container Feature, pero instalar mediante el Dockerfile hace que la política y el versionado sean más fáciles de razonar en un repo de equipo. Si quieres reproducibilidad, fija @anthropic-ai/claude-code a una versión concreta y mantén DISABLE_AUTOUPDATER=1.
Bloquea los Permisos Antes de Activar el Modo Auto
Crea .devcontainer/managed-settings.json:
{
"permissions": {
"defaultMode": "auto",
"disableBypassPermissionsMode": "disable",
"deny": [
"Read(./.env)",
"Read(./.env.*)",
"Read(./secrets/**)",
"Read(./config/credentials.json)",
"Bash(curl *)",
"Bash(wget *)",
"Bash(git push *)",
"Bash(kubectl *)",
"Bash(terraform apply *)",
"WebFetch(domain:169.254.169.254)"
],
"ask": [
"Bash(npm publish *)",
"Bash(docker push *)",
"Bash(gh release *)"
],
"allow": [
"Bash(npm install)",
"Bash(npm test *)",
"Bash(npm run lint *)",
"Bash(git diff *)",
"Bash(git status *)"
]
},
"autoMode": {
"environment": {
"trustedDomains": [
"registry.npmjs.org",
"github.com"
]
}
}
}
Dos detalles aquí hacen trabajo de verdad.
Primero, disableBypassPermissionsMode bloquea bypassPermissions y desactiva la bandera --dangerously-skip-permissions cuando se aplica mediante configuración gestionada. Anthropic documenta este control exacto en su referencia de configuración (Claude Code docs).
Segundo, las reglas deny siguen importando en modo auto. Anthropic dice que el modo auto bloquea acciones que escalan más allá de la petición, apuntan a infraestructura no reconocida o parecen impulsadas por contenido hostil, pero no deberías externalizar la política de tu equipo a un clasificador. Si nadie debería ejecutar terraform apply desde una sesión de agente, codifícalo como una regla deny.
Una advertencia: la política gestionada desde el repositorio puede editarla cualquiera que pueda editar el repo. La documentación de Anthropic dice que /etc/claude-code/managed-settings.json tiene alta precedencia dentro de Linux, pero para una política que los desarrolladores no puedan saltarse editando archivos del repo, usa configuración gestionada por servidor o MDM (Claude Code docs). Para un equipo de startup, una política versionada en el repo sigue siendo una buena base. Para un despliegue empresarial, no te quedes ahí.

Restringe el Tráfico Saliente con una Allowlist Pequeña
Añade .devcontainer/init-firewall.sh:
#!/usr/bin/env bash
set -euo pipefail
ALLOWED_HOSTS=(
api.onehop.ai
api.anthropic.com
claude.ai
platform.claude.com
registry.npmjs.org
github.com
raw.githubusercontent.com
)
iptables -P OUTPUT DROP
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
for host in "${ALLOWED_HOSTS[@]}"; do
for ip in $(getent ahostsv4 "$host" | awk '{print $1}' | sort -u); do
iptables -A OUTPUT -p tcp -d "$ip" --dport 443 -j ACCEPT
done
done
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
Esto es intencionadamente simple. Resuelve los nombres de host permitidos al arrancar y permite TCP 443 hacia esas IPs. Para un control de nivel producción, pon el contenedor detrás de un proxy y registra cada petición. Pero incluso esta regla básica de denegar por defecto es mejor que dejar que un agente de programación autónomo hable con todo internet.
La documentación de red de Anthropic enumera dominios requeridos como api.anthropic.com, claude.ai, platform.claude.com, downloads.claude.ai, storage.googleapis.com y raw.githubusercontent.com, dependiendo de la ruta de instalación y autenticación (Claude Code docs). Si instalas mediante npm y desactivas las actualizaciones automáticas, puede que no necesites los dominios de descarga en tiempo de ejecución. Mantén la lista ajustada y añade dominios solo cuando las builds fallen por una razón conocida.
Ejecútalo:
export ONEHOP_API_KEY=oh_your_key_here
code .
# VS Code: Dev Containers: Rebuild and Reopen in Container
claude --permission-mode auto
Dentro del contenedor, verifica:
whoami
claude --version
curl -I https://api.onehop.ai
curl -I https://example.com
La petición a OneHop debería funcionar. La petición a example.com debería fallar salvo que la hayas añadido.
Enruta Claude Fable 5 a Través de OneHop
Anthropic lanzó Claude Fable 5 y Claude Mythos 5 el 9 de junio de 2026, con Fable 5 a $10 por millón de tokens de entrada y $50 por millón de tokens de salida, menos de la mitad del precio de Mythos Preview (Anthropic). OneHop lista Claude Fable 5 como anthropic/claude-fable-5, con precio oficial de $10/M de entrada y $50/M de salida, y precio de OneHop de $3/M de entrada y $15/M de salida, además de $10 de crédito gratis para usuarios nuevos sin necesidad de tarjeta (OneHop).
Nota operativa actual: la página de Fable 5 en OneHop dice que el modelo no está disponible temporalmente aunque siga listado. Mantén la configuración lista, pero espera usarlo cuando tu cuenta y región tengan acceso.
Para una llamada directa a Anthropic Messages a través de OneHop, usa el endpoint compatible con Anthropic que OneHop publica para este modelo:
from anthropic import Anthropic
client = Anthropic(
base_url="https://api.onehop.ai/anthropic",
api_key="oh_your_key_here",
)
message = client.messages.create(
model="anthropic/claude-fable-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Summarize this repo's test strategy."}],
)
print(message.content[0].text)
Si tu app ya usa el gateway compatible con OpenAI de OneHop, el cambio de una sola línea en base URL es:
client = OpenAI(base_url="https://api.onehop.ai/v1", api_key="oh_your_key_here")
Para Claude Code en concreto, usa la base URL compatible con Anthropic en ANTHROPIC_BASE_URL, porque Claude Code habla la Anthropic Messages API. La página del modelo Fable 5 de OneHop lista actualmente Anthropic Messages como disponible en https://api.onehop.ai/anthropic, mientras que OpenAI Chat Completions aparece como no soportado para este modelo (OneHop).

El Modelo Operativo: Confía Menos, Envía Más Rápido
La mejor configuración de Claude Code no es la más permisiva. Es aquella donde los errores salen baratos.
Usa el modo plan cuando Claude esté explorando una base de código nueva. Cambia a auto solo después de acotar la tarea. Mantén bypassPermissions desactivado por política. Deniega lecturas de secretos. Deniega despliegues, pushes a ramas protegidas, mutaciones cloud y endpoints de metadatos. Mete el agente en un dev container no root. Bloquea el tráfico saliente por defecto. Revisa el diff antes de hacer merge.
Eso puede sonar más lento que el modo YOLO. En la práctica, es más rápido porque nadie tiene que vigilar 40 prompts triviales ni preguntarse si una aprobación acaba de permitir que un modelo exfiltre un token. El propio post de contención de Anthropic dice que el dev container de referencia existe para que Claude Code pueda ejecutarse sin supervisión y sin aprobaciones por acción (Anthropic). La pieza que falta es la política de equipo.
Si quieres el camino más corto para probar trabajo de programación de clase Fable sin reconstruir tu stack de proveedores, enruta a través de Claude Fable 5 en OneHop. Las cuentas nuevas pueden empezar con $10 gratis. El cambio de base URL es la parte fácil. La verdadera ganancia es combinarlo con un contenedor que haga que la autonomía sea lo bastante segura como para usarla.