Pular para conteúdo

AUR-446 — Os specs entregues descrevem o comportamento entregue

Documento histórico do board. Pode descrever componentes removidos; para uso atual, consulte o guia do produto.

Outcome

Cada spec de card entregue descreve o que o codigo faz hoje, e nao o estado do dia em que foi escrito. Este card corrige seis afirmacoes desatualizadas medidas na auditoria de 2026-08-13 e entrega o mecanismo que prova que elas continuam corrigidas: uma verificacao estatica, offline, por grep -F sobre o texto literal dos specs corrigidos.

O comando

bash tests/acceptance/AUR-446.sh AC-001

Dentro do profile pinado bootstrap-readonly-v1, o mesmo comando roda via:

./.board/bin/oci-run --profile bootstrap-readonly-v1 --card AUR-446

O comando nao aceita entrada de rede nem chamada de modelo: e uma verificacao puramente textual sobre arquivos ja materializados por paths/read_paths.

O que o comando verifica

Para cada um dos seis specs corrigidos, o comando confirma, por grep -F (correspondencia literal, nao regex), que:

  1. A afirmacao desatualizada (ancora negativa) esta ausente do arquivo.
  2. A afirmacao corrigida (ancora positiva) esta presente no arquivo.
Spec Afirmacao desatualizada removida Afirmacao corrigida
docs/specs/AUR-424.md "Dentro do sandbox ela sai 69" (E2E sempre sai 69 por paths fora do contrato) "O accept selado sai 0" (paths/read_paths foram ampliados; o card esta done)
docs/specs/AUR-425.md "No aurumcode docs subcommand exists" "subcommand delivered by AUR-426 (cmd/aurumcode/docs.go...)"
docs/specs/AUR-428.md "Os demais exemplos ... (code-review, qa-testing, all-pipelines) continuam pinados por SHA" "code-review.yml não está mais nesse grupo: o AUR-440 o repinou para a tag v1"
docs/specs/AUR-429.md "No aurumcode docs subcommand exists" "docs subcommand from AUR-426 (cmd/aurumcode/docs.go)"
docs/specs/AUR-437.md (nenhuma ancora negativa; a afirmacao original nao era falsa, so incompleta) "Reproduzido em internal/git/githubclient/client.go:795-802" (caso residual do ultimo " b/" documentado)
docs/specs/AUR-440.md "pelo AUR-437 e ainda nao foi executado" "AUR-438 esta done: cmd/aurumcode ja publica --pr, --repo, --publicar e --na-linha"

A correcao de docs/specs/AUR-437.md nao remove nenhuma afirmacao (a descricao original do defeito 4 e da correcao continuam verdadeiras para o caso que ela cobre); ela acrescenta a divulgacao do caso residual que a correcao nao fecha. Por isso essa linha nao tem ancora negativa: o comando so verifica a presenca da ancora positiva para este spec.

O caso residual de AUR-437.md e verificado de duas formas independentes: por ancora textual (grep -F) e por comportamento real, atraves da API publica de internal/git/githubclient (TestAUR446 em tests/unit/AUR-446.go), que prova empiricamente que extractFilePath("diff --git a/foo b/bar.go b/foo b/bar.go") retorna "bar.go" em vez de "foo b/bar.go" — nao apenas que a prosa do spec diz isso.

Sexto achado, incorporado apos reparo de paths: docs/specs/AUR-428.md

A auditoria original (achado 5) tambem cobre docs/specs/AUR-428.md:123-125, que afirmava que os "demais exemplos" (code-review.yml incluido) "continuam pinados por SHA" — falso para code-review.yml desde o AUR-440, que o repinou para a tag v1 (ref: v1 no passo "Checkout the AurumCode release" de .github/workflows/examples/code-review.yml); ainda verdadeiro para qa-testing.yml e all-pipelines.yml, que continuam pinados por SHA 6f584b5987c12399bc7a85571dad4a81e28005c8.

