Idea de partida: el contador de uso mide lo que Claude vuelve a leer en cada llamada, y eso pesa mucho más que lo que tú escribes. Encuentra lo que se queda dentro del contexto, sácalo con scripts y medidas, y el límite deja de dar miedo.

Para quién: quien usa Claude Code a diario y quien escribe skills para su equipo.

Martes, 11:47

Martes, 11:47. Llevas dos horas con Claude Code refactorizando el módulo de pagos. Los tests por fin pasan en local. Escribes «ahora actualiza la documentación» y la terminal, en vez de contestar, te enseña esto:

Cuatro horas de silencio. Y solo es martes: el tope semanal ya va por el 60 %.

Si usas Claude Code a diario, la escena te sonará. Lo inquietante del mensaje es no saber qué se ha comido los tokens, porque casi nunca es lo que parece. En este artículo hacemos la autopsia: dónde se van de verdad, qué monstruos viven dentro de tus skills y cómo los sacamos con skill-optimizer, una skill que hemos creado en Virtual Cave para que las demás gasten lo mínimo sin perder calidad.

Qué vas a aprender:

  1. Qué miden los límites de sesión y semanal de Claude Code, y dónde vigilarlos.
  2. Por qué el gasto crece con el número de llamadas y con el contexto de cada una, y qué acciones tiran la caché.
  3. En qué momento gasta cada parte de una skill (listado, SKILL.md, references, trabajo y subagentes) y qué seis costumbres disparan el consumo.
  4. Cómo medir una skill y sus sesiones reales con skill-optimizer, y cómo aplicar sus cambios sin perder calidad.
  5. Qué puedes hacer esta misma noche, tanto si usas Claude Code como si escribes skills.

El recorrido va de los relojes y la caché a la anatomía de una skill, pasa por un censo y un caso real, y acaba con el ritual de skill-optimizer y un kit de supervivencia.

1. El mensaje que nadie quiere leer

Primera aclaración técnica, antes de que se apaguen las luces: en Claude no existe un «límite diario». Existen dos relojes, y corren a la vez.

  • La ventana de sesión, una ventana móvil de 5 horas que se reinicia sola.
  • El tope semanal, que se renueva una vez por semana. En el plan Max hay además un tope semanal propio para los modelos Fable.

Los dos se comparten entre las apps de Claude y Claude Code: lo que gastas chateando a mediodía no está disponible para el refactor de la tarde. Cuando uno se agota, Claude Code te lo dice así:

MensajeQué ha pasado¿Sirve cambiar de modelo?
You've used 85% of your session limit · resets 3:45pmAviso: te queda poco de la ventana de 5 horasNo hace falta todavía
You've hit your session limit · resets 3:45pmSe acabó la ventana de 5 horasNo: es común a todos los modelos
You've hit your weekly limit · resets Mon 12:00amSe acabó el tope semanalNo: también es común a todos
You've hit your Opus limit · resets 3:45pmSe acabó el tope de una familia de modelos (igual con Sonnet)Sí, con /model, pero el siguiente turno relee toda la conversación sin caché

Cada petición descuenta de los dos relojes a la vez. La página de errores de Claude Code avisa de que una sola ráfaga de trabajo pesado, como un workflow que lanza muchos agentes, puede agotar el tope semanal antes de que se reinicie la ventana de sesión.

Dos relojes, un mismo contador

Dónde mirar antes de que sea tarde:

  • /usage: las barras del plan, cuándo se reinicia cada reloj, qué parte de tu consumo se atribuye a skills, subagentes, plugins y servidores MCP, y recomendaciones con su peso, del tipo «recorta este CLAUDE.md, que añade 49.000 tokens a cada petición». Con la tecla f (Claude Code 2.1.305 o posterior), Claude Code aplica las que puede.
  • La línea de estado (campos rate_limits) o el anillo de uso de la app de escritorio, para tenerlo siempre a la vista.
  • /context, para ver qué ocupa ahora mismo la ventana de contexto.

2. Autopsia: el contador mide lo que Claude relee

