Pular para conteúdo

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 -c no 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 bloco run: | de .github/workflows/providers-smoke.yml. Reproduzido nesta árvore sobre os workflows de c8591f9a:
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 '... && ...' virou sh scripts/ci/acceptance-sample.sh (POSIX sh, porque a imagem golang:1.27.1-alpine não tem bash; instala bash, git e python3 e roda os mesmos dois aceites do AUR-589, na mesma ordem, com set -eu no lugar da cadeia &&). Mesmo padrão de ci.yml com scripts/ci/build-test.sh.
  • providers-smoke.yml: os dois blocos run: | viraram run: bash scripts/ci/providers-smoke-detect.sh e run: bash scripts/ci/providers-smoke.sh. Corpo idêntico (comparado linha a linha com o bloco original); as variáveis chegam pelo env: do step, como antes. O job detectar ganhou actions/checkout (com persist-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, pullRequestRangeIn recusa a base ("base commit is not in the checkout"); sem git (aceite selado), o ResolveRef do 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 TestReviewPromptExplainsTheRedactionMarker renderiza o prompt de revisão com um diff que contém [REDACTED] e exige a instrução no System. AUR-597/AC-001/pass.
  • AC-002 nos dois workflows: nenhum sh -c, nenhum run: |, nenhuma cadeia &&; os três scripts existem, são referenciados e passam bash -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á all imprime AC-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.