Pular para conteúdo

AUR-569: achado determinístico acima de fail_on reprova em qualquer modo de inconclusivo

Reprodução (primeiro passo do card, commit b048183c)

Caso versionado demo/tutoriais/gate/achado-deterministico: política gate: {fail_on: [high], inconclusive: warn} (politica-alerta), --seguranca, sem provedor (TUT_FIXTURE=none), diff com dbPassword := "hunter2". Execução real na imagem do produto, antes da correção:

  • inconclusive: warn: exit_code=0; linhas policy gate: review inconclusive (quality_skipped) e o achado app.go:6: [error] ... (rule security/hardcoded-secret) no relatório; auditoria com origens: (nenhuma). FALHA ABERTA REPRODUZIDA.
  • inconclusive: block: exit_code=1, só pela ausência do parecer (quality_skipped); nenhuma linha de gate cita o achado.

Causa raiz (mais ampla que o relato)

Não era o modo de inconclusivo. Os achados do passe de segurança (security/*, review.SecurityScanWithCoverage) ficam fora de Review.Issues no --base (Run.Extra) e só chegavam ao gate pelo contribuinte policy-skills, que só conta ids citados por uma seção de skill da política. O contribuinte embedded-analysis só conta analysis/* (outro catálogo, que não casa dbPassword := "hunter2"). Logo um security/* nunca contava, em warn, block nem com provedor. O mesmo vale em --pr.

Correção

  • Novo contribuinte security-pass (internal/gate, depois de embedded-analysis): conta os achados do passe de segurança (campo Run.Security, preenchido por --base e --pr) com severidade >= fail_on, independentemente de gate.inconclusive: exit 3, linha com regra, severidade, limiar e origem security, e origin: security na auditoria.
  • Respeita config.ApplyRuleConfig, as exceções AUR-520 e gate.sources (conta sob a origem analysis, o catálogo embutido; sources: [skills] não conta). Não conta duas vezes um achado que o gate já tem (mesma regra, arquivo, linha).
  • O laço comum virou applyDeterministic, compartilhado com analysis.
  • Sem alterar o significado de warn para a ausência de parecer: sem achado determinístico, warn continua só avisando (exit 0); block continua exit 1.

Aceite

  • AC-001: caso versionado, --check verde, reprodução registrada aqui.
  • AC-002: TestAUR569SecurityFindingFailsGateInEveryInconclusiveMode (warn e block, exit 3).
  • AC-003: TestAUR569WithoutFindingWarnStillOnlyWarns, TestAUR569NoSecurityPassNoSecurityFinding e o caso do tutorial (diff sem segredo, exit 0).
  • AC-002-MUT-001: warn engolir o achado deixa AC-002 vermelho.
  • tests/acceptance/AUR-569.sh: all, AC-001..AC-003, AC-002-MUT-001; seletor desconhecido sai 64.

Fora do escopo / declarado

  • docs/architecture.md lista security-pass na ordem dos contribuintes.
  • docs/specs/AUR-562.md ganhou uma linha, porque AUR-562.sh exige cada caso do run.sh registrado ali.
  • A linha de gate sai com "[REDACTED]" no lugar de "Hardcoded" (o filtro de redação reage a esse trecho do título); comportamento já existente, não tocado.
  • --pr não é demonstrado na demo; só coberto pelo mesmo contribuinte.