Doce días de 'si quieren esto' a Tetris
Los Claude Code Mods son módulos TypeScript que corren dentro del engine de Claude Code y enganchan sus eventos como funciones. Boris Cherny, quien lidera Claude Code en Anthropic, los anunció con cinco palabras: "Claude mods are landing now" (los mods de Claude ya están aquí). El post reunió 2.400 likes, y alguien ya había construido Tetris dentro de la terminal. Tetris, Doom, y una mascota que crece mientras Claude corre tus tests, todo renderizado encima del prompt, a cero tokens.
El anuncio no enlaza a ninguna página de documentación. Enlaza a un issue de GitHub abierto 12 días antes por un ingeniero de Anthropic, con una condición escrita en él. Alice Poteat escribió que la respuesta de la comunidad probablemente determinaría si la función se lanzaba o no. 177 comentarios después, la gente había puesto a prueba el binario con el flag activado, medido sus timeouts y construido juegos sobre él.
| Medida | Valor |
|---|---|
| Likes en el anuncio | 2,400 |
| Comentarios en el issue de GitHub | 177 |
| Superficie tipada en el build de esta semana | 10,700 líneas |
| Eventos sobre sustantivos (build del hilo del issue) | 84 sobre 19 |
| Mods en GitHub en 48 horas | 31 |
Al momento de escribir esto, la página de documentación devuelve un 404. Este artículo cubre las cuatro formas de extender Claude Code, un Mod útil construido y roto a propósito, y qué sigue siendo inestable antes de lanzar uno.
Un Mod es una función en el medio
El árbol de código fuente lo define en una frase: un Mod es un plugin de Claude Code cuyo comportamiento vive en un hooks module. Una entrada de registro engancha los eventos del engine como funciones. En disco, eso es una carpeta de plugin, un hooks manifest que nombra exactamente un módulo, y el módulo en sí.
Cada hook es una función de tres cosas: $, la puerta por la que pasa cada efecto secundario; el evento; y la continuation, el resto de la cadena debajo de ti. Los hooks se anidan como middleware. El que se registra primero es dueño del evento, y nada más abajo en la cadena puede inhibirlo. Ese orden se configura, no se instala. En palabras de Alice Poteat, el orden lo define la configuración, no el momento en que instalaste cada uno.
No hay acceso ambiental. Todo lo que hace un Mod pasa por $, así que un admin puede auditar, permitir, denegar o registrar cualquier evento. Un comentarista lo resumió así: lo que hizo un plugin es exactamente las llamadas que hizo. Un solo hook sobre * ve cada evento, así que un audit log es una sola función. Un Mod puede dibujar, porque la interfaz es React. Corre en proceso sobre Bun, en 50 microsegundos en el percentil 99. Una variable de entorno lo activa. Lo que realmente vive en $ todavía se está diseñando junto con partners de early access.
Cuatro formas de extender Claude Code, y cuál usar para qué
Un shell hook es un script que el engine llama en un momento fijo. Recibe JSON por standard input y responde con un exit code. La respuesta tiene un techo: 8.000 caracteres de contexto de vuelta, y 2.000 para algunos hooks. En palabras de Pratham, en Windows suelen romperse de formas raras.
Un plugin es una caja. Un solo manifest empaqueta skills, agentes, hooks y servidores MCP. Se instala desde un marketplace o se carga directo desde una carpeta en disco, y un solo comando valida la caja antes de que corra nada.
Un skill es prosa que el modelo lee cuando la necesita. El cuerpo se carga solo cuando llega un prompt que coincide. Sigue siendo la forma más barata de cambiar el comportamiento.
Un Mod es la misma caja con un archivo más: un hooks manifest que nombra un módulo, y ese módulo es TypeScript, tipado, en proceso, sobre cada evento del engine. Esa es toda la diferencia.
| Mecanismo | Qué es | Corre | Techo |
|---|---|---|---|
| Shell hook | Script llamado en un momento fijo | Subprocess, exit code | 8,000 caracteres de vuelta (2,000 para algunos hooks) |
| Plugin | Paquete de skills, agentes, hooks, servidores MCP | Instalado o cargado desde disco | Validado antes de correr |
| Skill | Prosa cargada con un prompt que coincide | En el contexto del modelo | Cambio más barato |
| Mod | Plugin más un hooks module en TypeScript | En proceso, sobre cada evento | Tipado, early access |
Los tipos salen de un solo slash command, que escribe el listado completo de lo que ofrece $ directamente en tu proyecto. Los shell hooks antiguos están envueltos, no retirados. En un build temprano, Spencer Morley vio cómo el wrapper fallaba al cargar y quedaba declarado igual. La regla práctica: para cambiar lo que Claude sabe, escribe un skill; para correr un script en un momento dado, un shell hook; para lanzar un paquete, un plugin; para meterte dentro del engine, un Mod. El shell hook sigue funcionando en todos lados donde el flag esté apagado.
Los tres Mods propios de Anthropic, leídos desde el código fuente
Tres Mods vienen incluidos en el binario y su código está en GitHub: un security default, un panel diff y telemetry.
El security default queda en la capa más externa. En una máquina con managed settings, o en una organización Team o Enterprise, nada de lo que instale una persona queda por encima de él. Engancha 12 eventos, y cada hook hace uno de tres movimientos: dejar pasar más allá del user tier, rechazar a un caller del user tier por nombre, o dejar pasar. Falla cerrado, y el comentario del código lo dice en dos palabras. Esa es la parte que le importó al hilo: un admin le quita una affordance a $, y nada registrado por debajo puede invocarla. En palabras de un comentarista, eso es categóricamente distinto a pedirle a un plugin que no haga algo.
Diff es un panel al lado del transcript, que muestra los cambios sin commit de la sesión archivo por archivo, actualizado a medida que Claude edita. Se registra al iniciar la sesión y abarca 27 archivos auxiliares: no es un juguete.
Telemetry agrega un sustantivo a $ desde dentro de la creación del engine. Espera (await) lo que hay debajo y devuelve eso más él mismo. Corre solo en builds internos.
El README dice que hay que correr uno desde el código fuente y testear uno desde el código fuente. La ayuda del build de hoy lista validate, eval y details. No hay test en la lista, aunque la ayuda de test igual responde. El tier integrado también rechaza tu copia: si lanzas un plugin con uno de esos nombres, el binario carga el suyo propio.
Cuarenta y dos líneas: un Mod que oculta secretos del modelo
El slash command que escribe los tipos produce, en este build, 11.700 líneas: 84 eventos sobre 23 sustantivos. El hook de tool call responde con un resultado o un deny, nunca con el texto. Esa parte la fija el core.
El Mod son tres archivos: el plugin manifest, el hooks manifest con su única línea, y el módulo. El módulo tiene 42 líneas. Espera (await) lo que hay debajo, limpia el resultado y lo devuelve. Cuatro patrones cubren dos formatos de key de vendor, un token de GitHub, y cualquier cosa asignada a una variable llamada key, secret o token.
Validate lee el código fuente antes de correr. Nombra el evento que engancha el módulo y lo único que llama sobre $. La única advertencia es un author faltante. Cargado desde disco con el flag activado, el archivo de test contiene dos keys, ambas falsas por construcción, y el modelo lee "redacted". En sus propias palabras, los valores volvieron como redacted, así que no puede ver qué hay en ellos.
| Medida | Valor |
|---|---|
| Largo del módulo | 42 líneas |
| Latencia del salto, worker incluido | 28 ms |
| Tokens agregados a la sesión | 0 |
El engine registra el salto como resuelto por un hooks module. El inventario no muestra skills, ni agentes, nada siempre activo. Queda un límite: oculto para el modelo no es lo mismo que oculto en pantalla. El transcript sigue mostrando lo que imprimió la tool. Ese es otro Mod, como señaló Max de Ship Notes en una sola línea.
Rómpelo: un guardia lento es un guardia evadido
El mismo Mod, con una línea agregada: un sleep de 15 segundos antes de la llamada a lo que hay debajo. Diez segundos después, el engine se rinde, reporta que el hook superó su presupuesto y quedó omitido, y lo que está debajo corre en su lugar. El comando se ejecuta de todos modos e imprime "hi".
Reemplaza el sleep con un throw: 574 milisegundos, mismo veredicto, omitido, y el comando corre.
| Caso | Tiempo | Veredicto |
|---|---|---|
| Hook saludable | 28 ms | Resuelto |
| Throw | 574 ms | Omitido, el comando corrió |
| Hang | más de 10 s | Omitido, el comando corrió |
Ambos fallos terminan en la misma palabra: omitido. El hilo ya había medido esa asimetría una semana antes. Una capability que falta al cargar falla cerrada. Un hook que se pasa de presupuesto falla abierto: ruidoso pero evadido, en palabras de Spencer Morley. Un bloqueo sin razón simplemente manda al modelo a otra tool. Pratham lo vio elegir una tool distinta y escribir el archivo igual.
Lo que se propone es un catch. Alice Poteat propone un catch sobre el retorno del hook, que corre si te tardas demasiado o lanzas un error. Una escritura reescrita igual necesita una nota para el modelo: por razones de caching, ve lo que pidió escribir, así que agregas una línea de contexto. El presupuesto también es el aislamiento. El hooks worker corre aparte, y cuando se cae, el engine lo vuelve a levantar y apaga los hooks para esa sesión. La solución no es un presupuesto más largo, sino un catch declarado.
Cuarenta y ocho horas de Mods, y lo que compra una sola frase
A los dos días: Tetris encima del prompt y otros siete juegos, jugables mientras Claude trabaja, a cero tokens. Doom, el original de 1993, corre en su propio proceso; el Mod lo alcanza por HTTP local y redibuja 10 veces por segundo. Hay un pacer que respira en el spinner, y un modelo de historia con 260.000 parámetros corriendo dentro del hooks worker, con cero tokens de API.
El registry escaneó 31 Mods con validate. 14 pueden ejecutar procesos del host. 13 ven cada tool call.
La demo 8 del hilo de la comunidad prometía que una sola frase escribe un plugin que oculta secretos antes de que el modelo los lea. Nosotros pedimos uno.
| Medida | Valor |
|---|---|
| Tiempo | 4 min |
| Turnos | 34 |
| Costo | $1.23 |
| Líneas (más un archivo de test) | 190, contra nuestras 42 |
| Tests | 4 pasan en un tercio de segundo |
Etiqueta lo que oculta por tipo, valida limpio, y no necesita ninguna API key ni ninguna llamada al modelo. Una respuesta lo resumió así: las allowlists son el producto, Tetris es la demo.
Veredicto: construye uno ahora, lanza uno después
Los propios números del registry son la advertencia. 14 de 31 Mods pueden ejecutar procesos del host, y el único control es una huella estática. La ayuda de eval lo dice ella misma: una suite que pasa no es una vetting de seguridad.
| Señal | Valor |
|---|---|
| Eventos el día 8 | 20 |
| Eventos el día 15 | 84 |
| Versiones de CLI en dos semanas | 14 |
| Puntos en Hacker News | 2 |
| Respuestas a la pregunta de compatibilidad | 0 |
El presupuesto de 10 segundos vive en el runtime, no en los types, como señaló Marat. No hay línea de changelog, ni página de documentación, ni post de lanzamiento. Un rival dice que Anthropic lo copió: Ahmad Awais apunta a los mods de Command Code, y él mismo escribe su mod de ejemplo, así que hay que ponderar eso. El post de "early access, las APIs pueden cambiar" reunió 357 likes.
Construye uno ahora si ya escribes hooks y quieres audit, redacción o un panel. Espera si vas a lanzarlo a un equipo antes de que el contrato esté escrito. Esa misma apertura es la razón por la que el presupuesto que falla abierto, el type mismatch de las llamadas MCP y el fallo del wrapper los encontraron los usuarios en cuestión de días.
AIDive