El modelo no recuerda nada entre una petición y la siguiente. Cada vez que Claude Code le habla, le reenvía todo: el system prompt, las definiciones de herramientas, tu CLAUDE.md, el listado de skills, cada mensaje anterior y cada resultado de herramienta. Y cada vez que Claude usa una herramienta (leer un fichero, lanzar un comando, buscar en el código), hace otra petición con todo lo anterior dentro.

Cada llamada vuelve a leer todo el contexto

La caché de prompts evita que ese reenvío cueste el precio completo. Si el principio de la petición coincide exactamente con lo que el servidor procesó hace poco, esa parte se lee de caché a una fracción del precio de entrada: entre el 2,5 % y el 10 %, según el modelo. Barato, pero no gratis. Y multiplicado por cientos de llamadas, deja de ser barato. La guía de costes de Claude Code lo admite: una pregunta de una línea en una sesión abierta todo el día consume uso por toda la conversación.

De ahí sale la fórmula que guía el resto del artículo:

Gasto del hilo principal ≈ número de llamadas × contexto por llamada

Hay dos palancas, y solo dos:

  • Menos llamadas. Un script que hace diez pasos en una sola llamada ahorra diez relecturas de todo.
  • Menos contexto. Cada byte de salida que se queda dentro se paga en todas las llamadas siguientes, y además acerca la compactación.

Hay acciones que, encima, tiran la caché y obligan a pagar el contexto entero de nuevo:

AcciónQué pasa
Cambiar de modelo a mitad de sesiónCada modelo tiene su caché: la siguiente petición relee toda la conversación sin aciertos
Cambiar el esfuerzoEn la mayoría de modelos, lo mismo. En Opus 5.5, Sonnet 5.5, Haiku 5.5 y Fable 5.1, con suscripción o clave de API, la caché se conserva
Activar o desactivar el modo rápidoCada velocidad tiene su propia caché
Conectar o quitar un servidor MCP cuyas herramientas se cargan al inicioCambia el principio de la petición: se reescribe todo
CompactarLa historia se sustituye por un resumen, y generar ese resumen es en sí una petición grande
Volver tras una pausa largaLa caché caduca: una hora en la conversación principal de una suscripción (cinco minutos cuando ya gastas créditos de uso), cinco minutos en los subagentes
Actualizar Claude CodeEl nuevo system prompt reconstruye la caché desde arriba en la siguiente conversación

Invocar una skill, en cambio, no rompe la caché (salvo que su frontmatter fije otro modelo): su contenido se añade al final, como un mensaje más. El problema de las skills vive en otra parte de la casa.

3. La casa encantada de una skill

Una skill no gasta todo de golpe. Gasta en cuatro plantas y un anexo, y cada uno cobra en un momento distinto. Los límites de la tabla salen de la documentación de skills de Claude Code.

La casa encantada de una skill
PlantaQué hayCuándo cuestaEl detalle que importa
Ático · Listadodescription y when_to_use de la skill, y la descripción de cada agenteEn todas las sesiones, la uses o noSe corta en 1.536 caracteres. Si el listado no cabe en su presupuesto (un 1 % de la ventana de contexto), Claude Code quita descripciones, empezando por las skills que menos usas
Planta baja · DisparoEl cuerpo de SKILL.mdDesde que se invoca hasta el final de la conversaciónEntra como un único mensaje y cada llamada posterior lo relee. Tras compactar, solo se reinyectan sus primeros 5.000 tokens, con un máximo de 25.000 entre todas las skills
Sótano · Bajo demandareferences/, plantillas y el código de los scriptsCuando el modelo los abreLo que se abre se queda en el contexto. Los scripts se ejecutan, no se cargan: solo cuesta lo que imprimen
Cripta · TrabajoResultados de herramientas, ficheros leídos, respuestas de subagentes, reintentosCada resultado viaja en todas las llamadas siguientes, hasta compactarSuele ser lo que más pesa, y no se ve leyendo la skill
Anexo · SubagentesSu propio system prompt, herramientas, CLAUDE.md, el prompt y su trabajoEn cada subagente; al hilo principal solo vuelve su respuestaSu caché dura cinco minutos, aunque estés en una suscripción

Solo las tres primeras plantas se ven leyendo la skill. La cripta, donde suele estar el grueso del gasto, aparece únicamente en las sesiones reales. Por eso optimizar «a ojo», recortando prosa o quitando ejemplos, da tan poco: la prosa es lo más visible y casi nunca lo más caro.

