Lição 2: Evidência de primeira mão: a transcrição bruta, não o autorrelato
Objetivos de aprendizado:
- Entender por que o autorrelato de um agente é uma fonte secundária, e saber que “o que ele omite costuma ser mais importante do que o que ele inclui” aponta especificamente para quais lugares da transcrição
- Reconhecer o que conta como transcrição bruta: para cada chamada de ferramenta de uma execução, o nome da ferramenta e os parâmetros completos; para cada resposta de ferramenta, o valor de retorno completo ou o erro; e conseguir localizar um comportamento suspeito até “qual campo da mensagem N”
- Usar as quatro perguntas (ferramenta errada, parâmetros errados, chamadas de menos, resposta mal tratada) para ler uma transcrição até uma conclusão de classificação, e saber quais perguntas leitores humanos conseguem responder e quais devem ser delegadas a programas
Pré-requisitos: concluir a lição 1 e entender como o não determinismo quebra o “reproduza e depure”, e como um sintoma pode esconder várias causas indistinguíveis | Anterior: << Lição 1 | Próxima: Lição 3 >>
Ele disse que cruzou três fontes
Um agente de pesquisa termina sua execução e te entrega um resumo:
Busquei em três fontes autoritativas e cruzei os dados. Os números são consistentes.
Você acredita. A frase soa profissional, comedida, e explica o método por conta própria. Você manda o resultado para o time de negócios.
Três semanas depois chega uma reclamação: aquele número está absurdamente errado. Você abre a transcrição bruta daquela execução e lê mensagem por mensagem — ele fez apenas uma chamada de busca bem-sucedida; a segunda chamada foi uma captura de página que retornou um erro de timeout de uma linha; a terceira chamada nunca aconteceu. A palavra “cruzei” existe apenas no resumo que ele te deu.
Não é que o modelo esteja mentindo — quando ele escreveu aquela frase, não havia nenhuma “contagem de verificações” para consultar. Ele apenas deu continuidade ao que soava como um fechamento adequado. O custo, porém, é real: você confiou no autorrelato, pulou a transcrição e gastou três semanas para descobrir que essa execução quebrou na segunda etapa.
A conclusão da lição 1 foi: agentes são não determinísticos entre execuções, a intuição tradicional de “reproduzir e colocar um breakpoint” falha diretamente, e o caminho adiante é fazer a própria execução deixar evidência. O curso 10 desta série mencionou de passagem, no contexto de avaliação e pontuação, que “o autorrelato de um agente não pode ser usado como evidência”. Esta lição expande isso em um protocolo de leitura.
Autorrelatos são fontes secundárias
Os autorrelatos que um agente te entrega — resumos de fechamento, cadeia de raciocínio (o raciocínio que o modelo escreve antes de dar uma resposta, abreviado como CoT daqui em diante), autoavaliações depois da execução de uma ferramenta — são todos a escrita dele sobre ele mesmo. Esses textos são úteis, mas estão separados por uma camada daquilo que ele de fato fez.
O aspecto mais danoso dessa camada não é ele escrever a coisa errada, e sim ele não escrever nada. O artigo de engenharia de ferramentas da Anthropic é direto: o que os agentes omitem em seus feedbacks e respostas muitas vezes pode ser mais importante do que o que eles incluem; LLMs nem sempre dizem o que querem dizer1. A omissão é mais difícil de lidar do que o erro — com o erro você talvez perceba a contradição; com a omissão você nem tem a chance. No exemplo acima, ele não escreveu “a captura da segunda fonte falhou” — ele simplesmente não mencionou, e peças faltando não levantam a mão.
Então a sequência é: ler o raciocínio e o feedback dele (a CoT) ajuda a encontrar arestas, mas para pegar comportamentos não descritos explicitamente na CoT você precisa olhar a transcrição bruta, incluindo chamadas de ferramenta e respostas de ferramenta1. A CoT é pista; a transcrição é evidência. Inverta as duas e você vai concluir repetidamente “ele disse que fez, então provavelmente fez”.
Na prática: pegue cada número concreto do autorrelato e rastreie-o de volta até a transcrição. Se você não encontra a origem dele e não consegue derivá-lo de números presentes na transcrição, então é algo que o modelo gerou.
O que conta como “transcrição bruta”
Uma “transcrição bruta” não é novidade. Você construiu uma à mão no curso 7 desta série: aquele array messages. Cada iteração do loop anexa uma mensagem do assistant e depois anexa uma mensagem do user carregando o resultado da ferramenta. Quando uma tarefa termina, o que ficou depositado no array é a transcrição bruta daquela execução.
Abra ela e você verá dois tipos de bloco. Um bloco tool_use é o modelo nomeando qual ferramenta chamar, contendo o nome da ferramenta e um objeto completo de parâmetros que o modelo gerou. Um bloco tool_result é o que o harness devolve depois de efetivamente rodar a ferramenta — em caso de sucesso, o valor de retorno completo; em caso de falha, o conteúdo do erro mais uma flag de erro. Os dois blocos precisam ser lidos como par: olhar só o tool_use te diz o que ele queria fazer; olhar só o tool_result te diz o que o ambiente retornou.
Por que eles se qualificam como evidência? O artigo da Anthropic sobre padrões de agente explica pela perspectiva do próprio agente: durante a execução, o agente precisa obter “ground truth” (a verdade de campo que o ambiente devolve, como resultados de chamadas de ferramenta ou de execução de código) a cada etapa para avaliar seu progresso2. O mesmo lote de dados serve para você — ele julga onde está por meio deles; você julga onde ele está pelos mesmos.
O mesmo artigo também dá um princípio de design: priorize a transparência mostrando explicitamente as etapas de planejamento do agente2. Isso costuma ser tratado como recomendação de UI, mas sua implicação para depuração é mais concreta — qualquer ação que não aterrisse em uma fronteira de ferramenta não deixa rastro na transcrição. O modelo “comparando dois conjuntos de dados de cabeça” não deixa rastro; chamar uma ferramenta diff deixa. Se você quer que algo seja auditável, precisa empurrá-lo para a fronteira de ferramenta.
A revisão humana pega o que os evals não pegam
Nesse ponto alguém vai perguntar: o curso 10 não acabou de construir um conjunto de avaliação? Por que não rodar as pontuações e pronto? Por que ter gente folheando transcrições mensagem por mensagem?
Porque conjuntos de avaliação só pegam as falhas que você já pensou antes. A avaliação humana pega o que a automação deixa passar. Pessoas testando agentes encontram casos extremos que os evals não pegam. Isso inclui respostas alucinadas em consultas incomuns, falhas de sistema ou vieses sutis de seleção de fontes3. A terceira categoria merece atenção: no sistema multiagente de pesquisa da Anthropic, testadores humanos notaram que os primeiros agentes escolhiam consistentemente fazendas de conteúdo otimizadas para SEO em vez de fontes autoritativas porém menos bem ranqueadas, como PDFs acadêmicos ou blogs pessoais3.
Esse viés é quase invisível em evals: as respostas não são necessariamente erradas — fazendas de conteúdo também copiam fatos corretos — e as pontuações continuam parecendo boas. Ele está escrito em exatamente um lugar: a sequência de URLs que ele de fato escolheu, sentada na transcrição.
A camada de ferramentas tem exemplos do mesmo tipo. Quando a ferramenta de busca web do Claude foi lançada, o time identificou que o Claude estava desnecessariamente acrescentando 2025 ao parâmetro query da ferramenta, enviesando os resultados de busca e degradando o desempenho; a correção foi melhorar a descrição da ferramenta para guiar o Claude na direção certa1. Esse bug não quebra, não lança erro, não dá timeout. A ferramenta retorna com sucesso todas as vezes, com resultados de busca legítimos. As métricas podem te dizer “o desempenho degradou”; apontar o dedo para “degradou porque tem um 2025 no query” exige ler os parâmetros linha a linha.
Transcrições não são só para leitores humanos
A seção anterior abre espaço para um mal-entendido: ler transcrições = olhos humanos, linha a linha. Não é — transcrições são texto estruturado, e modelos são muito bons em lê-las. O artigo de engenharia de ferramentas dá um método quase rude: simplesmente concatene as transcrições dos seus agentes de avaliação e cole no Claude Code. O Claude é especialista em analisar transcrições e consegue refatorar muitas ferramentas de uma vez — por exemplo, para garantir que implementações e descrições de ferramentas permaneçam autoconsistentes quando novas mudanças são feitas1.
O gargalo de “ler transcrições” é paciência, não inteligência. Então a divisão de trabalho é clara: modelos são bons em varredura ampla, comprimindo um lote de transcrições em uma lista de suspeitos; humanos são bons em julgamento qualitativo — decidir se as amostras levantadas de fato contam como problemas.
O formato de transcrição dos outros é implementação interna deles
Já que transcrições são tão importantes, dá para simplesmente ler as transcrições prontas que produtos existentes gravam em disco? Pegue o Claude Code como exemplo: ele persiste as transcrições de sessão em arquivos ~/.claude/projects/*/*.jsonl4. Parece ideal: uma linha por mensagem, transcrição bruta pronta e estruturada.
Mas a documentação oficial emenda logo em seguida um aviso: o formato das entradas de transcrição é interno ao Claude Code e muda entre versões, então um pipeline que faz junções sobre esses campos pode quebrar a qualquer release; trate as junções como específicas de versão, não como um contrato estável4. A documentação de hooks acrescenta uma segunda nota: o arquivo de transcrição que um hook recebe é escrito de forma assíncrona e pode ficar atrás da conversa em memória, de modo que, quando um hook dispara, ele pode ainda não incluir as mensagens mais recentes do turno atual5.
As duas coisas ensinam a mesma lição: você não controla o formato dos outros, e não controla o momento em que eles escrevem. Você pode ler, pode usar para investigar, mas não pode construir sua observabilidade em cima disso. Conclusão: o seu harness precisa escrever a própria transcrição. A lição 3 cobre como projetar os campos dessa transcrição, e a lição 6 a adiciona ao harness que você escreveu no curso 7.
As quatro perguntas para ler transcrições
Quando você abre uma transcrição, por onde começa? O artigo de engenharia de ferramentas fornece uma taxonomia pronta: agentes podem chamar as ferramentas erradas, chamar as ferramentas certas com os parâmetros errados, chamar ferramentas de menos ou processar as respostas das ferramentas incorretamente1. Essas quatro eram originalmente sobre design de ferramentas, mas funcionam extremamente bem como checklist de leitura, porque cada uma tem seu próprio lugar na transcrição para onde apontar:
Pergunta um: ferramenta errada. Olhe o campo name de cada bloco tool_use. Compare com a tarefa em questão e com a resposta da ferramenta anterior. O critério é “havia uma ferramenta mais apropriada ali parada que não foi usada?”.
Pergunta dois: ferramenta certa, parâmetros errados. Olhe o campo input do bloco tool_use, chave por chave. O exemplo anterior — acrescentar 2025 aos termos de busca — vive sob esta pergunta. É a mais fácil de pular, porque parâmetros são longos e parecem plausíveis. Foque especificamente nas chaves que você consegue julgar certas ou erradas de forma independente: datas, caminhos, IDs, limites de intervalo, unidades.
Pergunta três: chamadas de menos. A evidência desta pergunta é a ausência, então é a mais difícil de ler. O jeito de detectá-la é encontrar posições onde “deveria ter havido uma próxima chamada e não houve”: um erro sem retentativa, uma busca que retorna cinco resultados mas só um é buscado, uma tarefa que exige duas fontes mas a transcrição tem só uma ida e volta bem-sucedida. A ausência não salta aos olhos sozinha — você precisa usar os requisitos da tarefa como gabarito e contar.
Pergunta quatro: resposta de ferramenta mal tratada. Olhe a mensagem do assistant imediatamente após cada tool_result e pergunte: “o que ele diz em seguida bate com o que ele acabou de receber?”. Erro tratado como sucesso, dados retornados do período A usados como período B, um retorno que diz explicitamente “resultados truncados” mas o agente toma como completo — tudo cai sob esta pergunta. Isso também se liga diretamente a como as mensagens de erro são escritas: quando uma ferramenta levanta um erro, você pode fazer engenharia de prompt nas suas respostas de erro para comunicar com clareza melhorias específicas e acionáveis, em vez de códigos de erro opacos ou tracebacks1. Quando você vir um agente interpretando errado o mesmo tipo de erro repetidamente, verifique primeiro o que esse erro em si diz.
Proporção: nem toda transcrição precisa de leitura humana linha a linha
Ler transcrições com olhos humanos é uma ação cara: uma execução com dezenas de mensagens leva uns bons dez minutos ou mais para ser lida com atenção; multiplique por cem execuções e ninguém dá conta. Então a leitura humana entra em dois lugares. Um é a amostragem: periodicamente pegue algumas execuções ao acaso e leia do começo ao fim, não caçando um bug específico, mas calibrando sua intuição de “como isso normalmente funciona” — vieses como o das fazendas de conteúdo de SEO são exatamente o tipo de coisa em que você tropeça quando está “lendo sem caçar bug”. O outro é a caracterização de problemas novos: quando você encontra um sintoma desconhecido, nas primeiras vezes você precisa ler com olhos humanos, porque ainda não sabe o que procurar; depois de ler o bastante para entender em qual campo ele aparece, passe a tarefa para um programa.
O volume rotineiro é carregado pela leitura programática: como projetar campos de log é a lição 3, como correlacionar registros espalhados em uma única execução é a lição 4. Aí o ponto de entrada da leitura humana vira “use métricas para estreitar até algumas execuções suspeitas e então abra as transcrições e olhe de perto”. A evidência precisa existir primeiro; só então dá para falar em lê-la de forma eficiente — esta lição cobre a primeira metade.
💻 Exercícios
Recapitulação
- O autorrelato de um agente é fonte secundária: o que os agentes omitem em seus feedbacks e respostas muitas vezes pode ser mais importante do que o que eles incluem; LLMs nem sempre dizem o que querem dizer1, e peças faltando não levantam a mão no resumo
- Ler a CoT encontra arestas, mas para pegar comportamentos não descritos explicitamente na CoT você precisa olhar a transcrição bruta, incluindo chamadas de ferramenta e respostas de ferramenta1 — a CoT é pista; a transcrição é evidência
- A transcrição bruta é o que fica depositado naquele array
messages do curso 7 desta série. Ela se qualifica como evidência porque resultados de ferramenta e execução de código são a ground truth que o ambiente dá a cada etapa2; a orientação oficial também diz “priorize a transparência mostrando explicitamente as etapas de planejamento do agente”2 — lido ao contrário, esse é o corolário desta lição: qualquer ação que não aterrisse numa fronteira de ferramenta não deixa rastro
- A avaliação humana pega o que a automação deixa passar: casos extremos que os evals não pegam, incluindo respostas alucinadas em consultas incomuns, falhas de sistema e vieses sutis de seleção de fontes3; o exemplo do mundo real são os primeiros agentes escolhendo consistentemente fazendas de conteúdo otimizadas para SEO em vez de PDFs acadêmicos e blogs pessoais3 — esse tipo de viés, quando aterrissa na transcrição, é aquela sequência de URLs que ele de fato escolheu. Bugs da camada de ferramentas também moram nos parâmetros: o Claude uma vez acrescentou desnecessariamente
2025 ao parâmetro query da ferramenta de busca, enviesando resultados e degradando o desempenho; a correção foi melhorar a descrição da ferramenta1
- Transcrições não precisam ser lidas só por humanos: simplesmente concatene as transcrições dos seus agentes de avaliação e cole no Claude Code. O Claude é especialista em analisar transcrições e consegue refatorar muitas ferramentas de uma vez — por exemplo, para garantir que implementações e descrições de ferramentas permaneçam autoconsistentes1. As quatro perguntas para ler transcrições são: ferramenta errada, ferramenta certa mas parâmetros errados, chamadas de menos, resposta de ferramenta mal tratada1
- O formato de transcrição dos outros é implementação interna deles. O Claude Code escreve as transcrições de sessão em
~/.claude/projects/*/*.jsonl4, mas a documentação oficial diz explicitamente que esse formato é interno ao Claude Code e muda entre versões, de modo que pipelines que fazem junções sobre esses campos podem quebrar a qualquer release e devem ser tratados como específicos de versão4; o arquivo de transcrição que um hook recebe também é escrito de forma assíncrona e pode ficar atrás da conversa em memória5. Então o seu harness precisa escrever a própria transcrição — a lição 3 projeta os campos, a lição 6 implementa
Lição 3 >>