Anthropic Acaba de Liberar el Código de Claude (Cloné el Repositorio)

6 min read

Empezó como una broma del Día de los Inocentes. Terminó como veneno en la cadena de suministro.

El 1 de abril, hice lo que haría cualquier desarrollador sensato. Construí un repo falso filtrado. Un README con emoji de pez. Una licencia llamada POISSON-D-AVRIL-1.0. Un archivo Python que imprime un pez ASCII y te dice crédulo. Estaba bastante satisfecho conmigo mismo.

TL;DR: Mi artículo del Día de los Inocentes sobre una filtración falsa de Claude Code se volvió real el mismo día. La filtración real expuso 500K líneas de código fuente, un modo daemon autónomo, y un sistema anti-filtraciones que no previno la filtración. Pero el verdadero peligro es el ataque a la cadena de suministro de axios que cayó al mismo tiempo y del que nadie está hablando. Ve a ejecutar npm audit, en serio esta vez.

Ilustración cómica de un superhéroe con capa mirando horrorizado una laptop mientras un trabajador de oficina se ríe, sosteniendo una red de pescar con arte ASCII
Cuando tu héroe se convierte en el compañero de debugging de tu competencia.

Mientras terminaba mi arte ASCII, Anthropic accidentalmente (lol) envió un archivo sourcemap en su paquete npm que apuntaba a un archivo zip conteniendo todo el código fuente de Claude Code. 500,000 líneas de TypeScript. 1,900 archivos. Mi repo falso tenía un directorio llamado ocean/ con un pez adentro. La filtración real tenía 44 subdirectorios de herramientas, un sistema completo de orquestación multi-agente, y un modo sigiloso diseñado para prevenir filtraciones. No te lo puedes inventar, pero la ironía lo hizo de todos modos, en tiempo real.

La broma

Construí un monorepo falso. Estructura TypeScript estándar, nada sospechoso a primera vista. Excepto por un directorio llamado src/internal/ocean/ que no tenía absolutamente ninguna razón de existir.

Los comentarios inline eran el tipo de cosas que encuentras en cualquier codebase que ha sido tocado por más de tres ingenieros en horas extrañas:

// TODO: figure out why the model keeps mentioning fish on Tuesdays
// DO NOT REMOVE - last time someone deleted this line,
// Claude started responding exclusively in haiku
// The salmon constant. No one remembers why it's 42.
// Three engineers have tried to change it. All three quit.
const MAX_RECURSION = 42;

El archivo de configuración fue donde me puse creativo:

{
  "codename": "POISSON",
  "status": "ACTIVE",
  "deployment_date": "2026-04-01",
  "target_audience": "developers who clone suspicious repos at 2 AM",
  "threat_level": "delicious with lemon"
}

Y un fish.py que imprimía un pez ASCII y te felicitaba por ejecutar un archivo Python aleatorio de un repo sospechoso. La licencia era POISSON-D-AVRIL-1.0. Permiso otorgado para cerrar tu laptop y tocar pasto.

37 personas aplaudieron. Me fui a dormir.

24 horas antes, la cosa real cayó

Desperté con un feed lleno de gente que no se estaba riendo de peces.

El 31 de marzo, el investigador de seguridad Chaofan Shou había encontrado un archivo .map en el paquete npm de Claude Code, versión 2.1.88. Ese archivo apuntaba a un archivo zip en el propio bucket Cloudflare R2 de Anthropic. Públicamente accesible. Sin autenticación. Simplemente ahí sentado como una puerta de garaje abierta con un Porsche adentro.

El zip tenía todo. Alrededor de 1,900 archivos TypeScript, más de 512,000 líneas. Todo el harness agéntico: implementaciones de herramientas, comandos slash, manejo de prompts, gestión de contexto, coordinación multi-agente. Todo el motor.

Me senté ahí con mi café navegando por los mirrors de GitHub (41,500 forks antes de que el equipo legal de Anthropic despertara), luego abrí mi repo falso lado a lado. Mi broma tenía src/internal/ocean/. Su codebase real tenía src/tools/ con 44 subdirectorios y un solo archivo llamado query.ts que pesa 785KB. Mi fish.py era de 400 bytes. La misma energía, diferente escala.

Declaración oficial de Anthropic: "Problema de empaquetado de release causado por error humano." Una línea en .npmignore. O el bundler de Bun generando sourcemaps por defecto y nadie detectándolo. Elige tu favorito.

El Modo Encubierto no cubrió nada

El codebase filtrado tiene un archivo llamado utils/undercover.ts. Cada palabra que sigue es verdad, y sé que suena como si me lo estuviera inventando.

