Como acompanhar uma orquestração de agentes que roda por horas sem ficar de babá?

Orquestração de agentes que roda por horas não precisa de babá, precisa de três coisas: rastro durante, sinal de vida verificável e aviso no fim. No Claude Code dá pra montar isso com o que já existe: mandar a sessão pro fundo com /bg (ou claude --bg --name direto pelo shell), acompanhar pelo agent view, ler os transcripts JSONL em ~/.claude/projects, ligar os hooks Stop, SubagentStop e Notification no settings.json e receber push no celular pelo Remote Control. E lembrar de uma coisa: arquivo salvo é fotografia do último evento gravado, não batimento cardíaco 🙂
Fala aí, beleza? Você dispara uma orquestração que vai levar horas, olha o relógio, olha o terminal, e percebe que acabou de virar vigia noturno da própria máquina
O problema não é a run demorar
O problema é que execução longa não precisa de vigia, precisa de três coisas em ordem: rastro durante o processo, sinal de vida que dá pra verificar e aviso no fim que chega até você, sem você ir buscar
Aqui a gente monta esse acompanhamento dentro do Claude Code usando só o que já existe na ferramenta: sessão em segundo plano, transcripts em disco, hooks, monitores, tarefas agendadas e push no celular
Bora ver na prática?
O que você precisa antes de começar
Lista curta, tudo verificável antes de você disparar qualquer coisa:
- Claude Code atualizado: workflows dinâmicos exigem a versão
v2.1.154ou posterior, e estão disponíveis em todos os planos pagos, com acesso à API da Anthropic, e também no Amazon Bedrock, Google Cloud Agent Platform e Microsoft Foundry - Acesso ao
~/.claude/settings.json, que é onde moram os hooks e a status line (se você usaCLAUDE_CONFIG_DIR, a raiz muda pra onde a variável apontar) - App Claude no celular, iOS ou Android, com a MESMA conta e organização que você usa no terminal, caso queira notificação push
- Agent teams é experimental e vem desligado por padrão, só liga com
CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1no settings.json ou no ambiente
Passo a passo: colocando a orquestração para rodar em segundo plano
- Manda a conversa atual pro fundo com
/bg
O comando (forma completa /background) joga a sessão atual pra uma sessão em segundo plano e libera o teu terminal na hora. Se o Claude estiver no meio de uma resposta, ela continua rodando lá na sessão de fundo
/bg
/bg run the test suite and fix any failures
Repara que ele aceita instrução extra no mesmo comando, então dá pra mandar pro fundo JÁ dizendo o que fazer
Formação Claude Code
Domine Claude Code do absoluto zero até o avançado
- 120 aulas
- 4 projetos
- 9h 45min
O erro comum deste passo: achar que sair do terminal mata tudo. Quando ainda existe trabalho rodando em segundo plano (subagentes, comandos de shell, workflows ou monitores), o Claude Code mostra o diálogo "Background work is running" em vez de encerrar na hora
- Já começa em segundo plano pelo shell, e dá nome
claude --bg "<prompt>"
claude --bg --name "flaky-test-fix" "<prompt>"
O --name define o nome de exibição da sessão no agent view no lugar do nome gerado automaticamente
O erro comum deste passo: disparar três runs longas sem nomear nenhuma, e depois tentar adivinhar qual é qual numa lista de nomes automáticos
Ctrl+Bpra mandar uma execução de Bash específica pro fundo
Não é a sessão inteira, é aquele comando que trava tudo. A saída vai pra arquivo, cada tarefa recebe um ID único e o Claude recupera esse conteúdo depois com a ferramenta Read
Tá no tmux? Aperta duas vezes, por causa da prefix key
O erro comum deste passo: esquecer que tarefa em segundo plano é encerrada se a saída passar de 5GB (ele deixa uma nota no stderr explicando) e que elas são limpas automaticamente quando o Claude Code encerra. Se por algum motivo você não quiser o recurso, CLAUDE_CODE_DISABLE_BACKGROUND_TASKS=1 desativa
- Workflows dinâmicos quando a orquestração é grande de verdade
Aqui muda o jeito de pensar: em vez de o modelo segurar tudo na cabeça, você tem um script JavaScript que orquestra subagentes em escala, executado por um runtime em segundo plano enquanto a sessão continua responsiva
O script guarda o loop, a ramificação e os resultados intermediários, então o contexto do Claude fica só com a resposta final. O progresso você acompanha em /workflows
O erro comum deste passo: tentar isso numa instalação antiga. Confere a versão, porque abaixo da v2.1.154 o recurso não existe
O que registrar durante o processo (para não depender da tela)
A regra é simples: se o único lugar onde a informação existe é a tela que você está olhando, você virou o log da operação
- Os transcripts já estão em disco, no formato JSONL
Uma linha por evento, cada linha é um objeto JSON de mensagem, chamada de ferramenta ou resultado:
~/.claude/projects/<encoded-cwd>/<session-id>.jsonl
E o encoded-cwd? É o diretório absoluto com todo caractere não alfanumérico trocado por hífen, então /Users/me/proj vira -Users-me-proj
Cada subagente tem transcript próprio, em arquivo separado:
~/.claude/projects/{project}/{sessionId}/subagents/agent-{agentId}.jsonl
Se você usa CLAUDE_CONFIG_DIR, a raiz troca junto
- Sabe qual arquivo ler quando o hook disparar
Nos hooks, transcript_path aponta pro transcript da sessão PRINCIPAL, enquanto agent_transcript_path aponta pro transcript do próprio subagente, aquele que fica na pasta subagents/ aninhada
O erro comum deste passo: logar o caminho errado e depois ficar procurando a etapa do subagente dentro do transcript do agente principal
- Status line personalizada como painel ao vivo
O script recebe um JSON pelo stdin e devolve a linha que você quiser ver. O JSON traz model.display_name, workspace.current_dir, context_window.used_percentage e session_id
#!/bin/bash
input=$(cat)
model=$(echo "$input" | jq -r '.model.display_name')
dir=$(echo "$input" | jq -r '.workspace.current_dir')
ctx=$(echo "$input" | jq -r '.context_window.used_percentage')
echo "$model | $dir | contexto ${ctx}%"
Salva (por exemplo em ~/.claude/statusline.sh), dá permissão e aponta o caminho no ~/.claude/settings.json com type command:
chmod +x ~/.claude/statusline.sh
Tome cuidado com a leitura do número: o used_percentage é calculado só com tokens de ENTRADA (input_tokens + cache_creation_input_tokens + cache_read_input_tokens). O session_id é estável durante a sessão e único por sessão, o que faz dele uma chave ótima pra amarrar log com transcript
- Telemetria por OpenTelemetry pra quem quer histórico de verdade
export CLAUDE_CODE_ENABLE_TELEMETRY=1
export OTEL_METRICS_EXPORTER=otlp
export OTEL_LOGS_EXPORTER=otlp
Os exportadores aceitam opções como otlp, prometheus ou console, e o endpoint OTLP é configurável
E como saber se está exportando mesmo? Procura no teu backend a métrica claude_code.session.count, que é emitida no início de cada sessão com o atributo start_type valendo fresh, resume, continue ou agents_view. Pra logs, procura o evento claude_code.user_prompt
Quer ler consumo? claude_code.token.usage pode ser quebrada por type (input/output), usuário, time, modelo, skill.name, plugin.name ou agent.name
O erro comum deste passo: ligar registro só no fim da run. Aí quando ela quebra no meio, você não tem NADA pra reconstituir o que aconteceu
Por que estado salvo não prova que o processo ainda está vivo
Essa é a parte que mais engana gente experiente, então vamos por partes
O sintoma:
O transcript tem linhas, o workflow mostra uma etapa "em curso", a sessão aparece bonitinha na lista
E nada avança há uma hora
A causa:
Arquivo e registro são fotografia do último evento gravado, não batimento cardíaco
Se o processo morreu, ele morreu sem escrever mais nada. O último estado salvo continua lá, intacto, dizendo "em curso" pra sempre. Estado no disco responde "o que aconteceu por último", nunca "está rodando agora"
A solução, com o que a ferramenta já dá:
- Lê o agent view: ele mostra todas as sessões e agrupa por estado, colocando no topo as que precisam de você. "Ready for review" e "Needs input" ficam acima de "Working" e "Completed". A sessão vai pra Ready for review quando tem pull request aberto, e o Completed junta concluídas, falhas e paradas (repara: falha e sucesso moram no mesmo grupo, então "Completed" NÃO quer dizer "deu certo")
Ctrl+Oabre o modo transcript quando você está anexado a uma sessão, uma visão rolável da conversa. É ali que dá pra ver movimento real, não estado congeladoCtrl+Tfixa a sessão no topo e mantém o processo rodando enquanto ela está ociosaCtrl+Sagrupa por diretório, ótimo quando você tem run de três projetos ao mesmo tempoCtrl+Xpara a sessão, eCtrl+Xde novo em até dois segundos apaga. Cuidado com o dedo rápido aí 😅
Como prevenir:
Prefira sinal que CHEGA até você (hook, push, monitor) em vez de sinal que você precisa ir buscar
E tem um detalhe de ambiente que explica muito "sumiço" misterioso: no macOS e no Linux, o Claude Code encerra tarefas em segundo plano quando o sistema operacional sinaliza pressão de memória, desde que a sessão esteja ociosa há pelo menos 30 minutos e nada esteja rodando (nenhum turno, nenhum subagente)
Ou seja, a tua máquina participa da equação. É o mesmo raciocínio de quem quer deixar o n8n rodando 24 horas sem depender do PC ligado: processo longo em máquina pessoal é sempre um acordo, não uma garantia
Como ser avisado quando terminar (ou quando travar pedindo input)
Agora a parte que devolve a tua tarde 😀
- Hook
Stoppara o fim do turno do agente principal
Ele roda quando o agente principal termina de responder, e recebe campos próprios no input: stop_hook_active e last_assistant_message, além dos campos comuns
Esse last_assistant_message é ouro pra notificação: dá pra mandar pro teu canal preferido já com o resumo do que o agente falou por último
- Hook
SubagentStoppra logar etapa por etapa
Dispara quando um subagente termina e devolve o controle ao agente principal. O input inclui hook_event_name valendo SubagentStop, mais agent_id, agent_transcript_path, agent_type e stop_hook_active
Numa orquestração longa esse é o teu registro de progresso REAL: cada subagente que fecha vira uma linha no teu log, com o caminho do transcript dele junto
- Hook
Notificationpro caso que mais trava run de horas
Ele dispara quando o Claude Code está esperando input ou permissão, e é configurado no ~/.claude/settings.json. Com o matcher vazio, ele dispara em todos os tipos de notificação
Pensa na cena clássica: você sai pra almoçar achando que a run está avançando, e ela está parada há 40 minutos esperando você aprovar uma permissão. Esse hook mata exatamente esse desperdício
O erro comum deste passo: escrever um hook que responde ao Stop e reinicia trabalho sem checar o stop_hook_active. Esse campo é verdadeiro quando o Claude Code já está continuando por causa de um stop hook, e existe justamente pra você não entrar em execução indefinida. Checa ele (ou processa o transcript) antes de mandar continuar
- Push no celular com Remote Control
Com o Remote Control ativo, o Claude envia notificação push pro teu celular, tipicamente quando uma tarefa longa termina ou quando ele precisa de uma decisão
O caminho é esse:
– instala o app Claude para iOS ou Android com a mesma conta e organização que você usa no terminal – aceita a permissão de notificação do sistema – roda /config e habilita "Push when Claude decides" e/ou "Push when actions required"
Também dá pra pedir direto no prompt, tipo "notify me when the tests finish"
Caso apareça "No mobile registered" no /config: abre o app no celular pra atualizar o token, é isso mesmo
Vigia automático: monitores, tarefas agendadas e eventos que chegam sozinhos
Aviso é bom, mas às vezes você quer REAÇÃO, não recado
- Ferramenta
Monitor
Ela deixa o Claude observar algo em segundo plano e reagir quando muda, sem pausar a conversa
Na maioria dos casos ele escreve um script pequeno, roda em segundo plano e recebe cada linha de saída conforme ela chega. Se o servidor já empurra eventos, ele pode abrir um WebSocket em vez disso. Encerra quando você pede cancelamento ou quando a sessão termina
Detalhe importante de segurança: o Monitor usa as MESMAS regras de permissão do Bash, então nada de comando mágico passando por fora do teu controle
- Monitores de fundo declarados por plugin
Plugins podem declarar background monitors que o Claude Code inicia sozinho quando o plugin está ativo. Eles observam logs, arquivos ou status externo e avisam o Claude conforme os eventos chegam
A diferença pro item anterior: aqui você não precisa mandar o Claude começar a observar, já sobe junto
- Tarefas agendadas com
/loope as ferramentas de cron
Servem pra repetir um prompt automaticamente em intervalo: monitorar deploy, acompanhar PR, checar build longo
O CronCreate aceita expressão cron de 5 campos (minuto, hora, dia do mês, mês, dia da semana), com curinga , valor único, passo /15, intervalo 1-5 e lista separada por vírgula. O CronList mostra ID, agenda e prompt, e o CronDelete cancela por ID
Agora a ressalva que evita frustração: essas tarefas têm escopo de sessão. Elas vivem na conversa atual e param quando você começa outra. Pra trazer de volta as que não expiraram, retoma com --resume ou --continue
E se você não informar intervalo, o Claude escolhe sozinho um atraso entre um minuto e uma hora a cada iteração
- Channels, quando o evento vem de fora
Channels são um servidor MCP que empurra eventos pra dentro de uma sessão em execução, permitindo que o Claude reaja a coisas que acontecem enquanto você nem está no terminal
Podem ser de mão dupla, ou seja, o Claude lê o evento e responde pelo mesmo canal. Os usos citados na documentação são ponte de chat via Telegram, Discord ou iMessage, e recebimento de webhooks de CI, rastreador de erros ou pipeline de deploy
Só lembrando o estado: research preview, exige autenticação Anthropic via claude.ai ou chave de API do Console, e não está no Amazon Bedrock, Google Cloud Agent Platform nem Microsoft Foundry
Três cenários de execução longa e o arranjo certo para cada um
Não existe arranjo único, existe arranjo que combina com o formato da tua run
| Cenário | O que importa | Arranjo |
|---|---|---|
| Run longa simples | só avisar no fim | claude --bg --name + hook Stop + push do Remote Control |
| Orquestração grande | ver progresso e retomar | workflows dinâmicos + /workflows + hook SubagentStop |
| Depende de evento externo | reagir quando algo muda | Monitor, tarefa agendada com cron ou Channels |
(a) A run que só precisa avisar no fim
Dispara com claude --bg --name "<nome>" "<prompt>", liga o hook Stop e deixa o push do Remote Control ativo
Você fecha a aba mental do assunto e o celular te chama quando acabou. Simples assim
(b) A orquestração com muitas etapas
Aqui o valor não é o aviso final, é ver o progresso e poder retomar
Cada execução de workflow grava o script em arquivo (sob o diretório da sessão em ~/.claude/projects/) e o runtime rastreia o resultado de cada agente, o que torna a run retomável dentro da mesma sessão. Ao retomar, os agentes já concluídos costumam devolver resultado em cache e o restante roda ao vivo
Junta com o hook SubagentStop e você ganha log etapa por etapa, com agent_type e agent_transcript_path de cada um. O acompanhamento visual fica no /workflows
(c) O trabalho que espera evento externo
CI, deploy, rastreador de erro, aquele pipeline que decide o teu dia
Aqui é Monitor (se você quer observar e reagir), tarefa agendada com cron (se é uma checagem repetida) ou Channels (se o sistema lá fora consegue empurrar webhook pra dentro da sessão)
Se a tua orquestração vive fora do terminal, o raciocínio é o mesmo que aparece na orquestração de agentes no n8n: quem dispara, quem observa e quem avisa precisam ser papéis separados
E os agent teams?
É um caminho diferente, vale citar: agent teams coordenam várias instâncias do Claude Code, com uma sessão como líder e teammates que têm contexto próprio e conversam entre si
Eles compartilham uma lista de tarefas, reivindicam trabalho e se comunicam diretamente, o que é bem diferente de subagentes, que só reportam ao agente principal. A exibição pode ser in-process (todos no mesmo terminal) ou split panes (um painel por teammate)
Só não esquece: é experimental e vem desligado por padrão, liga com CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1
Conclusão
Acompanhar orquestração de agentes que roda por horas não é ficar de babá, é montar três camadas na ordem certa: rastro durante o processo, sinal de vida que dá pra verificar e aviso que chega até você
E a lição que mais economiza tempo é aquela do meio do post: estado salvo é fotografia do último evento, nunca prova de processo vivo
Próximo passo pequeno pra fazer hoje: bota a tua próxima tarefa longa em /bg com --name, liga o hook Notification e o hook Stop no settings.json, e confere o agent view uma vez por hora em vez de encarar o terminal
Aí me conta nos comentários qual sinal funcionou melhor no teu fluxo: hook, push ou monitor?
Até o próximo post! 😀
Perguntas frequentes
Como saber que uma orquestração de agentes terminou sem ficar checando o terminal a cada cinco minutos?
Com o Remote Control ativo, o Claude Code manda notificação push pro celular quando a tarefa longa termina ou quando precisa de uma decisão sua. Basta instalar o app Claude (iOS ou Android) com a mesma conta e organização do terminal, aceitar a permissão de notificação e habilitar em /config as opções "Push when Claude decides" e/ou "Push when actions required". Se o /config mostrar "No mobile registered", é só abrir o app no celular pra atualizar o token.
Dá pra evitar que um hook de parada entre em loop infinito numa run que demora horas?
Dá, e é justamente pra isso que existe o campo stop_hook_active no hook Stop. Ele vem verdadeiro quando o Claude Code já está continuando por causa de um stop hook anterior, então o script precisa checar esse valor (ou processar o transcript) antes de disparar mais uma rodada.
É possível o Claude Code checar sozinho, de tempos em tempos, se uma orquestração de agentes longa ainda está saudável?
Sim, com tarefas agendadas via /loop mais as ferramentas de cron. O CronCreate aceita expressão cron de 5 campos (minuto, hora, dia do mês, mês, dia da semana), o CronList mostra ID, agenda e prompt de cada uma, e o CronDelete cancela por ID. Essas tarefas têm escopo de sessão: vivem na conversa atual e param quando você começa outra.
Dá pra acompanhar quantos tokens uma orquestração de agentes está consumindo em tempo real?
Dá, via OpenTelemetry, ativado com CLAUDE_CODE_ENABLE_TELEMETRY=1 mais as variáveis OTEL_METRICS_EXPORTER e OTEL_LOGS_EXPORTER apontando pra um endpoint OTLP. A métrica claude_code.token.usage pode ser quebrada por type (input/output), usuário, time, modelo, skill, plugin ou agent.name, e claude_code.session.count confirma que a instrumentação está viva assim que a sessão começa.
Como monitorar um processo externo (tipo um deploy) enquanto o Claude Code segue trabalhando em outra coisa?
É pra isso que existe a ferramenta Monitor: ela deixa o Claude observar algo em segundo plano e reagir quando muda, sem pausar a conversa. Na maioria dos casos ele escreve um script pequeno, roda em segundo plano e recebe cada linha de saída conforme chega, ou abre um WebSocket se o servidor já empurra eventos. Ela segue as mesmas regras de permissão do Bash e encerra quando você pede cancelamento ou finaliza a sessão.
Várias instâncias do Claude Code conseguem se coordenar numa mesma orquestração de agentes?
Existe o recurso Agent teams, mas ele é experimental e vem desligado por padrão, só liga com CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1 no settings.json ou no ambiente. Ali uma sessão vira líder e os teammates têm contexto próprio, compartilham lista de tarefas e conversam direto entre si, diferente de subagente, que só reporta ao agente principal.
Formações
Formação Vibe Coding
Do Prompt ao Produto: Crie Software Real com IA
- 474 aulas
- 20 projetos
- 39h 27min
Blog | Mais populares
Pipeline vs paralelo na orquestração de agentes: quando usar cada padrão?
Orquestração de agentes define sucesso do seu sistema. Pipeline ou paralelo? Entenda latência, custo e throughput na prática com exemplos reais de 2026.
Quando vale a pena usar vários agentes no Claude Code em vez de um só?
Vários agentes no Claude Code valem a pena? Veja quando dividir tarefas compensa (e quando só atrasa e encarece), com os 4 canais disponíveis na prática.
Vários agentes em paralelo com permissão de escrita: o que pode dar errado?
Agentes em paralelo com permissão de escrita podem sobrescrever trabalho, mexer fora do escopo e criar mudanças que o /rewind não desfaz. Veja como conter.
