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,--basee--pr) epartitionByCache(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 pormodelCacheKey; nao provavam o termo que diziam provar. O de versao do prompt usavaNewPromptBuilderWithoutTemplates, 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
--prnao tinham teste.
O que mudou
cmd/aurumcode/cache_redaction.go:redactCachedIssuesaplica a cada achado lido do cache a mesma redacao campo a campo da fronteira do modelo (prosa com o marcador+/-/espaco preservado, comoredactLinesKeepingMarkers).redactedVerdictReuseenvolve 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 deredactedVerdictReuse.cmd/aurumcode/review_cache.goemain.go:partitionByCacherecebe 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: seletoresall,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
redactCachedIssuesrepete a regra de prosa deinternal/review.redactLinesKeepingMarkers, que e privada e fica fora dos paths deste card; unificar exige exportar a funcao deinternal/reviewnum 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
Originforjado 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).