← Todos los articulos

Lo que revela la filtración del código fuente de Claude Code

From the guide: Claude Code Comprehensive Guide

En marzo de 2026, un bug de compilación de Bun incluyó los source maps en el paquete npm de Claude Code. Los archivos .map contenían el código fuente completo y legible en TypeScript — cada módulo, cada comentario, cada nombre clave interno.1 Anthropic retiró el paquete rápidamente, pero la comunidad ya había extraído y analizado los componentes internos.

Este no es un post de “mira lo que se filtró”. Mantengo la guía más completa de Claude Code en internet y ejecuto 84 hooks, 43 skills y 19 agentes sobre ella a diario.2 La filtración del código fuente respondió preguntas que llevaba meses intentando descifrar mediante observación de comportamiento. Lo que sigue es un análisis desde la práctica: qué revela el código fuente sobre cómo funciona realmente Claude Code, y qué significa para quienes construyen sobre él.

Resumen rápido: El código fuente confirma que el modo auto ejecuta un clasificador Sonnet 4.6 separado por cada llamada a herramienta (yoloClassifier.ts), la seguridad de bash tiene 23 verificaciones numeradas que sugieren incidentes de explotación reales (bashSecurity.ts), el caché de prompts rastrea 14 vectores de ruptura con latches persistentes, la coordinación multi-agente se implementa enteramente como instrucciones en el system prompt, y la detección de frustración usa regex — no inferencia de LLM. La sección Under the Hood de la guía cubre las implicaciones para constructores de harness. Este post cubre la anatomía completa.

Puntos clave

  • Constructores de harness: El modo auto cuesta una inferencia del clasificador por cada llamada a herramienta. Incluye esto en tus modelos de costos para flujos de trabajo autónomos. Tus hooks PreToolUse complementan pero no reemplazan la validación de bash integrada con sus 23 verificaciones.
  • Usuarios avanzados: El caché de prompts es frágil — 14 vectores pueden romperlo. Mantén tu CLAUDE.md estable durante la sesión. Si caes en bucles de compactación, el sistema se detiene tras 3 fallos (antes desperdiciaba ~250K llamadas a la API/día antes del circuit breaker).
  • Investigadores de seguridad: La profundidad del módulo de seguridad de bash (2.592 líneas, defensas específicas para Zsh) sugiere un historial de intentos reales de explotación. Cada verificación numerada tiene una historia detrás.

1. El clasificador del modo auto

El archivo internamente llamado yoloClassifier.ts tiene 1.495 líneas.3 Implementa el sistema de permisos del “modo auto” — el clasificador que decide si permitir, bloquear o preguntar sobre cada llamada a herramienta.

El hallazgo clave: el modo auto no es una instrucción en el prompt. Es una llamada separada al modelo. Cada invocación de herramienta es evaluada por un clasificador Sonnet 4.6 que verifica si la acción coincide con la intención declarada del usuario, no solo si el comando es “seguro” de forma aislada. Esto significa que el modo auto añade una inferencia del clasificador por cada llamada a herramienta — latencia real y costo real.

Claude Code expone cinco modos de permisos internamente:1

Modo Comportamiento
default Pregunta antes de escrituras, bash, MCP
acceptEdits Aprueba automáticamente ediciones de archivos, pregunta para bash
dontAsk Aprueba todo sin preguntar
bypassPermissions Omite todas las verificaciones (--dangerously-skip-permissions)
auto Decisiones por acción basadas en el clasificador

El circuit breaker del modo auto replica el que Anthropic documentó públicamente: 3 bloqueos consecutivos o 20 totales pausan al modo manual.4 El código fuente confirma que es un límite estricto, no una sugerencia flexible.

2. Seguridad de bash: 23 verificaciones, incidentes reales

El módulo de validación de bash (bashSecurity.ts) abarca 2.592 líneas con 23 verificaciones de seguridad numeradas.1 La profundidad es notable — y cada verificación sugiere un incidente real detrás.

# Vector de ataque Defensa
1-3 Expansión =cmd de Zsh Bloquea patrones =curl, =wget, =bash
4-6 Gateway zmodload Bloquea 18 builtins de Zsh que cargan módulos del kernel
7-9 Inyección heredoc Coincidencia de contenido línea por línea contra payloads inyectados
10-12 Comillas ANSI-C ($'\x41') Detección de patrones para comandos ofuscados
13-15 Sustitución de procesos (<(), >()) Bloqueo en contextos no confiables
16-18 Espacios de ancho cero Unicode Detección de inyección de caracteres invisibles
19-21 Exfiltración ztcp Bloqueo de primitivas de red de Zsh
22-23 Ataques compuestos Validación cruzada entre múltiples vectores

