Benchmark real de tokens, turns e custo comparando um harness tunado e um ambiente vazio
AGENTS.md, sem skills locais) e um tunado (este repositório, com skills, regras e índice de agents).Exemplo concreto: pedir "qual skill gera o carrossel do LinkedIn e onde ela está?" custou 17 idas e vindas num repositório vazio e 7 num repositório com o índice de skills já carregado.
Todo mundo com um .claude/ cheio de skills, subagents e servidores MCP acredita que isso torna o agente melhor. Quase ninguém mede quanto. A alternativa também é comum: começar do zero, sem nada configurado, e assumir que o modelo "já sabe se virar". As duas crenças raramente encontram um número.
Rodei um teste simples para trocar a crença por um dado: a mesma pergunta, no mesmo dia, com o mesmo modelo, em dois ambientes diferentes: um vazio e um com o harness deste repositório carregado. Não é um benchmark acadêmico nem uma amostra grande; é uma medição única, reproduzível e barata o suficiente para qualquer time rodar no próprio repositório antes de decidir investir em tuning.
Minha tese é simples: tuning de harness não compra "inteligência" extra do modelo. Compra menos exploração às cegas e respostas mais verificáveis, porque informação que já é local não precisa ser redescoberta a cada sessão. O ganho aparece em turns, tokens e taxa de acerto verificável; ele desaparece quando o repositório não tem contexto real para oferecer ou quando o tuning só empilha regras que ninguém consulta.
Neste artigo, harness tunado é um Claude Code configurado com os elementos que o time efetivamente mantém: AGENTS.md/CLAUDE.md do projeto, skills locais (.agents/skills/, .claude/skills/), um índice de subagents com responsabilidade clara e, quando existem, servidores MCP relevantes para a tarefa. Harness limpo é a mesma CLI, a mesma conta, o mesmo modelo, mas apontada para um diretório vazio: sem instrução de projeto, sem skill local, sem índice de agents específico.
| Elemento | Presente no harness tunado | Presente no harness limpo |
|---|---|---|
AGENTS.md / CLAUDE.md do projeto | Sim | Não |
Skills locais (.agents/skills, .claude/skills) | Sim | Não |
| Índice de subagents com descrição | Sim | Não |
| Regras com escopo de path | Sim | Não |
| Modelo, CLI e conta | Idênticos | Idênticos |
Uma ressalva necessária: "harness limpo" aqui não é uma instalação sem nenhuma configuração de máquina. O diretório de projeto estava vazio, mas a CLI ainda enxerga configuração global do usuário (~/.claude/), porque isolar completamente exigiria uma home limpa, o que foge do escopo de um teste rodado em produção. O efeito medido é o de contexto de repositório, não de uma reinstalação zero absoluta. Isso está declarado aqui porque uma medição sem esse aviso soaria mais definitiva do que é.
A tarefa foi fixa e verificável: "responda em até três bullets qual é a skill exata para gerar um carrossel do LinkedIn a partir de um artigo, qual arquivo define o padrão de commit semântico usado aqui, e qual skill gera a thumbnail do blog, citando o path exato de cada evidência." As três respostas existem neste repositório e podem ser conferidas com find e grep.
Configuração idêntica nos dois lados: mesmo modelo (claude-sonnet-5), mesmo dia, mesma conta, --print --output-format json, ferramentas limitadas a leitura (Read, Grep, Glob, sem escrita), teto de orçamento de US$ 1,50 para evitar loop custoso. A diferença entre as execuções foi apenas o diretório de trabalho: um repositório Git vazio versus este repositório com seu harness completo.
# harness limpo (diretório vazio)
cd /tmp/harness-bench/clean-repo
claude -p --output-format json --max-budget-usd 1.5 --model sonnet \
--allowedTools "Read,Grep,Glob" -- "$(cat task.txt)"
# harness tunado (este repositório)
cd /Volumes/lemon-ssd/projects-ssd/blog/writer
claude -p --output-format json --max-budget-usd 1.5 --model sonnet \
--allowedTools "Read,Grep,Glob" -- "$(cat task.txt)"
| Métrica | Harness limpo | Harness tunado | Diferença |
|---|---|---|---|
| Turns até concluir | 17 | 7 | -59% |
| Tokens totais (input + cache + output) | ≈ 768.900 | ≈ 438.300 | -43% |
| Custo da chamada | US$ 0,573 | US$ 0,458 | -20% |
| Motivo de término | completed | completed | — |
| Respostas com path verificado | 1 de 3 | 3 de 3 | — |
O custo em dólares caiu menos que os tokens porque a maior parte do gasto, nos dois casos, veio de leitura de cache (cache_read_input_tokens), que é cobrada mais barato que tokens novos; o harness limpo ainda assim pagou mais no total porque precisou ler muito mais coisa para chegar à mesma pergunta.
O harness limpo respondeu, mas se autodeclarou incerto:
"Path físico da skill não achado em
~/.claude/skillsnem hub (…) só existe referência no agent file, sem SKILL.md local localizável.""Path físico não localizado via find em
~/.claude/skillsnem hub plugins, só existe entrada na lista de skills carregadas, sem arquivo SKILL.md achável nesta busca."
Ele não inventou um caminho falso. Isso importa, porque hallucination costuma significar "afirmar algo falso com confiança", não "admitir que não achou". Mas gastou 17 turns fazendo find em diretórios que não existiam neste projeto, porque não tinha um índice local para consultar, e terminou com dois terços da resposta marcados como não verificados.
O harness tunado respondeu direto, com evidência checável:
"Carrossel LinkedIn: skill
linkedin-carousel-generator(…) evidência: listagem de skills disponíveis (…) Thumbnail do blog: skilllemon-blog-generate-thumb, evidência:.agents/skills/lemon-blog-thumb-upload/SKILL.md."
Conferi as três citações depois da execução:
find . -iname "SKILL.md" -path "*linkedin-carousel-generator*"
# ./.agents/skills/linkedin-carousel-generator/SKILL.md
find . -iname "SKILL.md" -path "*lemon-blog-generate-thumb*"
# ./.claude/skills/lemon-blog-generate-thumb/SKILL.md
test -f .agents/skills/lemon-blog-thumb-upload/SKILL.md && echo existe
# existe
As três batem. A diferença não foi o modelo "saber mais". Foi o modelo não precisar adivinhar onde procurar.
O modelo é o mesmo nos dois lados. O que muda é quanto do trabalho é busca às cegas versus leitura direcionada. Um harness tunado reduz o espaço de busca de três formas mensuráveis neste teste:
.agents/skills/ e .claude/skills/ corta a maior parte das tentativas de find genérico.Nenhum desses três pontos exige um modelo mais forte. Exige que a informação local esteja onde o agente já sabe olhar.
O resultado não generaliza para "sempre configure tudo". Três casos em que o harness limpo é a escolha certa:
AGENTS.md especulativo tende a virar o problema descrito no item seguinte.Uma execução por condição não é significância estatística; é uma amostra. O teto de orçamento pode ter truncado comportamento em cenários mais longos. A tarefa escolhida favorece harnesses com índice de skills, porque é exatamente o tipo de pergunta que um índice resolve; uma tarefa de raciocínio puro provavelmente mostraria uma diferença menor. Reproduzir isso no seu próprio repositório, com sua própria tarefa recorrente, vale mais do que confiar nestes números fora de contexto.
claude -p --output-format json, mesma conta, mesmo modelo, mesmo dia, comandos reproduzidos acima.Free and paid products to turn ideas into a foundation you can actually ship.
11 products availableContinue exploring similar topics
# Context Engineering no Claude Code: CLAUDE.md, memória e contexto que não apodrece English summary: Context engineering is not about feeding Claude Code an ever-growing pile of

Quase todo time diz que está construindo agents, mas na prática entrega prompts longos com permissões demais. Este guia explica o que realmente define um agent, como projetar agents customizados com Claude Code e quando faz sentido evoluir para subagents, hooks, MCP, agent teams e Agent SDK.
A 47-point checklist to find bugs, security risks, and performance issues before launch.
Production-tested templates trusted by developers. Save weeks of setup on your next project.