Pular para conteúdo

AUR-553: provas do reaproveitamento do veredito cobrem cada termo da chave

O que foi medido antes

Pendencias da revisao do AUR-524, confirmadas no codigo de origin/dev (bef0f3c0):

  • Defeito de seguranca. O cache de revisao (AURUMCODE_CACHE_DIR) e entrada nao confiavel: em CI pode ser compartilhado com outros workflows do mesmo escopo. Dois leitores devolviam achados do disco sem redacao: gate.ReuseOrStoreGateVerdict (veredito do gate, --base e --pr) e partitionByCache (cache por arquivo do --base). Um verbete forjado com um segredo ou texto arbitrario chegava inteiro ao review publicado no pull request, ao stdout, ao SARIF e a auditoria. A redacao so era aplicada na fronteira da resposta do modelo (internal/review.redactReviewResult).
  • Os testes de versao do prompt e de modelo do AUR-524 trocavam tambem a fixture (AURUMCODE_LLM_FIXTURE), cujo conteudo ja entra na chave por modelCacheKey; nao provavam o termo que diziam provar. O de versao do prompt usava NewPromptBuilderWithoutTemplates, cujo digest falha e desliga o reaproveitamento inteiro: com o termo removido da chave o teste continuava verde (medido: mutacao sobreviveu).
  • Digest do diff, identidade do repo, identidade do binario e armazenamento bruto no --pr nao tinham teste.

O que mudou

  • cmd/aurumcode/cache_redaction.go: redactCachedIssues aplica a cada achado lido do cache a mesma redacao campo a campo da fronteira do modelo (prosa com o marcador +/-/espaco preservado, como redactLinesKeepingMarkers). redactedVerdictReuse envolve o passo de reaproveitamento do pipeline do gate: o que ele acrescenta do cache (sufixo da uniao monotonica) e redigido com o filtro da execucao antes de qualquer passo seguinte ou sink; um achado que, redigido, iguala um ja existente e descartado.
  • cmd/aurumcode/review_gate.go: o pipeline monta o passo de reaproveitamento dentro de redactedVerdictReuse.
  • cmd/aurumcode/review_cache.go e main.go: partitionByCache recebe o filtro e redige cada achado de cache por arquivo.
  • cmd/aurumcode/aur524_test.go: os testes de modelo e de versao do prompt usam o servidor alternante (mesma identidade de provider); o de versao do prompt usa um builder com digest valido e diferente (um item de catalogo a menos) e afirma essa diferenca.
  • cmd/aurumcode/aur553_test.go: testes novos (abaixo).
  • tests/acceptance/AUR-553.sh: seletores all, AC-001..AC-004, MUT-001; cada mutacao e aplicada numa raiz temporaria nova e precisa compilar e deixar o teste correspondente vermelho.

A semantica monotonica do AUR-524 nao mudou: o reaproveitamento so acrescenta achados.

Como cada AC/MUT foi provado

Comando: bash tests/acceptance/AUR-553.sh all no container compartilhado.

AC/MUT Teste Mutacao (vermelha)
AC-001 TestAUR524AC002PromptVersionChangeInvalidatesReuse prompt_version: PromptVersionDigest vira "" na chave
AC-001 TestAUR524AC002ModelChangeInvalidatesReuse model_name: modelCacheKey ignora Name() e o modelo resolvido
AC-002 TestAUR553AC002DiffChangeWithoutSHAInvalidatesReuse (--pr, sem GITHUB_SHA) diff_digest: DiffDigest vira ""
AC-003 TestAUR553AC003RepoIdentityChangeInvalidatesReuse (remote origin muda) repo_identity
AC-003 TestAUR553AC003BinaryIdentityChangeInvalidatesReuse (main.version muda) binary_identity
AC-003 TestAUR553AC003PRStoresRawIssues (regra desligada, depois religada) raw_storage: guarda os achados ja filtrados pela config
AC-004 / MUT-001 TestAUR553AC004PRCachedFindingRedacted (review publicado no GitHub falso) unredacted_verdict: pipeline sem redactedVerdictReuse
AC-004 / MUT-001 TestAUR553AC004BaseCachedFileFindingRedacted (stdout do --base) unredacted_file_cache: partitionByCache sem redacao

O teste do --pr forja o verbete do veredito com um segredo registrado no filtro, um token com forma de credencial e um cabecalho Authorization citado como linha de diff; exige que o achado forjado chegue ao review publicado (prova nao vazia), que nenhum canario apareca no corpo publicado, no stdout ou no stderr, e que o marcador de redacao apareca.

Ultimas linhas reais:

mutation prompt_version -> RED: aur524_test.go:411: round2 exit=3, want 0: a changed prompt-version digest must never reuse round1's stored breach
mutation model_name -> RED: aur524_test.go:375: round2 must call the provider again, got 1 calls
mutation diff_digest -> RED: aur553_test.go:314: round2 exit=3, want 0: a changed diff must never reuse round1's stored breach
mutation repo_identity -> RED: aur553_test.go:281: round2 exit=3, want 0: a changed repository identity must never reuse round1's stored breach
mutation binary_identity -> RED: aur553_test.go:297: round2 exit=3, want 0: a changed binary identity must never reuse round1's stored breach
mutation raw_storage -> RED: aur553_test.go:337: round2 (rule enabled) exit=0, want exitFindings(3): the raw finding stored by round1 must fire under the enabled rule
mutation unredacted_verdict -> RED: aur553_test.go:232: published PR review leaked the cached canary "aur553-registered-canary-7f3e1d"
mutation unredacted_file_cache -> RED: aur553_test.go:258: stdout leaked the cached canary "aur553-registered-canary-7f3e1d"
AUR-553/all/pass

bash tests/acceptance/AUR-524.sh all continua AUR-524/all/pass.

Limites

  • redactCachedIssues repete a regra de prosa de internal/review.redactLinesKeepingMarkers, que e privada e fica fora dos paths deste card; unificar exige exportar a funcao de internal/review num card que possua o pacote.
  • A redacao mascara valores com forma de segredo; ela nao torna confiavel o restante do texto de um verbete forjado (por exemplo um Origin forjado de achado deterministico). O reaproveitamento continua so podendo acrescentar achados, nunca aprovar.
  • No teste de modelo a mutacao cai primeiro pelo cache por arquivo (que usa a mesma modelCacheKey), antes do veredito.

Rollback: reverter os commits do card (paths do card apenas).