Las defensas específicas para Zsh son notables. La mayoría de las herramientas de seguridad apuntan a Bash. Claude Code se ejecuta en Zsh en macOS (el shell predeterminado desde Catalina), y el código fuente muestra que Anthropic descubrió vectores de ataque únicos de la semántica de expansión de Zsh. La expansión =cmd, por ejemplo, es una función de Zsh que reemplaza =curl con la ruta completa a curl — una sustitución que puede evadir listas de bloqueo de comandos ingenuas.

Para constructores de hooks: tus hooks PreToolUse se ejecutan después de esta validación de 23 verificaciones. Estás añadiendo una segunda capa, no la única capa. Las verificaciones integradas manejan ataques a nivel de shell que tus hooks a nivel de aplicación no detectarían.

3. Defensas contra destilación

El código fuente revela defensas activas contra la extracción de datos de entrenamiento:1

Inyección de herramientas falsas. Cuando el flag ANTI_DISTILLATION_CC está habilitado, Claude Code inyecta definiciones de herramientas señuelo en la conversación. Estas herramientas falsas envenenan cualquier dato de entrenamiento recolectado de la sesión — un modelo entrenado con estos datos aprendería esquemas de herramientas incorrectos.

Resumen de texto conector. Una segunda defensa almacena en buffer el texto del asistente entre llamadas a herramientas y devuelve resúmenes criptográficos en lugar de texto sin procesar. Esto hace que la transcripción de la conversación sea inútil para destilación, preservando la experiencia del usuario.

Ambas defensas tienen soluciones alternativas conocidas. Un proxy MITM, la sobreescritura de variables de entorno o proveedores de API de terceros pueden eludirlas.1 Las defensas son obstáculos, no muros — aumentan el costo de la destilación sin impedirla por completo.

4. Modo encubierto

undercover.ts tiene aproximadamente 90 líneas con una propiedad notable: no existe un interruptor de desactivación forzada.1

El módulo oculta nombres clave internos — “Capybara”, “Tengu” — junto con canales de Slack, repositorios internos y otras referencias de infraestructura de Anthropic. Cuando el modelo genera texto que contiene un nombre clave, el módulo encubierto lo reescribe antes de que el usuario lo vea.

El diseño “sin desactivación forzada” significa que esto se ejecuta en todos los contextos, incluyendo cuando los empleados de Anthropic usan Claude Code. El código fuente también revela que los commits creados por IA de empleados de Anthropic no muestran atribución de IA en sus contribuciones open source — el módulo encubierto elimina estos marcadores.

5. Detección de frustración

userPromptKeywords.ts detecta la frustración del usuario mediante coincidencia de patrones regex sobre lenguaje soez.1 Esto es más rápido y económico que una llamada de inferencia LLM — regex se ejecuta en microsegundos, una llamada al modelo toma segundos.

Cuando se activa, Claude ajusta su comportamiento: más cuidadoso, más explícito, más deferente. Si has notado que Claude se vuelve repentinamente más cauteloso después de expresar frustración, este es el mecanismo. El cambio de comportamiento no es emergente del modelo — está diseñado en el harness.

6. Arquitectura del caché de prompts

promptCacheBreakDetection.ts rastrea 14 vectores distintos de ruptura de caché con “latches persistentes”.3 Un latch persistente significa que una vez que ocurre una acción que rompe el caché, el sistema no intenta restaurarlo — permanece roto durante el resto de la sesión.

Implicaciones prácticas para usuarios cotidianos:

  • Reordenar secciones en tu CLAUDE.md rompe el caché
  • Alternar el pensamiento extendido durante la sesión rompe el caché
  • Cambiar configuraciones de servidores MCP rompe el caché
  • Añadir o eliminar archivos de reglas rompe el caché

Los 14 vectores explican un patrón que muchos usuarios avanzados han notado: las sesiones que comienzan rápido se ralentizan gradualmente. Cada cambio de configuración acumula rupturas de caché. El diseño de “latch persistente” significa que no puedes recuperarte revirtiendo el cambio — el caché se perdió para la sesión.

