Pular para o conteudo
MODULO 4.3

πŸ”­ Falhas, harness e observabilidade

Aqui esta o preco do grafo. Fan-in que engole uma fonte, ciclo que nao converge, estado que vaza de um no pro outro. Este modulo mostra os tres modos de falha que so existem porque voce montou um grafo β€” e como instrumentar pra nao descobrir cada um deles em producao.

6
Topicos
45
Minutos
Avancado
Nivel
Pratica
Tipo
Progresso deste modulo
0%0 de 6
1

πŸ”€ 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.

fonte A fonte B fonte C βœ— fonte D juncao (merge) 3 de 4 fontes chegaram β€” merge nao checou, seguiu como se estivesse completo

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

Fan-in

Onde ramos paralelos se juntam

Cardinalidade

Recebi os N que despachei?

Falha silenciosa

Vazio nao e erro, mas devia ser

Decisao explicita

Abortar, marcar ou tentar de novo

2

♾️ 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
SEM TETO β€” trava escritor revisor ∞ reprova β†’ reescreve β†’ reprova β†’ reescreve... COM TETO β€” converge escritor revisor volta 2 de 3 desiste e avisa

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

Teto de voltas

Numero maximo, sem excecao

Criterio de progresso

2 voltas sem melhora = para

Saida de emergencia

Terceira aresta pra fora do par

Fatura infinita

Sem teto = sem limite de custo

3

🚰 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.

estado enxuto escritor revisor texto + criterio revisor julga com olhos frescos estado vazado escritor revisor texto + criterio + raciocinio volta a carimbar o trabalho

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

Vazamento de estado

Aresta carrega mais do que deveria

Contexto limpo

A vantagem que o grafo prometia

Carimba de volta

Revisor contaminado sempre aprova

Falha silenciosa

Diagrama igual, payload diferente

4

πŸ“ 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.

1

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.

2

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.

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

State schema

O contrato de cada aresta

Obrigatorio x proibido

Os dois lados precisam existir

Antes do prompt

Schema define o no, nao o contrario

Sem culpa dividida

Contrato claro = quebra rastreavel

5

πŸ’Ύ 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

Execucao duravel

Sobrevive a falha no meio

Idempotente

Repetir nao muda o resultado

Cache por no

Nao refaz o que ja terminou

Herdado de dados

Orquestracao ja resolveu isso

6

πŸ–₯️ 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".

monitor de execucao β€” grafo:daily_brief#run_4821
βœ“ coletar_fonte_a1.2s Β· $0.003
βœ“ coletar_fonte_b0.9s Β· $0.002
βœ— coletar_fonte_c4.0s Β· timeout
β§— revisor (volta 3 de 3)rodando Β· $0.041 acum.
β—‹ juncao_finalaguardando

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

Observabilidade

Quais nos, em que ordem, quanto custou

Transcript

Log bruto que voce le linha a linha

Caminho como dado

Voce consulta, nao adivinha

Sem instrumento

Paga o preco, perde a vantagem

πŸ“Œ Resumo do Modulo

βœ“
JunΓ§Γ£o precisa checar cardinalidade β€” recebeu os N que despachou? Decida explicitamente o que fazer com o que faltou.
βœ“
Todo ciclo precisa de teto e criterio de progresso β€” sem os dois, a fatura e infinita.
βœ“
Vazamento de estado anula o grafo β€” contexto contaminado faz o revisor voltar a carimbar.
βœ“
State schema e o contrato β€” obrigatorio e proibido, os dois lados precisam existir.
βœ“
Execucao duravel e idempotente β€” retoma sem refazer, repete sem duplicar efeito.
βœ“
Sem observabilidade voce paga e nao recebe β€” o caminho percorrido tem que ser um dado que se consulta.

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.