Pular para conteúdo

AUR-584: cmd/aurumcode por responsabilidade, textos em catálogo, perfis em YAML

Medido antes (base 2b8ca078, mais o merge do AUR-588 em 155a6dc5)

  • cmd/aurumcode/main.go 970 linhas (doc de pacote de 138 linhas que era changelog de cards), pr.go 1092, passes.go 611; 16 arquivos de produção com doc de pacote citando card (// AUR-515: ... etc.).
  • reviewCopy com 37 campos de texto por idioma em Go (reviewCopyFor), e ramos language == "pt-BR" || language == "pt" com literais próprios em passes.go (2), scanner_pass.go, provider_failure.go, pr_history.go, checkout_identity.go (5 ramos) e pr.go (HasPrefix(language, "pt")); internal/render/summary.go e changelog.go com os seus.
  • internal/prompt/parser.go 924 linhas com 14 regexp.MustCompile por chamada.
  • Perfis built-in de internal/reviewprofile como []Spec literal em Go; team.go decodificava o YAML do time com a sua própria cópia do scan de cláusulas recusadas.
  • selectProvider e selectProviderForModel repetiam a leitura de AURUMCODE_LLM_FIXTURE e de LLM_API_KEY/LLM_BASE_URL.
  • Funções exportadas com parâmetro bool: render.BuildSARIFLog, render.WriteSARIF (executionSuccessful), render.BuildAuditRecord (complete); fora de paths: gate.ReuseOrStoreGateVerdict.
  • Um SKILL.md malformado no repositório derrubava todos os skills do repositório (skills.LoadSource parava no primeiro erro).

O que mudou

  • cmd/aurumcode: main.go (316) fica com a entrada, fix, a seleção de provider com um leitor único do ambiente (providerFromEnv) e printFindings; saíram fix_suggestions.go, severity.go, local_diff.go, security_output.go, exit_codes.go, provider_selection.go. pr.go (245) fica com as opções, o status do check, o cliente e a origem do changelog do PR; saíram pr_remote.go, pr_diff_filters.go, pr_inline_format.go, pr_summary_format.go, review_memory.go, review_copy.go. passes.go (186) fica com o changelog e a nota de cobertura; saíram review_coverage.go, local_report.go, codebase_context.go. Cada arquivo tem um doc de conceito curto, sem número de card.
  • internal/i18n: catalog.yml embutido (pt-BR e en, 63 chaves: os 37 textos de reviewCopy, os avisos de cmd e os rótulos de resumo e changelog de internal/render), Text/Format, LocaleOf, Parse que recusa locale ausente, chave só num idioma e verbos de formatação diferentes. O catálogo é lido no primeiro uso; um catálogo inválido para o processo no primeiro texto, nunca publica revisão meio traduzida. Os textos foram extraídos dos literais Go por script, conferidos byte a byte contra a fonte.
  • Escolha de idioma unificada em i18n.LocaleOf: pt ou pt-* (sem diferenciar caixa) é português, o resto inglês. Para os valores que chegam ao produto (config.NormalizeReviewLanguage só devolve pt e pt-BR entre os portugueses) a saída é a mesma de antes; para entradas fora da lista (pt-PT direto numa função) os ramos exatos de cmd responderiam inglês e agora respondem português, como internal/render e formatInlineIssueForLanguage já faziam.
  • internal/reviewprofile: builtin.yml embutido, decodificado por decodeProfiles (o mesmo de LoadTeam: scan de cláusulas recusadas, KnownFields), compilado por compileSpec como antes.
  • internal/prompt: parser.go (197) só com ParseReviewResponse; saíram parse_error.go, parser_degraded.go, parser_json.go, parser_line_comments.go, parser_validate.go, parser_text.go, e os padrões em parser_patterns.go (o de ParseTestResponse depende da linguagem: cache por linguagem, compilado uma vez por processo, mesmo padrão de antes).
  • internal/render: BuildSARIFLog(toolVersion, findings, inconclusiveReason) e WriteSARIF(..., inconclusiveReason, filter) (motivo vazio = execução bem-sucedida, a regra que o único chamador já usava); BuildAuditRecord(..., coverage AuditCoverage).
  • Fechamento (a): skills.LoadSourceSkippingMalformed descarta só o SKILL.md malformado do repositório com o aviso repository skill <caminho>/SKILL.md unavailable, the other skills still apply: <erro>; a política central continua em LoadSource e falha fechado nomeando o arquivo. docs/tutorials/skills.md diz que globs vão entre aspas.
  • Fechamento (b): comentários em policygate.go, review_cache.go e aur513_test.go apontam para config.BuildContextBlockWithWarnings e o bloco de contexto na evidência do prompt.
  • Fechamento (c): docs/architecture.md em português; a seção ## Layers e a sua tabela ficaram byte a byte; os pontos de extensão em negrito foram traduzidos e architecture_doc_test.go os procura em português.

Guardas (cmd/aurumcode/structure_test.go)

TestProductionFilesStayShort (400 linhas), TestPackageDocNamesNoCard, TestNoBoolParameterInExportedFunction (cmd, i18n, prompt, render, reviewprofile, context), TestNoLanguageBranchOutsideCatalog (literal de etiqueta portuguesa em cmd ou render), TestEveryCatalogKeyUsedExists. Em internal/prompt: TestParserCompilesPatternsOnce. Em internal/i18n: TestEveryKeyExistsInEveryLocale, TestCatalogMissingKeyIsRefused, TestCatalogVerbMismatchIsRefused, TestLocaleOf.

AC-003: digest fixo

TestAUR584BuiltinProfilesKeepThePromptDigest fixa o sha256 das assinaturas e prefixos de prompt dos quatro built-ins, medido na árvore antes da mudança: f7c22d8d6452d8b8de3c36ccf8e9844aa19741156373570d7e02f3ff1841f2bd. O mesmo valor sai do YAML.

Âncoras de aceites concluídos

Nenhuma âncora de mutação de aceite concluído mudou de arquivo: cada linha que um script edita ficou, uma vez, no arquivo que o script nomeia (AUR-431, 436, 439, 443, 448, 450, 473, 476, 489, 499, 500, 502, 504, 505, 543, 565, 468, 572, 577). Duas formas de prova:

  • edição aplicada a uma cópia e go vet no pacote, na árvore final: AUR-431, 436, 439, 443, 450, 476, 489 (MUT-003), 499 (2), 500 (3), 502, 504, 505 (2), 543, 572, 577 compilam (o errNoProviderConfigured e a origem do changelog do PR ficaram em main.go e pr.go porque as mutações do AUR-436 e AUR-504 removem o último uso de errors desses arquivos);
  • seletores executados na árvore final: AUR-473 MUT-001/002 rejected, AUR-542 AC-001-MUT-001 pass, AUR-513 AC-004-MUT-001 pass, AUR-489 MUT-001 pass, AUR-576 AC-001..003 e MUT-001/002 pass; AUR-565, 572, 579 e 583 all passam.

Resultados iguais no main (b0407773), portanto anteriores a este card: AUR-448 AC-001-MUT-001 not-rejected, AUR-489 MUT-002/003 mutation-not-detected, AUR-513 AC-001/AC-003-MUT-001 mutation-anchor-missing, AUR-576 AC-004 go-test-failed (o teste de git repack abaixo). Âncoras já ausentes na base: AUR-438, 449, 451, 453, 455, 458, 490, 513 (main.go), 515. O oci-run --card AUR-576 termina em infraestrutura (no space left on device ao linkar os testes).

Fora do escopo dos paths

  • Seleção de provider em internal/llm: internal/llm não está em paths; a duplicação foi removida dentro de cmd/aurumcode (providerFromEnv).
  • internal/gate/exceptions.go ainda escolhe o idioma com literal próprio, e gate.ReuseOrStoreGateVerdict recebe bool; internal/gate não está em paths.

Falhas pré-existentes do ambiente

TestAUR536PackedRepositoryWithoutGitIsUnverifiable (cmd/aurumcode) e TestOpenRepo_GitBinary_PackedObjects (internal/analyzer) falham no container compartilhado também na base 2b8ca078 (git repack com git 2.54.0); não são deste card.

Provas

Todas no container compartilhado, em série, sobre a árvore final:

  • bash tests/acceptance/AUR-584.sh all: AUR-584/AC-001/pass, AC-002/pass, AC-003/pass, AC-004/pass (e2e, fechamento de skills e --check dos 18 tutoriais), AUR-584/all/pass.
  • MUT-001: passes.go:28:17: language tag "pt-BR" outside the internal/i18n catalog / --- FAIL: TestNoLanguageBranchOutsideCatalog / AUR-584/MUT-001/red.
  • MUT-002: i18n: catalog: key "notice.history_unavailable" exists in en but not in pt-BR / --- FAIL: TestEveryKeyExistsInEveryLocale / AUR-584/MUT-002/red.
  • MUT-003: built-in profile prompt digest = 9c6562e3..., want f7c22d8d... / --- FAIL: TestAUR584BuiltinProfilesKeepThePromptDigest / AUR-584/MUT-003/red.
  • AUR-583.sh all, AUR-579.sh all, AUR-565.sh all, AUR-572.sh all, AUR-561..564.sh all: exit 0. AUR-576.sh all: só TestAUR536PackedRepositoryWithoutGitIsUnverifiable falha (pré-existente, acima).
  • Tutoriais: imagem aurum-tutoriais:aur584 construída desta árvore, os 18 run.sh all com exit 0, --check ok em todos, expected/ sem edição.
  • bash scripts/docs/capturas.sh (229 imagens) e AUR-588.sh all: AUR-588/all/pass; scripts/docs/build.sh: 0 avisos.
  • go vet ./... limpo; go test -p 1 ./...: só as duas falhas pré-existentes do ambiente.