AUR-575: o gate falha fechado por construção
Medido antes (auditoria de 2026-10-03, base e6b708fe)
config.Parsevalidavagate, exceções,analysis_data,ssor_dtrackesupply_chain, mas nuncaquality_gates.sast(SastConfig.Validatesó era chamado pelos testes):engine: gitleaksrodava o Semgrep calado e umrule_packscom cara de flag passava.- O
.aurumcode/config.ymldo repositório era lido comyaml.Unmarshalleniente; só a política central fazia um segundo decode comKnownFields(true).gate: {fial_on: [error]}não declarava gate e aprovava. gate.inconclusiveausente valia"", tratado comowarnem todo lugar: SAST habilitado com Semgrep ausente saía 0 com statussuccess(alerta).- Cada fonte decidia sozinha o modo: Dependency-Track e
analysis_datacalculavamFailpelo modo, o SAST só marcavaInconclusive, o pipeline tratava o erro de contribuidor à parte, e a falha de artefato também. sources.go(loop determinístico: catálogo embutido e passe de segurança) esast.godescartavam comcontinueuma severidade queSeverityRankOfnão reconhecia.
O que mudou
internal/config/decode.go:decodeStrict(KnownFields(true), documento vazio = configuração zero) é o decoder deParse; o decode extra da política emcentral.gosaiu (a mensagem é a mesma:parsing <arquivo>: yaml: unmarshal errors: line N: field X not found in type ...).ParsechamaQualityGates.Sast.Validate().internal/config/gate.go:resolveInconclusive(fallback)normaliza o valor;GateConfig.InconclusiveMode()resolve ausente parablockquando o gate é declarado.internal/config/inconclusive.go:Config.InconclusiveMode()resolve ausente parablockquando há gate ou scanner habilitado (SAST, Dependency-Track,analysis_data);warnsó escrito.internal/gate/pipeline.go:ApplyInconclusiveModeé o único ponto que transformaInconclusiveemFail(modoblock, ou modo ilegível); o pipeline aplica após cada contribuidor, e a falha de artefato pós-pipeline reaplica a mesma função. Dependency-Track,analysis_data, artefatos, erro de contribuidor eEvaluateGatesó marcamInconclusive(EvaluateGateainda lê o modo para não graduar um run bloqueado).aurumcode sbomusaApplyInconclusiveModeValuecom o modo do gate.internal/gate/policy.go:GateRankOfconta severidade desconhecida comoerror; usado emsast.goesources.go.- Testes que afirmavam o padrão antigo (
warnimplícito) foram atualizados para o novo contrato;analysisdata_test.gousava a chave inexistentelanguagena raiz (o decode estrito revelou; a chave real éreview.language);aur572_test.goescreveinconclusive: warnporque testa a linha final do relatório, não o modo. - Tutorial do gate: política
politica-sast-padrao(SAST habilitado, semgate), caso comPATH=/sem-semgrepque sai 1;expected/eout/regravados com a imagem do produto; docsconfiguration.md,gate-corporativo.mdetutorials/gate.mdatualizados.
Como cada AC/MUT foi provado
bash tests/acceptance/AUR-575.sh all no container go-shared:
AUR-575/AC-001/pass
AUR-575/AC-002/pass
AUR-575/AC-003/pass
AUR-575/AC-004/pass
AUR-575/AC-005/pass
AUR-575/MUT-001/red: --- FAIL: TestAUR575SastSectionValidatedInParse (0.00s)
AUR-575/MUT-001/pass
AUR-575/MUT-002/red: --- FAIL: TestAUR575SASTMissingBlocksWithoutInconclusive (0.00s)
AUR-575/MUT-002/pass
AUR-575/MUT-003/red: --- FAIL: TestAUR575UnknownSeverityCountsAsError (0.00s)
AUR-575/MUT-003/pass
AUR-575/all/pass
- AC-001:
TestAUR575SastSectionValidatedInParse(chave citada) eTestAUR575InvalidConfigRefusedBeforeModel(runReview --basepara na carga, sem relatório). - AC-002:
TestAUR575UnknownKeyIsRefused(cinco seções, chave e arquivo nomeados) eTestAUR575ExistingConfigsStayValid(percorre todo.aurumcode/config.ymldedemo/,docs/,tests/; só os casos de falha deliberadospolitica-invalida,politica-sem-donoe a fixture legada congeladatests/fixtures/repo1, que já não carregava antes, ficam de fora). - AC-003: testes de config, gate e
cmd(--basesai ≠ 0;--prpublicafailure"revisão inconclusiva (bloqueio)";warnescrito mantém exit 0 esuccesscom alerta) e o caso do tutorial comrun.sh --check. - AC-004:
TestAUR575OneRuleForEveryInconclusiveSource(erro simples de contribuidor e SAST ausente decidem igual em"",block,warn) e checagem estrutural de que nenhuma fonte deinternal/gatecalculaFailpelo modo. - AC-005:
TestAUR575UnknownSeverityCountsAsErrorcobre SAST, catálogo embutido e passe de segurança; MUT-003 restaura ocontinuenos dois sites.
Divergência registrada
O card fala em exit 2 para erro de configuração "como já é na política"; o
produto sai 1 em todo erro de carga (política inclusive, ver o caso
falha-fonte-invalida do tutorial). Este card manteve o código existente.
Regressão verificada
go vet ./... e go test -p 1 ./... verdes; tests/acceptance/AUR-497.sh,
AUR-548.sh, AUR-556.sh, AUR-567.sh, AUR-569.sh, AUR-570.sh all
passam; docs/site/index.html não mudou; bash scripts/docs/build.sh com 0
warnings.
v2: AC-006 (todos os tutoriais reexecutados)
Imagem do produto reconstruída desta árvore (AURUMCODE_TUT_REBUILD=1, tag
aurum-tutoriais:aur575), run.sh all de todos os 15 tutoriais em série e
--check em cada um. Nenhum caso existente mudou de exit code nem de
RESULTADO: todos os tutoriais com gate ou scanner que passam por um caminho
inconclusivo já escreviam inconclusive explícito. As divergências encontradas
eram saída velha do AUR-567 (a linha do gate passou a usar - e a terminar
em origem <fonte>, e no SAST origem sast, secao <policy|repo>): expected/ e
blocos de docs/tutorials/*.md foram regravados em auditoria-sarif, excecoes,
politica-central, qualquer-linguagem, reaproveitamento, sast e skills. Os
valores que dependem do relógio ou do board (tag/idade do artefato de
dados-de-analise, contagem de cards em operacao) foram regravados com a
execução nova. tests/acceptance/AUR-533.sh: MUT-002 reancorada na assinatura
atual de ApplyAnalysisDataGate; all verde, as duas provas --pr caem
vermelhas sob a mutação. AUR-561..564 all, AUR-533 all e AUR-575 all
verdes; scripts/docs/build.sh com 0 warnings.