Pular para conteúdo

AUR-456 — O repositório não carrega cópia morta nem promessa falsa

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

O que este card entrega

A auditoria de 2026-08-14 (.board/cards/ready/AUR-456.md, seção "Achados medidos") encontrou catorze caminhos sem importador em lugar nenhum do repositório, ou divergentes da versão que o binário realmente embute. Este card remove cada um, com prova de ausência de importador registrada abaixo, e prova que os dois artefatos vivos que precisam sobreviver continuam funcionando.

Apagado, com a prova de ausência de importador

Cada comando abaixo foi executado nesta árvore antes de qualquer remoção.

  1. .aurumcode/rules/ (performance.yml, quality.yml, security.yml) — intocado desde o primeiro commit; a versão viva é internal/review/rules/*.yml, embutida via go:embed rules/*.yml (internal/review/rules.go:24). diff .aurumcode/rules/security.yml internal/review/rules/security.yml mostra divergência real: a cópia morta declara security/hardcoded-secrets (plural) sem nenhuma chave pattern:; a versão viva declara security/hardcoded-secret (singular) com pattern: real para as regras que o AUR-442 casou. grep -rn "go:embed" internal/review/ confirma que nada no código lê .aurumcode/rules — o único go:embed da árvore de review aponta para rules/*.yml, relativo ao próprio pacote.
  2. .aurumcode/prompts/*.md (seis arquivos, tudo exceto documentation/welcome-page.md) — internal/prompt/builder.go:14 declara //go:embed templates/*.md, seu próprio conjunto de templates. grep -rn '"\.aurumcode/prompts"' --include="*.go" . mostra que as duas únicas referências de código a esses seis caminhos (internal/prompt/builder.go:371, internal/prompt/builder_test.go) são comentários explicando que o template foi copiado deles em tempo de build (ver docs/specs/AUR-430.md), nunca uma leitura em runtime. Exceção viva confirmada antes de apagar qualquer coisa nesta pasta: internal/documentation/welcome/generator.go:17 declara defaultPromptPath = ".aurumcode/prompts/documentation/welcome-page.md" e o comentário na linha 22 documenta que é um override opcional lido de verdade. Mantido.
  3. configs/ (default-config.yml, .aurumcode/config.example.yml) — grep -rn '\bconfigs\b' --include="*.go" . não encontra nenhuma referência de código. As únicas menções em texto são o card cancelado AUR-335 (.board/cards/cancelled/AUR-335.md) e seu acceptance tests/acceptance/AUR-335.sh, que verifica um MANIFESTO de caracterização (tests/characterization/legacy/config-yaml/manifest.tsv) contendo essas strings de path — não o filesystem real —, então a remoção não afeta esse acceptance (confirmado lendo o script: ele faz grep -Fq "$path" "$manifest", nunca [[ -f "$path" ]]).
  4. index.md e _config.yml da RAIZ (não os de .aurumcode/) — cmd/aurumcode/docs.go:104 e cmd/regenerate-docs/main.go:548 mostram que o diretório de saída padrão do gerador é .aurumcode, nunca . (raiz). grep -n 'index\.md\|_config\.yml' scripts/*.sh .github/workflows/*.yml foi conferido linha a linha, não só por inferência: toda ocorrência resolve contra uma variável de saída (scripts/build-docs-site.sh:44, scripts/action-entrypoint.sh:70 e scripts/generate-enhanced-docs.sh:46 default AURUMCODE_OUTPUT_DIR a .aurumcode; scripts/build-docs-site.sh:113's index.md) continue ;; é um filtro por nome-base dentro de um loop sobre arquivos já copiados, não uma referência à raiz; a linha em demo-external-usage.yml:57 é comentário). Nenhum gerador lê ou escreve index.md/_config.yml na raiz. Conteúdo (title: AurumCode Documentation, "QA Testing", "Docker Hub") descreve uma plataforma que o código não tem — internal/pipeline/qa_pipeline.go não existe (ver item 5).
  5. _api/ (index.md, llm.md, pipeline.md, review.md) — _api/index.md cita internal/pipeline/review_pipeline.go, docs_pipeline.go e qa_pipeline.go. ls internal/pipeline/ mostra apenas extractor_pipeline.go e seu teste — nenhum dos três arquivos citados existe. grep -rln "_api/" --include="*.go" . só encontra _api/ como STRING LITERAL em fixtures sintéticas de teste do normalizador (internal/documentation/normalizer/*_test.go, ex. FilePath: "_api/example.md"), nunca uma leitura do diretório real. 5b. Único gerador que poderia escrever em _api/, e por que não conta como importador: scripts/generate-code-docs.sh:23 define OUTPUT_DIR="_api" e escreveria _api/index.md se executado. Esse script, porém, não é referenciado por nenhum workflow, Makefile ou outro script (grep -rln "generate-code-docs" --include="*.yml" --include="*.sh" --include="Makefile" --include="Dockerfile" . só encontra menções em tests/acceptance/{AUR-368,AUR-312,AUR-001}.sh, todas listas de inventário/caracterização, nunca uma chamada). Mais: o card cancelado AUR-368 (.board/cards/cancelled/AUR-368.md, tests/acceptance/AUR-368.sh) já caracterizou esse script como commands_executed=0 — nunca executado — contra um manifesto selado por sha256. Este card não toca scripts/generate-code-docs.sh (fora de paths), então esse selo permanece intacto; a existência do script não torna _api/ um diretório com importador ativo.
  6. .github/actions/aurumcode-docs/ (action.yml E README.md) — action.yml é uma segunda definição de Action com inputs incompatíveis com a action.yml real da raiz. grep -rn "uses:" .github/workflows/*.yml não mostra nenhum workflow usando ./.github/actions/aurumcode-docs. Decisão de escopo: o card e a auditoria citam nominalmente só action.yml, mas README.md nessa mesma pasta documenta EXCLUSIVAMENTE como consumir esse action.yml inexistente (uses: Mpaape/AurumCode/.github/actions/aurumcode-docs@... repetido a cada exemplo). Apagar só o action.yml e deixar o README.md trocaria uma cópia morta por uma promessa ativa nova — um README descrevendo uma Action reusável num caminho sem action.yml —, o que viola o Outcome do próprio card ("nenhum arquivo... afirma capacidade que o código não tem"). paths declara o diretório .github/actions inteiro, não só o arquivo; a pasta inteira é removida.
  7. pages-fix.md, test-jekyll.sh — sem importador. Lido antes de apagar: test-jekyll.sh faz cat > Gemfile <<'GEMS', ou seja, sobrescreve o Gemfile da RAIZ (não .aurumcode/Gemfile) se executado a partir da raiz. Esse Gemfile de raiz, por sua vez, também não é o usado pelo workflow real de Pages — .github/workflows/documentation.yml roda Ruby/Bundler com working-directory: .aurumcode, então é .aurumcode/Gemfile (mantido, fora do escopo de apagar deste card) que o Pages realmente consome. Nenhum workflow referencia o Gemfile da raiz pelo nome. test-jekyll.sh em si não é referenciado por nenhum workflow, script ou Makefile.

Mantido, verificado vivo (as duas provas que o aceite exige)

  • Override do welcome-page: .aurumcode/prompts/documentation/welcome-page.md continua existindo e internal/documentation/welcome/generator.go:17 continua nomeando esse caminho exato como defaultPromptPath (tests/integration/AUR-456.go::IntegrationAUR456, dentro do container — internal/documentation/welcome está em read_paths).
  • ENTRYPOINT do Dockerfile: Dockerfile não está em paths nem em read_paths do card, então o profile bootstrap-readonly-v1 (que só materializa paths+read_paths, ver .board/bin/oci-run) nunca o disponibiliza dentro do container — um aceite que o lesse falharia com entrypoint_missing/infraestrutura em vez de produzir um resultado real. Esta é PROVA HOST-RUN, feita nesta árvore antes do commit: grep -n "ENTRYPOINT" Dockerfile → ENTRYPOINT ["/bin/bash", "/app/scripts/action-entrypoint.sh"]. scripts/action-entrypoint.sh está em read_paths (scripts) e sua presença/não-vazio É verificada dentro do container (tests/e2e/AUR-456.sh).
  • Accept do AUR-002: tests/acceptance/AUR-002.sh e tests/characterization/legacy-baseline/ não estão em paths nem read_paths deste card, então também são PROVA HOST-RUN, não container-run. Resultado bruto registrado na seção "Aceites dos irmãos" abaixo.

Fora do container: por que estas duas provas não podem ser asserções do oci-run

bootstrap-readonly-v1 materializa exclusivamente os caminhos declarados em paths e read_paths do card (.board/bin/oci-run, função de materialização em torno de git ls-files -z --cached -- "$allowed_root"). Dockerfile, tests/acceptance/AUR-002.sh e tests/characterization/legacy-baseline/ não aparecem em nenhuma das duas listas. Uma asserção dentro do container contra esses caminhos falharia sempre com entrypoint_missing/infraestrutura — nunca um resultado de comportamento real — então a prova de que eles continuam funcionando é feita nesta árvore, pelo builder, antes do commit, e registrada aqui e na seção "Aceites dos irmãos".

Gap explícito do briefing vs. o card: .env copy.example

A auditoria (achados medidos) e o briefing do builder citam .env copy.example como lixo avulso, mas o paths do próprio card (.board/cards/ready/AUR-456.md) NÃO inclui esse caminho, e forbidden_paths inclui .env (embora o regex de selo do próprio tests/acceptance/AUR-001.sh:65, ^(\.git|\.env|credentials|secrets| \.board/cards)(/|$), não bata em .env copy.example por causa da âncora (/|$)). A razão que importa é mais simples: .env copy.example está fora de paths, e o Postcondition do card é explícito — "Fora de paths, nenhum byte muda". Este builder NÃO apaga esse arquivo. Isso é um gap real entre o briefing recebido e o card autoritativo, registrado aqui em vez de resolvido silenciosamente numa direção ou outra.

Baseline pré-existente do AUR-001 (não introduzido por este card)

Antes de qualquer mudança deste card, nesta mesma árvore:

$ bash tests/acceptance/AUR-001.sh AC-001
AUR-001/AC-001/unmapped-tracked-file: inventory omits 621 of 1420 sealed tracked files, first: .board/AGENT_PLAYBOOK.md
EXIT=1

.board/research/legacy-files.tsv (fora de paths/read_paths deste card, portanto fora do alcance de correção aqui) já estava 621 arquivos atrás do índice real do Git antes de qualquer commit deste card — uma dívida de sincronização pré-existente, não uma regressão deste card. Este card TAMBÉM torna algumas das linhas que já existiam em legacy-files.tsv (as que citam os catorze caminhos apagados) em stale-path — a mesma classe de falha em espécie, apenas uma segunda causa somada a uma execução que já falhava sozinha. Reproduzido depois da remoção nesta mesma árvore:

$ bash tests/acceptance/AUR-001.sh AC-001
AUR-001/AC-001/stale-path: inventory contains an untracked path: .aurumcode/prompts/changelog-generation.md
EXIT=1

Como esperado: a mesma classe de falha (exit 1, aceite do AUR-001 vermelho) continua, agora pela razão adicional de que .board/research/legacy-files.tsv ainda lista linhas para os catorze caminhos que este card apaga — o inventário não foi atualizado porque está fora de paths/read_paths deste card. Nenhuma correção a .board/research/legacy-files.tsv foi feita.

Comando (verificação estática do aceite)

O aceite roda offline, sem executar aurumcode nem regenerate-docs, e sem rede — é verificação de existência de arquivo (ausência dos catorze caminhos mortos, presença dos dois artefatos vivos) mais leitura de texto direta (grep) sobre os read_paths declarados no card.

# Dentro do profile pinado, cwd no worktree do candidato:
ulimit -v 8388608
export GOMEMLIMIT=2GiB GOFLAGS='-mod=mod -p=1'
bash tests/acceptance/AUR-456.sh AC-001

oci-run não passa seletor, então AC-001 (o default do script) é exatamente o que o aceite selado executa. O script, nesse caminho:

  1. Confirma a ausência dos catorze caminhos mortos listados acima (Unit, tests/unit/AUR-456.go::TestAUR456).
  2. Confirma, por leitura direta do código (não por outro grep sobre os caminhos apagados), que os dois artefatos vivos têm lastro: internal/documentation/welcome/generator.go nomeia exatamente .aurumcode/prompts/documentation/welcome-page.md; e internal/review/rules/security.yml declara o id singular security/hardcoded-secret com uma chave pattern: real, e NÃO declara o id plural morto security/hardcoded-secrets (Integration, tests/integration/AUR-456.go::IntegrationAUR456).
  3. Roda a mesma verificação a partir do binário de shell (tests/e2e/AUR-456.sh::E2EAUR456), no mesmo processo do AC-001.

AC-001 sozinho NÃO reproduz o MUT-001: essa mutação é uma invocação separada, bash tests/acceptance/AUR-456.sh MUT-001, provada manualmente durante a construção deste card (nunca automática dentro de oci-run, mesma convenção de AUR-428/AUR-440/AUR-445). Essa invocação estagia uma cópia descartável SEPARADA em /tmp (nunca o caminho rastreado, que já está apagado), reintroduz os bytes exatos de .aurumcode/rules/security.yml só nessa cópia, exporta AUR456_MUTATION=MUT-001 para que o Unit e o E2E distingam a mutação deliberada do RED natural (que produziria a mesma presença de arquivo, mas sem o marcador), e confirma que a saída capturada de cada camada carrega o rótulo AUR-456/AC-001/MUT-001 antes de aceitar a falha como a mutação detectada. A cópia é descartada ao final.

Exit codes

Código Contexto Significado
0 AC-001 Os catorze caminhos mortos estão ausentes e os dois artefatos vivos têm lastro no código.
0 MUT-001 A mutação de ceticismo (reintroduzir .aurumcode/rules/security.yml só na cópia descartável) foi detectada corretamente pelas camadas Unit e E2E.
1 (rotulado AUR-456/AC-001/behavior-missing) AC-001 sobre uma árvore não corrigida (RED), ou MUT-001 sem o marcador AUR456_MUTATION Um caminho morto sobrevive, ou um artefato vivo perdeu seu lastro.
1 (rotulado AUR-456/AC-001/MUT-001) Dentro da invocação MUT-001 A camada (Unit ou E2E) recusou a cópia mutada, como esperado.
64 Seletor desconhecido (erro de uso do script).
69 Falha de infraestrutura (ex.: go ausente do PATH), nunca contada como aceite.

Exemplo executável, sem segredo

cd /caminho/para/AurumCode
ulimit -v 8388608
GOMEMLIMIT=2GiB GOFLAGS='-mod=mod -p=1' bash tests/acceptance/AUR-456.sh AC-001
echo "exit: $?"

Saída esperada em GREEN: uma linha JSON {"card":"AUR-456","scenario":"AC-001","result":"pass",...} e exit 0.

Diagnóstico de falha

  • AUR-456/AC-001/behavior-missing:dead copy still present: <caminho> — o caminho morto nomeado ainda existe; releia a seção "Apagado" acima e a auditoria original no card.
  • AUR-456/AC-001/behavior-missing:... (variantes de generator.go/ security.yml) — a checagem cruzada contra o código falhou; o código mudou sem a remoção acompanhar, ou vice-versa.
  • AUR-456/AC-001/MUT-001 — esperado apenas durante a própria execução da mutação de ceticismo; fora dela, indica que a cópia morta de .aurumcode/rules/security.yml voltou a existir na árvore rastreada.
  • Exit 69 — infraestrutura (Go ausente, mktemp falhou); nunca conta como prova de comportamento.

Nota sobre os nomes dos seletores no card

A seção "TDD proof" do card nomeia os seletores TestAUR445, IntegrationAUR445 e E2EAUR445 — resíduo do template copiado de AUR-445 (mesmo office, mesmo formato de card). Esses símbolos já existem em tests/unit/AUR-445.go e tests/integration/AUR-445.go, no mesmo pacote (unit, integration); declará-los de novo em tests/unit/AUR-456.go / tests/integration/AUR-456.go colidiria e quebraria go build ./... / go vet ./... sobre esses pacotes — o mesmo problema que o próprio AUR-445 documentou contra seu resíduo de template AUR-428 (docs/specs/AUR-445.md, seção final). Este card usa os nomes correspondentes ao seu próprio ID — TestAUR456, IntegrationAUR456, E2EAUR456 — mantendo o mesmo padrão de nomenclatura que todo outro card do office já segue.

Aceites dos irmãos (host-run, nesta árvore, antes do commit)

Ambiente usado para as quatro execuções abaixo: PATH=/home/paape/go-sdk/bin:$PATH, GOPATH=/home/paape/go (necessário para que go run/go test resolvam github.com/gorilla/mux e gopkg.in/yaml.v3 sem rede — GOPROXY=off neste sandbox), mais ulimit -v 8388608, GOMEMLIMIT=2GiB, GOFLAGS='-mod=mod -p=1'.

Card Comando Exit bruto
AUR-002 bash tests/acceptance/AUR-002.sh AC-001 1 — AUR-002/AC-001/baseline-drift: legacy command behavior drift (integration exit 1): AUR-002: expected one generated document, got 2
AUR-424 bash tests/acceptance/AUR-424.sh AC-001 0
AUR-442 bash tests/acceptance/AUR-442.sh AC-001 0
AUR-444 bash tests/acceptance/AUR-444.sh AC-001 0

AUR-002 não fecha em 0 nesta árvore, e isso é pré-existente, não introduzido por este card. tests/integration/AUR-002.go, cmd/regenerate-docs e internal/pipeline estão fora de paths e read_paths deste card — não podem ser corrigidos aqui. Prova de pré-existência, reproduzida byte-a-byte em três árvores diferentes com o mesmo ambiente:

$ git archive 6f80d6a | tar -x -C /tmp/aur456-base   # base_sha exato deste worktree
$ cd /tmp/aur456-base && bash tests/acceptance/AUR-002.sh AC-001
AUR-002/AC-001/baseline-drift: legacy command behavior drift (integration exit 1): AUR-002: expected one generated document, got 2
EXIT=1

$ cd /home/paape/repos/AurumCode && bash tests/acceptance/AUR-002.sh AC-001   # checkout principal, não tocado
AUR-002/AC-001/baseline-drift: legacy command behavior drift (integration exit 1): AUR-002: expected one generated document, got 2
EXIT=1

Mesma falha, mesma mensagem, no base_sha exato deste card (antes de qualquer commit do AUR-456) e no checkout principal não relacionado. A causa provável é deriva de um card já integrado depois do AUR-002 original (provavelmente o AUR-424, que trocou gomarkdoc por go/parser da biblioteca padrão para Go — ver docs/specs/AUR-445.md — mudando quantos documentos a pipeline legada gera por rodada); investigar e corrigir essa deriva pertence a um card próprio, com internal/pipeline e cmd/regenerate-docs em paths, não a este.