Módulo 6: Sensores, Verificação e Autocorreção de Agentes | Curso de Harness Engineering

Módulo 6 · Curso de Harness Engineering

Sensores: verificação e autocorreção

Guias reduzem a chance de erro, mas não a eliminam. O que permite a um agente trabalhar sozinho por muito tempo é perceber os próprios erros e corrigi-los antes de você ver o resultado. Este módulo trata dos sensores: tudo o que observa o trabalho do agente e devolve um sinal que ele consegue usar.

guias vs. sensores lint para agentes testes de mutação back-pressure

Aula 24

Guias vs. sensores, computacionais vs. inferenciais

Birgitta Böckeler organiza o harness de quem usa agentes de código em dois grupos. Guias (feedforward) atuam antes da ação: instruções, skills, especificações. Sensores (feedback) atuam depois: observam o resultado e permitem que o agente se corrija. Os sensores, por sua vez, podem ser de dois tipos:

Tipo de sensorExemplosForçaLimite
ComputacionalTestes, lint, checagem de tipos, regras de dependência, buildDeterminístico, barato, rápidoSó verifica o que foi codificado
InferencialLLM como juiz, agente revisor, avaliação de screenshotJulga aspectos difíceis de codificar, como legibilidade e designMais caro, mais lento, não determinístico

A recomendação é usar sensores computacionais sempre que possível e reservar os inferenciais para o que não dá para codificar. O artigo da Anthropic sobre o Agent SDK chega à mesma ordem: primeiro regras determinísticas como lint, depois feedback visual, e por último o LLM como juiz, que o artigo considera pouco robusto e com latência alta. A documentação do Claude Code transforma isso em conselho direto: dê ao agente uma checagem que ele consiga rodar, seja teste, build, linter ou screenshot.

Há um efeito colateral interessante na escolha de linguagem. O artigo do Agent SDK observa que TypeScript é melhor que JavaScript para agentes porque acrescenta uma camada de feedback: o compilador vira um sensor gratuito que roda em segundos.

Tempo de feedback de cada sensor

Ordem de grandeza típica, em segundos, para um projeto web de porte médio. Valores ilustrativos: o que importa é a diferença de escala.

Gráfico ilustrativo do curso. Escala logarítmica. Sensores rápidos podem rodar a cada edição; os lentos, uma vez ao final.

Fontes desta aula: Böckeler: Harness engineering for coding agent users · Anthropic: Building agents with the Claude Agent SDK · Claude Code: Best practices

Aula 25

Lint, tipos e testes estruturais escritos para o agente

Um linter tradicional é escrito para pessoas, que entendem o contexto e sabem quando ignorar um aviso. Para um agente, a mensagem de erro é a única fonte de informação sobre o que fazer. Por isso, uma das práticas mais citadas em harness engineering é escrever as mensagens de lint como instruções de correção.

No relato da OpenAI, as regras de arquitetura do projeto, como quais camadas podem importar quais, foram impostas por linters próprios e testes estruturais, e as mensagens de erro diziam ao agente exatamente como resolver a violação. Böckeler mostra a mesma técnica com um formatador próprio para o ESLint: em vez de só listar violações, ele explica o motivo da regra e o caminho de correção, e permite exceções justificadas em vez de supressões em massa.

# Mensagem para pessoas
error  no-restricted-imports  'db' import is restricted

# Mensagem para o agente
error  Camada de UI não pode importar o banco (src/ui/Pedido.tsx:3).
       Motivo: ADR 0004, a UI só fala com a camada de serviços.
       Como corrigir: use pedidosService.listar() de src/services/pedidos.ts.
       Se for mesmo necessário, adicione // arch-exception: <motivo> e explique no PR.

Böckeler observa que sensores computacionais funcionam muito bem no nível de arquivo e função (lint, tipos, regras de dependência) e são baratos o bastante para rodar a cada mudança. Já problemas que atravessam vários arquivos, como modularidade e acoplamento, precisam de um sensor inferencial por cima dos dados brutos: um revisor que olhe as métricas de acoplamento e julgue se a estrutura faz sentido. Esse tipo de checagem automática de arquitetura tem raiz nas fitness functions do livro Building Evolutionary Architectures.

