← Voltar ao Blog

arXiv 2603.25723: 6 campos de Harness formalizados, mapeei meu harness-ops

Até semana passada eu descrevia o que o meu harness-ops faz com uma frase do tipo “cron chama Claude Code CLI que lê uns markdowns e decide o que postar.” Funciona como pitch, mas é o tipo de descrição que me faz passar vergonha quando alguém pergunta “e como você compara isso com o de outro time?”. Não sei. Nunca medimos a mesma coisa.

Em março de 2026, Pan et al. publicaram arXiv 2603.25723 — Natural-Language Agent Harnesses. O paper faz uma coisa chata e útil: define, em uma frase da Section 3.1, os 6 campos que descrevem uma harness em linguagem natural. Com os 6 nomes na mesa, duas harnesses viram comparáveis mesmo quando o código embaixo é totalmente diferente.

Peguei meu ~/repos/harness-ops e tentei mapear as 4 camadas (Observer, Strategist, Marketer e o Evolver que roda em cron à parte) contra os 6 campos do paper. Cinco encaixaram sem ginástica. Um ficou vazio. E dois dos oito módulos opcionais que o paper testa na Table 5 pioraram o benchmark — reforçando a tese de que “mais harness” não é “melhor harness”.

Os 6 campos de uma NLAH mapeados contra meu harness-ops

O que o paper realmente diz na Section 3.1

A frase-chave, verbatim do paper (traduzo abaixo):

The third layer is the NLAH: the natural-language policy document that describes the stages, roles, state rules, verification rules, recovery rules, and stopping conditions of a task run.

Em português, os 6 campos são:

  1. Estágios (stages) — as fases nomeadas do run. O paper sugere nomes como inspect, plan, edit, verify, recover, finalize.
  2. Papéis (roles) — o que cada agente é. Não “o que faz”: o contrato de responsabilidade.
  3. Regras de estado (state rules) — onde o estado vive entre passos e quem pode reabrir qual artefato.
  4. Regras de verificação (verification rules) — que evidência precisa aparecer antes do próximo passo rodar.
  5. Regras de recuperação (recovery rules) — como classificar uma falha e o que muda no retry.
  6. Condições de parada (stopping conditions) — quando declarar sucesso, falha, ou “orçamento esgotado”.

A escolha dos nomes é mais importante do que parece. Antes de ler o paper, eu misturava livremente “estágios” com “papéis” e tratava “regras de recuperação” como um sub-item de “regras de verificação”. A separação formal expõe lacunas que a prosa confortável esconde.

Por que isso vale 20 minutos de leitura

Pan et al. não estão vendendo IHR (Intelligent Harness Runtime, o executor próprio deles). O paper deixa isso explícito: a parte portável é a especificação em linguagem natural, não o runtime. A separação importa porque significa que você pode adotar o esqueleto dos 6 campos no seu Claude Code / Cursor / Codex sem trocar nada da infra.

O número que mais me chamou atenção é da Table 2: para a família Live-SWE-Agent, a política auditável do harness caiu de 60,1k tokens de código-controller para 2,9k tokens de NLAH. Para MHTBA (Meta-Harness para Terminal-Bench 2.0), caiu de 10,5k para 0,8k. É um fator >20× de compressão sem perda de desempenho — IHR-executed NLAH chegou a 73,0 em Live-SWE, enquanto o code harness original ficou em 67,0 (Table 1).

Traduzindo: a maior parte do “código de harness” não é mecanismo, é política escrita em linguagem natural fingindo ser if/else. Quando você escreve a política em prosa, o código residual é só o mínimo irredutível (parsers, sandboxing, chamadas de ferramenta).

O mapa do meu harness-ops: 5 encaixaram, 1 ficou vazio

Isso é o que eu encontrei quando sentei com o paper aberto do lado direito e tree ~/repos/harness-ops do esquerdo.

