Skip to content

fix: /bug não trava mais no cap de recuperação — red_check amarrado à reprodução + ledger de declarações de toda rodada - #57

Merged
elberrd merged 1 commit into
mainfrom
fix/fda-bug-red-gate-e-envelope-de-rodada-falha
Aug 25, 2026
Merged

fix: /bug não trava mais no cap de recuperação — red_check amarrado à reprodução + ledger de declarações de toda rodada#57
elberrd merged 1 commit into
mainfrom
fix/fda-bug-red-gate-e-envelope-de-rodada-falha

Conversation

@elberrd

@elberrd elberrd commented Aug 25, 2026

Copy link
Copy Markdown
Owner

O que muda

Diagnóstico do /goal travado no info-move em "limite obrigatório de recuperação do FDA eb0df857: 4/4". Pelo events.jsonl, duas das quatro recuperações morreram em red_check com "bug not reproduced" (14s, 0 tokens cada) e a quarta só existiu porque o run anterior fechou goal_met deixando 10 arquivos do próprio run sem commit. Dois bugs reais, com o mesmo código na main.

1. fda_bug: o gate one-way do red_check usava build.json como chave

O replay da prova RED só acontecia se phase_results/build.json existisse. Dois caminhos legítimos não têm esse arquivo:

  • builder que aplica o fix e reporta status=fail (fase falha não persiste resultado — foi o que aconteceu às 03:29: "implemented all planned M1 QA repairs, but 5 unrelated E2E failures remain");
  • verdict --redo build, que apaga o arquivo de propósito.

Nos dois, o teste focal passa (fix na árvore) e o run fecha como "bug not reproduced" — dead-end determinístico que consome uma recuperação a cada resume. rm verdict_history.json + "continue" (o que a FIA recomendou) repetiria o loop.

Fix: a prova é amarrada à reprodução, não a outra fase. red_check replay o resultado salvo quando red_test foi replayado (run.replayed antes/depois) e o proof_of bate com savedPhaseKey(red_test) (hash do resultado persistido); um red_test executado (--redo red_test) apaga a prova stale antes de validar, para uma validação que falhe nunca ser confundida com a prova antiga num resume posterior. Prova legada (sem binding) é aceita numa reprodução replayada. Tudo em gates.replayableRedProof + utils.savedPhaseKey.

2. Rodada de builder que falha perdia a declaração — e o commit deixava sobras

builderDeclaredFiles lia só phase_results/, que o runner escreve apenas em sucesso. O envelope da rodada falha declarava 17 arquivos (está no sqlite); a rodada seguinte declarou só os 9 que ela tocou; o commit levou 9 e deixou 10 como sujeira "do run" — que o orquestrador tentou reconciliar gastando o último verdict.

Fix: ledger imp/data/sessions/<id>/declared_files.json, escrito por agents.execute em todo envelope (gate failure e status=fail inclusos, antes do throw); builderDeclaredFiles une ledger + phase_results com o mesmo padrão de nome de fase. fda_bug passa a logar changed_by_run_but_uncommitted como os outros FDAs testados.

Verificação

  • npm test 1523/1523 + npm run lint limpos.
  • Novos: test/fia-bug-red-gate.test.js — runner real (Run + phaseParams) na mesma sequência do fda_bug: build falho após aplicar o fix → resume replay a prova e re-executa build; --redo build idem; --redo red_test valida a reprodução nova e a prova stale some para sempre; prova de outra reprodução nunca é replayada; tabela de decisão + savedPhaseKey. test/fia-declared-files-ledger.test.js — ledger, união no commit, pin de fonte no agents.mjs. Pins novos em fia-bug-repro-guard.
  • DOCS.md: exceções de replay do resume + higiene de commit.

Fora desta PR

O runtime do info-move (~alpha.20) continua com o bug até imp update após o publish; as 10 sobras lá são commitadas à mão (mesmo reparo já commitado em 2eb33a1, suíte verde com elas na árvore).

🤖 Generated with Claude Code

https://claude.ai/code/session_01MWuJUakJ2JzReCFE4vcHtt

… reprodução + ledger de declarações de toda rodada

Dois bugs vistos no info-move (sessão eb0df857: 2 das 4 recuperações
queimadas em 14s cada, 0 tokens, e a 4ª só existiu por sobras sem commit):

1. fda_bug: o gate one-way do red_check usava a existência de build.json
   como prova de "fix já aplicado". Builder que aplica o fix e reporta
   status=fail (fase falha não persiste resultado) e verdict --redo build
   (apaga o arquivo de propósito) deixam o fix na árvore sem build.json →
   o teste focal passa → "bug not reproduced". Agora a prova é replayada
   quando red_test foi replayado e o proof_of bate com
   savedPhaseKey(red_test); um red_test executado (--redo red_test) apaga
   a prova stale e revalida (gates.replayableRedProof).
2. builderDeclaredFiles lia só phase_results/ (escrito só em sucesso): a
   rodada que aplicou o reparo e falhou declarou 17 arquivos, a seguinte
   declarou os 9 que ela tocou, o commit levou 9 e deixou 10 como sujeira
   "do run". Ledger declared_files.json na sessão, escrito por
   agents.execute em TODO envelope (gate failure e status=fail inclusos) e
   unido em builderDeclaredFiles.

fda_bug também loga changed_by_run_but_uncommitted como os outros FDAs.
Testes: fia-bug-red-gate (runner real: build falho, --redo build,
--redo red_test, prova de outra reprodução), fia-declared-files-ledger e
pins em fia-bug-repro-guard. DOCS.md atualizado. 1523 verdes + lint.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MWuJUakJ2JzReCFE4vcHtt
@elberrd
elberrd merged commit afc72ee into main Aug 25, 2026
1 check passed
@elberrd
elberrd deleted the fix/fda-bug-red-gate-e-envelope-de-rodada-falha branch August 25, 2026 00:23
elberrd added a commit that referenced this pull request Aug 25, 2026
… declarações (#58)

Fecha o ciclo de release da PR #57: o gate do red_check amarrado à
reprodução e o ledger declared_files.json precisam de uma versão nova
para o npm publish.


Claude-Session: https://claude.ai/code/session_01MWuJUakJ2JzReCFE4vcHtt

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant