Pular para conteúdo

AUR-603: achado bloqueante do modelo passa por verificação adversarial

Medido antes

Na PR #112 (lote dev -> main, 2026-10-08) a autorrevisão bloqueou a cada rodada com achados do modelo que o código refuta. Exemplo: "Validate chamado sem guarda de nil" (internal/config/config.go:365/368), quando os dois métodos começam com if c == nil { return nil }. O achado citava a skill de falha fechada com severidade error, e o gate reprovava. Não havia nenhum passo entre a resposta do modelo e o gate que conferisse a afirmação contra o código.

O que mudou

  • internal/review/verify (pacote novo): Verifier.Verify envia ao verificador cada achado do modelo (Origin vazio, sem Assessment) que bloquearia. A janela da linha citada e as ocorrências dos símbolos que o achado nomeia (declarados, segundo a gramática, em arquivos do mesmo diretório) são lidas da revisão revisada (tools.Revision). A resposta JSON {"verdict","reason","quote"} é lida com veredito fechado. Só refuted com citação não vazia, presente literalmente num arquivo mostrado (normalizando só CRLF e espaços no fim da linha), rebaixa o achado. Qualquer outro desfecho mantém o bloqueio, com o motivo registrado: confirmed, uncertain, quote_not_found, invalid_answer, provider_error, call_limit ou source_unavailable.
  • internal/prompt/templates/verify.md + BuildVerificationPrompt: o prompt próprio do verificador. Ele não pode criar achado nem mudar severidade.
  • internal/config: review.verification (enabled, padrão ligado; max_calls, padrão 8, negativo recusado em Load), classificado como escolha do repositório na governança.
  • cmd/aurumcode: runGate chama verifyModelFindings antes do pipeline. "Bloquearia" (modelFindingBlocks) é --fail-on, a decisão do próprio gate.EvaluateGate sobre o achado isolado, com exceções, ou, sem gate, error/warning. O chamador é o orquestrador da revisão, então o custo conta no --limite. O achado refutado sai de result.Issues (gate, --fail-on, contagem sem gate) e vira sugestão não bloqueante "Refutado pela verificação", limitação marcada, linha no stderr e entrada da chave verification da auditoria. O mantido é dito no stderr com o motivo. Os textos estão no catálogo i18n (pt-BR e en).
  • Os testes que contam as chamadas do provedor (AUR-524 e AUR-553, via aur524GateConfig) desligam review.verification, porque medem a chamada da própria revisão. O provedor offline grava o prompt de verificação em <captura>.verificacao, ao lado da captura. Assim a captura continua sendo o prompt da revisão (tutoriais memoria, skills e qualquer-linguagem; AUR-432/593), e o prompt da verificação também pode ser observado.
  • Tutorial revisao, caso achado-refutado: a refutação com citação literal aprova e audita; a citação parafraseada reprova (exit 3).

Prova

Cenário realista: internal/review/verify/testdata, com o achado do modelo de revisão (review-finding.json) e as respostas do verificador (literal e parafraseada) sobre o código Validate com guarda de nil.

Item Teste Comando
AC-001 TestAC001RefutedWithLiteralQuoteIsDemotedAndRecorded, TestVerificationDemotesRefutedModelFindingBeforeTheGate bash tests/acceptance/AUR-603.sh AC-001
AC-002 TestAC002RefutedWithQuoteNotInRevisionKeepsBlocking, TestAC002TrailingSpacesAreTheOnlyForgivenDifference, TestVerificationKeepsBlockingWhenTheQuoteIsNotTheCode ... AC-002
AC-003 TestAC003EveryOtherOutcomeKeepsBlocking ... AC-003
AC-004 TestAC004DeterministicFindingsAreNeverSent, TestVerificationDemotesRefutedModelFindingBeforeTheGate ... AC-004
AC-005 TestAC005NonBlockingFindingsAndTheCeiling, TestVerificationDisabledSendsNothing, TestReviewVerificationDefaultsAndValidation ... AC-005
MUT-001 quoteFound aceita qualquer citação não vazia: TestAC002... cai ... MUT-001
MUT-002 erro do provedor rebaixa: TestAC003... cai com Outcome:refuted Demoted:true ... MUT-002

Saída de bash tests/acceptance/AUR-603.sh all (go-shared):

AUR-603/AC-001/pass
AUR-603/AC-002/pass
AUR-603/AC-003/pass
AUR-603/AC-004/pass
AUR-603/AC-005/pass
--- FAIL: TestAC002RefutedWithQuoteNotInRevisionKeepsBlocking (0.00s)
AUR-603/MUT-001/rejected
--- FAIL: TestAC003EveryOtherOutcomeKeepsBlocking (0.00s)
AUR-603/MUT-002/rejected
AUR-603/all/pass

Tutorial: AURUMCODE_TUT_IMAGE=aurum-tutoriais:aur603 bash demo/tutoriais/revisao/run.sh all e --check em todos os tutoriais.

Limites

  • Sem checkout git da revisão revisada (--pr com checkout não verificado, raiz sem .git), nada é verificado e o stderr diz por quê: o achado continua bloqueando.
  • O resultado da verificação não entra em cache. Um achado servido do cache por arquivo é verificado de novo, com uma chamada nova.
  • As ocorrências dos símbolos são buscadas só no diretório do arquivo citado. Uma definição em outro pacote não é mostrada, e a citação dela não conta.