Pular para conteúdo

AUR-454 — O review consolida ruído e respeita preferências explícitas

Medido antes (leitura do código em stream/B)

  • Já existia: a fusão de perfis (AUR-502, preservando campos pelo AUR-514); a fusão de lotes (internal/review/batch_merge.go, que só concatena); a regra de bloqueio da execução (internal/review/blocking, AUR-600); o filtro do marcador de redação (AUR-598); o achado fora do diff como comentário geral (AUR-545); a não repetição entre rodadas (AUR-494).
  • Faltava: no --pr, modelo, análise estática (runStaticAnalysis), passagem de segurança e scanners (joinScanners) acrescentam a result.Issues sem consolidação; o mesmo problema na mesma linha saía como dois comentários. Não havia preferência de apresentação.

Decisão

  • internal/review/consolidate (novo): Apply agrupa por arquivo, linha, lado e regra; a ocorrência mantida é a determinística (com origem) quando há, sobe para a maior severidade do grupo, junta as evidências distintas e preenche impacto, correção e verificação vazios; AlsoFrom rastreia as fontes fundidas. Sem corte por contagem. A preferência Collapse agrupa achados não bloqueantes das severidades declaradas; Blocking (a regra da execução) nunca é agrupado.
  • internal/config/presentation.go: review.presentation.collapse, validado (info, warning, error); campo do repositório em reviewRepositoryFields (a apresentação é escolha do repositório e nunca muda o que conta).
  • cmd/aurumcode/pr_presentation.go: o --pr publica (corpo e comentários) os achados consolidados com as fontes no texto e explica em "Consolidação e preferências" quantas ocorrências foram fundidas e quais achados foram agrupados. Gate, evento formal e status de --check continuam lendo result.Issues/p.issues da execução: consolidar não aprova nada.
  • Textos no catálogo internal/i18n (review.presentation_*).

Desvio de paths do card

internal/i18n/catalog.yml (textos) e docs/configuration.md (linha da tabela de chaves de review) ficam fora dos paths declarados.

Fora do escopo

O terminal --base continua listando cada ocorrência; a correlação entre regras diferentes de um mesmo defeito (correlates_with da avaliação do modelo) não funde achados.

Como cada cenário é provado (tests/acceptance/AUR-454.sh)

  • AC-001: TestAC001TwoPassesSameDefectPublishedOnce (um achado, determinístico, severidade maior, as duas evidências, fonte rastreável) e TestAUR454PublishedBodyExplainsMergeAndCollapse (fontes no texto, pt-BR e en).
  • AC-002: TestAC002DistinctProblemsStayDistinctNoCountCut (outra regra e outro lado na mesma linha seguem distintos; 203 achados distintos, 203 publicados).
  • AC-003: TestAC003CollapseIsDeterministicExplainedAndNeverHidesBlocking, TestReviewPresentationCollapseValidates e o teste do corpo (cada achado agrupado nomeado; sem preferência, nada muda).
  • MUT-001: dois mutantes que compilam: chave única por ocorrência (sem consolidação: AC-001 vermelho, AUR-454 duplicate kept) e identidade sem a regra (funde problemas diferentes: AC-002 vermelho, AUR-454 distinct problems merged).

Correções da revisão estática

  • Com gate declarado e inconclusivo, BlockingFindings fica vazio e collapse: [error] agruparia achados error. collapseAllowed desliga a preferência quando a execução é inconclusiva ou o gate reprova sem achado bloqueante nomeado. Prova: TestAUR454InconclusiveGateCondensesNothing (no AC-003).
  • A fonte "modelo" das ocorrências fundidas vem do catálogo (review.presentation_model_source).