Pular para conteúdo

AUR-547: aceites de cards done nao copiam pacotes removidos do produto

O que foi medido

AUR-542 (done) ja tinha medido, para tests/e2e/*.sh, que cmd/regenerate-docs, internal/pipeline e internal/documentation/* foram removidos do produto pelo commit 670c7f6 ("Focus AurumCode on code review", 2026-09-12) -- um pivo de produto deliberado e anterior, que o registro de entrega do AUR-490 (done) ja trata como fato assentado. Este card estende a mesma auditoria e a mesma correcao para tests/acceptance/AUR-443.sh, AUR-448.sh, AUR-449.sh, AUR-458.sh, AUR-466.sh e AUR-481.sh, e para tests/integration/AUR-449.go e tests/unit/AUR-449.go (AC-003).

Metodo: para cada script, a lista de pacotes copiados em stage_source() foi substituida pela resposta real de go list -deps ./cmd/aurumcode (rodado no container go-shared contra este worktree), filtrada aos pacotes github.com/Mpaape/AurumCode/internal/* e arredondada ao diretorio dono -- a mesma tecnica e a mesma lista final que o AUR-542 ja usou em tests/e2e/AUR-459.sh:

internal/analysis internal/analyzer internal/apply internal/changelog
internal/config internal/context internal/git internal/llm internal/memory
internal/prompt internal/render internal/review internal/reviewprofile
internal/security internal/testgen

Isso remove cmd/regenerate-docs, internal/documentation/* e internal/pipeline (que nao existem mais -- ls internal neste worktree confirma) e acrescenta pacotes que faltavam na lista original de cada script (internal/analysis, internal/apply, internal/changelog, internal/context, internal/memory, internal/render, internal/reviewprofile, internal/testgen), que o binario de hoje tambem importa e que a lista antiga, escrita antes desses pacotes existirem, nunca cobriu -- a materializacao estava incompleta nos dois sentidos, nao só excedente.

Cada script foi executado isolado, sem edicao, para medir a causa antes de qualquer correcao; depois de cada candidata, reexecutado para confirmar o novo resultado -- nunca inferido.

Por script

AUR-443: infraestrutura corrigida; AC-001 fica vermelho por tests/unit/AUR-443.go e tests/integration/AUR-443.go, fora dos paths deste card

Causa. Alem dos pacotes obsoletos, nominal_case() (dentro do proprio tests/acceptance/AUR-443.sh, portanto nos paths deste card) ainda testava o subcomando docs (removido com cmd/regenerate-docs) e esperava exit 1/stdout vazio para review --base sem provedor (revogado pelo AUR-490, done, integrado depois do AUR-443). Corrigido com a mesma logica que o AUR-542 ja aplicou a tests/e2e/AUR-443.sh: docs removido das asserções; "sem provedor" agora exit 0; o contrato "zero achados -> No issues found." passa a comparar so a ULTIMA linha (tail -n1), porque o AUR-490 antepõe incondicionalmente o bloco de resumo/diagrama, mais uma checagem de que nenhuma linha no formato <arquivo>:<linha>: [<severidade>] aparece em lugar nenhum do stdout.

Depois disso, nominal_case, e2e_case (que reusa o tests/e2e/AUR-443.sh ja corrigido pelo AUR-542) e mutation_case (MUT-001 proprio do AUR-443, com a mesma remocao de docs na checagem de restauracao) passam. unit_case e integration_case continuam vermelhos: chamam tests/unit/AUR-443.go e tests/integration/AUR-443.go, que NAO estao nos paths deste card (.board/cards/backlog/AUR-547.md so lista tests/integration/AUR-449.go e tests/unit/AUR-449.go), e esses dois arquivos ainda afirmam o docs subcommand e o exit 1 incondicional pre-AUR-490.

Decisao. Teste desatualizado contra o AUR-490 e o pivo 670c7f6, exatamente como o AUR-542 ja decidiu para o tests/e2e/AUR-443.sh irmao -- mas os dois arquivos que ainda falham (tests/unit/AUR-443.go, tests/integration/AUR-443.go) ficam fora dos paths deste card. Nao corrigidos aqui; reportado para reabertura do card de origem ou para um card de escopo dedicado a esses dois arquivos.

Antes -> Depois. Antes: AUR-443/AC-001/infrastructure/missing_input:... (parava na materializacao). Depois: nominal_case, e2e_case e mutation_case passam; AC-001 completo para AUR-443/AC-001/selector:TestAUR443:exit:1 -- vermelho medido, causa em arquivo fora dos paths, documentado aqui, nao mascarado.

B1 (revisao independente) -- cenario 7. A asserção original (tail -n1 mais um grep ancorado no formato exato de achado) deixava passar uma linha vazada arbitraria entre o diagrama e "No issues found.", provado adicionando essa linha em cmd/aurumcode/main.go::printFindings e vendo o cenario 7 continuar verde. Trocado por after_diagram() (ver secao AUR-448 abaixo para o detalhe da funcao): tudo depois da ULTIMA cerca de mermaid precisa ser EXATAMENTE "No issues found.", sem excecao. Reproduzido com a mesma mutacao do revisor: AC-001 agora falha em review-contract-leaked-finding, dentro de nominal_case, antes mesmo de chegar no unit_case ja vermelho por outro motivo.

B3 (revisao independente) -- selectores individuais medidos e fixados em tests/acceptance/AUR-547.sh::detail_checks, nao mais inferidos pela tag grosseira de AC-001:

selector (AUR-443) exit medido tag/causa
TestAUR443 (unit, fora dos paths) 1 selector:TestAUR443:exit:1 -- 4 subtestes falham dentro de tests/unit/AUR-443.go (fora dos paths): top-level_--help_lists_subcommands... (ainda exige docs no --help), docs_--help_is_still_on_stdout..., no_provider_configured:... (ainda exige exit 1) e review_--base's_published_contract_is_untouched... (AUR-443.go:529, ainda exige stdout igual a so "No issues found.", sem o bloco de resumo/diagrama do AUR-490)
IntegrationAUR443 (fora dos paths) 1 selector:IntegrationAUR443:exit:1 -- um subteste falha: a_valid_ref_still_resolves_and_reviews_normally_on_both_backends (AUR-443.go:298), mesma causa (compara contra o stdout pre-AUR-490)
E2EAUR443 (fora dos paths, ja corrigido pelo AUR-542) 0 E2EAUR443/ok
AC-001-MUT-001 (mutation_case, proprio deste script) 0 MUT-001/rejected

AUR-448: infraestrutura corrigida; AC-001 fica vermelho por um gate de evidencia mais novo que a propria fixture do script nao satisfaz

Causa. Depois de corrigir a materializacao e o cenario 1 (mesma causa do AUR-443/AUR-490: "sem provedor" agora exit 0, stdout nao mais vazio -- a mensagem completa continua presente, impressa como segunda linha pelo conserto do AUR-542 em cmd/aurumcode/main.go) e os cenarios 2 e 4 (a comparacao exata de stdout precisa ser so da ULTIMA linha, pelo mesmo motivo do AUR-443), o script avanca e falha no cenario 3 (mixed.json, descarte misto): medido diretamente, a resposta do motor hoje e aurumcode review: 3 finding(s) descartado(s) pelo gate de escopo e evidencia: 3 sem evidencia concreta -- em portugues, descartando TODOS os 3 achados, inclusive o grounded com rule_id valido -- em vez de aurumcode review: 2 finding(s) discarded: 1 with no rule_id, 1 citing an unknown rule_id (security/definitely-not-a-rule). O gate que o AUR-448 testava (so citacao de rule_id, em internal/review.enforceRuleCitations) foi superado por um gate mais novo e mais estrito (internal/review/scope.go, "gate de escopo e evidencia", que exige Evidence/Impact/Verification em todo achado -- o mesmo gate que o AUR-542 ja documentou investigando tests/e2e/AUR-459.sh). A fixture mixed.json do proprio AUR-448.sh nao carrega esses campos, entao hoje e descartada por inteiro.

Decisao. Isto NAO e so uma desatualizacao contra o AUR-490: e um gate de produto mais novo e mais estrito que invalida a premissa da fixture do AUR-448, nao so o texto da mensagem. internal/review/scope.go nao esta nos paths deste card (so leitura), e decidir se a fixture deveria ganhar evidencia/impact/verification para voltar a sobreviver ao gate -- ou se o card de origem (AUR-448) precisa ser reaberto para essa decisao de produto -- e maior do que este card deveria assumir sozinho, pelo mesmo motivo que o AUR-542 recusou tocar internal/review/scope.go para o AUR-438/AUR-459. Fica vermelho, com a causa medida acima, nao mascarado.

Antes -> Depois. Antes: AUR-448/AC-001/infrastructure/missing_input:.... Depois: cenarios 1 e 2 corrigidos contra o AUR-490; AC-001 continua vermelho, agora com tag unica e precisa por asserção (s1-*/s2-*/s3-*/s4-*, nao mais o rotulo generico behavior-missing que uma unica revisao independente apontou como capaz de mascarar qualquer asserção nova). AC-001 para hoje em AUR-448/AC-001/s3-grounded-finding-missing no cenario 3 -- o gate de evidencia descarta ate o achado fundamentado antes mesmo do cenario 4 ser alcancado.