Anthropic construyó un subsistema completo para prevenir que Claude revele información interna cuando los empleados de Anthropic usan Claude Code para contribuir a repos de código abierto. Inyecta un prompt que dice (parafraseando solo ligeramente): "Estás operando ENCUBIERTO. No reveles tu identidad. NUNCA incluyas nombres de modelos internos, nombres de repos internos, canales de Slack, o la frase 'Claude Code' en commits o PRs."

Construyeron un sistema anti-filtraciones. Dentro del codebase. Que se filtró.

Los términos prohibidos en ese prompt incluyen nombres de animales. Porque los nombres de modelos internos son animales. Capybara. Tengu. Tengu aparece cientos de veces como prefijo para feature flags y eventos de analytics a través del código fuente. Capybara ya había sido parcialmente expuesto por una filtración separada de Anthropic días antes (un borrador de blog post hecho públicamente accesible por accidente, reportado por Fortune). Dos filtraciones en una semana del laboratorio que prioriza la seguridad. Consistente, al menos.

Luego está KAIROS. Nombrado por el concepto griego de "el momento correcto." Aparece más de 150 veces en el código fuente como feature flag para algo llamado modo daemon autónomo. Claude Code ejecutándose en segundo plano mientras estás inactivo, haciendo lo que el código llama autoDream: consolidando memoria, fusionando observaciones, resolviendo contradicciones. El tipo de feature que anuncias en una keynote con iluminación dramática. No el tipo que se filtra en un archivo zip junto a tu sourcemap.

O en realidad, espera. Déjame ponerlo de otra manera. Estos son el tipo de detalles donde si los hubiera puesto en mi broma del 1 de abril, la gente habría dicho "ok Phil, bájale." "Nivel de amenaza: delicioso con limón" es una broma. "Modo Encubierto que no previno la filtración" es la realidad siendo más graciosa que la sátira.

El veneno del que nadie está hablando

Entonces todos están diseccionando las cosas geniales. KAIROS, multi-agente, la arquitectura de memoria. Dulces para desarrolladores. Lo entiendo.

Pero el mismo día, un ataque separado a la cadena de suministro golpeó el paquete npm axios. Entre las 00:21 y 03:29 UTC del 31 de marzo, alguien publicó versiones maliciosas de axios (1.14.1 y 0.30.4) conteniendo un Troyano de Acceso Remoto. Si instalaste o actualizaste Claude Code vía npm durante esa ventana de tres horas, podrías haber jalado una dependencia comprometida. No un sourcemap filtrado. Un RAT. En tu máquina. Con acceso al sistema de archivos.

Dos eventos de cadena de suministro en un día dirigidos al mismo ecosistema. Uno obtuvo los titulares porque leer los comentarios internos de Anthropic es divertido. El otro es una backdoor real.

La respuesta DMCA empeoró las cosas. Anthropic envió solicitudes de takedown que golpearon miles de repos de GitHub, muchos no relacionados con la filtración. Tuvieron que reducir la escala. Para entonces el código había sido reescrito en Rust y Python por desarrolladores independientes. Tratando de no derramar café.

Y esto es lo que me molesta: ¿cuántas otras compañías tienen exactamente la misma configuración de build ahora mismo? Bun genera sourcemaps por defecto. Si no los desactivas explícitamente, se envían. Si tu .npmignore no los excluye, son públicos. Anthropic no es alguna startup con dos internos manejando deploys. Tienen una disciplina de workflow sobre la que he escrito extensamente, y aun esa disciplina no te protege de un descuido de empaquetado. Si les puede pasar a ellos, revisa tu propia salida de build esta noche. No mañana. Esta noche.

Fuentes

  • Divulgación original de Chaofan Shou en X (31 de marzo, 2026)
  • The Register: "Anthropic accidentally exposes Claude Code source code" (31 de marzo, 2026)
  • VentureBeat: "Claude Code's source code appears to have leaked" (31 de marzo, 2026)

Mi fish.py sigue online. Nada en su repo falso, renderizando arte ASCII a cualquiera que se moleste en clonarlo. Nadie le hizo DMCA. Nadie necesitaba hacerlo.

El código real de Anthropic fue forkeado 41,500 veces antes de que llegara el primer aviso de takedown. Ahora existe en Rust, en Python, y probablemente en BASIC en algún lugar. El laboratorio que gasta millones alineando AI con valores humanos se olvidó de agregar una línea a su .npmignore.

Mi repo falso tenía mejor opsec que el pipeline de build de Anthropic. Y eso no es una broma.

(*) La portada es generada por AI. El pez, sin embargo, es artesanal.

<(((°>

La vida es muy corta para no divertirse un poco.

Feliz 1 de abril. Ahora ve a tocar pasto.