AUR-480 - Fonte opcional de contexto falha com aviso sem apagar o review
Medido antes
O comportamento ja existe no codigo e nao foi alterado. Este card entrega apenas a caracterizacao.
internal/config/provider.gocallProviderBounded: cada provider roda sobProviderTimeout(10s) eMaxProviderContributionBytes; trava, erro e estouro de prazo viram erro nomeado (context provider "<nome>" ...).BuildContextBlockWithWarnings: falha de provider viraProviderWarning{Provider, Reason}, ambos passam porfilter.Redact, o provider e omitido e os demais continuam. So o estouro de tamanho (contributionLimitError) continua erro duro.internal/config/provider_files.go:ConfiguredProviderstrata.aurumcode/prompt.mdausente como opcional ("", sem aviso); toda fonte escrita explicitamente (ContextFile.Optional == false) devolve erro quando ausente, e esse erro aparece como aviso nomeado.Parse/Load: YAML malformado, chave desconhecida (decodeStrict) e path de contexto fora do repo continuam erro; arquivo escrito e invalido nunca vira config vazia.- O texto do provider so entra no prompt (
prompt.RenderRepositoryContext); nenhuma API de decisao (gate, regras, severidade, redacao) recebe texto de provider. - Teste existente:
TestAUR480ProviderFailureWarnsAndContinues(provider_pending_test.go).
O que mudou
tests/acceptance/AUR-480.sh: copiacmd internal pkg go.mod go.suminteiros para uma raiz temporaria, grava aliinternal/config/aur480_acceptance_test.goe rodago testdo pacote. O repositorio nao e tocado.docs/specs/AUR-480.md: este documento. Nenhum arquivo decmd/,internal/oupkg/foi editado.
Prova por AC
Comando geral (container, cwd no worktree): go-shared exec -w <worktree> bash -c 'bash tests/acceptance/AUR-480.sh <seletor>'.
| AC | Seletor | Testes |
|---|---|---|
| AC-001 | AC-001 |
AC001HangingProviderIsOmittedWithinDeadline (provider que ignora ctx; aviso did not answer, review roda, retorno antes de 15s), AC001ErroringProviderWarnsAndReviewContinues (aviso com nome e motivo, resposta do modelo intacta, contexto saudavel preservado), AC001OnlyFailingProviderStillReviewsUnwrapped, mais o TestAUR480ProviderFailureWarnsAndContinues existente |
| AC-002 | AC-002 |
AC002MalformedConfigStillFails (YAML malformado, chave desconhecida, path escapando, idioma invalido, secao escalar, Load de arquivo invalido), AC002RequiredSourceMissingStillFails (fonte explicita ausente falha e aparece como aviso nomeado), AC002OptionalDefaultPromptAbsentIsSilent |
| AC-003 | AC-003 |
AC003ContextTextCannotChangeDecisions (texto hostil so como fundo; resposta/severidade do modelo e Gate/Rules inalterados), AC003WarningsDoNotLeakSecrets (segredo no nome e no motivo e redigido; nao chega ao prompt) |
all roda os nove testes e exige --- PASS de cada um. Ultima linha real: AUR-480/all/pass; AC-001, AC-002 e AC-003 terminam em AUR-480/<AC>/pass. Seletor desconhecido: exit 64.
Mutacoes (compilam e ficam vermelhas por comportamento)
Aplicadas na copia temporaria; o script recusa mutacao que nao compila ou que sobrevive.
| Mutacao | Alteracao | Testes vermelhos (saida real) |
|---|---|---|
| MUT-001 | falha de provider aborta (return "", warnings, err no lugar do append) |
erroring optional source aborted the review: context provider "broken-rag": index unreachable; tambem hanging, only-failing, AC003 x2 e o teste existente |
| MUT-002 | aviso suprimido (_ = warning) |
warning must name the source and the reason, got []; hanging, only-failing, required-missing e existente |
| MUT-003 | ProviderTimeout = 24 * time.Hour |
a hanging provider held the review past 15s |
| MUT-004 | Reason sem Redact |
warning leaked the secret: {Provider:src-[REDACTED] Reason:... AURUM-480-canary-secret} |
| MUT-005 | fonte obrigatoria ausente vira "", nil |
missing required docs/missing.md must fail |
| MUT-006 | decodeStrict ignora erro de decode |
malformed yaml: Parse must fail, got nil |
Cada uma termina em AUR-480/MUT-00N/pass (mutation produced RED).
Fora de escopo
Converter falha do modelo de review em sucesso ou inventar contexto substituto: nao ha teste nem codigo nesse sentido.