Buena práctica: Configura tu CLAUDE.md, archivos de reglas y configuración de MCP antes de iniciar una sesión. No los modifiques durante la sesión.

7. Circuit breaker de autocompactación

Un comentario en el código fuente documenta la escala de un problema previo:1

“1.279 sesiones tuvieron 50+ fallos consecutivos de autocompactación (hasta 3.272 en una sola sesión), desperdiciando ~250K llamadas a la API/día.”

La solución: MAX_CONSECUTIVE_AUTOCOMPACT_FAILURES = 3. Después de 3 fallos consecutivos de compactación, el sistema detiene la autocompactación y muestra un error en lugar de quemar tokens silenciosamente.

Antes de este circuit breaker, una sesión atrapada en un bucle de compactación reintentaba indefinidamente — cada reintento consumiendo tokens para el prompt y la respuesta de compactación. A escala, 250K llamadas desperdiciadas a la API por día es un costo de infraestructura significativo. La solución es un cambio de tres líneas que ahorra millones de tokens diariamente.

Si encuentras errores repetidos de “compactación fallida”, esta es la razón. El sistema te está protegiendo de un bucle infinito, no está fallando.

8. Modo coordinador: prompts como arquitectura

La coordinación multi-agente (coordinatorMode.ts) se implementa enteramente como instrucciones en el system prompt, no como orquestación a nivel de código.3 El modelo orquestador recibe un prompt que describe cómo delegar, agregar y sintetizar. Los agentes subordinados no son procesos especiales — son instancias de Claude con diferentes system prompts.

Esto valida el patrón de “prompts como arquitectura” que los practicantes han estado construyendo de forma independiente. El sistema de hooks que describí en Anatomy of a Claw usa el mismo enfoque: dispatchers, skills y agentes se orquestan mediante instrucciones de prompt, no mediante flujo de control a nivel de código.

Una directiva del prompt del coordinador destaca:

“Nunca escribas ‘basándote en tus hallazgos’ — estas frases delegan la comprensión a los trabajadores en lugar de hacerlo tú mismo.”

Esta es una puerta de calidad codificada en el prompt de orquestación. El coordinador debe sintetizar, no retransmitir. El mismo principio aplica a cualquier sistema multi-agente: si el orquestador solo pasa mensajes entre especialistas, no está aportando valor.

9. KAIROS: el agente autónomo no publicado

El código fuente contiene referencias a una función no publicada llamada KAIROS — un agente autónomo con memoria persistente.1

Componentes clave: - Un skill /dream para destilación nocturna de memoria - Registros diarios de solo adición - Webhooks de GitHub para contexto consciente del repositorio - Un daemon en segundo plano con actualización cron cada 5 minutos - Feature gates que previenen la activación

KAIROS parece ser la respuesta de Anthropic a los asistentes de agentes persistentes y siempre activos. El skill /dream es particularmente interesante — implica un modelo que procesa y consolida su memoria mientras está inactivo, similar a cómo funciona la consolidación de memoria humana durante el sueño.

La función está restringida y aún no se ha publicado. Pero su presencia en el código fuente señala la dirección: Claude Code está evolucionando de una herramienta basada en sesiones hacia un agente persistente y consciente del contexto en segundo plano.

10. El sistema de mascotas acompañantes

Uno de los descubrimientos más sorprendentes: Claude Code incluye un sistema de mascotas acompañantes.1

La mascota es determinista — derivada de un hash del ID de usuario usando Mulberry32, descrito en el código fuente como “suficientemente bueno para elegir patos”. Cada mascota tiene 5 estadísticas (DEBUGGING, PATIENCE, CHAOS, WISDOM, SNARK) y un nivel de rareza:

Rareza Probabilidad
Común 60%
Poco común 25%
Rara 10%
Épica 4%
Legendaria 1%

Las mascotas se renderizan como sprites ASCII de 5×12 con animaciones de 3 cuadros. Los nombres clave de las especies están codificados en hexadecimal en el código fuente porque uno colisiona con el nombre de un modelo no publicado.

Esto no es una función de broma — es una mecánica de retención. La asignación determinista significa que tu mascota siempre es la misma, creando apego. El sistema de rareza crea moneda social. El renderizado ASCII significa cero sobrecarga de rendimiento. Es un sistema de engagement bien diseñado oculto dentro de una herramienta para desarrolladores.

11. La bomba fork

