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/aurumcodeconhece: os caminhos removidos porignore(capturados antes deFilterIgnoredPathsrodar) e os caminhos com aviso emanalyzer.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 pormaxCoveragePaths), 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.