Campo da NLAHOnde vive no harness-ops
EstágiosCada <domain>-cycle SKILL.md ordena Observer → Strategist → Marketer; Evolver roda num cron separado (sábados 09:00)
Papéisdomains/<name>/strategy.md separa Observer/Strategist/Marketer/Evolver dentro das 4 funções (Build, Market, Observe, Strategize) do CLAUDE.md
Regras de estadodomains/<name>/data/*.jsonl + core/data/evolution-counter.txt com flock
Regras de verificaçãocore/factcheck-gate.sh + factcheck-approved.jsonl bloqueiam publish-*.sh se CRITICAL>0
Regras de recuperaçãovazio — cada script resolve retry do seu jeito, sem política uniforme
Condições de paradaEvolver: diff20行 / 週2提案 / 3週連続却下でmute (do CLAUDE.md)

A primeira reação foi “legal, 5 de 6, bati 83%.” A segunda reação foi “espera, o que exatamente eu faço quando um dos ciclos falha às 03h?” A resposta honesta: depende de qual script quebrou, e cada um resolve de um jeito. Alguns morrem silenciosamente. Alguns mandam Telegram. Alguns deixam partial state em jsonl que o próximo run tenta digerir. Nenhum classifica a falha.

Isso é exatamente a lacuna que o campo recovery rules nomeia. Antes eu teria chamado de “resiliência” ou “o retry está meio capenga” — frases que não permitem medir nada. Agora tem nome e tem lugar na política.

O detalhe inconveniente da Table 5

O paper não para em “6 campos existem.” A Table 5 testa 8 módulos opcionais que você pode adicionar à sua NLAH, e mostra o efeito sobre dois benchmarks (SWE Verified e OSWorld).

Dois módulos pioraram o resultado:

  • Multi-candidate search: -1,60 em SWE Verified. O número de agent calls saltou de 1,1 para 5,7, mas o resultado caiu. Mais busca, menos acerto.
  • Context compression: -1,00 em SWE Verified e -8,30 em OSWorld. É o pior resultado da tabela. O resumo “inteligente” do contexto piora as duas tarefas de uma vez só.

O terceiro módulo problemático é mais sutil: markdown memory deu +5,60 em OSWorld e -2,80 em SWE Verified. Útil para computer-use, nocivo para coding. É um “depende” que não vive bem num listão de boas práticas para “o seu agente.”

A conclusão que levei para o harness-ops: antes de adicionar um módulo porque li num blog da LangChain, ler qual benchmark Pan et al. usaram para julgar aquele módulo. Dos ciclos que eu já rodo, o único que seria candidato a “multi-candidate search” é o Evolver — e o paper me acabou de dizer que isso custa 5× mais agent calls para perder 1,6 ponto. Deu certo em não ter construído.

O que eu vou mudar essa semana

Três mudanças pequenas, uma por vez.

Primeiro, criar core/recovery-policy.md como o 6º arquivo canônico da harness-ops e começar com dois estágios: “ignorar e seguir” vs “parar o ciclo e notificar.” É menos do que o paper descreve, mas é algo que pode ser lido na segunda-feira de manhã quando um cron de domingo deu ruim.

Segundo, renomear mentalmente os blocos do strategy.md para os campos do paper. Isso não é um rename de arquivo — é vocabulário. Daqui a seis meses, se eu ou qualquer outra pessoa olhar para harness-ops, “regras de verificação” vai apontar sem ambiguidade para o factcheck-gate.sh, enquanto “o retry está meio capenga” vira discussão filosófica no Slack.

Terceiro, não adicionar context compression. Até num experimento. O paper já fez por mim.

O que isso não resolve

Falar em “6 campos” não transforma uma harness ruim em boa. O paper é um mapa, não um motor. A Table 4 mostra que o próprio IHR tem Information Handoff Recall de 0,322 em Live-SWE quando a execução passa por parent-child agents — ou seja, o handoff perde dois terços da informação que o prompt direto preservaria. Mesmo o autor da taxonomia admite que o próprio runtime ainda vaza nos cantos.

É um começo, não um fim. E para quem (como eu) chamava a própria harness de “o setup” uma semana atrás, começar com nomes certos já é uma mudança não trivial.

A versão original em inglês deste raciocínio, com um ângulo mais pessoal sobre vocabulário de time, está em arXiv 2603.25723 “Natural-Language Agent Harnesses”: 4 Patterns + 3 Anti-Patterns After 12 Weeks in Prod — se seu inglês de leitura técnica estiver afinado, leia os dois lados.

E se o conceito de “6 componentes” soar familiar, é porque eu já escrevi sobre uma taxonomia próxima, do Next Signal Prediction, em Prompt morreu, Context está morrendo: Harness Engineering é a próxima onda. Os dois recortes são compatíveis: Pan et al. é o acadêmico (o que precisa estar na política); NSP é o prático (quais arquivos materializam essa política).

Referências


Se você quer o passo-a-passo com AGENTS.md, CLAUDE.md, skills e hooks mapeados aos 6 campos, montei o guia completo em Guia Prático de Harness Engineering: do uso ao controle da IA.


ken imoto · WebRTC & Voice AI engineer · kenimoto.dev · TabNews

Harness Engineering Livro relacionado Harness Engineering Tutorial de Harness Engineering | design de AGENTS.md · implementação de hooks · operação de agentes de IA Ver a página do livro →