Anthropic filtró su propio código fuente por error: así fue como pasó
Nota: Los fragmentos de código que aparecen en esta serie son recreaciones en Python basadas en la arquitectura y patrones descritos públicamente tras la filtración. No se reproduce código original de Anthropic. El objetivo es puramente educativo: entender los conceptos de ingeniería detrás de una herramienta de IA de producción.
1. Qué pasó exactamente
A finales de marzo de 2026, Anthropic publicó una nueva versión de Claude Code, su herramienta de terminal que permite usar Claude como asistente de programación. La versión era la 2.1.88. Hasta ahí, todo normal.
El problema es que dentro del paquete que subieron a npm (el registro público donde se distribuyen paquetes de JavaScript y TypeScript), se coló un archivo que no debería haber estado ahí: un source map de 59,8 megabytes.
2. Qué es un source map (explicado desde cero)
Cuando escribes una aplicación en TypeScript (un lenguaje moderno basado en JavaScript), antes de publicarla necesitas compilarla. El proceso de compilación transforma tu código legible en un archivo JavaScript optimizado, minificado e ilegible. Esto es normal y deseable: el resultado es más rápido y ligero.
El problema es que si algo falla en producción, los errores que ves se refieren al código ilegible, no al original. Para resolver esto existen los source maps: archivos con extensión .map que actúan como un diccionario de traducción entre el código compilado y el código fuente original.
Un source map contiene:
El código fuente original completo, tal como lo escribieron los desarrolladores
Los nombres originales de todas las variables, funciones y clases
La estructura de directorios del proyecto (nombres de carpetas y archivos)
Las posiciones exactas de cada línea de código
En resumen: si tienes el .map, tienes el código fuente. Es como encontrar la llave maestra de un edificio.
Por eso la regla de oro es clara: los source maps nunca se incluyen en paquetes de producción. Son herramientas de desarrollo interno, punto.
3. Cómo se coló el archivo
El paquete de Claude Code se publica en npm bajo el nombre @anthropic-ai/claude-code. Cuando un desarrollador ejecuta npm install, se descarga un archivo .tgz (un comprimido) que contiene todo lo necesario para ejecutar la herramienta.
En la versión 2.1.88, ese comprimido incluía el archivo .map de 59,8 MB. Normalmente, un paquete npm de este tipo pesa unos pocos megabytes. Que de repente pese 60+ MB debería haber encendido todas las alarmas. Pero no las encendió.
¿Cómo se evita esto normalmente?
Con un archivo
.npmignoreque lista los archivos que NO deben incluirse en el paqueteCon el campo
"files"enpackage.jsonque lista explícitamente los archivos que SÍ deben incluirseCon un check en el pipeline de CI/CD que verifique el tamaño del paquete antes de publicar
Ejecutando
npm pack --dry-runpara inspeccionar qué contiene el paquete antes de subirlo
Alguno de estos controles falló o no existía. Anthropic confirmó que fue un "release packaging issue caused by human error".
Además del .map incluido directamente, investigadores de seguridad descubrieron que el archivo de depuración apuntaba a un ZIP alojado en la infraestructura cloud de Anthropic que contenía el repositorio casi completo.
4. La reacción
La comunidad de seguridad detectó el problema rápidamente:
Zscaler ThreatLabz publicó un análisis técnico detallado, confirmando el tamaño del
.mapy la exposición del código fuenteThe Verge cubrió la noticia destacando hallazgos curiosos dentro del código: una mascota virtual estilo Tamagotchi y un agente "always-on"
Axios tituló directamente: "Anthropic leaked its own Claude source code"
The Guardian lo recogió como noticia tecnológica relevante
Anthropic emitió un comunicado oficial:
"This was a release packaging issue caused by human error, not a security breach. No customer data, API keys, or credentials were exposed."
El paquete fue actualizado rápidamente para eliminar el .map. Pero el código ya había sido descargado y analizado.
5. Qué se encontró dentro
El source map permitió reconstruir prácticamente todo el código fuente de Claude Code. Las cifras:
|
Métrica |
Valor |
|---|---|
|
Archivos |
~1.900 |
|
Líneas de código |
~500.000 |
|
Framework de UI |
React para terminal |
|
Herramientas internas |
43+ |
|
Sub-agentes |
6 tipos |
Lo que se encontró dentro, y que iremos desgranando en los siguientes posts de esta serie, incluye:
Un motor agéntico que ejecuta herramientas en streaming antes de que el modelo termine de generar su respuesta
43+ herramientas organizadas en 9 familias: sistema de archivos, shell, web, sub-agentes, tareas, planificación, integración con IDEs, workflow y miscelánea
Un clasificador de machine learning que analiza comandos bash con Tree-sitter y decide automáticamente si son seguros o necesitan aprobación del usuario
6 tipos de sub-agentes (general-purpose, Explore, Plan, Bash, statusline-setup, claude-code-guide) que se lanzan como procesos independientes
Un sistema de compactación de contexto en 5 niveles que gestiona la memoria de la conversación, incluyendo un "DreamTask" que consolida memorias en segundo plano
Telemetría en 3 capas (GrowthBook, First-Party Logger, Datadog) con un killswitch remoto
Un fork completo de un framework React con un motor de layout para renderizar interfaces en la terminal
Una mascota virtual estilo Tamagotchi escondida en el código (destacada por The Verge)
6. Los easter eggs escondidos en el código
Además de la arquitectura seria, el código de Claude Code esconde un puñado de sorpresas que demuestran que los ingenieros de Anthropic tienen sentido del humor.
La mascota virtual (Buddy System)
El hallazgo más llamativo, y el que The Verge destacó en su titular, es un sistema completo de mascota virtual al estilo Tamagotchi. Un módulo dedicado contiene un sistema de compañeros con:
18 especies disponibles: pato, ganso, blob, gato, dragón, pulpo, búho, pingüino, tortuga, caracol, fantasma, ajolote, capibara, cactus, robot, conejo, seta y "chonk"
Sistema de rareza con 5 niveles: Common (60%), Uncommon (25%), Rare (10%), Epic (4%) y Legendary (1%). Además, hay un 1% de probabilidad de que tu mascota sea "shiny"
5 estadísticas de personalidad: DEBUGGING, PATIENCE, CHAOS, WISDOM y SNARK
Sprites ASCII animados con 3 fotogramas de animación para cada especie. Por ejemplo, el pato:
__
<(· )___
( ._>
`---´Un "alma" generada por IA: cada mascota tiene un nombre y personalidad generados por Claude. La parte física se deriva de un hash del ID del usuario, así que cada usuario obtiene una mascota determinista pero única
Animación de corazones cuando la acaricias con
/buddy pet: los corazones flotan hacia arriba durante 2,5 segundos antes de desvanecerse en puntos
El teaser del sistema aparecía con texto arcoíris solo del 1 al 7 de abril de 2026, es decir, justo esta semana.
160+ verbos absurdos en el spinner de carga
El código contiene una lista de más de 160 verbos inventados o absurdos que se muestran mientras Claude Code "piensa". Algunos destacados:
"Clauding" — autoreferencial
"Whatchamacalliting"
"Discombobulating" / "Combobulating"
"Flibbertigibbeting"
"Razzle-dazzling"
"Shenaniganing"
"Lollygagging"
"Tomfoolering"
El agente "always-on"
El otro hallazgo que destacó The Verge: Claude Code incluye un modo proactivo donde el agente no espera instrucciones, sino que toma la iniciativa. El sistema incluye un mecanismo de "sueño" que permite al agente dormirse y despertarse periódicamente para comprobar si hay trabajo nuevo, respetando la expiración del caché de prompts para no desperdiciar llamadas a la API.
Nombres de especies codificados en hexadecimal
Para evitar que los nombres de las especies aparezcan como texto legible en el bundle compilado (y no disparen un canary de seguridad que busca nombres en código), todos están codificados en hexadecimal. La idea, recreada en Python:
# Los nombres no aparecen como strings en el bundle
def species(hex_codes):
return "".join(chr(c) for c in hex_codes)
DUCK = species([0x64, 0x75, 0x63, 0x6b]) # → "duck"
GOOSE = species([0x67, 0x6f, 0x6f, 0x73, 0x65]) # → "goose"El algoritmo para "elegir patos"
El generador pseudoaleatorio que determina la especie de tu mascota usa un algoritmo llamado Mulberry32, una PRNG ligera y con semilla. El comentario que lo acompaña en el código dice, textualmente: "good enough for picking ducks".
7. Esto no es la primera vez que pasa (en la industria)
Incluir source maps en producción por error es un problema conocido en la industria. Empresas como Facebook y Google han tenido incidentes similares donde código interno quedó expuesto a través de .map files accesibles públicamente en sus sitios web.
La diferencia en este caso es que lo expuesto no era una página web sino una herramienta de IA completa, lo que abrió una ventana única para entender cómo se construye un asistente de código basado en LLMs a escala de producción.
8. Por qué importa
Independientemente del debate sobre si el código de herramientas de IA debería ser open source, este leak ofreció algo que rara vez se consigue: la oportunidad de estudiar, línea por línea, cómo una empresa de primera línea resuelve problemas reales de ingeniería de IA.
No se trata de copiar. Se trata de aprender.
En los próximos 7 posts de esta serie, vamos a desmontar Claude Code pieza por pieza: desde el motor agéntico que lo hace funcionar hasta el framework de terminal que renderiza su interfaz. Todo documentado, todo explicado, todo con referencias directas al código.
Fuentes
The Verge — "Claude Code leak exposes a Tamagotchi-style 'pet' and an always-on agent"
The Guardian — "Claude's code: Anthropic leaks source code for AI software engineering tool"
Esta serie es un proyecto de Levante, un cliente de escritorio open source para trabajar con MCPs, modelos de IA y herramientas en una sola interfaz. Si te interesa la arquitectura de herramientas de IA, te interesa Levante.
Saúl Gómez es fundador de Levante, un cliente de escritorio open source para trabajar con modelos de IA.
