AUR-542: scripts e2e de cards done que ainda falham voltam a provar o prometido
O que foi medido
AUR-541 (2026-10-02) auditou tests/e2e/*.sh que alimentam
AURUMCODE_LLM_FIXTURE e corrigiu o gate de evidencia nas fixtures, mas
encontrou seis scripts que falham por motivos ALEM desse gate:
AUR-438, AUR-443, AUR-448, AUR-449, AUR-451, AUR-459. Este card roda cada
um via .board/bin/go-shared exec contra este worktree, mede a causa raiz,
e decide: regressao de produto (corrigir dentro dos paths deste card) ou
teste desatualizado (corrigir o teste, sem afrouxar nenhum gate nem mudar o
que o card de origem prometeu).
Metodo: cada script foi executado isolado antes de qualquer edicao, o
primeiro fail()/infra() encontrado foi tratado como a causa, e o
binario foi reconstruido e reexecutado apos cada correcao candidata para
confirmar o novo resultado -- nunca inferido.
AUR-443: docs nao existe mais, e a mensagem de "sem provedor" mudou sob AUR-443
Causa
Duas causas distintas, nao relacionadas entre si:
aurumcode --help,docs --helpe o bloco final do script testavam o subcomandodocs(gerado porcmd/regenerate-docs). Esse comando foi removido do produto pelo commit670c7f6("Focus AurumCode on code review and publish interactive documentation", 2026-09-12), um pivo de produto deliberado e anterior a este card --git ls-files cmd/regenerate-docse vazio emmain, e o binario hoje respondeaurumcode: unknown command "docs"(exit 2) para qualquer invocacao. AUR-490 (done) ja trata essa remocao como fato assentado.- O script chama
review --base HEAD~1sem provedor e espera exit 1 com stdout vazio. AUR-490 (done, integrado emmainantes deste card) mudou esse caminho deliberadamente (seu proprio registro de entrega: "review --basesem provedor configurado deixa de sair 1 incondicionalmente"): hoje sai 0 por padrao (roda so analise deterministica) a menos que o chamador peça--exigir-qualidade(AUR-458), e o stdout passa a sempre trazer o resumo e o diagrama mermaid (AC-002 do AUR-490) em vez de ficar vazio ou conter so a linha de achado.
Decisao
Teste desatualizado nos dois pontos. docs ja nao existe no produto por
decisao de outro card, anterior e integrado; manter a asserção testaria
uma capacidade que o produto deliberadamente abandonou. O exit-code e o
formato de stdout de "sem provedor" tambem sao decisao deliberada e
integrada do AUR-490, nao uma regressao deste card para corrigir.
Antes
tests/e2e/AUR-443.sh falhava em help_missing_docs (grep por docs no
--help de topo).
Depois
Removidas as asserções sobre docs (linhas que verificavam --help
listar docs, docs --help, docs --this-flag-does-not-exist, e o bloco
final que rodava docs --source ... --output ...); a secao 7
("review --base's published contract") passou a comparar so a ULTIMA
linha do stdout (tail -n1) contra No issues found. em vez do stdout
inteiro, porque o AUR-490 sempre antepõe o bloco de resumo/diagrama; a
secao 4 ("no provider configured") passou a esperar exit 0 (o novo
padrao) em vez de 1. tests/e2e/AUR-443.sh sai 0.
AUR-448: "sem provedor" nao tinha mais a mensagem completa da fixture
Causa
O cenario 1 (no_provider_wrong_exit) tambem colide com a mudanca do
AUR-490: review --base HEAD~1 sem provedor agora sai 0, nao 1. Mas, ao
investigar mais a fundo, a mudanca do AUR-490 tambem substituiu, no
caminho padrao (sem --modelo explicito), a mensagem completa que
errNoProviderConfigured carrega -- com rule_id, severity, um exemplo
real do catalogo e o ponteiro para known-problem-response.json -- por
uma linha curta ("no LLM provider configured: quality review skipped;
running deterministic analysis only"). Essa e exatamente a mensagem que
AUR-448 e AUR-443 foram escritos para proteger (a promessa do
AUR-448: "a mensagem que ensina o formato do fixture mostra a forma
COMPLETA que o motor exige"). Medido diretamente em cmd/aurumcode/main.go:
antes deste card, nenhum caminho alcancavel sem --modelo explicito
imprimia mais "rule_id", "severity", security/hardcoded-secret ou
tests/fixtures/review/known-problem-response.json no stderr.
Decisao
Regressao de produto real, dentro do escopo deste card (cmd/aurumcode
esta em paths). O AUR-490 tinha o direito de mudar o exit code (decisao
dele, registrada e revisada) mas apagou, como efeito colateral nao
documentado, uma mensagem que outro card done prometia explicitamente.
Conserto aditivo: a branch qualitySkipped de cmd/aurumcode/main.go
(em torno da linha 868) agora imprime a mensagem curta do AUR-490 E, numa
segunda linha, o texto completo de errNoProviderConfigured (%v) --
sem mudar a linha curta, o exit code ou o stdout. Nao e uma reversao do
AUR-490: o exit code continua 0 por padrao.
Antes
$ aurumcode review --base HEAD~1
aurumcode review: no LLM provider configured: quality review skipped; running deterministic analysis only
rule_id, severity, exemplo do catalogo ou ponteiro de
fixture; exit 0.)
Depois
$ aurumcode review --base HEAD~1
aurumcode review: no LLM provider configured: quality review skipped; running deterministic analysis only
aurumcode review: no LLM provider configured: set AURUMCODE_LLM_FIXTURE=<path> to a JSON file shaped like {"issues":[{"file":"<path>","line":<n>,"severity":"error|warning|info","rule_id":"<id from the embedded rule catalog, e.g. security/hardcoded-secret>","message":"<text>"}]} for offline use -- a finding whose rule_id is missing or unknown is discarded, never shown, so rule_id is not optional -- if you have the AurumCode source checked out, tests/fixtures/review/known-problem-response.json is a worked example -- or set LLM_API_KEY and LLM_BASE_URL for a live provider
tests/e2e/AUR-448.sh sai
0.
AUR-449: mesma causa de exit code do AUR-490, sem regressao adicional
Causa
O ultimo cenario ("sem --seguranca, sem provedor, deve continuar
falhando") tambem assume o exit 1 incondicional que o AUR-490 removeu, e
ainda afirmava que a nota de skip "quality review skipped" NAO deveria
aparecer sem --seguranca -- tambem falso hoje: o AUR-490 removeu esse
requisito de && *seguranca do guarda (comentario do proprio
cmd/aurumcode/main.go: "AUR-490 drops this guard's old && *seguranca
requirement"), entao a nota aparece em QUALQUER review --base sem
provedor, com ou sem --seguranca.
Decisao
Teste desatualizado; nenhuma mensagem adicional faltava aqui (diferente do
AUR-448, este script nunca verificava rule_id/severity/etc). Ajustado
para o novo padrao: exit 0, nota de skip esperada, e a unica asserção que
ainda importa para a promessa deste card -- a secao "Security findings"
continua ausente sem --seguranca -- preservada.
Antes
tests/e2e/AUR-449.sh falhava em
no-seguranca-no-provider-must-still-fail:0.
Depois
Cenario final passou a esperar exit 0 e a permitir a nota de skip; a
asserção real (sem --seguranca, sem secao de seguranca) continua
verificada. tests/e2e/AUR-449.sh sai 0.
AUR-451: um commit sem card (2cd157b) mudou o contrato de publicacao 10 dias depois do AUR-451 -- decisao de coordenacao registrada abaixo
Causa
A primeira versao desta secao (revisada e rejeitada) atribuia as duas
falhas a "asserções sempre equivocadas". Isso e FALSO -- medido com
git show, nao inferido:
0e00d50("AUR-451: review --pr now runs the whole engine, not just --base", 2026-08-14 -- a entrega do proprio AUR-451) tem, emcmd/aurumcode/pr.go: zero achados ->fmt.Fprintln(stdout, "No issues found.")ereturn 0SEM publicar nada; achados -> um loop que so publica POST por achado (inline ou geral), SEM nenhum post de resumo. Ou seja, as asserções originais detests/e2e/AUR-451.sh(1 POST para 1 achado inline;"No issues found."no stdout e 0 POSTs para zero achados) eram EXATAMENTE o que o proprio card entregou e testou.2cd157b("feat: publish structured pull request reviews", 2026-08-24, DEZ DIAS depois) reescreveu esse trecho depr.go: passou a publicar incondicionalmente um comentario de resumo (PostIssueCommentcomsummaryBody) depois do loop, e removeu a linhafmt.Fprintln(stdout, "No issues found.").2cd157bNAO e um commit de card -- sua mensagem nao tem prefixoAUR-NNN:, e nao ha.board/cards/done/AUR-*.mdcujoDelivery recordcite esse SHA (o AUR-451 ja estava em done antes dele, e o proximo card a tocarpr.gonao e2cd157b). Foi esse commit, nao um teste sempre errado, que tornou as asserções do AUR-451 falsas.
Decisao
Nao resolvida por este card -- registrada como pendente, nao como
assentada. 2cd157b mudou um contrato que um card aprovado (AUR-451)
tinha fixado como parte do seu "AC-001: repetir a mesma entrada produz a
mesma saida", sem passar pelo processo de card/revisao deste repositorio
(nenhum .board/cards/done/*.md o reivindica). Se essa substituicao foi
legitima -- por exemplo, se um card posterior e nao rastreado nos
cartoes atuais a autorizou, ou se a politica do projeto aceita commits
"feat:" fora do board para esse pacote -- e uma decisao do coordenador,
nao deste card: tests/acceptance/AUR-542.sh::AC-001 so pode confirmar o
que o binario FAZ hoje, nunca se um commit sem card tinha autoridade para
mudar o que fazia. Por pragmatismo, e para o script continuar uma prova
executavel em vez de ficar vermelho por um motivo que ele nao pode
decidir, tests/e2e/AUR-451.sh foi ajustado para o comportamento ATUAL
(pos-2cd157b) -- mas isso e um stopgap documentado, nao uma declaracao
de que 2cd157b estava certo. Se o coordenador decidir que 2cd157b
reverteu uma garantia do AUR-451 sem autoridade para isso, a correcao
certa e reverter esse pedaco de pr.go para o comportamento de
0e00d50, nao manter o teste alinhado ao estado atual.
Antes
tests/e2e/AUR-451.sh falhava em seguranca_only_wrong_post_count.
Depois
Cenario 2 passou a esperar 2 POSTs (1 inline + 1 resumo, o comportamento
pos-2cd157b); cenario 3 passou a verificar a linha 0 comentario(s)
publicado(s) no pull request #42 (0 na linha, 0 geral). em vez de No
issues found., e a contagem de POST esperada passou de 0 para 1 (so o
resumo). tests/e2e/AUR-451.sh sai 0 -- contra o comportamento atual,
nao necessariamente contra o comportamento que o AUR-451 tem o direito
de exigir.
AUR-438: achado geral (fora das linhas adicionadas) continua inalcancavel -- NAO CORRIGIDO
Causa
Confirmado exatamente como o AUR-541 mediu:
internal/review/scope.go::filterModelIssues descarta QUALQUER achado
fora das linhas adicionadas do diff (contador OutsideAddedLines) ANTES
de checar evidencia/impacto/verificacao -- mesmo quando o achado carrega
as tres provas completas (como a fixture do proprio AUR-438.sh planta em
docs/notas.md:99). cmd/aurumcode/pr.go ja tem a logica downstream
inteira para classificar um achado sobrevivente como inline
(isInlineEligible, que chama review.IsChangedLine -- a MESMA funcao
containsSide que filterModelIssues ja usou para decidir se o achado
sobrevive) ou geral (o else que chama PostIssueComment por achado).
Como as duas checagens sao identicas, todo achado que sobrevive a
filterModelIssues TAMBEM passa isInlineEligible -- o que decide entre
os dois ramos de publicacao e so a flag --na-linha (inlineComments):
sem ela, TODO achado sobrevivente (mesmo um dentro das linhas
adicionadas) sai pelo ramo geral; com ela, o ramo geral fica inalcancavel
para qualquer achado de modelo, porque nenhum achado fora do diff chega
viva o bastante para testar a flag. O recurso de comentario geral de PR
prometido pelo AUR-438
("problema fora das linhas alteradas vira comentario geral em vez de
sumir") esta, na pratica, inalcancavel para o caso que ele foi desenhado
para cobrir.
Decisao medida e por que fica fora deste card
Uma correcao exigiria mudar internal/review/scope.go para distinguir
"arquivo nunca tocado pelo diff" (deve continuar descartado -- e o
proprio motivo de existir do gate: impedir que o modelo fale com
autoridade sobre codigo nao tocado) de "arquivo tocado, linha fora do
hunk" (candidato a comentario geral, ainda sujeito ao gate de
evidencia). Essa distincao foi prototipada e imediatamente CONTRADIZ dois
testes unitarios existentes e deliberados em internal/review/scope_test.go
(TestFilterModelIssuesRejectsUnscopedAndUnprovedFindings e
TestDeletionRegressionUsesOldSideWithoutAdmittingUntouchedCode), que
fixam o comportamento atual -- inclusive para um achado DENTRO do mesmo
arquivo tocado mas em coordenada (side/linha) errada -- como
correto e intencional. Resolver esse conflito exige decidir qual dos dois
comportamentos documentados (o do AUR-438: achado geral some; o dos
testes de scope_test.go: qualquer posicao fora da linha exata e
rejeitada, mesmo dentro do mesmo arquivo) e o certo, e essa decisao afeta
internal/review/scope.go, que todo achado do motor passa por -- risco e
escopo maiores do que este card, que e sobre e2e scripts, deveria assumir
sem uma revisao dedicada. Non-goals deste card proibe "afrouxar o gate de
escopo e evidencia"; mudar scope.go sem decidir essa tensao seria
exatamente esse risco. Recomendacao: abrir um card dedicado para decidir
e, quando decidido, atualizar internal/review/scope.go e
internal/review/scope_test.go juntos. Aberto: AUR-545.
Antes e Depois
Sem mudanca. tests/e2e/AUR-438.sh continua saindo 1 com
AUR-438/AC-001/missing_general_finding -- exatamente a causa medida
acima, nao mascarada.
AUR-459: conversao de line_comments nunca sobrevive ao gate de evidencia -- NAO CORRIGIDO (gap arquitetural confirmado, mais profundo que o relatado)
Causa
Tres causas em camadas, medidas nesta ordem:
- Infra obsoleta (corrigida): o script materializa um worktree
minimo e copiava
cmd/regenerate-docs(removido pelo mesmo pivo670c7f6do AUR-443) einternal/pipelineeinternal/documentation/*(tambem removidos --ls internalneste worktree confirma que nenhum dos dois existe mais). Nenhum e importado porcmd/aurumcode; a copia nunca foi necessaria para o build. Essa causa SOZINHA explicava o exit 79 (infrastructure/missing_input) que o AUR-541 reportou, mas mascarava a causa real abaixo. - Gate de evidencia (NAO corrigido, arquitetural): uma vez removida a
copia obsoleta, o script compila e roda -- e falha em
gate-open-on-converted-finding:exit:0: o achado convertido deline_comments(viainternal/prompt/parser.go::adoptLineComments) nunca sobrevive afilterModelIssues, porque o tipolineCommentnao carregaEvidence/Impact/Verification--adoptLineCommentsconstroi otypes.ReviewIssueresultante so comFile/Line/Severity/RuleID/Message/Suggestion. Medido diretamente: mesmo a fixturegrounded.jsondo proprio script (comrule_idvalido) e descartada comaurumcode review: 1 finding(s) descartado(s) pelo gate de escopo e evidencia: 1 sem evidencia concretaem vez de fechar o gate de--fail-on. - Contrato de stdout do AUR-490 (relacionado, nao a causa raiz deste
script): mesmo corrigido o item 2, o cenario 2 deste script
(
[[ "$(cat "$run_dir/out.stdout")" == 'No issues found.' ]]) tambem colidiria com o mesmo efeito do AUR-490 que afetou AUR-443/448 (secao acima) -- o--baseusado aqui sempre antepõe o resumo/diagrama.
Decisao medida e por que fica fora deste card
O item 2 e um gap arquitetural real e maior do que o relatado pelo
AUR-541 (que nao conseguiu nem chegar a medi-lo, bloqueado pelo item 1).
Corrigi-lo exigiria uma decisao de produto que este card nao tem mandato
para tomar sozinho: internal/prompt/templates/review.md hoje NAO ensina
mais o modelo a usar line_comments (so issues, onde rule_id e
evidencia sao exigidos e explicados) -- adoptLineComments existe apenas
como tolerancia a um modelo que ainda emite o formato antigo. Adicionar
evidence/impact/verification ao struct lineComment sem tambem
decidir se o prompt volta a ensinar esse formato (e, se sim, com qual
texto) deixaria os novos campos mortos para qualquer modelo real --
servindo apenas as fixtures deste proprio teste, o que e fabricar uma
prova em vez de corrigir o produto. Alem disso, internal/prompt esta
sendo editado em paralelo por outro cartao (AUR-543) nesta janela; uma
mudanca de schema nesse pacote feita aqui arriscaria colisao direta.
Recomendacao: abrir um card dedicado, com mandato sobre
internal/prompt (schema E template), para decidir se line_comments
continua existindo como via paralela com prova propria, ou se deve ser
removido em favor de ensinar so issues. Aberto: AUR-546.
Antes e Depois
Antes: AUR-459/E2E/infrastructure/missing_input:cmd/regenerate-docs,
exit 79 -- mascarava a causa real. Depois do conserto do item 1 (materializacao
obsoleta removida): AUR-459/E2E/gate-open-on-converted-finding:exit:0,
exit 1 -- RED real e corretamente atribuida, documentada aqui, nao
mascarada. O script continua vermelho; a causa mudou de infraestrutura
falsa para comportamento real, o que e o resultado certo quando a causa
de fundo e maior que este card.
Non-goals respeitados
internal/review/scope.go e internal/prompt/parser.go (o schema de
lineComment) nao foram alterados -- ambos os gaps que exigiriam tocá-los
(AUR-438, AUR-459) ficam documentados e vermelhos, nao corrigidos. Nenhuma
promessa de card foi mudada: o unico ajuste de produto
(cmd/aurumcode/main.go, mensagem completa de "sem provedor") restaura
uma promessa que ja existia (AUR-443/AUR-448) e que uma mudanca de outro
card (AUR-490) tinha apagado como efeito colateral -- nao cria capacidade
nova nem afrouxa o gate de evidencia, que continua exigindo
evidence/impact/verification em todo achado, sem excecao.
O que tests/acceptance/AUR-541.sh deveria registrar (fora dos paths deste card -- so relatorio)
tests/acceptance/AUR-541.sh roda e ainda passa (AUR-541/all/pass)
porque sua AC-001 so e sensivel a descarte do gate de evidencia em scripts
que RODAM, e trata qualquer script na lista known_red_scripts como
isento de checagem de exit code. Mas essa lista (AUR-438 AUR-443 AUR-448
AUR-449 AUR-451) e seu comentario explicativo agora estao desatualizados:
AUR-443, AUR-448, AUR-449 e AUR-451 saem 0 depois deste card -- continuar
os tratando como "known red" nao quebra nada hoje, mas documenta uma causa
que deixou de existir. So AUR-438 (e, se fosse incluido no scan,
AUR-459 -- que ja e excluido por nome, por outro motivo) continuam
genuinamente vermelhos. Recomenda-se que quem possui tests/acceptance/AUR-541.sh
remova AUR-443/448/449/451 dessa lista e atualize o comentario na proxima
janela que tocar esse arquivo.
Decisao de coordenacao sobre o AUR-451 (integracao, 2026-10-02)
O formato de publicacao do --pr introduzido por 2cd157b (resumo sempre
publicado, sem "No issues found." no stdout) esta no main ha mais de um mes
e e o comportamento atual do produto; o teste do AUR-451 fica alinhado a ele.
AUR-438 e AUR-459 seguem vermelhos com causa medida e cards dedicados:
AUR-545 (destino de achado fora do diff) e AUR-546 (comentarios de linha sem
evidencia).