chimera-carry-the-failure-forward
Um loop de retry que sobrescreve sua variável de feedback mostra à tentativa 3 apenas a falha da tentativa 2 — então ela re-deriva o patch que a tentativa 1 já testou.
Conferida por quem revisou e leu o cartão, não reivindicada pelo próprio arquivo. Um cartão que o agente destila durante uma execução que consumiu conteúdo não confiável nasce contaminado e fica retido para revisão antes de alguma vez ser recuperado.
Quando ele vem à mente
- escrevendo um loop de retry
- o agente insiste na mesma correção
- devolvendo a saída do verificador ao modelo
- as tentativas falham sempre igual
- revertendo o workspace entre tentativas
Evite e Verifique são onde costuma estar o valor. Faça é a seção que todo mundo escreve.
O corpo do cartão acima é uma tradução. O original em inglês é o que a CLI importa, o que o agente lê em execução e o que o hash abaixo atesta.
Gatilho
Você tem um loop que roda uma tentativa, a julga, e roda outra com feedback: um agente com um verificador, um corretor de código contra uma suíte de testes, um pipeline de gerar-e-conferir. O orçamento é de mais de duas tentativas, e o workspace é revertido entre elas, de modo que cada tentativa começa limpa.
Não se aplica a um retry idempotente sobre um transporte instável — uma chamada de rede que falhou por razões sem relação com o que você enviou. Ali não há nada a aprender com a tentativa 1, e carregá-la adiante é só payload.
Faça
- Guarde as tentativas em uma lista, não em uma variável que você reatribui. Um registro por tentativa: a saída do verificador, o patch que a tentativa de fato escreveu, e qual passo de tool falhou primeiro.
- Tire o patch do snapshot do workspace, antes da reversão — o diff de verdade, não a descrição que o modelo deu do que mudou. A reversão é o que torna isso necessário: uma vez que a árvore volta atrás, nada em disco registra o caminho errado tampouco, então a próxima tentativa não tem obstáculo nenhum para re-derivar o mesmo caminho.
- Componha o prompt de retry a partir de todos os registros, do mais antigo para o mais novo, cada um rotulado com o número da tentativa e seu veredito, sob um cabeçalho que diga que essas já foram tentadas e revertidas.
- Limite cada registro. O Chimera trunca um diff realimentado em 2000 caracteres e marca o corte; um histórico de três tentativas sem limite vai dominar o prompt.
- Deduplique por assinatura de falha. Se duas tentativas falharam do mesmo jeito, mantenha uma e registre que aquilo se repetiu — a repetição é o sinal, a segunda cópia não é informação nova.
- Quando a assinatura se repetir, pare de acrescentar e mude algo estrutural: replaneje com as
causas acumuladas como contexto do planejador (
TaskLedger.context()as renderiza sob "Why earlier attempts failed (do NOT repeat these):"), ou escale para um modelo mais forte. Mais feedback sobre o mesmo beco sem saída não sai do beco sem saída. - Emita um evento contável a cada vez que você injeta histórico, para que um braço de benchmark consiga provar que a injeção sequer disparou.
Evite
A sobrescrita. Em chimera/core/autonomous.py o feedback do loop é reconstruído a cada rodada:
feedback = "\n\n".join(p for p in (fb, _verify_fb) if p) or "The attempt did not pass verification."
de modo que a tentativa 3 é composta com a falha da tentativa 2 e nada da tentativa 1. Carregar a falha adiante significa acrescentar a uma estrutura em vez disso — esboçado, não citado, porque a versão que acumula é o que este card defende, e não o que o arquivo faz hoje:
records.append(record_for(index, verdict, patch)) # one entry per attempt
feedback = render(records) # every attempt, oldest first
Seja preciso sobre qual metade já existe quando você ler isto dentro do Chimera: o conteúdo do
feedback está bem coberto — --diff-feedback mostra ao retry o patch que ele de fato escreveu
(chimera/core/autonomous.py, limitado por _DIFF_FEEDBACK_MAX_CHARS = 2000), e o TaskLedger
acumula causas para o planejador. O que não está coberto é o acúmulo entre tentativas na linha
acima. Um card que apresentasse tudo isso como faltante estaria argumentando contra trabalho já
feito.
Evite também dizer ao retry que ele falhou sem mostrar o que ele escreveu. "The attempt did not pass verification" mais um teste falhando é o bastante para fazer um modelo tentar de novo e não é o bastante para fazê-lo tentar algo diferente — o patch errado é invisível para ele e o workspace não o contém mais, então re-derivá-lo é o caminho de menor resistência.
E evite carregar só a prosa do gerente e descartar a saída do verificador. O assert que falha é a linha mais acionável do loop inteiro; um parágrafo de um revisor sobre ele é uma paráfrase com estritamente menos informação.
Verifique
Instrumente o compositor, rode uma tarefa que você sabe que falha três vezes, e faça um grep no prompt da tentativa 3 atrás de uma string que só existe na tentativa 1 — um arquivo que ela tocou, um identificador do diff dela. Presente ou ausente; não há crédito parcial.
Segunda checagem, igualmente binária: conte as injeções. Uma execução em que o histórico nunca foi montado porque a guarda estava errada, ou porque a lista de diffs estava vazia, não mediu nada — e um braço de benchmark construído sobre isso mede o encanamento, não a ideia. Se o contador marcar zero, o resultado é nulo, não importa o que a taxa de sucesso diga.
Risco
Ancoragem é a contra-hipótese registrada, não uma hipótese vaga: mostrar a um modelo o patch errado
pode fixar a atenção dele naquele patch e produzir variações de uma abordagem morta em vez de uma
abordagem diferente. É por isso que o comportamento é opt-in e medido no Chimera
(--diff-feedback), em vez de ligado por padrão. Trate isso como uma afirmação a testar nas suas
próprias tarefas, não como uma melhoria estabelecida.
O segundo custo é o orçamento de contexto. Três diffs, três dumps de verificador e uma revisão do gerente podem empurrar o prompt além do limiar de compactação — e aí um compactador sem restauração vai descartar exatamente o histórico acumulado que você pagou para construir. Limite os registros e conheça o seu orçamento antes de ligar isso, ou os dois mecanismos vão brigar e o sintoma visível não será nenhum dos dois.
Como usar
O cartão é dado. Clone o repositório e importe pelo caminho — o que chega pela rede é tratado como contaminado e fica retido para aprovação, que é o comportamento desejável e a razão de não haver um instalador de uma linha aqui.
git clone https://github.com/brcampidelli/chimera-agent.gitchimera skills-import chimera-agent/skills/chimera-carry-the-failure-forward/SKILL.mdIntegridade
SHA-256 do arquivo como publicado. Quem importa pode conferir que o que recebeu é o que esta página mostrou.
62dcc2aa830e5eb35c554bebf2c1a24454a054bf17bf152ccd59f3497b5e043d