4. Bestiario: seis monstruos que se comen tu límite

Cada planta tiene su inquilino. Todos son costumbres razonables que, multiplicadas por cientos de llamadas, se convierten en monstruos. audit.py y tokens.py son los scripts de skill-optimizer que los detectan; los vemos en el capítulo 7.

MonstruoDónde viveQué se comeCómo lo detectasExorcismo
👻 El fantasma del listadoÁticoDescripciones largas de skills que casi nunca usas, presentes en todas las sesiones. Cuando el listado se llena, otras skills se quedan sin descripción y Claude deja de saber cuándo usarlasaudit.py: description-cap, description-long. En Claude Code, /doctor estima el coste del listadoCaso de uso clave primero y descripción corta. disable-model-invocation: true en las skills que solo lanzas tú con /nombre
🧟 El zombi del SKILL.mdPlanta bajaUn SKILL.md de miles de tokens que, una vez invocado, no sale del contexto. Si se compacta, solo resucita su principiobody-lines, body-charsSKILL.md como router: el detalle, a references/; lo importante, arriba
⚰️ La momia de las referenciasSótanoReferences leídas enteras cuando la tarea necesitaba una sección. Código fuente de un script leído para aprender un flagreference-toc, duplicate, script-help. En tokens.py show, los ficheros de la skill que se leen en cada sesiónLeer solo lo del alcance, índices en las references largas, --help en vez del código
🧛 El vampiro del logCriptaSalidas de builds, tests o búsquedas recursivas que se quedan en el contexto y se pagan en cada llamada posteriornoisy-command. En tokens.py show, los resultados con más tokens arrastradosUna línea por problema, el log completo a un fichero, comandos en modo silencioso
🦇 La bandada de murciélagosCriptaMuchas llamadas pequeñas con la misma forma: cada paso hecho a mano es otra relectura del contexto enteroscript-candidate. En tokens.py show, decenas de Bash, Read o Grep igualesUn script que hace los diez pasos en una llamada; un start y un finish que abren y cierran la tarea
🕷️ La araña de los subagentesAnexoSubagentes sin modelo fijo (pueden acabar en el más caro), con todas las herramientas y respuestas de miles de tokens. O subagentes para tareas de dos ficherosagent-model, agent-tools, agent-answer, no-agents. En tokens.py show, subagentes cuyo gasto es casi todo arranqueAgentes con modelo, herramientas mínimas y respuesta acotada, y solo por encima de un umbral

5. Censo del cementerio: 101 skills en un portátil

¿Exageramos? Hicimos un censo en el portátil de uno de nuestros desarrolladores, el mismo en el que se preparó este artículo. Pasamos audit.py a cada skill instalada y miramos el listado de skills que recibía Claude en esa misma sesión.

Censo del cementerio: un portátil, 101 skills
  • El fantasma, en carne y hueso. Las descripciones de las 94 skills que Claude puede invocar por su cuenta suman unos 7.900 tokens. Con las 122 skills disponibles en la sesión (las instaladas, más las que traen Claude Code y los plugins), el listado no cabía en su presupuesto y Claude Code recortó: 61 aparecían solo con su nombre. Entre ellas, la propia skill-optimizer. Una skill sin descripción es un fantasma: está ahí, pero Claude no sabe cuándo llamarla.
  • Zombis de tamaño medio. El SKILL.md mediano ronda los 2.300 tokens, 45 pasan de 10.000 caracteres y el mayor llega a unos 16.100 tokens. Mientras no se invocan, no cuestan nada. Cuando se invocan, viajan en cada llamada hasta el final de la conversación.
  • Sin herramientas propias ni forma de medir. 81 skills no tienen ni un script: todo lo que hacen lo hace el modelo a mano, llamada a llamada. Y 100 de 101 no tienen evals, así que nadie puede demostrar si un recorte las ha empeorado.

Las skills del censo funcionan. Lo que nadie midió al escribirlas es cuánto gastan, y eso lo acaba notando el tope semanal.

6. Caso real: la sesión de los 165 millones de tokens

