Saltar al contenido
LINWIND de Windows a Linux

~/ia

Sonnet trabaja, Haiku busca y Opus aconseja: cómo montar ese reparto en Claude Code y lo que cuesta

Marcos · · 6 min

El reparto que circula en infografías, con Sonnet haciendo el trabajo, Opus aconsejando y varios subagentes Haiku buscando en paralelo, se puede montar hoy en Claude Code con funciones oficiales. Lo que no cuentan esas imágenes es lo que pasa al usarlo. En una tarea de prueba, el asesor en Opus se llevó dos tercios del coste, el subagente que revisaba en su propia copia del repositorio no veía los cambios sin commit, y en una sesión sin interfaz los permisos del proyecto no se aplicaron. Todo tiene arreglo, y conviene saberlo antes de copiar la configuración.

Una aclaración sobre la imagen original: además de los modelos de Anthropic pinta una capa «JEV» que decide qué fichero o qué herramienta usar. Eso no es de Claude Code, sale de plugins de terceros que usan Jev, el modelo de decisiones de TypeSafe del que hablé en no uses ChatGPT para clasificar, y las cifras de esa parte («1,338 forks») están puestas de adorno.

Las piezas y cómo se activa cada una

Pieza Qué hace Cómo se activa
Sesión principal en Sonnet Edita, ejecuta y decide "model": "sonnet" en .claude/settings.json o claude --model sonnet
Opus como asesor Revisa la conversación y aconseja; no escribe código /advisor opus, "advisorModel": "opus" o claude --advisor opus
Subagentes en Haiku Búsquedas y tareas mecánicas en paralelo model: haiku en su fichero de .claude/agents/
Auditor aislado Trabaja en una copia del repositorio isolation: worktree en su fichero
Línea de estado Enseña quién trabaja en cada momento Un mod, más abajo

Comprobado el 1 de noviembre en la documentación del asesor, la de subagentes y la de worktrees, con Claude Code 2.1.316.

El asesor: útil, discreto y lo más caro

El asesor (advisor en inglés) es una herramienta experimental: Claude consulta a un segundo modelo, normalmente más fuerte, en momentos clave, como antes de decidir el enfoque, cuando se atasca en un error repetido o antes de dar la tarea por terminada. Ese modelo recibe la conversación entera, con cada llamada a herramientas y su resultado, y devuelve consejo que la sesión principal aplica. Solo funciona con la API de Anthropic (no en Bedrock, Vertex ni Foundry), se apaga con /advisor off o con CLAUDE_CODE_DISABLE_ADVISOR_TOOL=1, y la opción --advisor no aparece en claude --help aunque existe. Tampoco hay forma de fijar cuántas veces consulta: se le puede pedir en el propio encargo y poco más.

La prueba fue un proyecto mínimo en Python con un fallo en el cálculo del IVA. Se pidió a Sonnet que mapeara el repositorio, localizara los usos de la función, consultara al asesor, arreglara el fallo con un test nuevo y pasara un auditor antes de terminar. El asesor se consultó tres veces: dos desde la sesión principal, antes del enfoque y antes del cierre, y una desde dentro de un subagente Haiku, que también tiene acceso a él. Según el informe de uso de la propia sesión, la tarea costó 1,14 dólares a precio de lista: 0,74 el asesor en Opus, 0,38 Sonnet y 0,02 los subagentes Haiku. Y lo que aconsejó no se puede leer, porque en el registro de la sesión llega cifrado.

Con eso a la vista, yo no lo dejaría encendido por defecto. Compensa en tareas donde equivocarse de enfoque cuesta más que la consulta, como una migración o un cambio que toca muchos ficheros. Para lo demás está el alias opusplan, que usa Opus solo en el modo plan y pasa a Sonnet para escribir el código, sin una tercera voz en cada paso.

Los subagentes Haiku, lo más barato del montaje

Cada subagente es un fichero Markdown en .claude/agents/ con una cabecera. El que mapeaba el repositorio en la prueba era así:

---
name: mapa
description: Usar al empezar una tarea para mapear el repositorio. Solo lee.
tools: Read, Grep, Glob
model: haiku
---
Recorre el repositorio y devuelve un mapa breve de módulos y tests.

Sonnet los lanzó en segundo plano mientras seguía, y el que localizaba usos encontró los ocho usos de la función en cuatro ficheros. Todo lo que hicieron los subagentes Haiku en la tarea costó dos céntimos. La descripción es lo que Claude lee para decidir cuándo usar cada uno, así que conviene escribirla con el «usar cuando» claro. Un detalle de la documentación: el subagente de exploración que trae Claude Code usa el modelo de la sesión principal, no Haiku, y para abaratarlo hay que crear uno propio que se llame Explore con model: haiku.

El auditor en su worktree solo ve lo que está en un commit

Con isolation: worktree, el subagente trabaja en una copia del repositorio en .claude/worktrees/ que Claude Code borra al acabar si no tiene cambios. Esa copia sale de la rama principal, o del commit actual si en los ajustes pones "worktree": { "baseRef": "head" }, pero en ningún caso lleva lo que no se ha guardado en un commit. En la primera ronda el auditor revisó el código viejo y no pudo verificar el arreglo. La salida es hacer el commit en una rama antes de llamarlo, y en la segunda ronda, así, revisó el cambio correcto.

Tampoco pudo ejecutar los tests, y la causa estaba en otra parte. La regla que los permitía estaba en .claude/settings.json, y la sesión se lanzó con claude -p en una carpeta en la que nunca se había confirmado la confianza. La página de permisos lo dice: en esa situación las reglas permissions.allow del proyecto no se usan. El aviso salió literal en la consola: «Ignoring 4 permissions.allow entries from .claude/settings.json: this workspace has not been trusted». Se arregla abriendo Claude Code una vez en esa carpeta y aceptando el diálogo de confianza.

Ver quién trabaja con una línea de estado

La barra de la infografía, con los subagentes en marcha y el asesor «de guardia», no viene de serie. Se puede hacer con un mod, que es un plugin de Claude Code con hooks escritos en TypeScript. Este cuenta las consultas al asesor, que aparecen en cada paso como una llamada de servidor llamada advisor, y lleva la lista de subagentes que arrancan y terminan:

on('turn.step', async function* ($, e, next) {
  const paso = yield* next(e)
  consultas += (paso.serverToolUses ?? []).filter(u => u.name === 'advisor').length
  if (e.agentId === undefined) principal = corto(e.model)
  $.ui.status(texto())
  return paso
})

on('agent.spawn', async ($, e, next) => {
  const arranque = await next(e)
  if (arranque.agentId) enMarcha.set(arranque.agentId, { tipo: e.subagentType, modelo: corto(arranque.model) })
  $.ui.status(texto())
  return arranque
})

Con un tercer hook que saca de la lista al subagente cuando termina su turno, la línea queda como «principal sonnet-5-5 · advisor 2 consultas (1 desde subagentes) · subagentes 1 (mapa haiku-5-5)». El mod pasa claude plugin validate y su test con claude plugin test, que simula los eventos sin abrir la interfaz, y se carga con claude --plugin-dir y la carpeta del mod. Las consultas de los subagentes van aparte porque en la prueba una de las tres vino de un Haiku, y se paga igual que las demás.

Y la capa Jev

Si quieres algo parecido a lo de la imagen, en GitHub hay plugins para Claude Code que usan Jev para puntuar el riesgo de cada herramienta antes de ejecutarla (jev-guard), recortar salidas largas o sustituir el resumen de compactación (fast-jev-compaction). Funcionan mandando a TypeSafe lo que lee tu sesión, que es tu código, y Jev se presentó en septiembre en acceso anticipado. Para un repositorio de cliente, yo pediría antes su política de datos por escrito.

# sigue leyendo

Comentarios

Deja un comentario

Tu correo no se publica.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.