Cheatsheet do harness do agente: componentes, arquivos, problemas comuns e checklist de execução
O harness do agente é formado por cinco subsistemas: instruções, ferramentas, ambiente, estado e feedback. O conjunto mínimo de arquivos inclui o AGENTS.md como roteador curto, um script de verificação (make check e verify.sh), um arquivo de progresso e uma lista de funcionalidades com status. A marcação de «pronto» é feita pelo script, e não pelo agente.
Os cinco subsistemas do harness
| Subsistema | O que é | Artefatos | Sintoma de quebra |
|---|---|---|---|
| Instruções | O que o agente deve saber sobre o projeto | AGENTS.md / CLAUDE.md, skills, docs/, ADRs | Viola convenções conhecidas |
| Ferramentas | O que o agente consegue fazer | shell, testes, linter, navegador, servidores MCP | «Quer, mas não consegue» |
| Ambiente | Onde o agente trabalha | arquivos de lock, Docker/devcontainer, git worktree, sandbox, init.sh | A sessão começa consertando o ambiente |
| Estado | O que sobrevive a um reinício | PROGRESS.md, DECISIONS.md, feature_list.json, commits | A sessão nova não sabe onde o trabalho parou |
| Feedback | Como o agente percebe os próprios erros | make check, E2E, hooks, arch-check, avaliador | Diz «pronto», mas não funciona |
Ordem para montar do zero: feedback → instruções → estado → ambiente → ferramentas.
Arquivos do harness
| Arquivo | Finalidade | Regra |
|---|---|---|
| AGENTS.md / CLAUDE.md | Entrada: o que é o projeto, como subir, como verificar | Roteador curto (cerca de 80 linhas), com links para docs com condição «quando ler» |
| docs/*.md | Detalhes de cada tema | Lidos sob demanda, nunca inteiros |
| .claude/skills/*/SKILL.md | Procedimentos repetitivos (deploy, revisão) | Carregados quando a tarefa corresponde à descrição |
| PROGRESS.md | Estado, feito, bloqueios, próximo passo | Atualizado ao fim de cada sessão |
| DECISIONS.md | Decisão, motivo, alternativas descartadas | Registrar o caminho, e não só a conclusão |
| feature_list.json | Funcionalidades: behavior, verification, state | Exatamente uma active (WIP = 1) |
| scripts/verify.sh | Verifica a funcionalidade e a marca como passing | O único que define passing, com o SHA do commit |
| scripts/arch-check.sh | Verifica as fronteiras da arquitetura | Código de saída 1, com WHY e FIX na saída |
| scripts/init.sh | Checa o ambiente antes do trabalho | Ambiente ok, git limpo, make check verde, há uma funcionalidade ativa |
| sprint contract | Acordo sobre a funcionalidade antes do código | Dentro do escopo / fora do escopo / questões em aberto |
| .claude/settings.json | Permissões e hooks do Claude Code | Verificações em eventos, não na memória do agente |
Esqueleto do AGENTS.md
# Projeto: backend de pagamentos (FastAPI, PostgreSQL)
## Execução
docker compose up -d && ./scripts/init.sh
## Verificação
make check # lint, tipos, testes unitários, arch-check
make e2e # cenários de ponta a ponta
## Definição de pronto
- make check e make e2e terminam com código 0
- a funcionalidade é marcada como passing pelo script scripts/verify.sh
- PROGRESS.md atualizado
## MUST
- acesso ao banco apenas pelos repositórios
- segredos lidos apenas de variáveis de ambiente
## Documentos
- docs/payments.md — quando a tarefa envolver pagamentos e estornos
- docs/migrations.md — quando o esquema do banco mudar
Estados da funcionalidade
| Estado | Significado | Quem altera |
|---|---|---|
| pending | Na fila | Planejador |
| active | Em andamento (só uma por vez) | Agente, ao começar |
| passing | Passou na verificação | Somente verify.sh |
| blocked | Precisa de decisão humana, com motivo | Agente |
Níveis de verificação
| Nível | O que | Quando |
|---|---|---|
| 1 | Lint, tipos | Sempre |
| 2 | Testes unitários e de integração | Sempre |
| 3 | E2E | Alteração que toca mais de uma camada; antes de «pronto» |
| 4 | arch-check | Quando surge um import novo entre camadas |
O direito de dizer «pronto» vem só depois do nível mais alto. Testes unitários verdes não significam pronto.
Transformar regras em mecanismos
| Nível | Ferramenta | Custo |
|---|---|---|
| Guarda grep | Script que busca um padrão e imprime WHY/FIX | Minutos |
| Regra de linter | import-linter (Python), dependency-cruiser, eslint-plugin-boundaries (JS/TS) | Cerca de uma hora |
| Teste arquitetural | Teste no CI que falha quando as camadas são violadas | Mais, mas visível no make check |
#!/usr/bin/env bash
fail=0
if grep -rn "from app.db" app/services/; then
echo "WHY: a camada de serviços não acessa o banco diretamente"
echo "FIX: use o repositório de app/repositories/"
fail=1
fi
exit $fail
Problemas comuns e soluções
| Problema | Subsistema | Solução |
|---|---|---|
| Regra no CLAUDE.md não é respeitada | Instruções | Enxugar o arquivo, transformar a regra em verificação ou hook |
| O agente não consegue rodar os testes | Ferramentas | Liberar o comando, instalar as dependências na imagem |
| Comportamento diferente entre máquinas | Ambiente | Arquivos de lock, Docker/devcontainer, versão do runtime fixada |
| Amnésia entre sessões | Estado | PROGRESS.md, nota de passagem de sessão, leitura no início |
| Três funcionalidades começadas, nenhuma terminada | Estado | WIP = 1 em feature_list.json |
| «Pronto», mas não funciona | Feedback | Definição de pronto, E2E, verify.sh, avaliador independente |
| Testes verdes, funcionalidade quebrada | Feedback | E2E com banco e configuração reais |
| O agente copia padrões ruins | Feedback | arch-check desde o primeiro dia |
| Não se sabe o que o agente fez | Estado | Commits pequenos, relato no PROGRESS.md, registro no DECISIONS.md |
| O agente quebrou o ambiente durante a noite | Ambiente | Sandbox, git worktree, checkpoints, rollback pelo init.sh |
| O mesmo comentário de revisão aparece duas vezes | Harness como um todo | Transformar em verificação no make check e remover o texto das instruções |
Papéis em tarefas longas
| Papel | Faz | Não faz |
|---|---|---|
| Planejador | Funcionalidades com critérios de aceite | Não escreve código |
| Gerador | Implementa uma funcionalidade, roda os testes | Não decide se está pronta |
| Avaliador | Veredito pela rubrica, com referência a arquivo, linha ou log | Não vê o raciocínio do gerador |
| Merge | Faz o commit quando review == pass | É código, não agente |
Orçamento do trabalho autônomo
- O objetivo em uma frase (por exemplo: todas as funcionalidades em passing).
- WIP = 1, com limite de tempo e de tentativas por funcionalidade.
- A métrica sobe de forma monotônica; qualquer regressão leva a rollback imediato.
- Migrations, infraestrutura e dinheiro são encaminhados a uma pessoa.
- Depois de várias reprovações na revisão, a funcionalidade recomeça com contexto limpo.
Checklist para executar o agente
- Existe AGENTS.md: stack, como subir, comando de verificação, definição de pronto.
- O make check passa em um clone limpo.
- O ambiente é reproduzível: arquivos de lock, Docker ou devcontainer.
- O agente tem permissão para os comandos necessários; os perigosos são proibidos ou ficam no sandbox.
- Existe pelo menos um E2E para o cenário principal.
- Existe PROGRESS.md, e a regra manda lê-lo no início da sessão.
- A lista de funcionalidades tem status, e só uma está ativa.
- O status passing é definido pelo script.
- As mensagens de verificação trazem WHY e FIX.
- A tarefa tem critérios de aceite e limites de escopo claros.
- Está definido o que exige decisão humana.
- O verification gap foi medido antes das mudanças, para servir de comparação.
Métricas do harness
| Métrica | Como calcular |
|---|---|
| Verification gap | Proporção, em 10 tarefas, de «pronto» sem confirmação da verificação |
| MTTR | Tempo entre a falha e a volta a um estado funcional |
| Partida a frio | A sessão nova responde «onde estamos e qual é o próximo passo» sem adivinhar |
| Ablação | Queda de desempenho ao desligar um subsistema, em um conjunto fixo de tarefas |
Conclusão
O harness é um circuito, não um arquivo: instruções, ferramentas, ambiente, estado e feedback. Comece pela verificação, mantenha o AGENTS.md curto, deixe a decisão de «pronto» para o script e revise o harness com regularidade. Tudo isso se reúne no curso de harness engineering, em um harness completo sobre um projeto real.
Perguntas frequentes
Qual é a diferença entre AGENTS.md e CLAUDE.md?
A finalidade é a mesma: ambos são arquivos de instruções para o agente. O CLAUDE.md é lido pelo Claude Code; o AGENTS.md é um formato comum a vários agentes. No CLAUDE.md você pode simplesmente apontar para o AGENTS.md.
Quantas linhas deve ter o AGENTS.md?
Não há um limite rígido, mas o arquivo de entrada deve ser curto, algo em torno de cem linhas, como um sumário. Os detalhes vão para documentos separados.
Um projeto pequeno precisa de feature_list.json?
Para alterações pontuais, não. Ele compensa quando o agente trabalha em várias funcionalidades seguidas ou ao longo de várias sessões.
Onde guardar os segredos que o agente precisa?
Em variáveis de ambiente ou em um gerenciador de segredos, e não nos arquivos de instruções nem no código. O agente recebe acesso ao ambiente, e não valores escritos no texto.
Este tema é abordado em profundidade, com prática, no curso “Harness Engineering: инженерия надёжности AI-агентов”.
- Из чего состоит harness AI-агента: инструкции, инструменты, среда, состояние, обратная связь
- Харнес AI-агента с нуля: AGENTS.md, feature_list.json, verify.sh и автономный цикл