Na primeira passagem deste card, docs/specs/AUR-428.md ficou fora do escopo gravavel: nem paths nem read_paths do card AUR-446 (frontmatter em .board/cards/ready/AUR-446.md) listavam esse arquivo — paths listava docs/specs/AUR-446.md duas vezes em vez de uma vez AUR-428.md e uma vez AUR-446.md. Esse gap foi relatado em vez de contornado silenciosamente (o mesmo padrao que docs/specs/AUR-424.md documenta para o candidato original do AUR-424), o coordenador corrigiu o frontmatter do card para listar docs/specs/AUR-428.md e a duplicata sumiu, e a correcao real agora vive em docs/specs/AUR-428.md, seção "Fora de escopo / notas" — nao mais nesta seção.

Exit codes

Rotulos exatos, tal como os quatro arquivos (tests/acceptance/AUR-446.sh, tests/e2e/AUR-446.sh, tests/unit/AUR-446.go, tests/integration/AUR-446.go) realmente emitem — nao uma paráfrase:

Exit Significado Rotulo(s) exatos
0 As cinco verificacoes passam nas tres lanes (Unit, Integration, E2E). {"result":"pass",...}
1 Ancora positiva ausente (a afirmacao corrigida nao esta no spec). AUR-446/AC-001/behavior-missing:<spec>:missing:<ancora> (E2E e Go); AUR-446/AC-001/entrypoint_missing:<path> (arquivo deste card ausente, checado por tests/acceptance/AUR-446.sh antes de estagiar)
1 MUT-001: ancora negativa (afirmacao desatualizada) foi reintroduzida. AUR-446/AC-001/MUT-001/<spec>:stale-claim-present:<ancora> (E2E); AUR-446/AC-001/MUT-001:<spec>:stale-claim-present:<ancora> (Go, dois-pontos em vez de barra)
1 Saida nao-deterministica entre as duas passagens do E2E. AUR-446/AC-001/nondeterministic-output:<digest1>:<digest2>
1 Uma lane Go falhou por um motivo que o grep de detalhe do orquestrador nao capturou. AUR-446/AC-001/selector-exit:<pacote>:<rc>
64 Seletor desconhecido. AUR-446/AC-001/unknown-selector
79 Infraestrutura: go, tr, grep ou sha256sum ausente, ou um dos read_paths (cmd/aurumcode, internal/git/githubclient, .github/workflows/examples/code-review.yml) nao esta materializado — nunca uma aprovacao nem uma reprovacao comportamental. AUR-446/AC-001/infrastructure/<motivo> (missing_go, missing_tr, missing_grep, missing_sha256sum, read_path_not_materialized:<path>, repo_root)

Exemplo executavel (sem segredo)

$ bash tests/acceptance/AUR-446.sh AC-001
...
{"card":"AUR-446","scenario":"AC-001","result":"pass","specs_checked":5,"anchors_verified":9}

Nenhuma variavel de ambiente com segredo e lida por este comando; ele nao abre socket nem faz chamada de rede.

Diagnostico de falha

  • AUR-446/AC-001/MUT-001/docs/specs/AUR-425.md:stale-claim-present:... (ou AUR-429.md): a ancora negativa No \aurumcode docs` subcommand exists:` voltou a aparecer no arquivo — este e exatamente o MUT-001 deste card.
  • AUR-446/AC-001/behavior-missing:docs/specs/AUR-424.md:missing:...: a ancora positiva O accept selado sai **0** sumiu do arquivo.
  • AUR-446/AC-001/MUT-001/docs/specs/AUR-424.md:...: a ancora negativa Dentro do sandbox ela sai 69 voltou.
  • AUR-446/AC-001/behavior-missing:docs/specs/AUR-437.md:missing:...: a ancora internal/git/githubclient/client.go:795-802 sumiu do spec.
  • A subtest Go AUR-437 residual...truncation is real code behaviour falha sem nenhum rotulo behavior-missing de spec: o proprio codigo parou de reproduzir o truncamento (extractFilePath foi corrigido para o caso residual) — nesse caso a divulgacao do caso residual em AUR-437.md passou a superclamar um bug que nao existe mais, e precisa ser corrigida na direcao oposta.
  • AUR-446/AC-001/behavior-missing:docs/specs/AUR-440.md:missing:...: a ancora positiva AUR-438 esta done: \cmd/aurumcode` ja publica` sumiu.
  • AUR-446/AC-001/MUT-001/docs/specs/AUR-440.md:...: a ancora negativa restaurado pelo AUR-437 e ainda nao foi executado voltou.
  • exit 79 com rotulo infrastructure/read_path_not_materialized:<dir>: cmd/aurumcode, internal/git/githubclient ou .github/workflows/examples/code-review.yml nao esta presente no checkout — nunca tratado como reprovacao comportamental.
  • exit 79 com rotulo infrastructure/missing_tr (ou missing_grep, missing_sha256sum, missing_go): uma ferramenta que o script depende esta ausente do PATH. Checado explicitamente antes de qualquer verificacao para nao colapsar em falso RED sob set -euo pipefail.
  • exit 1 com rotulo AUR-446/AC-001/nondeterministic-output:<d1>:<d2>: as duas passagens de tests/e2e/AUR-446.sh sobre os mesmos arquivos reais produziram transcritos diferentes — a clausula de repeticao do AC-001 falhou.

