Pular para conteúdo

AUR-476 — O usuário vê arquivos e contexto que a review não cobriu

Status: especificação do card AUR-476 (O05-review).

Problema

O produto já sabe quando uma review foi parcial. internal/prompt (coverage.go, builder.go) classifica cada arquivo de código do diff em complete, partial ou omitted — por limite de tokens do prompt — e internal/config.FilterIgnoredPaths remove do diff, antes de o modelo vê-lo, todo arquivo que casa com a lista ignore de .aurumcode/config.yml. Ambos os fatos ficam, hoje, só dentro do prompt (## Review Coverage no texto do usuário) ou em ReviewResult.Metadata (contagens). Nenhum deles chega ao terminal do --base nem ao parecer publicado do --pr.

Isso produziu um defeito medido no review da PR #48 (SHA 16cff8c35a983c958c75fba1d109505b0c15bdf2): o resumo afirmou que "não há testes automatizados no conjunto alterado" enquanto dois aceites e asserções Playwright estavam no diff. A causa é exatamente o caminho acima: a base declarava ignore: ["tests/**"], FilterIgnoredPaths removeu os testes da entrada do modelo, e o modelo — vendo um diff sem testes — concluiu que eles não existem. A omissão era configurada, mas o parecer a apresentou como prova de inexistência.

O card fecha o buraco em cmd/aurumcode, o único dono das duas saídas do usuário. Ele não confia no modelo para mencionar a limitação e não move a lógica de cobertura para fora de internal/prompt.

Decisão

Uma passagem determinística de cobertura (cmd/aurumcode/passes.go:

  • reviewCoverageBreakdown — a quebra por motivo: complete, partial, omitted por orçamento, ignorado por configuração, filtrado como binário/grande demais, e o denominador (Total).
  • mergeReviewCoverage — combina as contagens do prompt (ReviewResult.Metadata: code_files_total/complete/partial/omitted) com os dois fatos que só cmd/aurumcode conhece: os caminhos removidos por ignore (capturados antes de FilterIgnoredPaths rodar) e os caminhos com aviso em analyzer.DiffNotice (binário/oversized). O total é reconciliado com a contagem bruta de arquivos do diff para nunca subcontar um arquivo que o prompt não mediu.
  • coverageNotice — renderiza um aviso localizado, com contagem e caminhos (limitados por maxCoveragePaths), ou string vazia quando a review cobriu tudo.

O aviso é anexado em result.Limitations (para o --pr, renderizado na seção Review limits) e impresso diretamente no stdout do --base, logo após o resumo. Ele é derivado apenas do diff e da configuração, nunca do resumo do modelo, então uma resposta que afirme "todos os arquivos revisados" não o apaga (AC-003).

Por que não só result.Limitations

No caminho --base, result.Limitations não é renderizado (o renderLocalReport imprime apenas resumo + diagrama Mermaid). Anexar só às limitações faria o aviso existir para o --pr e ser invisível no terminal. Por isso coverageNotice também é impresso diretamente, usando o mesmo texto: um único ponto de verdade, duas saídas.

Por que não editar internal/prompt / internal/review

O card possui apenas cmd/aurumcode, tests/acceptance/AUR-476.sh e docs/specs/AUR-476.md; internal/* está em read_paths. A lógica de classificação já existe e está provada (AUR-467/475/477) dentro do prompt; o que faltava era expô-la. O card reusa ReviewResult.Metadata e não duplica a regra de orçamento.

Acceptance scenarios

  • AC-001 — Diff com arquivo omitido (por ignore) produz aviso de quantidade e caminhos não revisados no CLI e no PR.
  • AC-002 — Review completa não adiciona alerta de omissão.
  • AC-003 — O aviso vem do pipeline e persiste mesmo quando a resposta do modelo afirma cobertura completa.
  • AC-004 — PR com testes alterados e omitidos da entrada do modelo identifica essa omissão; o parecer não apresenta ausência no contexto como prova de inexistência de testes no diff.

Non-goals

  • Impor um limite default novo de tokens.
  • Transformar toda omissão em erro sem política explícita.
  • Reescrever o resumo do modelo. O aviso é uma seção determinística adicional; ele não edita a prosa que o modelo escreveu.

Testes de comportamento

cmd/aurumcode/aur476_test.go (pacote main, o único que alcança a passagem não exportada) constrói fixtures Git soltas — sem binário git, sem subprocesso — com um arquivo de código e um arquivo de teste sob tests/, e exercita runReview (--base) e runPRReview (--pr) reais:

  • TestAUR476TerminalDeclaresIgnoredCoverage (AC-001/AC-003)
  • TestAUR476CompleteReviewHasNoNotice (AC-002)
  • TestAUR476NoticeIsPipelineDerivedNotModelDerived (AC-003)
  • TestAUR476PRDeclaresOmittedTests (AC-004)

tests/acceptance/AUR-476.sh executa esses seletores no perfil selado go-unit-offline-v1. A mutação declarada (MUT-001) insere um retorno vazio no topo de coverageNotice; o candidato continua compilando e o teste de comportamento correspondente falha (RED).

Compatibilidade e rollback

Zero-config: sem ignore e com diff que caiba no orçamento, coverageNotice retorna "" e nenhuma saída nova aparece — os bytes publicados permanecem idênticos. Nenhuma escrita no repositório consumidor. Nenhum segredo ou resposta bruta de provider entra na saída. O rollback é limitado a cmd/aurumcode.