Fan-out é um orquestrador soltando N trabalhadores sobre itens independentes e juntando só o que importa. Funciona quando cada item cabe num pedido claro, tem teto e devolve uma linha conferível. Nesta aula você roda um fan-out em shell com agente falso, vê o tempo cair e refaz só o item reprovado.
2O pedido de delegação: objetivo, formato, fontes e fronteiras
3Teto por trabalhador e retorno em arquivo
4Consolidar pela última linha e refazer só o reprovado
Objetivo: rodar um fan-out com N trabalhadores, teto por item e consolidação curta, refazendo só o item reprovado.
01 · Um fan-out com controle
O orquestrador planeja e junta; os trabalhadores só fazem a sua parte. Clique em cada etapa.
Reprovado? Volta só ele para a lista; os aprovados não são refeitos
Clique em cada bloco do diagrama para ver o que ele faz.
Fan-out de 500 arquivos mecânicos não pede modelo nenhum: é script. Agente entra quando cada item exige julgamento.
02 · As formas de fan-out hoje
Pela doc do Claude Code (Run agents in parallel, lida em 19/10/2026) e pelo Codex CLI 0.163.0.
1. Subagentes
Peça vários subagentes na mesma mensagem. Os resultados voltam para a conversa que os criou.
Para um lote grande e repetível, a doc aponta dynamic workflows (um script que roda muitos subagentes e confronta resultados) e o /batch, que divide uma mudança grande em 5 a 30 subagentes, cada um no seu worktree.
2. Sessões
claude --bg solta uma sessão em segundo plano; claude agents mostra todas numa tela. Antes de editar, a sessão de fundo entra num worktree próprio em .claude/worktrees/.
Cada sessão gasta a sua cota. Junte os resultados por arquivo, numa sessão chefe ou num script.
3. Agent teams
Desligado por padrão (CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1). Um líder e colegas com lista de tarefas e mensagens entre si. Um time por sessão, sem time aninhado, e /resume não restaura colegas em processo.
Colegas não ganham worktree: dois editando o mesmo arquivo sobrescrevem. Divida os arquivos por dono.
4. Shell
Fora da sessão, um xargs -P com claude -p ou codex exec por item. É o que você controla melhor: teto, arquivo de saída, retomada.
É a forma do ensaio abaixo, porque dá para trocar o agente por um script falso.
03 · Fan-out em shell, com ensaio
O AGENTE é qualquer comando que lê o pedido no stdin. Para o ensaio, um script que dorme 2 s e responde.
fanout.sh · salve em ~/treino-multi/
#!/usr/bin/env bash
# fanout.sh — um trabalhador por linha da lista, N ao mesmo tempo, retorno curto em arquivo.
# Uso: fanout.sh <lista.txt> <pasta-saida> [N]
# AGENTE = comando que lê o pedido no stdin (padrão: claude -p). Para ensaio: um script falso.
# TETO = segundos por trabalhador (padrão 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 # só o reprovado volta
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"' _ {}
# o orquestrador junta só as últimas linhas: é isso que volta para o contexto dele
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 · ensaio sem cota (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 # um por vez
rm -rf $E/saida
time AGENTE=$E/agente-falso.sh ./fanout.sh $E/lista.txt $E/saida 3 # três ao mesmo tempo
AGENTE=$E/agente-falso.sh ./fanout.sh $E/lista.txt $E/saida 3 # de novo: não refaz
cat $E/consolidado.txt
Terminal · real, com 2 ou 3 itens do seu projeto
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
Exemplo do repositório
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
Cortes: as linhas user/sys do time. O tempo caiu de 10 s para 4 s porque o agente falso só dorme: é a forma do ganho, não a medida de um agente de verdade. Na terceira rodada, só o reprovado rodou de novo.
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
Dois claude -p em paralelo, 48 s no total, no projeto de treino. O texto de cada resumo ficou em real/saida/; ao orquestrador chegaram duas linhas.
Com TETO=1, nenhum trabalhador termina: o timeout corta todos com código 124 e o resultado vai para .erro, não para .md.
Teto é obrigatório, mas calibrado: rode um item real sozinho, meça e dê folga. Sem teto, um trabalhador travado segura o lote inteiro.
04 · O pedido de delegação
Quando o fan-out é dentro da sessão, o orquestrador é você pedindo. Os quatro campos vêm do post da Anthropic.
Prompt · fan-out com subagentes numa sessão
Divida em subagentes, um por item da lista abaixo, todos na mesma mensagem.
Para cada subagente, escreva:
- Objetivo: <o que este item precisa responder>
- Formato de saída: no máximo 5 linhas; última linha OK ou FALHA: <motivo>; grave em saida/<item>.md
- Fontes e ferramentas: <arquivos ou pastas que pode ler>; não edite nada fora de saida/
- Fronteira: não trate dos outros itens; se depender de outro item, pare e diga qual
Depois, leia só a última linha de cada arquivo e me dê a tabela item → OK/FALHA.
Itens:
<item 1>
<item 2>
<item 3>
05 · Prática
Ensaio primeiro; depois dois itens reais.
E5 · Fan-out com agente falso
10 min
Salve o fanout.sh e rode o ensaio inteiro.
Pronto quando: a rodada com N=1 leva cerca de 10 s e a com N=3 cerca de 4 s; as duas imprimem OK: 4 · FALHA: 1; a terceira imprime quatro linhas pula … (aprovado) e uma feito resumir-docs-quebrado-md.
E6 · Dois itens reais
10 min
Rode o bloco real (ele usa claude -p, pela sua assinatura). Se um item sair FALHA, leia só o arquivo dele e rode o fanout.sh de novo.
Pronto quando:cat real/consolidado.txt mostra 2 linhas, cada uma terminando em OK ou FALHA: …, e ls real/saida/*.erro não acha nada.
06 · Teste da aula
Pergunta 1 de 4
Por que o orquestrador lê só a última linha de cada resultado?competência
Correto
É o mesmo princípio do subagente: o detalhe fica fora. Quando precisa, o orquestrador abre só o arquivo do item reprovado.
Não é essa
É o mesmo princípio do subagente: o detalhe fica fora. Quando precisa, o orquestrador abre só o arquivo do item reprovado.Rever: Um fan-out com controle
Pergunta 2 de 4
O que faltava no pedido que fez três subagentes da Anthropic repetirem a mesma busca?competência
Correto
Com pedido vago, cada subagente interpretou do seu jeito e o trabalho se repetiu. Os quatro campos dividem o trabalho.
Não é essa
Com pedido vago, cada subagente interpretou do seu jeito e o trabalho se repetiu. Os quatro campos dividem o trabalho.Rever: Fan-out em shell, com ensaio
Pergunta 3 de 4
Na segunda rodada do fanout.sh, quem roda de novo?
Correto
Aprovado não é reprocessado. FALHA e .erro voltam; é a regra "só o reprovado volta" do kit da aula 1.
Dois colegas de um agent team precisam mexer no mesmo arquivo. O que a doc recomenda?
Correto
Agent teams não dão worktree a cada colega: editar o mesmo arquivo sobrescreve. Partição por dono, ou isolamento (aula 5).
Não é essa
Agent teams não dão worktree a cada colega: editar o mesmo arquivo sobrescreve. Partição por dono, ou isolamento (aula 5).Rever: As formas de fan-out hoje
Teste concluído
Você acertou {a} de {n}. Acertando todas, a aula é marcada como concluída.
Escolha uma alternativa. A explicação aparece depois da sua tentativa.
07 · Em três frases
Itens congeladosSó entra no fan-out o que não depende de outro item; o resto vai antes ou depois.
Teto e arquivoCada trabalhador com timeout, resultado gravado e última linha OK ou FALHA.
Só o reprovado voltaO orquestrador lê as últimas linhas e reroda só o que falhou.