Tienes un feature que necesita tres cosas al mismo tiempo. Puedes lanzar subagentes dentro de una sola sesion de Claude Code y dejarlos trabajar en paralelo. O puedes dividir el trabajo en tres tareas independientes, entregar cada una a un agente separado en su propio panel tmux, y dejarlos correr sin saber nada uno del otro.
Ambos enfoques paralelizan trabajo. Resuelven problemas distintos. Elige el incorrecto y terminaras quemando ventana de contexto en overhead de coordinacion o creando conflictos de merge que toman mas tiempo en resolver que la tarea original.
Este es el framework de decision que uso cada dia mientras corro 13 agentes Claude Code en la misma codebase. No es teorico. Es el resultado de haberme equivocado suficientes veces como para saber donde esta el limite.
Dos tipos de paralelismo
Claude Code soporta dos formas distintas de ejecutar trabajo concurrentemente.
Los subagentes son procesos hijos que se lanzan dentro de una sola sesion de Claude Code. El agente padre inicia multiples subagentes, cada uno aborda una parte del problema, y luego recolecta los resultados. Comparten el mismo directorio de trabajo y el contexto del padre. Piensa en ellos como threads en un solo proceso.
Parent agent
├── Subagent A: "Search lib/ for all usages of parseConfig"
├── Subagent B: "Search server/ for all usages of parseConfig"
└── Subagent C: "Search components/ for all usages of parseConfig"
Los agentes separados corren en sesiones independientes de Claude Code, tipicamente en paneles tmux separados. Cada uno tiene su propia ventana de contexto, su propio archivo de identidad CLAUDE.md y su propia vista de la codebase. No comparten memoria. Se comunican a traves de artefactos: comentarios en tareas, actualizaciones de estado, codigo commiteado. Piensa en ellos como procesos separados sin estado compartido.
tmux pane 1: eng1 agent → "Build the REST endpoint"
tmux pane 2: eng2 agent → "Build the React component"
tmux pane 3: qa1 agent → "Write integration tests for both"
El modelo mental importa porque determina como fluye el trabajo entre unidades. Los subagentes pueden pasar datos al padre de forma economica. Los agentes separados pasan datos a traves del sistema de archivos, git o un task tracker externo.
Cuando ganan los subagentes
Usa subagentes cuando el trabajo comparte estado y los resultados necesitan converger.
Investigacion en paralelo. Necesitas buscar un patron en cinco directorios, leer tres archivos de documentacion y sintetizar los hallazgos en una recomendacion. Los subagentes pueden tomar cada uno una ruta de busqueda, devolver resultados, y el padre puede combinarlos sin overhead de serializacion.
Transformaciones independientes sobre los mismos datos. Estas refactorizando un modulo y necesitas actualizar las definiciones de tipos, los tests y la documentacion en un cambio coherente. Cada subagente se encarga de un archivo, pero el padre asegura que los cambios sean consistentes porque ve los tres resultados antes de commitear.
Exploracion rapida. Estas debuggeando y necesitas revisar el git log, la salida de tests y la configuracion de runtime simultaneamente. Los subagentes pueden recopilar los tres en paralelo y el padre sintetiza un diagnostico.
El patron: distribuir, recopilar, actuar sobre el resultado combinado. Si tu paralelismo termina con el padre necesitando razonar sobre todos los outputs juntos, los subagentes son la herramienta correcta.
En que fallan los subagentes: cualquier cosa que tome mas de unos minutos por rama, cualquier cosa que modifique archivos en rutas superpuestas, o cualquier cosa que necesite verificacion independiente. Los subagentes comparten un directorio de trabajo, asi que dos subagentes escribiendo en el mismo archivo corromperan el trabajo del otro. Y como comparten contexto, un subagente de larga duracion consume la ventana disponible del padre.
Cuando ganan los agentes separados
Usa agentes separados cuando el trabajo puede verificarse de forma independiente y no necesita un contexto compartido para tener sentido.
Diferentes componentes del mismo feature. "Construye el endpoint de API" y "Construye el frontend que lo llama" son independientes hasta la integracion. El ingeniero de API no necesita el componente React en su contexto. El ingeniero de frontend no necesita el esquema de base de datos. Darle a cada uno su propio agente con un CLAUDE.md acotado mantiene el contexto limpio y evita que la complejidad de un agente contamine el trabajo del otro.
Diferentes criterios de aceptacion. Si la tarea A esta terminada cuando el endpoint devuelve 200 con la forma JSON correcta, y la tarea B esta terminada cuando el componente renderiza los datos con estados de error adecuados, esos son objetivos de verificacion separados. Un agente QA puede validar cada uno independientemente. Los subagentes no pueden verificarse independientemente porque producen un output combinado.
Trabajo que toca diferentes partes de la codebase. File ownership es la forma mas simple de prevenir conflictos de merge. El agente A es dueno de server/, el agente B es dueno de components/. Ninguno entra en territorio del otro. Si intentas esto con subagentes, el padre tendria que gestionar file locking, lo cual anula el proposito del paralelismo.
Tareas con diferentes horizontes de tiempo. Una tarea toma 10 minutos, la otra 2 horas. Con subagentes, el padre espera al hijo mas lento. Con agentes separados, la tarea corta se completa, se verifica y se shipea mientras la tarea larga sigue corriendo.
El patron: lanzar, olvidar, verificar por separado. Si cada pieza de trabajo se sostiene sola y puede verificarse sola, los agentes separados con tareas estructuradas son mas limpios.
El problema del handoff
El verdadero punto de decision se reduce a los handoffs.
Los handoffs de subagentes son economicos. El hijo devuelve datos al padre en el mismo contexto. Sin serializacion, sin escrituras a archivos, sin esperar actualizaciones de estado. El padre lanza tres subagentes, devuelven tres resultados, el padre tiene todo lo que necesita.
Los handoffs entre agentes separados son costosos pero durables. El agente A completa trabajo, commitea codigo, actualiza un estado de tarea y comenta lo que hizo. El agente B recoge esa senal (ya sea a traves de un coordinador o haciendo polling del task tracker) y comienza su trabajo dependiente. El overhead es real: necesitas un sistema de tareas, un protocolo de estados y alguna forma para que los agentes descubran lo que otros agentes han hecho.
La regla general: si el trabajo requiere mas de un handoff entre las unidades paralelas, usa subagentes. Si es un solo fan-out-and-gather, los subagentes son mas simples. Si el output del agente A es el input del agente B, que se convierte en el input del agente C, el costo de coordinacion de agentes separados esta justificado porque cada handoff produce un artefacto verificado y commiteado que no se perdera si un agente crashea o alcanza un limite de contexto.
Un ejemplo concreto. Necesitas:
- Encontrar todos los endpoints de API que devuelven datos de usuario
- Agregar rate limiting a cada uno
- Escribir tests para los nuevos rate limits
- Actualizar la documentacion de la API
Los pasos 1 y 2 estan fuertemente acoplados. Los resultados de busqueda (paso 1) alimentan directamente la modificacion (paso 2). Un subagente maneja la busqueda; el padre aplica los cambios. Eso es un patron de subagente.
Los pasos 3 y 4 son independientes entre si pero dependen del paso 2. Los tests necesitan el codigo real del endpoint. Los docs necesitan la forma final de la API. Estas son tareas separadas para agentes separados, cada una con sus propios criterios de aceptacion, cada una verificable por si misma.
