Pular para conteúdo

AUR-586: tutoriais e aceites sem valores volateis nem copias enumeradas

Medido antes

  • docs/tutorials/operacao.md e demo/tutoriais/operacao/out/entrega-e-evidencia.log traziam board valid: 585 atomic cards; dados-de-analise.md e o out/ traziam analysis_data.tag: analysis-data/20261002T134230Z, generated_at: 2026-10-02T13:42:30Z e is 30.0 days old. Outro dia ou outro estado do board divergia de AUR-563/564 (blocos == demo).
  • tut_check so fazia grep -F de expected/ em out/ (nao exigia que out/ viesse da imagem desta arvore) e tut_image reaproveitava aurum-tutoriais:local de qualquer arvore.
  • Os oito aceites (430, 432, 434, 435, 459, 461, 467, 475) copiavam pacotes enumerados (internal/documentation/*, cmd/regenerate-docs, internal/pipeline nao existem mais) e AUR-430/432/467 tinham alvo de mutacao quebrado por uma troca em massa de internal/review/reviewer.go por uma lista de cinco arquivos.

O que mudou

  • demo/tutoriais/_lib/normaliza.sed (novo): regras sed -E que reduzem os valores volateis a forma: board valid: <N> atomic cards, analysis-data/<timestamp>, <timestamp>, is <duracao> days old, idade: <duracao>. tut_check normaliza out/ com elas antes do grep -F; AUR-563/564 AC-002 fazem o mesmo antes de comparar os blocos do texto. Um valor fora da forma (board valid: abc atomic cards) nao e normalizado e reprova. Documentado em _lib/tutorial.sh, demo/tutoriais/README.md e docs/tutorials/README.md.
  • _lib/tutorial.sh: TUT_TREE = sha256 de go.mod, go.sum e dos arquivos de producao (sem *_test.go) de cmd internal pkg, so por sha256 de arquivos (sem git e sem docker: o mesmo valor no host e no container selado; o git ls-files foi descartado porque o container selado nao tem git). O Dockerfile nao e materializado no container selado (nao esta em paths nem read_paths dos cards 561..564 e 586), entao fica fora de TUT_TREE e entra em TUT_DOCKERFILE, conferido sempre que o arquivo existe (no host). A tag da imagem e aurum-tutoriais:<12 hex de sha256(TUT_TREE+TUT_DOCKERFILE)> (AURUMCODE_TUT_IMAGE continua sobrescrevendo). Cada execucao grava out/.imagem (tree=, dockerfile= e image= com docker image inspect --format '{{.Id}}'). --check falha com motivo quando out/.imagem falta ("out/.imagem ausente") ou foi gravado por outra arvore ("outra arvore"); com docker e a imagem local o digest tambem precisa bater ("imagem conferida"); sem docker so a arvore e conferida ("imagem nao conferida (sem docker)").
  • expected/ e blocos de operacao.md e dados-de-analise.md agora usam a forma. Os 15 tutoriais foram reexecutados (run.sh all) com a imagem desta arvore e out/.imagem esta versionado. Transparencia: depois dos 15 run.sh all, a formula da identidade mudou (Dockerfile saiu de tree, ver acima) e os 15 out/.imagem foram regravados por script a partir da mesma imagem (image=sha256:4ad57c18... real, fontes identicas), sem reexecutar os casos; o proximo run.sh all regrava cada um normalmente.
  • Os aceites 563/564 passam a normalizar o out/ antes de comparar os blocos.
  • AUR-586.sh: AC-001..004 e MUT-001/002.

Decisao por aceite (430, 432, 434, 435, 459, 461, 467, 475)

Todos passaram a copiar cmd internal pkg go.mod go.sum inteiros (459 ja o fazia). Cada um foi rodado no container (go-shared, em serie, todos os seletores).

Aceite Resultado com a copia inteira Decisao
AUR-430 todos os seletores 0, apos consertar o alvo da mutacao (reviewer.go; a mutacao agora zera result.Issues antes de applyGates e a asserção olha a mensagem e [error], porque o relatorio sempre lista os arquivos tocados) mantido, verde
AUR-432 AC-001 published-format-drifted; Test e Integration vermelhos aposentado (exit 69)
AUR-434 AC-001 behavior-missing (gate de escopo/evidencia descarta os achados da fixture); Test e Integration vermelhos aposentado (exit 69)
AUR-435 AC-001 base-quality-missing; Integration vermelho aposentado (exit 69)
AUR-459 AC-001, Test, Integration e E2E vermelhos (enumeracao ja corrigida antes; o vermelho e de comportamento) aposentado (exit 69)
AUR-461 Test (TemplateCitesOnlyRealRules) e Integration (EveryOfferedRuleSurvivesTheGate) vermelhos aposentado (exit 69)
AUR-467 AC-001, Test, Integration, E2E, MUT-001 e MUT-002 0 mantido, verde
AUR-475 Integration (ArithmeticConsistencyAcrossBudgets) vermelho aposentado (exit 69)

Aposentar e explicito (modelo AUR-309): imprime o motivo e sai 69; nao e passe nem rejeicao funcional. Reescreve-los seria reescrever o comportamento que provaram, fora do escopo.

Prova de cada AC e MUT

Veja a secao "Execucao real" abaixo: cada comando e a ultima linha real.

Fora do escopo deste card

O workflow noturno (.github) nao e path deste card: AUR-563 e AUR-564 devem entrar nele (AUR-583/584 ou o proximo card de CI). Como out/.imagem depende dos fontes de cmd internal pkg, todo card que altera o produto precisa reexecutar os tutoriais (run.sh all) para o --check voltar a passar: isso e o comportamento pedido (a prova nao envelhece em silencio).

Execucao real

Execucao real no HOST (docker, imagem aurum-tutoriais:bf5c6ca887c0, tag derivada da arvore; AURUMCODE_TUT_REBUILD=1 no primeiro revisao; os demais com a imagem ja construida desta arvore): run.sh all de revisao, operacao, dados-de-analise, gate, skills, politica-central, qualquer-linguagem, excecoes, auditoria-sarif, reaproveitamento, sast, xbom, assinatura, benchmark e sbom-dependency-track, todos com exit 0. Depois, bash demo/tutoriais/<t>/run.sh --check nos 15:

imagem conferida: aurum-tutoriais:bf5c6ca887c0 sha256:4ad57c18... (arvore 9844a95730d3)
CHECK OK

(operacao, dados-de-analise, gate e revisao incluidos; o out/.imagem de cada um esta versionado: tree=9844a957... e image=sha256:4ad57c18....)

Execucao real no container (go-shared exec, em serie, cwd no worktree):

AUR-561 all rc=0  AUR-561/AC-002-MUT-001/ok (sem a linha que prova o caso, --check diverge em todos os casos)
AUR-562 all rc=0  AUR-562/AC-002-MUT-001/ok (sem a linha que prova o caso, --check diverge em todos os casos)
AUR-563 all rc=0  AUR-563/AC-002-MUT-001/ok (sem a linha que prova o caso, --check diverge em todos os casos)
AUR-564 all rc=0  AUR-564/AC-002-MUT-001/ok (sem a linha que prova o caso, --check diverge em todos os casos)
AUR-586 all rc=0  AUR-586/all/pass

No container nao ha docker: o --check imprime imagem nao conferida (sem docker) e confere a arvore. Aceites 430 e 467 no container: AUR-430.sh (AC-001, TestAUR430, IntegrationAUR430, E2EAUR430, AC-001-MUT-001) e AUR-467.sh (AC-001, Test, Integration, E2E, MUT-001, AC-003-MUT-002) saem 0; os demais, como na tabela acima.

Prova por criterio (AUR-586.sh):

  • AC-001: AUR-586/AC-001/ok (563 e 564 AC-002 verdes com outro N e outra data; valor fora da forma reprova). A copia selada tem board valid: 4242 atomic cards, tag analysis-data/20310101T000000Z, 2031-01-01T00:00:00Z e is 11.5 days old no out/; board valid: abc atomic cards reprova 564.
  • AC-002: AUR-586/AC-002/ok (...): sem out/.imagem a saida diz out/.imagem ausente; com tree= zerado diz outra arvore; alterar cmd/aurumcode/main.go na copia tambem reprova; o gravado passa.
  • AC-003: AUR-586/AC-003/ok (os oito aceites: 6 aposentados com motivo, ...); a execucao de cada um no container esta na tabela acima.
  • AC-004: AUR-586/AC-004/ok (nenhum expected/ nem bloco de saida com data, tag gerada ou contagem do board literais).
  • MUT-001: AUR-586/MUT-001/rejected (literal board valid: 585 de volta em operacao.md reprova AC-004 e AUR-564 AC-002).
  • MUT-002: AUR-586/MUT-002/rejected (tut_check_imagem desligado: o --check passa sem out/.imagem e a sonda fica vermelha).

bash scripts/docs/build.sh: 0 warnings.

Selado: .board/bin/oci-run --profile go-unit-offline-v1 --card AUR-586 com cwd no worktree: exit_code 0, AUR-586/all/pass (o selado nao materializa o Dockerfile nem todo demo/: por isso a identidade da arvore exclui o Dockerfile e o clone do aceite copia so demo/tutoriais).