Correcao da secao anterior desta mesma spec (revisao independente, B2): a frase "cenarios 1, 2 e 4 corrigidos" estava errada -- o cenario 4 nunca chega a rodar dentro de AC-001 porque o cenario 3 falha primeiro. O cenario 4 TEM seu proprio conserto (ver B1 abaixo), mas isso so fica provado rodando os outros selectores do script isoladamente, nao pelo AC-001 inteiro. Medido e fixado em tests/acceptance/AUR-547.sh::detail_checks:

selector (AUR-448) exit medido tag/causa
TestAUR448 (unit, fora dos paths) 1 selector:TestAUR448:exit:1 -- tests/unit/AUR-448.go tambem colide com o gate de evidencia (discard_warning vem vazio onde o teste esperava texto)
IntegrationAUR448 (fora dos paths) 1 selector:IntegrationAUR448:exit:1 -- mesma causa, em tests/integration/AUR-448.go
E2EAUR448 (fora dos paths, ja corrigido pelo AUR-542) 0 E2EAUR448/ok -- este, sim, continua verde
AC-001-MUT-001 (mutation_case, propria deste script) 1 MUT-001/not-rejected -- a mutacao que suprime o aviso de descarte (Fprintf -> _ = warning) nao e mais a UNICA fonte de texto em stderr: o gate de evidencia mais novo escreve sua propria mensagem por um caminho diferente, que a mutacao nao toca, entao stderr continua nao-vazio e a asserção final do mutation_case falha -- nao porque a mutacao sobreviveu como PASS, mas porque o proprio mutation_case hoje e vermelho por uma causa colateral ao gate de evidencia, nao ao que ele pretende testar

