AUR-614: POC em camadas e tutorial camadas
O que entrega
demo/do-zero: a POC "do zero" passa a nascer em três repositórios, um
por time: security-policy (segurança: gate obrigatório, idioma, ignore,
regra IA-001 e o lugar das exceções), devops-policy (engenharia: skills
PAD-001 e QA-001 e os analistas padroes e qa) e o serviço assistente,
cujo workflow aponta para os dois (policy_repository/policy_ref e
standards_repository/standards_ref, fixados na SHA da main de cada
um). Doze passos no roteiro guiado; o modo ia cria as duas camadas e
prepara só o serviço, com o servidor MCP já recebendo AURUMCODE_POLICY e
AURUMCODE_STANDARDS.
- Modo mock: os três são repositórios bare em
.estado/remotos/, servidos pelo
GitHub falso de demo/tutoriais/_lib; a revisão da PR monta a main de
cada repositório central fora da árvore do serviço (az_exporta_main) e
deriva --politica/--padroes do que o próprio workflow da main
declara. Modo real só montado: --mostrar imprime, sem rede e sem gh,
os nomes (NOME-security-policy, NOME-devops-policy, NOME), os comandos
gh repo create/gh secret set/gh variable set e, com --privado, os
tokens AURUMCODE_POLICY_TOKEN/AURUMCODE_STANDARDS_TOKEN (fine-grained,
Contents: read nos dois centrais). Nenhum repositório é criado no GitHub
por este card.
- Evidência do roteiro:
run.sh --modo mock --auto grava out/roteiro-mock.log
(valores voláteis normalizados: caminho absoluto, chave da demonstração,
SHAs, ids de achado) e out/.imagem; run.sh --check confere
expected/roteiro-mock.txt e a imagem, sem docker, com o mesmo
_lib/tutorial.sh dos tutoriais.
- Tutorial executável
demo/tutoriais/camadas com três repositórios de
exemplo (security-policy/, devops-policy/, servico/ e variantes) e
quatro casos: tres-camadas, servico-nao-afrouxa, mesmo-nome e a falha
padroes-com-gate; página docs/tutorials/camadas.md (blocos idênticos aos
arquivos, saídas literais do out/, capturas), índices
(docs/tutorials/README.md, docs/index.md; o nav do site é injetado por
scripts/docs/hooks.py), tests/fixtures/tutorials/mapa.tsv,
docs/tutorials/instalacao-ia.md citando a camada de padrões.
tests/acceptance/AUR-614.sh: all, AC-001..AC-005, MUT-001,
MUT-002; seletor desconhecido sai 64; infraestrutura 79.
Decisões
- O produto, não um simulacro. O roteiro e o tutorial rodam
/app/aurumcode da imagem construída do Dockerfile da raiz, sem rede, com
o provedor falso (AURUMCODE_LLM_FIXTURE). A camada de padrões entra pelas
mesmas flags que o workflow passa (--politica /github/policy --padroes
/github/standards).
- Seletores diferentes por camada. Uma skill da política com o mesmo
seletor (
languages/paths) de uma skill de baixo faz a de baixo não ser
enviada ao modelo (regra do catálogo de skills). A skill ia da segurança
usa languages: [python] e a time da engenharia paths: ["**/*.py"]; sem
isso os achados PAD-001/QA-001 não existiriam (foi o primeiro defeito da
primeira execução real).
- A correção mantém as linhas.
etapas/correcao.py ganha um comentário na
linha 10 (onde o defeito tinha a chave fixa) para --executar continuar nas
linhas 32 e 34: o fixture do modelo cita as mesmas linhas nas duas rodadas,
e o parecer aprovado mostra as observações da engenharia no lugar certo.
- A legenda é conclusão do roteiro. "De onde veio cada achado" é impressa
lendo os repositórios clonados (a skill cujo nome prefixa a regra); só linhas
arquivo:linha do parecer entram nela, nunca as linhas do gate.
- Evidência versionada, como nos tutoriais. O sealed não tem docker, git
nem python3; o aceite prova o roteiro pela gravação (
--check), o modo real
pelo --mostrar e limpar por execução. As mutações têm dois níveis:
com docker, python3 e a imagem gravada, a mutação roda de verdade; sem eles,
a mesma prova sobre a evidência.
Provas
Execução real em 2026-10-13, nesta árvore, com a imagem
aurum-tutoriais:90bbf1e4c39d construída do Dockerfile da raiz:
| prova |
comando |
resultado |
| POC mock de ponta a ponta |
bash demo/do-zero/run.sh --modo mock --auto |
exit 0; 36 s na primeira execução (com o docker build), 6 s com a imagem pronta; PR #1 "Bloqueado: 2 problemas" com [perfil seguranca], [perfil padroes] [padrões de engenharia], [perfil qa] [padrões de engenharia] e analysis/hardcoded-secret; passo 10 com os dois avisos "a política central decide sozinha" e o mesmo bloqueio; correção "Aprovado com 2 observações que não bloqueiam o merge." |
POC --check |
bash demo/do-zero/run.sh --check |
CHECK OK |
| modo real montado |
bash demo/do-zero/run.sh --modo real --mostrar --repo loja --privado |
nomes, comandos gh e tokens impressos; gh/docker nunca chamados (AC-003 usa falsos que registram a chamada) |
| tutorial |
bash demo/tutoriais/camadas/run.sh all e --check |
4 casos em 5 s; CHECK OK; casos camadas/tres-camadas, camadas/servico-nao-afrouxa, camadas/mesmo-nome, camadas/padroes-com-gate |
| capturas |
AURUM_CAPTURAS_SO=camadas,tutorials-camadas bash scripts/docs/capturas.sh |
7 capturas do tutorial + página desktop/mobile; scripts/docs/capturas-check.sh ok |
| aceite |
bash tests/acceptance/AUR-614.sh all |
AC-001..AC-005 ok; MUT-001 e MUT-002 rejected no nível com docker (mutação executada) |
| id |
prova |
última linha |
| AC-001 |
--check do roteiro; três remotos; achado de cada camada identificado no parecer publicado e na legenda; aprovado depois do bloqueado; README diz quem mantém |
AUR-614/AC-001/ok |
| AC-002 |
avisos de gate e ignore descartados e exit_code=3 logo depois; afrouxa.yml declara os dois |
AUR-614/AC-002/ok |
| AC-003 |
--mostrar com --privado e com dono/NOME público; modelo do workflow com os quatro inputs e os dois secrets; refs fixadas por rev-parse main |
AUR-614/AC-003/ok |
| AC-004 |
limpar apaga .estado/ e o projeto marcado do modo ia; preserva out/, expected/, camadas/ e um destino sem a marca |
AUR-614/AC-004/ok |
| AC-005 |
estrutura da página, 4 fases, --check, saídas literais, blocos idênticos, índices, mapa.tsv, flags contra --help (go build quando não há binário), domínios reservados |
AUR-614/AC-005/ok |
| MUT-001 |
sem standards_repository no modelo do workflow, o roteiro mutado roda e os achados da engenharia somem do parecer da PR; --check da cópia diverge nomeando a camada |
AUR-614/MUT-001/rejected |
| MUT-002 |
a versão da engenharia da skill nomes posta na política (e vice-versa): o caso 3 sai 0 em vez de 3 e --check diverge em caso=mesmo-nome |
AUR-614/MUT-002/rejected |
Achados sobre o produto (honestidade da demonstração)
- O aviso de seletor igual entre camadas sai em inglês e chama a camada de
padrões de "repository skill" (
policy skill "ia" (...) overrides repository
skill "time" (standards/...)). A POC evita o caso por seletor; a mensagem é
do catálogo de skills (internal/context/skills), fora deste card.
- As mensagens da camada de padrões (skill ignorada por nome,
config.yml
recusado) mudaram entre o commit revisado do AUR-613 e a ergonomia dele;
expected/mesmo-nome.txt, expected/padroes-com-gate.txt e os blocos
<!-- saida: --> correspondentes em docs/tutorials/camadas.md seguem o
texto da árvore desta execução. Quando o AUR-613 fechar, run.sh all
regrava out/ e esses arquivos precisam acompanhar o texto final.
Limites
- O modo real nunca foi executado por este card (criaria repositórios na
conta de quem roda);
--mostrar é o que o aceite prova. O ensaio real é
operação do dono.
- O aceite selado (
go-unit-offline-v1) não tem docker, git nem python3: as
mutações rodam ali no nível da evidência. O nível executado está registrado
acima, nesta máquina.
- O GitHub falso não guarda o parecer anterior: a edição "no lugar" aparece
como um comentário novo na segunda rodada (o texto do roteiro diz isso).