Los patrones de skill-optimizer salen de una autopsia real: la de tech-tutorial, una skill que mantiene repositorios de tutoriales Java. Comprueba que el README cuadre con el código, actualiza versiones, traduce y verifica builds. Una sesión que revisó una docena de tutoriales dejó estos números:

La sesión de los 165 millones de tokens

461 llamadas del hilo principal, con 357.000 tokens de contexto de media en cada una. Las lecturas de caché fueron el 82 % de los tokens ponderados del hilo. Al lado de eso, el texto de la skill (lo primero que cualquiera intentaría recortar) era ruido.

El ahorro está en el trabajo, y esa idea recorre toda skill-optimizer. Así lo aplica tech-tutorial:

Lo que el modelo hacía a manoLo que hace ahoraPatrón
Comparar el README con el repositorio, leyendo y buscandoLint: 23 reglas en un script, una línea por problema, con --changed y --maxA1, A2
Buscar versiones desactualizadas y editarlas una a unaVersions --apply, que lee un known-issues.json con bloqueos y guías de migraciónA1, C2
Renombrar y perseguir cada referenciaRename: git mv y todas las referencias en una llamadaA1
Lanzar builds y leer los logs enterosVerify: tres builds, una línea por build y la ruta del logA2, A3
Decidir qué leer y qué delegar recorriendo tablasStart --scope … imprime los siguientes pasosB1
Repasar un checklist finalFinish --verify --scenarios: FINISH OK o lo que fallaB2, B4
Repetir comprobaciones manuales en cada revisióndocs/scenarios.json y Scenarios --checkB3
Traducir todo en el hilo principalUn subagente traductor, solo por encima de 5 ficheros y en grupos de unos 8D2

El SKILL.md quedó en 7 KB, como router, con siete references de 3 a 10 KB que se leen según el alcance de la tarea. Y los scripts son Java ejecutado con JBang: cada tutorial ya necesita un JDK, así que la skill no añadió ningún runtime nuevo.

7. El exorcista: skill-optimizer

skill-optimizer es una skill de Claude Code que audita y refactoriza otras skills para que gasten el mínimo de tokens sin perder calidad. Mide lo que la skill carga y lo que gastaron sus sesiones reales, propone cambios ordenados por ahorro (cada uno respaldado por un hallazgo o un número), los aplica cuando das el OK y vuelve a medir.

Los mandamientos

  1. La calidad, primero. Lo que decide el resultado (escribir, diseñar, nombrar, diagnosticar, revisar lo que hicieron los subagentes, el informe final) se queda en el modelo principal con todo el contexto. Se optimiza el trabajo mecánico que lo rodea. Un ahorro que baja la tasa de aciertos de las evals es una regresión.
  2. Evidencia antes que cambio. Cada cambio del plan cita un hallazgo de la auditoría o un número de una sesión. Las intuiciones sobre dónde se van los tokens suelen fallar: la salida de las herramientas y el número de llamadas pesan más que toda la prosa.
  3. Entender antes de cortar. Una frase que parece redundante suele guardar un fallo pasado. Se mueve a donde aplica (una reference, una comprobación en un script, las instrucciones de un agente) con su porqué, en vez de borrarla.
  4. Tocar solo la skill objetivo. Snapshot antes de editar, mismo idioma y misma voz, y ningún commit si no se pide.
  5. No añadir runtimes por capricho. Los scripts nuevos usan el runtime que el dominio ya necesita (Java con JBang en tech-tutorial; si no, Python con uv). Si la skill gana un requisito, gana también un doctor que lo instala.

Dos modos

ModoQué haceCuándo
optimize (por defecto)Mide, planifica, aplica tras tu OK y vuelve a medirSkills tuyas
auditMide y planifica; no toca nada«¿Por qué X gasta tanto?», revisiones y skills de terceros (ofrece trabajar sobre una copia)

La caja de herramientas

