π Cace o merge que engole uma fonte
No fan-in β o ponto onde varios ramos paralelos se juntam de volta num so no β existe um modo de falha silencioso: um ramo falha ou volta vazio, e a juncao segue em frente como se estivesse completa. O resultado sai bonito, esta incompleto, e ninguem percebe porque nada gritou.
π Novo aqui? Duas palavras antes de seguir
- Fan-in / merge / juncao: o no onde varios ramos que rodaram em paralelo (fan-out) voltam a se encontrar. E o oposto do fan-out.
- Cardinalidade: quantidade esperada de itens. Se voce despachou 4 ramos, a cardinalidade esperada na juncao e 4. Cardinalidade errada = alguem sumiu no meio do caminho.
O jeito mais comum disso acontecer: voce despacha pesquisa em quatro fontes, uma API cai, o no daquela fonte retorna lista vazia (nao erro β vazia), e o merge escreve o relatorio com tres fontes achando que sao quatro. Ninguem recebeu excecao, ninguem viu log vermelho. O relatorio so esta errado.
O que olhar: a linha vermelha tracejada da fonte C β ela ainda chega na juncao, so que vazia. O no de merge nao tem nenhuma checagem de quantidade, entao ele processa o que recebeu e segue. Nenhum erro sobe. O defeito nao esta na fonte que falhou; esta na juncao que nao perguntou "recebi os quatro que despachei?".
β JunΓ§Γ£o segura
- βConta quantos itens chegaram e compara com quantos foram despachados
- βDecide explicitamente o que fazer com ramo faltando: abortar, seguir marcando lacuna, ou retry
- βRegistra no output "3 de 4 fontes, C indisponivel" quando decide seguir mesmo assim
β JunΓ§Γ£o cega
- βFaz merge de "o que chegou" sem saber quanto era esperado
- βTrata lista vazia igual a lista com dado β os dois "passam" no merge
- βNenhum log, nenhuma metrica registra a lacuna
Conceitos-chave
Onde ramos paralelos se juntam
Recebi os N que despachei?
Vazio nao e erro, mas devia ser
Abortar, marcar ou tentar de novo
βΎοΈ Quebre o roteamento que nao converge
Duas arestas condicionais que se apontam sao a receita mais comum de um grafo travado: o revisor reprova, o escritor reescreve, o revisor reprova de novo β indefinidamente. O grafo "esta rodando" ha horas e o sintoma e exatamente esse: nenhum erro, so consumo.
π‘ O que todo ciclo precisa ter
- β’Teto de voltas β um numero maximo de repeticoes, ponto final, mesmo que ninguem tenha "resolvido" nada
- β’Criterio de progresso β duas voltas sem melhora mensuravel = desiste e avisa, nao continua tentando igual
- β’Sem os dois, a fatura e infinita β voce paga token, tempo e credito ate alguem notar manualmente
O que olhar: a diferenca inteira esta na terceira aresta do lado direito, a ciano, que so existe porque alguem desenhou uma saida de emergencia. Sem ela, o grafo da esquerda so tem duas arestas β e as duas so sabem apontar uma pra outra.
β οΈ Atencao: "converge eventualmente" nao e um plano
Se a sua defesa contra o loop infinito e "o revisor vai aprovar em algum momento", voce nao tem defesa nenhuma. Escreva o numero explicito (ex.: max 3 voltas) E o criterio de progresso (ex.: score de qualidade tem que subir a cada volta) β os dois, nao um so. Teto sem criterio de progresso deixa o grafo gastar as 3 voltas inteiras mesmo quando a segunda ja mostrou que nao vai melhorar.
Conceitos-chave
Numero maximo, sem excecao
2 voltas sem melhora = para
Terceira aresta pra fora do par
Sem teto = sem limite de custo
π° Vede o estado que vaza
Vazamento de estado e quando um no passa adiante mais do que devia, e o contexto limpo do no seguinte deixa de ser limpo. Contexto limpo era exatamente a vantagem que motivou montar o grafo β e esse e o modo de falha que anula essa vantagem, silenciosamente, sem quebrar nada visivel.
O exemplo classico e o revisor. Se o revisor recebe so o texto e o criterio de aprovacao, ele julga com olhos frescos. Se o revisor recebe o raciocinio do escritor junto β "pensei assim, decidi assado" β ele para de julgar o resultado e comeca a validar o processo. Na pratica, ele volta a carimbar o trabalho, porque agora entende (e simpatiza com) o motivo por tras da escolha.
O que olhar: so a aresta mudou de conteudo β nao a estrutura do grafo. Isso e o que torna vazamento de estado dificil de flagrar em revisao de codigo: o diagrama fica identico, so o payload que trafega dentro da aresta engordou. Auditar arestas pelo schema, nao so pelo desenho, e a unica forma confiavel de pegar isso.
π Onde o vazamento costuma entrar sem querer
- Log de debug esquecido no payload β voce deixou o "pensamento em voz alta" do escritor no campo de saida
- Contexto compartilhado por conveniencia β um objeto de sessao unico que todo no le e escreve
- Historico de conversa inteiro β em vez de so o resumo, o proximo no recebe o transcript bruto
- Campos "por via das duvidas" β alguem adiciona um campo extra "pode ser util depois" sem revisar se deveria vazar
Conceitos-chave
Aresta carrega mais do que deveria
A vantagem que o grafo prometia
Revisor contaminado sempre aprova
Diagrama igual, payload diferente
π Escreva o state schema
State schema e a declaracao explicita do que cada aresta carrega: nome dos campos, formato de cada um, o que e obrigatorio, e β tao importante quanto β o que explicitamente nao deve passar. E o contrato entre dois nos. Sem contrato, mudar um lado quebra o outro sem aviso, e ninguem sabe de quem e a culpa.
Campos obrigatorios
O minimo que o no seguinte precisa pra funcionar β sem eles, ele nem deveria comecar.
Ex.: texto e criterio_aprovacao pra um revisor.
Campos proibidos
A parte que a maioria esquece de escrever. Sem isso, "por via das duvidas" vira padrao.
Ex.: raciocinio_do_escritor NAO passa pro revisor β e vazamento de estado do topico 3.
Formato e validacao
Nao basta o nome do campo β precisa dizer o tipo e, se der, validar antes de repassar.
Ex.: score e numero entre 0 e 1, nao string "oitenta por cento".
π‘ Dica pratica
Escreva o state schema ANTES de escrever o prompt de cada no β no papel ou num JSON de exemplo. Se voce nao consegue nomear os campos com clareza, e sinal de que os dois nos ainda estao conceitualmente misturados, e talvez devessem ser um so.
Conceitos-chave
O contrato de cada aresta
Os dois lados precisam existir
Schema define o no, nao o contrario
Contrato claro = quebra rastreavel
πΎ Torne a execucao duravel
Execucao duravel e a capacidade de um grafo sobreviver a uma falha no meio do caminho: retomar exatamente de onde parou, nao refazer um no que ja terminou com sucesso, e ser idempotente β rodar a mesma entrada duas vezes produz o mesmo resultado, sem efeito colateral duplicado.
Isso nao e novidade que o mundo de agentes inventou. E exatamente o que orquestracao de dados resolve ha decadas com execucao duravel e cache por no (pense em ferramentas de pipeline de dados que retomam um job travado sem refazer as etapas que ja completaram). Grafo agentico herda essa solucao pronta β nao precisa reinventar.
β Execucao duravel
- βCada no completo grava resultado + checkpoint antes de seguir
- βRetomar apos falha comeca do proximo no pendente, nao do inicio
- βMesma entrada + mesmo grafo = mesmo caminho (reproduzivel)
β Execucao fragil
- βGrafo inteiro roda de novo do zero apos qualquer falha
- βNo que ja mandou email/gravou arquivo repete a acao no retry (nao idempotente)
- βNenhum registro de "ate onde eu tinha chegado"
π Tres perguntas pra checar se o seu grafo e duravel
- Se cair no no 4 de 7, o que acontece no restart? β se a resposta e "roda tudo de novo", nao e duravel
- Rodar um no duas vezes muda o resultado do mundo real? β se sim (email duplicado, cobranca dupla), ele nao e idempotente
- Voce consegue reproduzir exatamente o mesmo caminho com a mesma entrada? β se nao, voce nao tem como depurar de verdade
Conceitos-chave
Sobrevive a falha no meio
Repetir nao muda o resultado
Nao refaz o que ja terminou
Orquestracao ja resolveu isso
π₯οΈ Instrumente ou depure no escuro
Observabilidade aqui e simples: o harness de grafo precisa mostrar quais nos rodaram, em que ordem, com que latencia e com que custo. Num loop, "por que ele fez isso?" fica enterrado num transcript (o log bruto da conversa/execucao) que voce le linha a linha. Num grafo, o caminho percorrido e um dado que voce consulta β se a instrumentacao existir.
Sem essa instrumentacao, voce paga o preco inteiro do grafo β mais nos, mais arestas, mais modos de falha β e nao recebe a vantagem que o justificava: enxergar o sistema. E instrumentacao nao e opcional em grafo do jeito que era "desejavel" em loop; sem ela voce literalmente nao tem como responder "onde travou".
recriacao ilustrativa, nao e screenshot de ferramenta real.
O que olhar: a linha vermelha (coletar_fonte_c) e o alerta do topico 1 batendo na sua tela β sem esse painel, esse timeout vira o "3 de 4 fontes" silencioso que ninguem percebeu. A linha ambar mostra o ciclo do topico 2 na terceira e ultima volta permitida, com custo acumulado visivel β voce ve o teto se aproximando antes dele estourar o orcamento.
π§ͺ Exemplo pratico: prompt de auditoria de grafo
Objetivo: dar ao Claude Code (ou outro assistente com acesso a arquivos) um
grafo.json descrevendo nos e arestas, e pedir pra ele achar os cinco defeitos deste modulo antes de voce colocar em producao.
Voce vai auditar o arquivo <grafo.json> deste projeto, que descreve um grafo de agentes (nos, arestas, condicoes). Procure especificamente estes cinco defeitos e reporte cada ocorrencia com o no/aresta exato: 1. CICLO SEM TETO DE VOLTAS Existe algum par de arestas condicionais que formam um ciclo (A -> B -> A) sem um campo tipo "max_voltas" ou equivalente? Se sim, aponte o ciclo. 2. ARESTA CONDICIONAL SEM "QUANDO" Toda aresta que sai de um no de decisao/roteamento declara a condicao sob a qual e seguida? Aponte arestas condicionais sem condicao explicita. 3. CONDICOES QUE NAO COBREM TODOS OS CASOS (ENTRADA ORFA) Some as condicoes de saida de cada no de decisao. Existe um caso possivel (ex.: nem aprovado nem reprovado) que nao tem aresta correspondente? Isso deixa o fluxo sem destino nesse caso. 4. JUNCAO SEM CHECAGEM DE CARDINALIDADE Todo no que recebe de mais de uma aresta (fan-in) tem alguma logica de checagem de quantidade/completude antes de seguir? Aponte juncoes que nao verificam se receberam todos os ramos esperados. 5. NO SEM TETO DE CUSTO Todo no que chama um modelo tem um limite de custo, tokens ou tempo declarado? Aponte nos sem nenhum limite. Para cada defeito encontrado: cite o id do no/aresta, explique o risco em 1 frase, e sugira a correcao minima.
Como verificar: rode esse prompt contra um grafo que voce sabe que esta quebrado β
pegue um grafo.json valido e remova de proposito o campo max_voltas de um ciclo.
Se o assistente nao apontar exatamente esse ciclo como defeito 1, o prompt esta frouxo β reescreva pedindo que ele liste TODOS os ciclos antes de decidir se tem teto.
Agora troque pelo seu: aponte pro seu proprio
<grafo.json> real. Se aparecer mais de um defeito, priorize corrigir primeiro o ciclo sem teto e a juncao sem checagem β
sao os dois que mais rapido viram fatura infinita ou dado incompleto sem aviso.
Checagem rapida (nao bloqueia nada): o revisor comeca a aprovar tudo depois que voce passou a incluir o raciocinio do escritor na aresta que chega ate ele. Qual e o defeito?
Conceitos-chave
Quais nos, em que ordem, quanto custou
Log bruto que voce le linha a linha
Voce consulta, nao adivinha
Paga o preco, perde a vantagem
π Resumo do Modulo
O que isto fecha:
O grafo nao e de graca. Voce compra paralelismo, contexto limpo e fluxo auditavel β e paga em state schema, modos de falha novos e infraestrutura de execucao/observabilidade. Se voce nao vai instrumentar, provavelmente nao devia ter montado o grafo.
Proxima Trilha:
Trilha 5 β Mao na massa: migre um loop real pra grafo, modele grafos de negocio e de tarefas, e leve pra casa uma biblioteca de prompts prontos.