Pular para conteúdo

AUR-514 — A evidência completa do achado sobrevive à combinação de perfis

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

  • runProfilePasses (cmd/aurumcode/profiles.go) convertia cada achado de um perfil em reviewprofile.Finding com só RuleID, File, Line, Message e Severity; attributedIssues reconstruía o ReviewIssue a partir desses cinco campos. Com --perfis/review.profiles, Side, Impact, Evidence, Suggestion, Verification, ID, Origin e Assessment sumiam: um achado LEFT virava RIGHT e a evidência não chegava a nenhuma saída.
  • MergeFindings colapsava a duplicata no primeiro perfil e descartava o segundo sem rastro; a identidade ignorava o lado do diff.
  • Já existia (não refeito aqui): o parecer do PR (writeFindingsSection) e o comentário inline (formatInlineIssueForLanguage) já imprimiam impacto, evidência, correção e verificação rotulados pelo idioma (AUR-600/i18n); a redação desses campos na fronteira do modelo (redactReviewResult); o achado fora do diff como comentário geral (AUR-545), que não passa pela fusão.
  • Faltava no terminal: printFindings (--base) só imprimia arquivo:linha: [severidade] mensagem, o lado LEFT e a avaliação; nunca impacto, evidência, correção ou verificação, com ou sem perfis.

Decisão

  • reviewprofile.Finding ganha Side, Impact, Evidence, Suggestion, Verification, Ref (handle opaco do chamador) e AlsoFrom. O lado entra na identidade e na ordem (vazio = RIGHT). Numa duplicata (merge_detail.go), o primeiro perfil continua dono (contrato do AUR-502), o perfil posterior entra em AlsoFrom, um campo vazio é preenchido pelo posterior e uma evidência diferente é acrescentada, nunca descartada.
  • cmd/aurumcode/profile_findings.go: profileFinding converte todos os campos; attributedIssues reconstrói a partir do ReviewIssue original inteiro (originals[Ref], preservando ID, Origin, Assessment) e aplica o detalhe fundido. A atribuição é [perfil a] ou [perfil a; também: b, c].
  • cmd/aurumcode/finding_fields.go: writeFindingFields é o único escritor das quatro linhas rotuladas (- <rótulo>: <valor>), usado pelo terminal (printFindings, que passa a receber o idioma da revisão) e pela seção de achados do parecer, que mantém os mesmos bytes.
  • Severidade nunca muda; nenhuma rodada extra de LLM; campos presentes não viram prova de veracidade (Non-goals).

Documentação

  • docs/configuration.md (seção do gate, parágrafo de --perfis): descreve a fusão e o terminal. Varredura de texto desatualizado em docs/, README.md, docs/tutorials e demo/tutoriais: nenhuma página afirmava o comportamento antigo da fusão.
  • Saídas de tutorial que vão mudar (o terminal agora mostra o detalhe do achado) e devem ser regravadas no fluxo final, não aqui: demo/tutoriais/politica-central/expected/politica-local.txt, demo/tutoriais/agente/expected/hook-pre-commit.txt e os blocos de saída --base com achados de docs/tutorials/{revisao,gate,sast,politica-central,auditoria-sarif,skills,agente}.md.

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

  • AC-001: TestAUR514AC001ProfileMergeKeepsEveryField roda duas passagens reais de perfil (runProfilePasses, mesmo FakeProvider, logo todo achado é duplicata) sobre um diff com linha removida e adicionada; o achado LEFT mantém lado e os quatro campos e cita os dois perfis. TestAUR514AC001DuplicateKeepsTheLaterEvidence prova preenchimento pela duplicata, evidência dos dois perfis, ID e Assessment preservados. TestAUR514AC001SidesAreDistinctFindings: LEFT e RIGHT da mesma linha não colapsam.
  • AC-002: TestAUR514AC002TerminalAndPRShowTheSameFields confere, em pt-BR e en, as mesmas linhas no terminal (printFindings), no parecer (formatReviewDocument) e no comentário inline.
  • MUT-001: três mutantes que compilam apagam, um de cada vez, Evidence, Impact e Side de profileFinding; cada um precisa deixar o AC-001 vermelho com AUR-514 field lost, nunca por erro de build.

Correção da revisão estática

A atribuição [perfil a; também: b] saía de um literal em português; agora vem do catálogo (review.profile_attribution, review.profile_attribution_also) no idioma da revisão (ReviewContext.Language), com acentuação correta.