HerramientaQué hace
scripts/doctor.sh, scripts/doctor.ps1Comprueba uv, que ejecuta los scripts de Python e instala lo que declaran, e imprime el comando de instalación para tu sistema. --install --dry-run enseña el plan
scripts/audit.py <skill>Auditoría estática: cada planta en caracteres y ~tokens, y hallazgos fichero:línea [regla] mensaje. --save antes de cambiar, --compare después
scripts/tokens.py list --skill <nombre>Las sesiones que invocaron la skill, de la más reciente a la más antigua, con sus tokens ponderados
scripts/tokens.py show <sesión>Dónde gastó una sesión: por modelo, contexto por llamada, cada subagente y su respuesta, herramientas, los resultados que más arrastraron, los ficheros de la skill leídos y las compactaciones
references/Los patrones y cómo escribir scripts y subagentes baratos, y cómo medir. Se leen cuando el paso los necesita
assets/templates/Puntos de partida para la skill objetivo: un checker, scripts de start y finish, un subagente y un manifiesto de plugin

Los scripts no gastan tokens de modelo: imprimen resúmenes cortos, y el modelo lee su salida en vez de los ficheros que analizan. tokens.py trabaja con las transcripciones que Claude Code guarda en ~/.claude/projects, en tu máquina: no sale nada de ella.

El ritual de skill-optimizer

8. El ritual, paso a paso

Instalación

El repositorio del artículo incluye la skill en la carpeta skill-optimizer/. Clónalo y copia esa carpeta en ~/.claude/skills/ (para ti) o en <proyecto>/.claude/skills/ (para un proyecto). Desde la raíz del repositorio, en macOS, Linux o Git Bash:

En PowerShell:

Claude Code la detecta sin reiniciar si la carpeta ~/.claude/skills ya existía al abrir la sesión; si acabas de crearla, ejecuta /reload-skills. Sus scripts necesitan uv, que trae Python y las librerías que cada script declara. La skill lo comprueba sola, pero puedes adelantarte. Primero, el plan:

Y, si te convence, la instalación:

En Windows, con PowerShell, primero el plan y después lo mismo sin -DryRun:

El doctor usa Scoop o winget en Windows, Homebrew en macOS y el instalador oficial en el resto. Su última línea es DOCTOR OK cuando no falta nada.

Para invocarla, pídeselo a Claude con tus palabras:

  • «optimiza la skill my-skill»: mide, enseña el plan, aplica tras tu OK y vuelve a medir.
  • «¿por qué my-skill gasta tantos tokens?»: solo auditoría; no cambia nada.
  • /skill-optimizer audit my-skill

Paso 1 · Snapshot y medición

La skill copia el objetivo a una carpeta temporal y guarda la auditoría de partida (audit.py <skill> --save). Así se ve audit.py sobre una skill pública de automatización de navegador que tenemos instalada:

Arriba, cada planta con su tamaño. Abajo, los hallazgos con fichero, línea y regla. Los avisos (warn) son defectos: una descripción que el listado corta, un agente sin modelo, una ruta a un fichero que no existe. Las notas (note) son candidatos que hay que pesar contra lo que hace la skill. Esta skill está sana (cero avisos) y aun así tiene margen: 115 bloques de shell y ningún script es justo donde anidan los murciélagos.

Las 22 reglas de audit.py
ReglaTipoQué señala
frontmatteravisoSKILL.md sin frontmatter válido, sin nombre o sin descripción
description-capavisodescription + when_to_use por encima de 1.536 caracteres: el listado corta el resto
description-longnotadescription por encima de 1.024 caracteres, el límite para skills subidas a claude.ai o a la API
body-linesavisoCuerpo de SKILL.md por encima de 500 líneas (configurable)
body-charsnotaCuerpo de SKILL.md por encima de 10.000 caracteres: cada llamada posterior lo arrastra
missing-fileavisoUna ruta a un fichero de la skill que no existe
orphan-referencenotaUna reference que ningún otro fichero nombra: no se carga nunca, o se carga a ciegas
reference-tocnotaUna reference de más de 300 líneas sin índice al principio
duplicatenotaLa misma línea larga en SKILL.md y en una reference, o en dos references: se paga dos veces
plugin-missingavisoagents/ sin .claude-plugin/plugin.json: los agentes nunca se cargan como subagentes
agent-modelavisoUn agente sin model: puede acabar en el modelo principal, el más caro
agent-toolsavisoUn agente sin tools: hereda todas, y cada esquema de herramienta es contexto
agent-fieldsnotaUn agente sin effort, maxTurns u omitClaudeMd
agent-descriptionnotaDescripción de agente de más de 200 caracteres o que no empieza por <skill> only -
agent-answernotaUn agente sin línea de estado (DONE/BLOCKED) o sin límite de longitud en su respuesta
agent-nestednotaUn agente que puede lanzar subagentes
agent-skillsnotaUn agente que precarga skills: su contenido entero en cada ejecución
no-agentsnotaSKILL.md manda delegar en subagentes, pero la skill no define ninguno
script-candidatenotaMuchos bloques de shell y ningún script: las secuencias repetidas cuestan tokens de modelo
script-helpnotaUn script sin --help: el modelo lee su código para aprender a llamarlo
noisy-commandnotaUn comando que imprime mucho más de lo que el modelo necesita
no-evalsnotaSin evals/: un cambio no se puede medir en la misma tarea antes y después