TDD proof

  • Test: tests/acceptance/AUR-446.sh::AC-001.
  • Red: antes das correcoes acima, docs/specs/AUR-425.md e docs/specs/AUR-429.md continham No \aurumcode docs` subcommand exists:(ancora negativa presente) e nenhum dos cinco specs continha sua ancora positiva correspondente; o aceite falhava emitindo, para cada spec, tantoAUR-446/AC-001/MUT-001/:stale-claim-present:...(ancora negativa presente) quantoAUR-446/AC-001/behavior-missing::missing:...(ancora positiva ausente) — reproduzido diretamente restaurandodocs/specs/AUR-425.mda partir degit show HEAD:docs/specs/AUR-425.md(a versao pre-correcao) e rodandotests/acceptance/AUR-446.sh AC-001` sobre ela antes deste card ser aceito. Falha de compilacao, imagem, loader ou rede nao conta como RED.
  • Green: as edicoes de prosa acima em docs/specs/AUR-424.md, docs/specs/AUR-425.md, docs/specs/AUR-429.md, docs/specs/AUR-437.md e docs/specs/AUR-440.md.
  • Refactor: preservar as ancoras exatas, os exit codes e o formato de saida.
  • Unit: tests/unit/AUR-446.go::TestAUR446.
  • Contract: not-applicable — nenhum port novo e publicado.
  • Integration: tests/integration/AUR-446.go::IntegrationAUR446.
  • E2E: tests/e2e/AUR-446.sh::E2EAUR446.

Nota de nomenclatura: o card .board/cards/ready/AUR-446.md cita os seletores TestAUR428/IntegrationAUR428/E2EAUR428 na clausula "TDD proof" — um residuo de copia do template de AUR-428 (a mesma origem do titulo duplicado de AC-001 e da duplicata docs/specs/AUR-446.md em paths). Todo tests/unit/AUR-*.go existente neste repositorio nomeia sua funcao apos o proprio numero do card, sem excecao (verificado por varredura completa de tests/unit/AUR-4*.go); este card segue essa convencao (TestAUR446/IntegrationAUR446/E2EAUR446) e tests/acceptance/AUR-446.sh aceita TestAUR428/IntegrationAUR428/E2EAUR428 como aliases do seletor para quem invocar com o nome literal do card.

Security and privacy

  • Data flow: repositorio -> grep -F sobre arquivos ja materializados -> saida sanitizada de uma linha.
  • Secrets: o canario AURUM_SECRET_CANARY nao aparece em stdout, stderr, cache ou evidencia; nenhum passo le variavel de ambiente com segredo.
  • Least privilege: nenhum processo externo e iniciado alem de go test (para as lanes Unit/Integration) e grep; rede, socket, mounts de host, devices e capabilities permanecem negados pelo profile.

Compatibility, migration, rollback

  • Compatibility: nenhum comando ou formato ja publicado por outro card muda.
  • Migration: not-applicable.
  • Rollback: reverter somente os arquivos em paths; nenhum estado externo e publicado por este card.