Fontes desta aula: OpenAI: Harness engineering (Ryan Lopopolo) · Böckeler: Maintainability sensors for coding agents

Aula 26

Testes de mutação e o limite da cobertura alta

Um agente que precisa fazer os testes passarem vai fazer os testes passarem, e nem sempre da forma que você quer. Uma suíte com cobertura alta pode esconder asserções fracas: testes que executam o código sem verificar o resultado, ou que verificam só que nenhuma exceção foi lançada. Böckeler aponta isso como um limite real dos sensores de teste e recomenda testes de mutação como sensor complementar.

A ideia é simples. Uma ferramenta de mutação altera o código de propósito (troca um > por >=, remove uma linha, inverte uma condição) e roda os testes. Se os testes continuam passando com o código alterado, aquela mutação "sobreviveu", o que prova que nenhum teste verifica aquele comportamento. A taxa de mutantes mortos mede a qualidade real da suíte, não só quantas linhas ela executa.

Para harnesses, testes de mutação são caros demais para rodar a cada edição, mas funcionam bem em dois momentos: periodicamente, para medir a qualidade dos testes que o agente escreve, e no fim de uma tarefa grande, como um sensor de qualidade final. A Anthropic acrescenta outra proteção, específica para agentes de longa duração: instruir explicitamente que é inaceitável remover ou editar testes para fazê-los passar, já que o agente tem acesso a eles.

  • Teste vermelho antes do verde: peça ao agente que escreva o teste, confirme que ele falha e só então implemente.
  • Proteja os testes: regra explícita e, se possível, permissão que impeça editar testes aprovados sem pedir.
  • Meça a suíte, não só a cobertura: rode mutação periodicamente nos módulos críticos.

Fontes desta aula: Böckeler: Maintainability sensors for coding agents · Anthropic: Effective harnesses for long-running agents

Aula 27

Back-pressure: hooks silenciosos no sucesso e detalhados na falha

A HumanLayer usa o termo back-pressure (contrapressão) para os mecanismos que empurram o agente de volta quando ele tenta avançar com algo errado. O exemplo mais forte é um hook que roda testes e lint ao fim do turno e impede o agente de declarar a tarefa concluída enquanto houver falhas. O Claude Code oferece exatamente isso com um hook de parada, que bloqueia o fim do turno até a checagem passar, e um limite de segurança de oito bloqueios seguidos para evitar laços infinitos.

A regra de ouro para esse tipo de sensor é economia de contexto: silencioso no sucesso, detalhado na falha. Se o hook imprime a saída completa de 400 testes que passaram, desperdiça milhares de tokens a cada turno. Se, na falha, imprime só "testes falharam", o agente não sabe o que corrigir. O formato certo é nada quando dá certo e, quando dá errado, o teste, o arquivo, a linha, o valor esperado e o recebido.

O projeto do compilador C escrito por Claudes em paralelo levou esse princípio ao limite. O autor, Nicholas Carlini, relata que a qualidade dos testes e do pipeline de integração contínua foi o fator decisivo, e que os testes foram desenhados pensando nas limitações do modelo: saídas curtas, logs gravados em arquivo com a palavra ERROR na mesma linha da causa para facilitar a busca com grep, e um modo rápido que roda uma amostra de 1% ou 10% dos testes para feedback imediato.

Quando o agente erra de novo, a pergunta não é "como explico melhor?", é "que sensor teria pegado isso?".

Síntese do curso a partir de Böckeler (2026) e HumanLayer (2026)

Fontes desta aula: HumanLayer: Skill Issue · Claude Code: Best practices · Anthropic: Building a C compiler with parallel Claudes