Después, las sesiones reales. tokens.py list --skill <nombre> encuentra las que invocaron la skill y tokens.py show <sesión> las abre en canal. Para que veas lo que enseña, se lo pasamos a la propia sesión de Claude Code que investigó para este artículo.

Autopsia en directo: la sesión que preparó este artículo

Con solo 26 llamadas, cada una cargaba ya 163.100 tokens de contexto de media, y la sesión había leído 4,04 millones de tokens de caché. Lo más caro fue lo que leímos y se quedó dentro. El código de audit.py, leído entero, viajó en las 21 llamadas siguientes: 132.000 tokens arrastrados. Lo leímos porque había que explicarlo aquí. Para usarlo, la skill pide justo lo contrario: ejecutar --help y leer solo lo que imprime. Hasta el exorcista tiene que vigilar que no lo posean.

Fíjate también en el reparto. En una sesión corta, las escrituras de caché (construir el contexto) pesan tanto como las lecturas, y la salida no se queda lejos. Cuantas más llamadas, más se comen las lecturas el total: en tech-tutorial llegaron al 82 %.

weighted son tokens ponderados: entrada + 1,25 × escritura de caché de 5 minutos + 2 × escritura de 1 hora + 0,1 × lectura de caché + 5 × salida. Son las proporciones de precio de los modelos de Claude (en los más recientes la lectura de caché sale todavía más barata) y sirven para comparar sesiones del mismo modelo, no como factura.

Paso 2 · Leer la skill entera

Con las medidas delante, la skill lee el objetivo con la herramienta de lectura (no con cat: una salida de shell grande se guarda en un fichero que luego hay que leer otra vez): SKILL.md, cada reference, cada agente y el --help de cada script. Anota qué pasos son mecánicos, cuáles deciden la calidad y qué instrucciones guardan una lección aprendida.

Paso 3 · El plan

Una tabla con el cambio, el patrón, la evidencia, el ahorro (nivel y tokens aproximados por ejecución) y el riesgo para la calidad, con el mayor ahorro por riesgo arriba. Un plan de ejemplo, ilustrativo, a partir de la auditoría de arriba:

CambioPatrónEvidenciaAhorro estimadoRiesgo para la calidad
Un script que agrupe las secuencias de comandos que se repitenA1script-candidate: 115 bloques de shellMenos llamadas por tareaBajo: se prueba con un input real
SKILL.md como router, con el detalle en references por tareaC1body-chars: unos 3.800 tokens en cada llamada tras invocarlaBuena parte de esos tokens en cada llamadaMedio: hay que conservar cada lección
Instalación silenciosa, con el log a un ficheroA3noisy-command en SKILL.md:411La salida de npm fuera del contextoBajo
Índice al principio de la reference de 433 líneasC1reference-tocLecturas parciales en vez de enterasBajo
Evals de las tareas típicas—no-evalsNinguno directo: permite medir todo lo demásNinguno

La skill enseña el plan y espera el OK. En modo audit, el ritual acaba aquí.

Paso 4 · Aplicar

En el orden del plan. Los scripts parten de las plantillas de assets/templates/ y cumplen el contrato de salida del capítulo siguiente; los subagentes se definen como agentes de plugin. Cada script nuevo se ejecuta sobre un input real y se lee lo que imprime, no solo su código de salida: un generador que «funciona» pero escribe una tabla vacía es un fallo. Si cambian agents/ o .claude-plugin/, toca ejecutar /reload-plugins antes de poder llamar a los agentes; los cambios en SKILL.md se cargan en caliente.