B1 (revisao independente): tail -n1 + grep por formato de achado deixava vazar uma linha arbitraria

Causa. A revisao independente provou, adicionando fmt.Fprintln(stdout, "LEAKED discarded finding -- config/demo-tokens.txt line 4: hardcoded secret DEMO_API_TOKEN") antes de "No issues found." em cmd/aurumcode/main.go::printFindings, que tests/acceptance/AUR-443.sh (cenario 7) e tests/acceptance/AUR-448.sh (cenario 4 e seu mutation_case) ficavam verdes mesmo com essa linha vazada: tail -n1 ve so a ULTIMA linha (ainda "No issues found."), e o grep de "zero achados" so cobria o formato exato <arquivo>:<linha>: [<severidade>], que a linha vazada nao tem.

Decisao e conserto. As duas asserções foram trocadas por uma funcao after_diagram() (awk) que pega TUDO depois da ULTIMA linha que e exatamente a cerca do mermaid (```) e exige igualdade EXATA com "No issues found." -- qualquer linha extra, de qualquer formato, quebra a igualdade. Reproduzido com a mesma mutacao do revisor: tests/acceptance/AUR-443.sh AC-001 agora falha em review-contract-leaked-finding (nominal_case, antes mesmo de chegar no unit_case) e o cenario 4 isolado de AUR-448.sh (testado diretamente contra o binario mutado, fora da sequencia de AC-001 que para no cenario 3) tambem passa a rejeitar a linha vazada.

AUR-449: corrigido por completo -- AC-001 sai 0

Causa. Alem da materializacao, tres pontos colidiam com cards aprovados e integrados depois do AUR-449:

  1. review --base sem --seguranca e sem provedor: o AUR-490 removeu a exigencia && *seguranca deste mesmo guarda em cmd/aurumcode/main.go -- hoje sai 0 (nao mais 1 incondicional) e a nota de skip aparece mesmo sem --seguranca (nao mais nunca).
  2. Um provedor configurado errado (AURUMCODE_LLM_FIXTURE para um arquivo que nao existe) com --seguranca: o AUR-458 (done, tambem integrado depois do AUR-449) decidiu que esse caminho ainda entrega os achados de seguranca ja computados (nunca descarta trabalho ja feito), em vez de falhar antes de qualquer saida -- medido diretamente contra o binario.
  3. O pin de sha256 do stdout completo com um provedor configurado parou de bater porque o AUR-490 passou a antepor incondicionalmente o bloco de resumo/diagrama nesse mesmo caminho.

Decisao. Os tres sao realinhamentos contra cards aprovados e integrados (AUR-490, AUR-458), nunca enfraquecimento do que o AUR-449 proprio provou: o invariante que o AUR-449 realmente possui -- a nota exata "quality review skipped" nunca aparece para um provedor configurado errado (so para "nada configurado") -- continua testado e passando; o pin de sha256 do stdout completo foi trocado por uma checagem do byte-a-byte da SECAO DE SEGURANCA (contagem exata de citacoes), o unico pedaco que o AUR-449 proprio publicou. tests/unit/AUR-449.go (linhas 182, 212, 244 antes da edicao) e tests/integration/AUR-449.go (linha 213 antes da edicao) tiveram exatamente essas asserções atualizadas, pela mesma razao -- AC-003 deste card.

Antes -> Depois. Antes: AUR-449/AC-001/infrastructure/missing-input:.... Depois: nominal_case, unit_case, integration_case, e2e_case e mutation_case (MUT-001 proprio do AUR-449, anchor atualizado para o texto atual do guarda pos-AUR-490, asserções finais restritas ao que esta mutacao realmente testa) todos passam. AUR-449/AC-001/ok.

AUR-458: infraestrutura corrigida; AC-001 fica vermelho por tests/e2e/AUR-458.sh, fora dos paths deste card

Causa. Depois de corrigir a materializacao e o pin de sha256 do stdout completo (mesma causa do AUR-449: trocado por checagem da secao de seguranca sozinha), nominal_case() passa por completo. AC-001 deste script tambem roda tests/e2e/AUR-458.sh (nao esta nos paths deste card -- so tests/acceptance esta) e falha ali: AUR-458/E2E/pr-path-must-refuse-the-flag:want-2-got-1 -- o caminho --pr com uma flag que deveria ser recusada (exit 2) hoje sai 1. Separadamente, os selectores TestAUR458/IntegrationAUR458 (fora do AC-001 deste script, so acessiveis por selector direto) mostram que tests/unit/AUR-458.go (tambem fora dos paths) falha em dois casos ("provider absent, quality review demanded": exit 0, esperava 1; "--exigir-qualidade recusado no caminho --pr": exit 1, esperava 2) -- tests/integration/AUR-458.go passa.

Decisao. As tres causas vivem em arquivos fora dos paths deste card (tests/e2e/AUR-458.sh, tests/unit/AUR-458.go). Nao investigado a fundo se sao desatualizacao contra AUR-490/AUR-458 ou um gap real do caminho --pr -- essa investigacao e essa correcao pertencem a um card com mandato sobre esses arquivos. Reportado, nao mascarado.

Antes -> Depois. Antes: AUR-458/AC-001/infrastructure/missing-input:.... Depois: nominal_case passa por completo; AC-001 completo fica AUR-458/AC-001/e2e-failed (pr-path-must-refuse-the-flag:want-2-got-1) -- vermelho medido, causa em arquivos fora dos paths, documentado aqui.

B3 (revisao independente). A chamada original a tests/e2e/AUR-458.sh dentro do case "$selector" descartava a saida em /dev/null, entao um e2e-failed generico nao distinguia essa causa de qualquer outra. Corrigido capturando a saida e anexando sua ultima linha ao tag: a tag completa, medida e agora pinada em tests/acceptance/AUR-547.sh::expected_tag, e e2e-failed:AUR-458/E2E/pr-path-must-refuse-the-flag:want-2-got-1.

AUR-466: infraestrutura corrigida; AC-001 fica vermelho por tests/integration/AUR-466.go, fora dos paths deste card

Causa. Alem da materializacao, a contagem de achados do cenario Python (AC-003 do proprio AUR-466) contava [error] no stdout INTEIRO, e o AUR-490 passou a imprimir uma linha [error] extra (a do passe de analise deterministica, que agora roda sempre em review --base) antes da secao de seguranca -- medido diretamente. Corrigido escopando a contagem a secao de seguranca (depois do cabecalho), igual ao cenario node_repo alguns pontos acima no mesmo script. Depois disso nominal_case passa. integration_case continua vermelho: tests/integration/AUR-466.go (fora dos paths deste card) ainda compara o stdout inteiro contra o formato pre-AUR-490.

Decisao. Realinhamento contra o AUR-490 dentro do que este card possui (tests/acceptance/AUR-466.sh); tests/integration/AUR-466.go fica fora dos paths, vermelho, reportado.

Antes -> Depois. Antes: AUR-466/AC-001/infrastructure/missing-input:.... Depois: nominal_case passa; AC-001 completo fica AUR-466/AC-001/selector:IntegrationAUR466:exit:1 -- vermelho medido, causa em arquivo fora dos paths, documentado aqui.

B3 (revisao independente). O subteste que falha em IntegrationAUR466 e medido e nominal: AUR-466.go:182, "expected exactly one finding on the Python vuln fixture" -- o mesmo efeito do AUR-490 (linha [error] extra da analise deterministica) que nominal_case ja corrigiu, so que tests/integration/AUR-466.go fica fora dos paths deste card. O selector E2EAUR466 (tambem fora dos paths) foi rodado isoladamente e confirmado verde (AUR-466/AC-001/e2e-ok) -- nao e so inferido pelo AC-001 geral. Ambos fixados em tests/acceptance/AUR-547.sh::detail_checks.

AUR-481: infraestrutura corrigida; AC-001 fica vermelho por tests/integration/AUR-481.go, fora dos paths deste card

Causa e decisao identicas ao AUR-466 (mesmo script-irmao, mesma fixture Python, mesma linha [error] extra do passe de analise deterministica do AUR-490): a contagem do cenario Python foi escopada a secao de seguranca da mesma forma. integration_case continua vermelho por tests/integration/AUR-481.go, fora dos paths deste card.

Antes -> Depois. Antes: AUR-481/AC-001/infrastructure/missing-input:.... Depois: nominal_case passa; AC-001 completo fica AUR-481/AC-001/selector:IntegrationAUR481:exit:1 -- vermelho medido, causa em arquivo fora dos paths, documentado aqui.

B3 (revisao independente). Mesma medicao do AUR-466: AUR-481.go:172, "expected exactly one finding on the Python vuln fixture". E2EAUR481 (fora dos paths) rodado isoladamente e confirmado verde (AUR-481/AC-001/e2e-ok). Ambos fixados em tests/acceptance/AUR-547.sh::detail_checks.

AC-002: nenhum aceite listado copia pacote que nao existe mais

Confirmado por grep nos seis scripts: nenhuma ocorrencia de cmd/regenerate-docs, internal/pipeline ou internal/documentation resta em stage_source()/required_inputs de nenhum dos seis. tests/acceptance/AUR-547.sh::AC-002 verifica isso automaticamente a cada execucao.

AC-003: tests/unit/AUR-449.go e tests/integration/AUR-449.go

Ver a secao "AUR-449" acima. As asserções que afirmavam "o aviso de qualidade pulada nao aparece sem --seguranca" (revogado pelo AUR-490) foram atualizadas para a regra atual (a nota aparece sempre que nada esta configurado, com ou sem --seguranca); a asserção sobre um provedor configurado errado foi atualizada para refletir a entrega do AUR-458 (achados de seguranca ainda aparecem; so o invariante proprio do AUR-449 -- nunca a nota exata de skip -- continua garantido); a asserção com provedor valido nao mudou de comportamento, so ganhou um comentario explicando por que continua correta.

Revisao independente (REQUEST_CHANGES) -- resolucao

  • B1 (bloqueante, resolvido): tail -n1 mais um grep ancorado ao formato de achado deixava vazar uma linha arbitraria antes de "No issues found." em tests/acceptance/AUR-443.sh (cenario 7) e tests/acceptance/AUR-448.sh (cenario 4 e seu mutation_case). Reproduzido com a mutacao exata do revisor em cmd/aurumcode/main.go::printFindings (nunca commitada -- so usada para medir, depois revertida) e corrigido com after_diagram(), que exige igualdade EXATA de tudo apos a ultima cerca de mermaid. Ver as secoes "B1" dentro de AUR-443 e AUR-448 acima.
  • B2 (bloqueante, resolvido): a tag generica behavior-missing do AUR-448.sh foi substituida por uma tag unica por asserção (s1-*/s2-*/s3-*/s4-*); a frase falsa "cenarios 1, 2 e 4 corrigidos" foi corrigida (so 1 e 2; o 4 nunca roda dentro de AC-001 porque o 3 falha primeiro); TestAUR448, IntegrationAUR448, E2EAUR448 e AC-001-MUT-001 foram medidos e documentados individualmente (tabela na secao AUR-448 acima) e fixados em tests/acceptance/AUR-547.sh::detail_checks.
  • B3 (bloqueante, resolvido): as tags grosseiras de AUR-458 (e2e-failed, saida descartada em /dev/null), AUR-443 (selector:TestAUR443:exit:1) e AUR-466/AUR-481 (selector:IntegrationAUR4NN:exit:1) agora tem a causa interna pinada (nome do subteste ou ultima linha do e2e, ver as secoes por script acima), e tests/acceptance/AUR-547.sh roda, selector por selector, cada um dos 12 pares (script, selector) listados em detail_checks, provando cada green reivindicado (E2EAUR443, AC-001-MUT-001 do AUR-443, E2EAUR448, E2EAUR466, E2EAUR481) em vez de inferi-lo do AC-001 grosseiro.

Non-goals respeitados

Nenhum pacote de produto foi alterado. internal/review/scope.go (gate de evidencia que explica o AUR-448) nao foi tocado -- fica vermelho, documentado, fora do escopo deste card, pelo mesmo motivo que o AUR-542 recusou tocar o mesmo arquivo para AUR-438/AUR-459. Nenhum arquivo fora de tests/acceptance, tests/integration/AUR-449.go, tests/unit/AUR-449.go, tests/acceptance/AUR-547.sh ou este documento foi editado.

Recomendacao

Abrir um card dedicado com mandato sobre tests/unit/AUR-443.go, tests/integration/AUR-443.go, tests/integration/AUR-466.go, tests/integration/AUR-481.go, tests/e2e/AUR-458.sh e tests/unit/AUR-458.go para o mesmo realinhamento contra AUR-490/AUR-458 que este card aplicou aos scripts de aceite; e um card com mandato sobre internal/review/scope.go (ou sobre a fixture do AUR-448) para decidir o gate de evidencia que deixa tests/acceptance/AUR-448.sh vermelho.