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 aresult.Issuessem 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):Applyagrupa 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;AlsoFromrastreia as fontes fundidas. Sem corte por contagem. A preferênciaCollapseagrupa 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 emreviewRepositoryFields(a apresentação é escolha do repositório e nunca muda o que conta).cmd/aurumcode/pr_presentation.go: o--prpublica (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--checkcontinuam lendoresult.Issues/p.issuesda 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) eTestAUR454PublishedBodyExplainsMergeAndCollapse(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,TestReviewPresentationCollapseValidatese 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,
BlockingFindingsfica vazio ecollapse: [error]agruparia achadoserror.collapseAlloweddesliga 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).