Paso 5 · Medir otra vez

audit.py --compare contra la foto inicial, y después las evals de la skill o una tarea representativa, ejecutada sobre la copia y sobre la versión nueva, con el mismo modelo y el mismo esfuerzo. Mejor dos veces cada una: una misma tarea varía entre ejecuciones, y una diferencia de pocos puntos no demuestra nada. El informe separa lo medido de lo estimado:

NivelAntesDespuésMedido con
Listado (cada sesión)audit.py
Disparo (SKILL.md)audit.py
Bajo demanda, por tarea típicaLas references que imprime el script de start
Sesión: ponderados del principal y de los subagentes, llamadas, contexto por llamadatokens.py show, antes y después
Tasa de aciertos de las evalsEvals

Si las evals bajan, el cambio es una regresión, por muchos tokens que ahorre.

9. El grimorio: patrones para gastar menos sin perder calidad

La skill trae un catálogo de patrones en cinco familias (references/patterns.md). Cada patrón se aplica solo cuando su señal aparece en la auditoría o en una sesión real.

FamiliaLa ideaPatrones
A · Los scripts hacen el trabajo deterministaLo que se comprueba o transforma sin criterio, lo hace un script que imprime un resumenA1 un script por comprobación · A2 resúmenes, no logs · A3 comandos silenciosos y lecturas dirigidas
B · Los scripts deciden y cierranUn start convierte la petición en los siguientes pasos; un finish cierra la tarea en una llamadaB1 start con NEXT · B2 finish con FINISH OK · B3 la prueba como datos · B4 reglas que se comprueban en vez de repetirse
C · Cargar menosSKILL.md como router, el conocimiento como datos y cada cosa dicha una vezC1 router · C2 conocimiento como datos · C3 decirlo una vez · C4 descripciones · C5 plantillas en vez de ejemplos
D · Subagentes con correaEl trabajo justo, el modelo más barato que una comprobación pueda respaldar y respuestas acotadasD1 agentes de plugin · D2 umbral y modelo · D3 respuestas acotadas · D4 no repetir lo que ya comprueban los scripts · D5 una línea ENV · D6 verificar, escalar, parar · D7 aislar en un fork el trabajo ruidoso
E · Evitar el retrabajoNo pagar dos veces el mismo errorE1 un doctor de requisitos · E2 editar con herramientas, no con heredocs · E3 toda la evidencia de una vez · E4 lotes · E5 fichero de progreso · E6 el nivel justo de las skills que llama
De monolito a router

El contrato de salida de un script

Un script solo ahorra si su salida es corta y fiable. Este es el formato que piden los patrones A2 y B2:

  • Una línea por problema, fichero:línea [regla] mensaje, para que el modelo vaya directo al sitio.
  • Un tope por fichero y regla (--max, 5 por defecto), con una línea ... n more: la sexta línea idéntica no enseña nada que no enseñaran las cinco primeras.
  • Una última línea de estado en la que se pueda confiar (CHECK OK o CHECK: n problem(s)), con código de salida 0, 1 o 2.
  • Lo largo (builds, tests, logs) a un fichero, con su ruta y las líneas que importan.
  • Filtros a la tarea (--changed, --only, --skip) y --help o --format para que nadie tenga que leer el código.
  • UTF-8, sin colores ni barras de progreso, determinista e idempotente.

Subagentes con correa

Un agente de plugin fija en su frontmatter lo que un general-purpose deja al azar. Un ejemplo ilustrativo a partir de la plantilla de la skill (assets/templates/agent.md):

CampoValorPor qué
descriptionUna línea: <skill> only - <qué hace>Las descripciones de los agentes van en todas las sesiones, y el prefijo evita que el modelo principal lo use para otra cosa
modelhaiku o sonnet, según el trabajoSin él, puede acabar en el modelo principal, el más caro
effortlow para lo mecánico, medium para el criterioLos tokens de razonamiento también cuentan
toolsSolo las que necesitaSi se omite, hereda todas: más esquemas en su contexto y más margen para hacer lo que no debe
maxTurnsEntre 25 y 40Acota a un subagente perdido
omitClaudeMdtrueSe salta los CLAUDE.md del usuario y del proyecto, que rara vez ayudan en una tarea acotada (Claude Code 2.1.271 o posterior)
skillsNo ponerloPrecargaría el contenido entero de cada skill en cada ejecución

