Você provavelmente está medindo seu agente de IA errado (e como um grupo de comparação resolve isso)

Um detector determinístico de loops e um grupo de comparação cego — porque "nosso agente melhorou" é uma afirmação empírica que a maioria dos times acaba desmentindo sem querer.

A afirmação que ninguém sustenta

Todo produto de agente diz que deixa o modelo melhor. Quase nenhum prova. Não porque os agentes não melhorem — mas porque a medição está quebrada de um jeito sutil e específico.

Loops de estratégia são detectáveis sem LLM

Um loop de estratégia é a mesma classe de ação falhando repetidamente em alvos distintos — o agente editando três arquivos do mesmo jeito errado, ou repetindo a mesma correção que não funciona. Você não precisa de um modelo para perceber isso. Uma regra dura e auditável dá conta:

A mesma tentativa se repetiu pelo menos 3 vezes, em pelo menos 2 lugares diferentes, e a última delas deu errado.

Determinística, não manipulável. A classe vem de ferramenta + código de erro + mensagem normalizada; o alvo (arquivo/caminho) separa uma nova tentativa legítima de um loop de estratégia. É uma garantia anti-Goodhart: você não consegue afrouxar a regra para deixar seus números mais bonitos.

A armadilha: viés de seleção

Uma vez que você consegue detectar loops, o passo óbvio é intervir e medir. E a medição óbvia está errada: o detector só dispara em sessões difíceis, então "com intervenção" vs "sem intervenção" compara difícil contra fácil. Sua intervenção parece prejudicial. Você não lança nada — ou pior, remove um recurso que de fato ajudava.

Isso não se corrige depois, com estatística. Corrige-se na coleta.

A correção: um grupo de comparação cego

No instante da detecção — o único momento em que os dois grupos são comparáveis — atribua o loop a treated ou holdout:

A atribuição é determinística — hash(run | assinatura) — porque a detecção pode rodar mais de uma vez ao longo de uma sessão; um sorteio aleatório colocaria o mesmo loop em grupos diferentes a cada rodada e apodreceria a amostra.

Julgue os dois grupos com a mesma régua

O grupo tratado tem um sinal natural de sucesso; o de comparação não tem nenhum. Comparar "o veredito da intervenção" com "o que quer que tenha acontecido na comparação" é comparar instrumentos diferentes. Então leia o resultado do próprio fluxo de eventos, nos dois grupos: ≥3 falhas da mesma classe após a detecção → recorreu; um sucesso com a mesma ferramenta em um alvo onde ela vinha falhando → quebrou o loop. Esse resultado comparável é a métrica. O ganho é a taxa de quebra no grupo tratado menos a taxa de quebra no grupo de comparação.

Por que não simplesmente perguntar a um LLM se ele está em loop?

Um LLM dá um palpite plausível, não uma regra; muda de resposta a cada rodada; não tem memória da semana passada; e rodá-lo a cada ação é absurdamente caro. Use regras determinísticas baratas para observar continuamente, e gaste o modelo só no momento raro e decisivo em que um loop real é confirmado.

O hook

Construímos isso sobre hooks do editor: um arquivo de configuração mais um script Node sem dependências. Fail-open (nunca bloqueia o editor), dormente sem token, e envia apenas nome da ação, alvo e resultado — nunca o seu código. Em um loop confirmado, ele injeta a provocação de volta na conversa.

O que aprendemos usando em nós mesmos

Chamadas repetidas de leitura/busca disparavam o detector — falsos positivos de navegação. Um loop de estratégia real exige ações executivas (edições, execuções, comandos), não o agente apenas olhando em volta. Então ferramentas somente-leitura deixaram de contar como tentativas. A coisa que mede a coisa pegou a si mesma.

Onde estamos

Estamos coletando dados agora e — em plena transparência — ainda não temos números de ganho. Vamos publicar taxas de loop e o ganho medido com o tamanho da amostra junto, nunca uma razão sem um n. Compartilhamos o método agora porque o desenho da medição é a parte que vale ser testada em público.