
Testes com Jev em 100 chamadas reais expõem falhas de avaliação de agentes
O teste: 100 chamadas reais, quatro rótulos
A equipe do Archestra avaliou o Jev, um classificador rápido do tipo "System 1", ao lado de Sonnet 5 e de vários modelos de pesos abertos, em 100 chamadas reais de ferramentas extraídas de sessões de produção do Claude Code. O trabalho faz parte do pipeline de anotação do OpenAPPA, que usa Information Flow Control (IFC): se um agente lê dados internos, a sessão se torna interna e esses dados não podem ir a destinos públicos. Para ferramentas dinâmicas como bash e integrações MCP, um classificador rotula em tempo de execução cada chamada em quatro dimensões: delta_audience (quem vê a saída), delta_trust (se a saída é confiável), requires_audience e requires_trusted (condições para a chamada rodar).
Como o classificador fica em uma fronteira de segurança, um falso negativo pode permitir vazamento de dados - os erros não custam o mesmo. Bloquear uma chamada segura (falso alarme) é incômodo; permitir uma chamada perigosa pode expor dados.
A armadilha da constante de 79%
Como 79% das chamadas em traces reais de desenvolvedores são rotineiras e locais (git status, cargo test, cat package.json), um classificador fixo que sempre responde "benigno" já atinge 79% de acerto. Um modelo com 75% é pior que esse baseline trivial. Os casos difíceis são os raros: enviar mensagem no Slack (saída pública, mas entrega dados internos), referências opacas como IDs hexadecimais sem contexto semântico, e buscas externas como WebSearch, que enviam a consulta para fora do perímetro - se a sessão já estiver contaminada por injeção, a query pode exfiltrar contexto sensível.
Resultados e validação dos juízes
Com 400 decisões (100 chamadas × 4 rótulos), os resultados reportados cobrem as 337 decisões em que três famílias de juízes independentes e cegos - Claude Opus, GLM 5.3 Flash e Gemini 3.8 Flash - concordaram. As 63 restantes expuseram lacunas na especificação dos autores (leitores externos, IDs opacos, metadados de ferramenta), não erros aleatórios dos juízes.
Sonnet 5 liderou com 98% zero-shot, 5 a 6 pontos à frente do Jev (93% zero-shot, 95% com 9 exemplos). Opus não mostrou preferência por outro modelo Claude (−0,1 ponto no conjunto compartilhado). O autoavaliação enviesou: modelos deram 2 a 3 pontos a mais a si mesmos; o Gemini se atribuiu 100% de concordância. A lição dos autores: não deixe um modelo corrigir o próprio dever de casa.
Entre os abertos: Bespoke-Nimble-9B fez 83%/86%; SemIf (Qwen3.5-4B) foi de 63% para 84% com exemplos; o reranker Qwen3-Reranker-4B, 64%/75%; SemIf MiniCPM-2B, 54%/80%; e Laya (ModernBERT-421M), 48%/46%, embora com recall de recusa de 100% só porque classificou tudo como perigoso (12% de precisão).
Modos de falha específicos
Sonnet 5 pegou operações de escrita óbvias, mas perdeu todas as cinco buscas externas do rótulo requires_trusted, tratando busca como leitura inofensiva - todos os seus oito erros no conjunto estrito foram vazamentos (leaks). O reranker 4B cometeu o oposto: em 65 chamadas rotineiras rotulou a saída como "self", restringindo demais o uso posterior. MiniCPM-2B gerou 80 vazamentos, classificando 58 leituras de arquivos internos como públicas.
Zero-shot, os pequenos decodifiers aprenderam a posição da opção, não a tarefa: Qwen 0.6B sempre escolheu A; MiniCPM-2B sempre a última. Exemplos no contexto elevaram os decodifiers em 20 a 34 pontos, mas não ajudaram o encoder Laya. As pontuações de confiança da maioria dos abertos foram inúteis (probabilidades separadas por apenas 0,05 a 0,10), enquanto o Jev não errou nenhuma previsão com confiança ≥ 0,7 - o que torna roteamento por confiança prático.
Estabilidade do Jev
Em cinco execuções seguidas, os rótulos do Jev foram majoritariamente estáveis (394 a 398 de 400 idênticos em repetições), mas as probabilidades flutuam: apenas 35% a 39% foram bit-idênticas no mesmo payload, com variação de até 0,17. A sensibilidade à ordem das opções ficou isolada nos rótulos de três vias (delta_audience, requires_audience): cerca de 4 em 100 decisões mudam só por reordenação, custando 1,5 a 2 pontos de acerto. A maioria das viradas ocorreu em quase-empates, mas houve um caso de 0,83 (internal) indo a 0,48 (public).
Conclusões para produção
A descoberta mais útil, segundo os autores, foi que o benchmark original era ruim: a amostragem aleatória produziu ~90 casos rotineiros e apenas 10 perigosos, permitindo boas notas rotulando quase tudo como benigno. Eles recomendam desconfiar de resultados públicos de benchmark em tarefas fora de distribuição, inspecionar erros individualmente, depurar o harness de avaliação com modelos fracos de propósito, e nunca aprovar um modelo para uma fronteira de execução olhando só o número agregado - o score não mostra se o modelo falha de forma segura. O Jev, respondendo em cerca de 300 ms e barato, se mostra um roteador promissor: casos claros no caminho rápido, incertos escalados para modelo maior ou revisão humana.