Y su respuesta tiene contrato: una primera línea de estado (DONE, DONE_WITH_CONCERNS, BLOCKED o NEEDS_CONTEXT), como mucho entre 10 y 25 líneas con hallazgos fichero:línea: problema, y lo largo, a un fichero. Además, el agente tiene prohibido lanzar subagentes.

¿Quién hace cada trabajo?

Dos avisos que vienen con el reparto. Un modelo más barato se equivoca con la misma seguridad con la que acierta, así que antes de actuar sobre su resultado se vuelve a ejecutar la comprobación determinista. Y un BLOCKED nunca se reenvía igual: se añade el contexto que faltaba, se divide la tarea, se sube un modelo o se hace a mano. Tras tres arreglos fallidos de lo mismo, se informa.

10. Kit de supervivencia para esta noche

Si usas Claude Code a diario, sin instalar nada:

  • Mira /usage antes de que él te mire a ti: a quién atribuye el consumo y qué te recomienda recortar.
  • Usa /context para ver qué ocupa la ventana ahora mismo.
  • Haz /clear entre tareas que no tienen nada que ver: no cuesta nada.
  • Guarda /compact para las pausas naturales, no para la mitad de una tarea: compactar un contexto grande es, en sí, una petición grande.
  • Elige modelo y esfuerzo al empezar. Cambiar de modelo a mitad de sesión relee la conversación entera sin caché.
  • Pide filtrados, no volcados: «enséñame solo los tests que fallan» en vez de «ejecuta los tests».
  • Deja CLAUDE.md por debajo de 200 líneas y mueve lo específico de un flujo a una skill.
  • Marca con disable-model-invocation: true las skills que solo lanzas tú, y desinstala las que no usas (/skill-doctor te dice cuáles).
  • Desconfía de los fan-outs gigantes: un workflow que lanza muchos agentes puede agotar el tope semanal de una sentada.
  • Si el límite ya te ha pillado a mitad de tarea, Claude Code puede esperar al reinicio y continuar solo. Lo tienes en /rate-limit-options.

Si escribes skills para tu equipo, con skill-optimizer:

  • Pasa audit.py a tus skills más usadas y corrige primero los avisos.
  • Busca sus sesiones con tokens.py list --skill <nombre> y abre la más cara con tokens.py show.
  • Pide un plan con evidencia, da el OK solo a lo que tenga número y vuelve a medir.
  • Escribe evals de las tareas típicas: sin ellas, un ahorro puede ser una regresión disfrazada.

11. Cierre

Lo que enseñan los números de este artículo:

  1. El gasto lo marcan las llamadas y el contexto de cada una. En la sesión de tech-tutorial, 461 llamadas con 357.000 tokens de contexto de media hicieron que las lecturas de caché fueran el 82 % de los tokens ponderados del hilo principal.
  2. Lo que entra en el contexto se paga en cada llamada posterior. El código de audit.py, leído una vez, viajó en las 21 llamadas siguientes: 132.000 tokens arrastrados por un resultado de 6.300.
  3. El listado de skills tiene presupuesto. Con 122 skills disponibles, 61 aparecían solo con su nombre, y Claude no sabía cuándo llamarlas.
  4. Un recorte solo es ahorro si las evals se mantienen. En el censo, 100 de 101 skills no tenían evals con las que demostrarlo.

Son medidas de un portátil y de unas pocas sesiones: mide las tuyas con tokens.py antes de decidir qué recortar.

El límite solo apaga la luz. El monstruo vive en el contexto: en el log que nadie volvió a mirar, en el SKILL.md que entra y ya no sale, en los diez pasos que podían haber sido una llamada.

Esta noche, antes de salir a pedir caramelos, pásale el exorcista a la skill que más usas. Si el informe de mañana dice «menos tokens, mismas evals», el único susto de la semana será el disfraz.