Przejdź do treści

Blog

Releasesv0.38.0

v0.38.0 — o loop pode ser medido, e avisa quando parou de chegar a algum lugar

This is the release note as published, not a rewrite of it. Release notes are published in the language they were written in.

Esta release quase não tem funcionalidade nova. Ela mexe no harness — tudo que existe em volta do modelo — depois de um estudo que cruzou quatro fontes independentes sobre engenharia de harness com uma auditoria do próprio Chimera.

Um parágrafo não conta mais como uma solução

Sem --verify, quem dava o veredito sobre uma execução era o Manager. Ele recebe (tarefa, resposta, contexto) — nunca vê o diff, nem a transcrição, nem um arquivo sequer, e não tem registro de ferramenta nenhum. Ou seja: o caminho padrão podia reportar sucesso para uma execução que leu um código, escreveu uma explicação convincente e não mudou nada.

Isso é exatamente a falha de patch vazio que o próprio código documentava ("SWE-bench run 1: 11/19 empty patches"), e estava alcançável por padrão.

Agora, quando nada foi verificado e nada mudou, isso é falha. Um verificador executável continua valendo mais que o diff — uma tarefa pode legitimamente passar sem tocar em arquivo — e um diff que não dá para medir é tratado como desconhecido, nunca como vazio.

Cada tentativa passa a registrar quem a aprovou: verifier, diff+manager, manager ou none. Um recibo que diz "sucesso" sem nomear a autoridade convida quem lê a supor a mais forte.

O loop agora sabe dizer quando parou de chegar a algum lugar

Duas coisas diferentes são chamadas de "problema de contexto". Rot acontece dentro de um passo só: a atenção se dilui num prompt longo. Drift acontece ao longo de uma trajetória — nenhum passo isolado tem problema, mas ao longo de dezenas de turnos a execução para de acumular e começa a girar.

O detector de ciclo que já existia olha uma janela deslizante de 12 chamadas e pega a versão apertada disso. Uma execução que revisita os mesmos três arquivos a cada vinte turnos atravessa essa janela sem disparar uma vez.

O detector novo compara a primeira metade contra a segunda — nunca um total, porque uma execução longa e produtiva se repete bastante e isso não é drift:

  • redundância — chamadas que re-derivaram uma tripla (ferramenta, argumentos, observação) que a execução já tinha. A observação entra na chave de propósito: ler → editar → ler é a mesma chamada com resposta diferente, e isso é progresso.
  • falha — taxa de erro subindo ao longo do caminho. Uma execução quebrada desde o passo um é outro problema, e não é sinalizada.
  • pós-compactação — redundância pulando logo depois que histórico foi descartado. Sinal próprio porque nomeia um mecanismo: o conserto é o payload de restauração, não a tarefa.

Verificado num loop real: o detector novo dispara no passo 12 de uma execução que o detector de ciclo deixa chegar até o fim como saudável.

Ele reporta e não age. Parar, re-planejar e forçar compactação são todas respostas plausíveis, e não há evidência de qual ajuda. Escolher uma agora seria embutir a suposição não-medida que este trabalho existe para evitar.

Contexto virou orçamento, e a compactação restaura o fio

Antes, estourar a janela era terminal (CONTEXT_OVERFLOW → aborta), o que fazia da janela — e não da dificuldade da tarefa — o teto real do agente.

O orçamento gasta uma fração da janela e compacta num gatilho abaixo dela, porque compactar também precisa de espaço. Ele nunca toca a mensagem de sistema (o prefixo estável em que todo o cache de prompt está ancorado), nunca deixa um resultado de ferramenta órfão da chamada, e restaura o que a execução precisa para continuar sendo ela mesma: o arquivo aberto, o plano, a lista de tarefas, o estado atual.

A nota padrão descreve o que caiu em vez de resumir. O agente pode reler um arquivo; ele não consegue desacreditar um resumo inventado.

Desligado por padrão — compactar descarta mensagens, e quem não pediu isso não deveria receber.

O que a execução custou, medido de verdade

Cada passo agora registra tokens de prompt e de resposta, latência, as ferramentas chamadas e se houve compactação. Não precisou de tokenizer: o provedor já reporta prompt_tokens por chamada, e esse número é o tamanho do contexto naquele passo.

Junto veio a taxa de acerto de cache — o número de custo mais útil que um loop produz, porque um token cacheado custa cerca de um décimo de um token novo, então duas execuções com contagem idêntica podem diferir ~10x no preço. Ela também é um sinal de projeto: despenca sempre que alguma coisa reescreve o começo do prompt, e não há outro sintoma. Um provedor que não reporta cache lê como desconhecido, nunca como erro.

E o trace finalmente é escrito. O gravador existia sem nenhum chamador — toda medição que o loop tomava morria com o processo. chimera solve e o endpoint do app agora gravam uma linha JSONL por execução em traces.jsonl.

O app pilota uma execução, não só dispara

Uma execução leva minutos e edita arquivos, então é claro que você navega para outro lugar — e o estado dela ia junto com a tela. O progresso sumia, o agente continuava trabalhando, e nada conseguia pará-lo.

Agora a execução vive acima da troca de telas: saia do Trabalho no meio e a transcrição ainda está lá quando você voltar, a barra de status nomeia a tarefa de qualquer tela, e o Parar funciona de todas.

O Parar fica desabilitado até o backend nomear a execução — mandar um cancelamento para um id que ainda não temos daria em nada enquanto a interface diria que parou — e permanece em "parando" até o quadro terminal chegar, porque o cancelamento é cooperativo. Um stream que quebra é registrado como quebrado, não como execução que falhou: a execução pode muito bem ainda estar correndo no backend, e dizer "falhou" seria um chute.

Aprovação humana finalmente alcançável pelo app

O envelope de human-in-the-loop está no núcleo desde o M13 e só era alcançável pela CLI — o próprio código registrava isso como pendência. O servidor podia, portanto, armar uma pausa que não tinha como responder.

Agora há um quadro paused no stream (distinto de done — uma pausa não chegou a veredito, e lê-la como falha descartaria em silêncio trabalho que está ali esperando para ser liberado), uma rota para listar execuções paradas antes desta janela existir, e as quatro ações: aceitar, aceitar editando, mandar orientação e tentar de novo, ou rejeitar.

Registrar o veredito não conclui a execução, e a resposta diz isso. Só uma das ações gasta outra tentativa, e a interface avisa antes do clique.

⚠️ Os instaladores não são assinados por autoridade certificadora: o Windows e o macOS avisam na primeira execução.

pip install --upgrade chimera-agent

🤖 Generated with Claude Code

Read the release on GitHub