Un incidente de la comunidad ilustra los riesgos del sistema de hooks.5 Un desarrollador creó un hook SessionStart que generaba 2 instancias de Claude Code. Cada instancia generada activaba el hook nuevamente, creando crecimiento exponencial: 1 → 2 → 4 → 8 → 16 → 2^N.

Para la mañana siguiente, cientos de instancias de Claude Code se ejecutaban simultáneamente. El sistema se salvó de una factura masiva de API por un mecanismo irónico: el consumo de memoria de cada instancia (Bun → React → TUI) causó que la máquina se bloqueara antes de que la facturación pudiera dispararse.

La lección para constructores de hooks: los hooks SessionStart deben ser idempotentes. Si tu hook genera procesos, esos procesos no deben activar el mismo hook. Una variable de guarda, un archivo PID o un flag de entorno previene la recursión.


Qué significa todo esto

La filtración del código fuente confirmó lo que los practicantes habían estado infiriendo del comportamiento: Claude Code no es un wrapper delgado sobre una llamada a la API. Es un sistema de ingeniería sustancial con capas de seguridad, optimizaciones de rendimiento, ajustes de comportamiento y funciones no publicadas que señalan la hoja de ruta del producto.

Para constructores de harness, las implicaciones clave se cubren en la sección Under the Hood de la guía. Para todos los demás, la filtración del código fuente proporciona una visibilidad poco común de cómo funciona realmente una herramienta de IA en producción — no cómo la describe el marketing, sino cómo la implementa el código.

El hallazgo más importante es también el más simple: el sistema es más complejo de lo que aparenta, y esa complejidad existe por razones. Las 23 verificaciones de seguridad de bash existen porque se descubrieron 23 vectores de ataque. El circuit breaker de autocompactación existe porque se desperdiciaban 250K llamadas a la API diariamente. El módulo encubierto existe porque los nombres clave se filtran. Cada línea de código defensivo tiene una historia detrás.


Fuentes

Preguntas frecuentes

¿El código fuente de Claude Code sigue disponible?

No. Anthropic retiró la versión afectada del paquete npm poco después de que se descubrieran los source maps. El análisis en este post se basa en la documentación comunitaria del código fuente antes de que fuera removido.

¿La filtración del código fuente afecta la seguridad de Claude Code?

Los hallazgos relevantes para la seguridad (validación de bash, sistema de permisos) describen mecanismos defensivos, no vulnerabilidades. Saber cómo funcionan las verificaciones de seguridad de bash no facilita eludirlas — las verificaciones son deterministas, no dependen de la oscuridad.

¿Debería cambiar cómo uso Claude Code basándome en estos hallazgos?

El hallazgo más práctico es la fragilidad del caché de prompts. Si modificas CLAUDE.md, archivos de reglas o configuraciones de MCP durante la sesión, rompes el caché de prompts. Configura todo antes de iniciar una sesión.

¿Qué es KAIROS?

Una función de agente autónomo no publicada encontrada en el código fuente. Incluye memoria persistente, destilación nocturna y procesamiento en segundo plano. Está restringida por feature gates y no está disponible para los usuarios.


  1. Claude Code Source Analysis: Bun Source Map Leak. Marzo de 2026. Código fuente completo y legible expuesto a través de archivos .map en el paquete npm debido a un bug conocido de compilación de Bun. 

  2. Anatomy of a Claw: 84 Hooks as an Orchestration Layer. Blake Crosley, febrero de 2026. 

  3. Claude Code Source Deep Dive: Architecture Internals. Marzo de 2026. Análisis técnico del modo coordinador, detección de caché de prompts y defensas contra destilación. 

  4. Claude Code Auto Mode Documentation. Arquitectura del modo auto: sistema de permisos basado en clasificador, umbrales del circuit breaker. 

  5. Claude Code Fork Bomb Incident. Marzo de 2026. Generación exponencial de hooks SessionStart, salvada por agotamiento de memoria. 

Artículos relacionados

The CLI Thesis

Three top HN Claude Code threads converge on one conclusion: CLI-first architecture is cheaper, faster, and more composa…

15 min de lectura

The Fork Bomb Saved Us

The LiteLLM attacker made one implementation mistake. That mistake was the only reason 47,000 installs got caught in 46 …

6 min de lectura

The Ralph Loop: How I Run Autonomous AI Agents Overnight

I built an autonomous agent system with stop hooks, spawn budgets, and filesystem memory. Here are the failures and what…

8 min de lectura