AUR-597: autorrevisão do lote conclui (marcador de redação e shell dos workflows)
Medido antes (base c8591f9a)
Autorrevisão do Aurum na PR #96 (lote dev -> main, 2026-10-07) reprovou por
três motivos:
- Marcador de redação lido como segredo. Em
internal/llm/provider/profiles/resolve.go,APIKey: key(identificador Go) é trocado por[REDACTED]pelo redator (internal/security/redaction) antes do prompt. O modelo reportou PUB-002 (error) "literal mascarado no código": falso positivo criado pelo próprio Aurum. sh -cno workflow. O passe de segurança acusou command injection em.github/workflows/acceptance-sample.yml:44(sh -c '... && ...').- SAST inconclusivo. O semgrep 1.172.0 da imagem do produto, com os
pacotes do Aurum (
p/security-audit,p/owasp-top-ten), não interpreta como Bash o blocorun: |de.github/workflows/providers-smoke.yml. Reproduzido nesta árvore sobre os workflows dec8591f9a:
errors 1 [('PartialParsing', '.github/workflows/providers-smoke.yml', "[{'file': '.github/workflows/providers-smoke.yml', 'start': {'line': 109, ...")]
scanned ['.github/workflows/acceptance-sample.yml', '.github/workflows/providers-smoke.yml']
O que mudou
- Prompt (
internal/prompt/templates/review.md): bullet novo, ao lado do que trata sintaxe de workflow como configuração. Diz que[REDACTED]é a máscara do próprio Aurum sobre o valor original (que pode ser só um identificador ou uma expressão), que não é literal da mudança nem evidência de segredo, que a detecção de segredo cabe ao scanner de segredos sobre o conteúdo bruto, e que nunca se reporta segredo com base no marcador. O redator não mudou. - acceptance-sample.yml: o
sh -c '... && ...'viroush scripts/ci/acceptance-sample.sh(POSIX sh, porque a imagemgolang:1.27.1-alpinenão tem bash; instala bash, git e python3 e roda os mesmos dois aceites do AUR-589, na mesma ordem, comset -euno lugar da cadeia&&). Mesmo padrão deci.ymlcomscripts/ci/build-test.sh. - providers-smoke.yml: os dois blocos
run: |viraramrun: bash scripts/ci/providers-smoke-detect.sherun: bash scripts/ci/providers-smoke.sh. Corpo idêntico (comparado linha a linha com o bloco original); as variáveis chegam peloenv:do step, como antes. O jobdetectarganhouactions/checkout(compersist-credentials: false) para ter o script. - Teste novo (
cmd/aurumcode/pr_local_diff_test.go): API recusa o diff por tamanho e nem a base do evento (AURUMCODE_BASE_SHA) nem a da API estão no checkout: saída 1, nada enviado ao modelo, nada publicado, e a revisão declara que o diff não pôde ser calculado do checkout. O código já falhava fechado; faltava o teste. Com git,pullRequestRangeInrecusa a base ("base commit is not in the checkout"); sem git (aceite selado), oResolveRefdo leitor de objetos aceita um SHA bem formado sem conferir que o objeto existe, e a falha vem depois, ao ler o commit ausente. Ainda fechado, mas nesse caminho a base da API não é tentada quando a do evento está ausente: pendência registrada, não corrigida aqui.
Provas
tests/acceptance/AUR-597.sh (seletores all, AC-001..AC-004,
MUT-001, MUT-002).
- AC-001
TestReviewPromptExplainsTheRedactionMarkerrenderiza o prompt de revisão com um diff que contém[REDACTED]e exige a instrução noSystem.AUR-597/AC-001/pass. - AC-002 nos dois workflows: nenhum
sh -c, nenhumrun: |, nenhuma cadeia&&; os três scripts existem, são referenciados e passambash -n.AUR-597/AC-002/pass. - AC-003 semgrep 1.172.0 da imagem do produto (construída desta árvore),
mesmos pacotes do Aurum, sobre os dois workflows: 0 erros, 2 caminhos
examinados. Exige semgrep e acesso ao registry de regras, que o aceite
selado não tem; lá
allimprimeAC-003/not-run-here. Prova:
$ docker run --rm -v "$PWD:/repo:ro" -w /repo -e AURUM597_SEMGREP=on -e TMPDIR=/tmp \
--entrypoint bash aurum-tutoriais:aur597 tests/acceptance/AUR-597.sh AC-003
AUR-597/AC-003/pass (semgrep, 2 workflows, 0 errors)
A mesma invocação sobre os workflows de c8591f9a dá o PartialParsing
acima: o AC discrimina.
- AC-004 TestTooLargeDiffWithBaseAbsentFromCheckoutFailsClosed.
AUR-597/AC-004/pass.
- MUT-001 remove o bullet do template: o teste do AC-001 cai
(missing "[REDACTED]é a máscara que o próprio Aurum aplica").
AUR-597/MUT-001/rejected.
- MUT-002 recoloca sh -c em acceptance-sample.yml: a checagem do
AC-002 cai (sh-c-in-workflow:.github/workflows/acceptance-sample.yml).
AUR-597/MUT-002/rejected.
- bash tests/acceptance/AUR-597.sh all no container compartilhado termina em
AUR-597/all/pass.
- actionlint (rhysd/actionlint:latest): só os 5 falsos positivos já
conhecidos de job.workflow_sha/job.workflow_repository em review.yml.
Goldens do prompt
internal/review/testdata/promptgolden/* fixa os bytes do prompt. Os seis
arquivos com o prompt de sistema foram regravados com
AURUM_UPDATE_PROMPT_GOLDEN=1; o diff é só o bullet novo (5 linhas em cada
um). internal/review está em read_paths, não em paths, do card: a
regravação é consequência direta da mudança do template e está declarada aqui.
Tutoriais e capturas
O template entra na identidade da árvore (out/.imagem): os tutoriais foram
reexecutados com a imagem aurum-tutoriais:aur597 construída desta árvore,
--check passou em todos e scripts/docs/capturas.sh regravou
docs/assets/capturas.
Fora do escopo
O AC-002 cobre os dois workflows do card. Ainda há sh -c em
.github/workflows/ci.yml:37 (Playwright) e
.github/workflows/analysis-data.yml:39, fora dos paths deste card:
pendência para um card próprio.