Fan-out es un orquestador soltando N trabajadores sobre ítems independientes y juntando solo lo que importa. Funciona cuando cada ítem cabe en un pedido claro, tiene tope y devuelve una línea verificable. En esta lección ejecutas un fan-out en shell con agente falso, ves cómo baja el tiempo y rehaces solo el ítem reprobado.
1Las formas de fan-out en Claude Code y en el shell
2El pedido de delegación: objetivo, formato, fuentes y fronteras
3Tope por trabajador y retorno en archivo
4Consolidar por la última línea y rehacer solo el reprobado
Objetivo: ejecutar un fan-out con N trabajadores, tope por ítem y consolidación corta, rehaciendo solo el ítem reprobado.
01 · Un fan-out con control
El orquestador planifica y junta; los trabajadores solo hacen su parte. Haz clic en cada etapa.
¿Reprobado? Vuelve solo él a la lista; los aprobados no se rehacen
Haz clic en cada bloque del diagrama para ver qué hace.
Un fan-out de 500 archivos mecánicos no pide ningún modelo: es un script. El agente entra cuando cada ítem exige criterio.
02 · Las formas de fan-out hoy
Según la doc de Claude Code (Run agents in parallel, leída el 19/10/2026) y Codex CLI 0.163.0.
1. Subagentes
Pide varios subagentes en el mismo mensaje. Los resultados vuelven a la conversación que los creó.
Para un lote grande y repetible, la doc apunta a dynamic workflows (un script que corre muchos subagentes y contrasta resultados) y a /batch, que divide un cambio grande en 5 a 30 subagentes, cada uno en su worktree.
2. Sesiones
claude --bg suelta una sesión en segundo plano; claude agents muestra todas en una pantalla. Antes de editar, la sesión de fondo entra en un worktree propio en .claude/worktrees/.
Cada sesión gasta su cuota. Junta los resultados por archivo, en una sesión jefe o en un script.
3. Agent teams
Desactivado por defecto (CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1). Un líder y compañeros con lista de tareas y mensajes entre sí. Un equipo por sesión, sin equipo anidado, y /resume no restaura compañeros en proceso.
Los compañeros no reciben worktree: si dos editan el mismo archivo, se sobrescriben. Divide los archivos por dueño.
4. Shell
Fuera de la sesión, un xargs -P con claude -p o codex exec por ítem. Es lo que mejor controlas: tope, archivo de salida, reanudación.
Es la forma del ensayo de abajo, porque permite cambiar el agente por un script falso.
03 · Fan-out en shell, con ensayo
El AGENTE es cualquier comando que lee el pedido por stdin. Para el ensayo, un script que duerme 2 s y responde.
fanout.sh · guárdalo en ~/treino-multi/
#!/usr/bin/env bash
# fanout.sh — un trabajador por línea de la lista, N al mismo tiempo, retorno corto en archivo.
# Uso: fanout.sh <lista.txt> <pasta-saida> [N]
# AGENTE = comando que lee el pedido en stdin (por defecto: claude -p). Para ensayo: un script falso.
# TETO = segundos por trabajador (por defecto 600)
set -u
LISTA="${1:?uso: fanout.sh <lista.txt> <pasta-saida> [N]}"; OUT="${2:?pasta de saída}"; N="${3:-3}"
export OUT AGENTE="${AGENTE:-claude -p}" TETO="${TETO:-600}"
mkdir -p "$OUT"
trabalho() {
item="$1"; nome=$(printf '%s' "$item" | tr -cs 'a-zA-Z0-9' '-' | cut -c1-40)
if [ -s "$OUT/$nome.md" ] && [ "$(tail -1 "$OUT/$nome.md")" = OK ]; then
echo "pula $nome (aprovado)"; return 0 # solo el reprobado vuelve
fi
printf 'Tarefa: %s\nResponda em no máximo 5 linhas. Última linha: OK, ou FALHA: <motivo>.\n' "$item" \
| timeout "$TETO" $AGENTE > "$OUT/$nome.tmp" 2>&1
rc=$?
if [ $rc -eq 0 ]; then mv "$OUT/$nome.tmp" "$OUT/$nome.md"; echo "feito $nome"
else mv "$OUT/$nome.tmp" "$OUT/$nome.erro"; echo "erro $nome (rc=$rc)"; fi
}
export -f trabalho
grep -v '^[[:space:]]*$' "$LISTA" | xargs -d '\n' -P "$N" -I{} bash -c 'trabalho "$1"' _ {}
# el orquestador junta solo las últimas líneas: eso es lo que vuelve a su contexto
for f in "$OUT"/*.md; do [ -e "$f" ] && printf '%s: %s\n' "$(basename "$f" .md)" "$(tail -1 "$f")"; done > "$OUT/../consolidado.txt"
echo "itens: $(grep -cv '^[[:space:]]*$' "$LISTA") · feitos: $(ls "$OUT"/*.md 2>/dev/null | wc -l) · com erro: $(ls "$OUT"/*.erro 2>/dev/null | wc -l) · OK: $(grep -c ': OK$' "$OUT/../consolidado.txt") · FALHA: $(grep -c ': FALHA' "$OUT/../consolidado.txt")"
Terminal · ensayo sin cuota (agente falso)
cd ~/treino-multi && chmod +x fanout.sh
E=${TMPDIR:-/tmp}/ensaio-multi/fanout; rm -rf $E && mkdir -p $E
cat > $E/agente-falso.sh <<'SH'
#!/usr/bin/env bash
pedido=$(cat); sleep 2
case "$pedido" in
*quebrado*) printf 'não consegui ler o arquivo\nFALHA: arquivo quebrado\n' ;;
*) printf 'resumo de uma linha\nOK\n' ;;
esac
SH
chmod +x $E/agente-falso.sh
printf 'resumir docs/a.md\nresumir docs/b.md\nresumir docs/quebrado.md\nresumir docs/c.md\nresumir docs/d.md\n' > $E/lista.txt
time AGENTE=$E/agente-falso.sh ./fanout.sh $E/lista.txt $E/saida 1 # uno a la vez
rm -rf $E/saida
time AGENTE=$E/agente-falso.sh ./fanout.sh $E/lista.txt $E/saida 3 # tres al mismo tiempo
AGENTE=$E/agente-falso.sh ./fanout.sh $E/lista.txt $E/saida 3 # otra vez: no rehace
cat $E/consolidado.txt
Terminal · real, con 2 o 3 ítems de tu proyecto
cd ~/treino-multi
printf 'Resuma runtime/POLITICA.md em 3 linhas\nResuma runtime/ROTEAMENTO.md em 3 linhas\n' > lista-real.txt
./fanout.sh lista-real.txt real/saida 2 < /dev/null
cat real/consolidado.txt
Ejemplo del repositorio
feito resumir-docs-a-md
feito resumir-docs-b-md
feito resumir-docs-quebrado-md
feito resumir-docs-c-md
feito resumir-docs-d-md
itens: 5 · feitos: 5 · com erro: 0 · OK: 4 · FALHA: 1
real 0m10.094s
(…)
feito resumir-docs-a-md
feito resumir-docs-b-md
feito resumir-docs-quebrado-md
feito resumir-docs-d-md
feito resumir-docs-c-md
itens: 5 · feitos: 5 · com erro: 0 · OK: 4 · FALHA: 1
real 0m4.054s
(…)
pula resumir-docs-b-md (aprovado)
pula resumir-docs-a-md (aprovado)
pula resumir-docs-c-md (aprovado)
pula resumir-docs-d-md (aprovado)
feito resumir-docs-quebrado-md
itens: 5 · feitos: 5 · com erro: 0 · OK: 4 · FALHA: 1
resumir-docs-a-md: OK
resumir-docs-b-md: OK
resumir-docs-c-md: OK
resumir-docs-d-md: OK
resumir-docs-quebrado-md: FALHA: arquivo quebrado
Recortes: las líneas user/sys del time. El tiempo bajó de 10 s a 4 s porque el agente falso solo duerme: es la forma de la ganancia, no la medida de un agente de verdad. En la tercera ronda, solo el reprobado corrió de nuevo.
feito Resuma-runtime-ROTEAMENTO-md-em-3-linhas
feito Resuma-runtime-POLITICA-md-em-3-linhas
itens: 2 · feitos: 2 · com erro: 0 · OK: 2 · FALHA: 0
(…)
Resuma-runtime-POLITICA-md-em-3-linhas: OK
Resuma-runtime-ROTEAMENTO-md-em-3-linhas: OK
Dos claude -p en paralelo, 48 s en total, en el proyecto de entrenamiento. El texto de cada resumen quedó en real/saida/; al orquestador le llegaron dos líneas.
Con TETO=1, ningún trabajador termina: el timeout corta a todos con código 124 y el resultado va a .erro, no a .md.
El tope es obligatorio, pero calibrado: corre un ítem real solo, mide y deja margen. Sin tope, un trabajador trabado retiene el lote entero.
04 · El pedido de delegación
Cuando el fan-out es dentro de la sesión, el orquestador eres tú pidiendo. Los cuatro campos vienen del post de Anthropic.
Prompt · fan-out con subagentes en una sesión
Divide en subagentes, uno por ítem de la lista de abajo, todos en el mismo mensaje.
Para cada subagente, escribe:
- Objetivo: <lo que este ítem necesita responder>
- Formato de salida: máximo 5 líneas; última línea OK o FALHA: <motivo>; grábalo en saida/<item>.md
- Fuentes y herramientas: <archivos o carpetas que puede leer>; no edites nada fuera de saida/
- Frontera: no trates los otros ítems; si depende de otro ítem, detente y di cuál
Después, lee solo la última línea de cada archivo y dame la tabla ítem → OK/FALHA.
Ítems:
<ítem 1>
<ítem 2>
<ítem 3>
05 · Práctica
Primero el ensayo; después dos ítems reales.
E5 · Fan-out con agente falso
10 min
Guarda el fanout.sh y corre el ensayo completo.
Listo cuando: la ronda con N=1 tarda cerca de 10 s y la de N=3 cerca de 4 s; las dos imprimen OK: 4 · FALHA: 1; la tercera imprime cuatro líneas pula … (aprovado) y una feito resumir-docs-quebrado-md.
E6 · Dos ítems reales
10 min
Corre el bloque real (usa claude -p, con tu suscripción). Si un ítem sale FALHA, lee solo su archivo y corre el fanout.sh de nuevo.
Listo cuando:cat real/consolidado.txt muestra 2 líneas, cada una terminando en OK o FALHA: …, y ls real/saida/*.erro no encuentra nada.
06 · Prueba de la clase
Pregunta 1 de 4
¿Por qué el orquestador lee solo la última línea de cada resultado?competencia
Correcto
Es el mismo principio del subagente: el detalle queda afuera. Cuando lo necesita, el orquestador abre solo el archivo del ítem reprobado.
No es esa
Es el mismo principio del subagente: el detalle queda afuera. Cuando lo necesita, el orquestador abre solo el archivo del ítem reprobado.Repasar: Un fan-out con control
Pregunta 2 de 4
¿Qué faltaba en el pedido que hizo que tres subagentes de Anthropic repitieran la misma búsqueda?competencia
Correcto
Con un pedido vago, cada subagente interpretó a su manera y el trabajo se repitió. Los cuatro campos dividen el trabajo.
No es esa
Con un pedido vago, cada subagente interpretó a su manera y el trabajo se repitió. Los cuatro campos dividen el trabajo.Repasar: Fan-out en shell, con ensayo
Pregunta 3 de 4
En la segunda ronda de fanout.sh, ¿quién se ejecuta de nuevo?
Correcto
Lo aprobado no se reprocesa. FALHA y .erro vuelven; es la regla "solo el reprobado vuelve" del kit de la clase 1.
No es esa
Lo aprobado no se reprocesa. FALHA y .erro vuelven; es la regla "solo el reprobado vuelve" del kit de la clase 1.Repasar: Fan-out en shell, con ensayo
Pregunta 4 de 4
Dos compañeros de un agent team necesitan modificar el mismo archivo. ¿Qué recomienda la doc?
Correcto
Los agent teams no le dan un worktree a cada compañero: editar el mismo archivo sobrescribe. Partición por dueño, o aislamiento (clase 5).
No es esa
Los agent teams no le dan un worktree a cada compañero: editar el mismo archivo sobrescribe. Partición por dueño, o aislamiento (clase 5).Repasar: Las formas de fan-out hoy
Prueba completada
Acertaste {a} de {n}. Si aciertas todas, la clase se marca como completada.
Elige una alternativa. La explicación aparece después de tu intento.
07 · En tres frases
Ítems congeladosSolo entra en el fan-out lo que no depende de otro ítem; el resto va antes o después.
Tope y archivoCada trabajador con timeout, resultado guardado y última línea OK o FALHA.
Solo el reprobado vuelveEl orquestador lee las últimas líneas y vuelve a ejecutar solo lo que falló.