Erros comuns

  • Testes lentos demais para o loop. Se a suíte leva 20 minutos, o agente não roda depois de cada mudança. Crie um modo rápido.
  • Saída verbosa. Logs completos de sucesso enchem o contexto. Imprima só falhas.
  • Confiar só no LLM como juiz. É útil para o que não dá para codificar, mas é lento e varia entre execuções.
  • Deixar o agente editar os testes livremente. O caminho mais curto para o verde é apagar o teste.
  • Mensagens de erro escritas só para pessoas. Diga o motivo e o caminho de correção.

Aplicação prática

  1. Liste os sensores do seu projeto e o tempo de cada um. Crie um comando rápido que rode os sensores de segundos (tipos, lint, testes unitários afetados).
  2. Reescreva as mensagens das três regras de lint mais violadas pelo agente no formato motivo mais caminho de correção.
  3. Configure um hook de fim de turno que só imprime saída quando algum sensor falha.
  4. Rode uma ferramenta de mutação no módulo mais crítico e veja quantos mutantes sobrevivem aos testes escritos pelo agente.

Siglas usadas neste módulo

LLM:
Large Language Model, modelo de linguagem de grande escala.
CI:
Continuous Integration, integração contínua.
ADR:
Architecture Decision Record, registro de decisão de arquitetura.
PR:
Pull Request, pedido de integração de mudanças.
SDK:
Software Development Kit, kit de desenvolvimento de software.

Perguntas frequentes

O que são sensores em harness engineering?
São os mecanismos que observam o resultado do trabalho do agente e devolvem um sinal que ele consegue usar para se corrigir: testes, lint, checagem de tipos, build, screenshots, revisores automáticos. Na divisão de Birgitta Böckeler, eles complementam as guias, que atuam antes da ação. Sensores computacionais são determinísticos e baratos; inferenciais usam um modelo para julgar o que é difícil de codificar.
Por que escrever mensagens de lint para o agente?
Porque, para o agente, a mensagem de erro é a única informação sobre o que fazer. Uma mensagem que diz o motivo da regra e o caminho de correção permite que ele resolva a violação sozinho, em vez de tentar soluções aleatórias ou suprimir o aviso. A OpenAI e a Thoughtworks relatam essa prática como uma das mais eficazes.
Cobertura de testes alta não basta?
Não. Cobertura mede quantas linhas os testes executam, não se verificam o resultado correto. Um agente pode escrever testes que passam por todo o código sem asserções significativas. Testes de mutação alteram o código de propósito e verificam se algum teste falha, medindo a qualidade real da suíte.
O que é back-pressure em agentes de código?
São mecanismos que empurram o agente de volta quando ele tenta avançar com trabalho com defeito. O exemplo típico é um hook de fim de turno que roda testes e lint e impede o agente de encerrar enquanto houver falhas. A regra é que esses hooks sejam silenciosos no sucesso e detalhados na falha, para não desperdiçar contexto.
Quando usar um LLM como juiz?
Quando o critério não pode ser codificado de forma confiável, como qualidade de design visual, clareza de um texto ou adequação de uma arquitetura. Ainda assim, deve ser a última camada: a Anthropic considera o LLM como juiz menos robusto e mais lento do que regras determinísticas. Funciona melhor com critérios explícitos, exemplos calibrados e um agente avaliador separado do agente que gerou o trabalho.

Referências

Livros

FORD, N.; PARSONS, R.; KUA, P.; SADALAGE, P. Building Evolutionary Architectures. 2. ed.

O'Reilly, 2023. Introduz as fitness functions, checagens automáticas de arquitetura que são a origem dos sensores computacionais.

BECK, K. Test-Driven Development: By Example.

Addison-Wesley, 2002. O ciclo vermelho-verde-refatorar, a forma mais antiga de sensor que guia a implementação.

FEATHERS, M. Working Effectively with Legacy Code.

Prentice Hall, 2004. Como criar pontos de teste em código existente, pré-requisito para dar sensores a um agente.

Cursos e Ferramentas