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; linhaspolicy gate: review inconclusive (quality_skipped)e o achadoapp.go:6: [error] ... (rule security/hardcoded-secret)no relatório; auditoria comorigens: (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 deembedded-analysis): conta os achados do passe de segurança (campoRun.Security, preenchido por--basee--pr) com severidade >=fail_on, independentemente degate.inconclusive: exit 3, linha com regra, severidade, limiar eorigem security, eorigin: securityna auditoria. - Respeita
config.ApplyRuleConfig, as exceções AUR-520 egate.sources(conta sob a origemanalysis, 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 comanalysis. - Sem alterar o significado de
warnpara a ausência de parecer: sem achado determinístico,warncontinua só avisando (exit 0);blockcontinua exit 1.
Aceite
- AC-001: caso versionado,
--checkverde, reprodução registrada aqui. - AC-002:
TestAUR569SecurityFindingFailsGateInEveryInconclusiveMode(warn e block, exit 3). - AC-003:
TestAUR569WithoutFindingWarnStillOnlyWarns,TestAUR569NoSecurityPassNoSecurityFindinge o caso do tutorial (diff sem segredo, exit 0). - AC-002-MUT-001:
warnengolir 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.mdlistasecurity-passna ordem dos contribuintes.docs/specs/AUR-562.mdganhou uma linha, porqueAUR-562.shexige cada caso dorun.shregistrado 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.
--prnão é demonstrado na demo; só coberto pelo mesmo contribuinte.