Pular para conteúdo

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:

  1. aurumcode --help, docs --help e o bloco final do script testavam o subcomando docs (gerado por cmd/regenerate-docs). Esse comando foi removido do produto pelo commit 670c7f6 ("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-docs e vazio em main, e o binario hoje responde aurumcode: unknown command "docs" (exit 2) para qualquer invocacao. AUR-490 (done) ja trata essa remocao como fato assentado.
  2. O script chama review --base HEAD~1 sem provedor e espera exit 1 com stdout vazio. AUR-490 (done, integrado em main antes deste card) mudou esse caminho deliberadamente (seu proprio registro de entrega: "review --base sem 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
(nada sobre 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
(exit 0, unchanged; stdout now carries the summary/diagram per AUR-490, so scenario 2 and 4's exact-stdout checks now compare only the last line, also an AUR-490 effect, not a new regression.) 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, em cmd/aurumcode/pr.go: zero achados -> fmt.Fprintln(stdout, "No issues found.") e return 0 SEM 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 de tests/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 de pr.go: passou a publicar incondicionalmente um comentario de resumo (PostIssueComment com summaryBody) depois do loop, e removeu a linha fmt.Fprintln(stdout, "No issues found."). 2cd157b NAO e um commit de card -- sua mensagem nao tem prefixo AUR-NNN:, e nao ha .board/cards/done/AUR-*.md cujo Delivery record cite esse SHA (o AUR-451 ja estava em done antes dele, e o proximo card a tocar pr.go nao e 2cd157b). 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:

  1. Infra obsoleta (corrigida): o script materializa um worktree minimo e copiava cmd/regenerate-docs (removido pelo mesmo pivo 670c7f6 do AUR-443) e internal/pipeline e internal/documentation/* (tambem removidos -- ls internal neste worktree confirma que nenhum dos dois existe mais). Nenhum e importado por cmd/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.
  2. 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 de line_comments (via internal/prompt/parser.go::adoptLineComments) nunca sobrevive a filterModelIssues, porque o tipo lineComment nao carrega Evidence/Impact/Verification -- adoptLineComments constroi o types.ReviewIssue resultante so com File/Line/Severity/RuleID/Message/Suggestion. Medido diretamente: mesmo a fixture grounded.json do proprio script (com rule_id valido) e descartada com aurumcode review: 1 finding(s) descartado(s) pelo gate de escopo e evidencia: 1 sem evidencia concreta em vez de fechar o gate de --fail-on.
  3. 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 --base usado 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).