Pular para conteúdo

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.go callProviderBounded: cada provider roda sob ProviderTimeout (10s) e MaxProviderContributionBytes; trava, erro e estouro de prazo viram erro nomeado (context provider "<nome>" ...).
  • BuildContextBlockWithWarnings: falha de provider vira ProviderWarning{Provider, Reason}, ambos passam por filter.Redact, o provider e omitido e os demais continuam. So o estouro de tamanho (contributionLimitError) continua erro duro.
  • internal/config/provider_files.go: ConfiguredProviders trata .aurumcode/prompt.md ausente 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: copia cmd internal pkg go.mod go.sum inteiros para uma raiz temporaria, grava ali internal/config/aur480_acceptance_test.go e roda go test do pacote. O repositorio nao e tocado.
  • docs/specs/AUR-480.md: este documento. Nenhum arquivo de cmd/, internal/ ou pkg/ 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.