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 emreviewprofile.Findingcom sóRuleID,File,Line,MessageeSeverity;attributedIssuesreconstruía oReviewIssuea partir desses cinco campos. Com--perfis/review.profiles,Side,Impact,Evidence,Suggestion,Verification,ID,OrigineAssessmentsumiam: um achadoLEFTviravaRIGHTe a evidência não chegava a nenhuma saída.MergeFindingscolapsava 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ó imprimiaarquivo:linha: [severidade] mensagem, o ladoLEFTe a avaliação; nunca impacto, evidência, correção ou verificação, com ou sem perfis.
Decisão
reviewprofile.FindingganhaSide,Impact,Evidence,Suggestion,Verification,Ref(handle opaco do chamador) eAlsoFrom. 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 emAlsoFrom, um campo vazio é preenchido pelo posterior e uma evidência diferente é acrescentada, nunca descartada.cmd/aurumcode/profile_findings.go:profileFindingconverte todos os campos;attributedIssuesreconstrói a partir doReviewIssueoriginal inteiro (originals[Ref], preservandoID,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 emdocs/,README.md,docs/tutorialsedemo/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.txte os blocos de saída--basecom achados dedocs/tutorials/{revisao,gate,sast,politica-central,auditoria-sarif,skills,agente}.md.
Como cada cenário é provado (tests/acceptance/AUR-514.sh)
- AC-001:
TestAUR514AC001ProfileMergeKeepsEveryFieldroda duas passagens reais de perfil (runProfilePasses, mesmoFakeProvider, logo todo achado é duplicata) sobre um diff com linha removida e adicionada; o achadoLEFTmantém lado e os quatro campos e cita os dois perfis.TestAUR514AC001DuplicateKeepsTheLaterEvidenceprova preenchimento pela duplicata, evidência dos dois perfis,IDeAssessmentpreservados.TestAUR514AC001SidesAreDistinctFindings:LEFTeRIGHTda mesma linha não colapsam. - AC-002:
TestAUR514AC002TerminalAndPRShowTheSameFieldsconfere, 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,ImpacteSidedeprofileFinding; cada um precisa deixar o AC-001 vermelho comAUR-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.