AUR-518 — Política central do workflow obrigatório prevalece sobre o repo
Status: especificação do card AUR-518 (O05-review).
Problema
.aurumcode/config.yml do repositório pode desligar qualquer regra
(rules.<id>.enabled: false), baixar sua severidade (rules.<id>.severity)
e tirar qualquer caminho do alcance da revisão (ignore). Isso é correto
quando o repositório é o único dono do próprio gate, mas quebra um uso como
gate de compliance: uma organização GitHub que exige um workflow reutilizável
com uma política de segurança embutida (skills e regras) não pode ter essa
política neutralizada pelo próprio repositório que ela deveria auditar.
Decisão
Nenhum formato novo de configuração. A política central é outro diretório
.aurumcode/ — config.yml e os mesmos Markdown (prompt.md, skills/*.md,
docs) que um repositório já usa —, carregado de um checkout separado que o
workflow controla, nunca buscado pela rede em tempo de execução pelo binário.
internal/config/central.go:
LoadCentralPolicy(root string) (*Config, error): lêroot/.aurumcode/config.ymlreaproveitandoParse(mesma validação de idioma/publicação/changelog/perfis/caminhos de contexto que o config de um repositório já passa). Arquivo ausente ou YAML inválido falha fechado, nomeando o caminho. Toda skill/doc/prompt explicitamente listada emreview.contextque a política declara deve existir sobroot, senão o erro nomeia o arquivo.ApplyCentralPolicy(repo, central *Config) (*Config, []ProviderWarning):central == nildevolverepoinalterado enil— o caminho sem política é byte-idêntico ao de antes do card. Com política, o config efetivo é uma cópia derepoondeRuleseIgnorevêm exclusivamente decentral(cada entrada derepo.Rules/repo.Ignoreé descartada e gera um avisoProviderWarning{Provider: "politica central", ...}nomeando a regra ou o padrão) eReview.Language/Review.Publicationvêm decentralquando ele os declara. O resto deReview— incluindo oContextdo repositório — continua do repositório.
cmd/aurumcode (main.go e pr.go): a flag --politica/--policy (ou,
ausente, a variável AURUMCODE_POLICY) nomeia o diretório da política.
ApplyCentralPolicy roda logo depois do config do repositório carregar, nos
dois caminhos (--base e --pr), antes de qualquer seleção de provedor —
um erro de LoadCentralPolicy sai antes de qualquer chamada ao modelo. Os
provedores de contexto da política (config.ConfiguredProviders(policyDir,
central)) entram na lista ANTES dos do repositório. Os avisos da política
são impressos no terminal (mesmo canal dos avisos de provedor de contexto já
publicados) e somam-se a result.Limitations, chegando ao parecer publicado
do PR.
.github/workflows/review.yml e action.yml ganham um input opcional
(policy_path): vazio mantém o comportamento de hoje; não vazio é passado
como --politica (workflow reutilizável) ou via AURUMCODE_POLICY no
ambiente do container (Action Docker direta, sem mudar o número fixo de
argumentos posicionais de scripts/action-entrypoint.sh).
Prova
internal/config/central_test.go prova LoadCentralPolicy/
ApplyCentralPolicy isoladamente (política ausente/inválida/skill faltando
falha fechado; override de regra e de ignore descartados com aviso;
Context/idioma/publicação do repositório sobrevivem quando a política não
os declara). cmd/aurumcode/aur518_test.go dirige o comando review real
contra o fixture offline (AURUMCODE_LLM_FIXTURE), cobrindo AC-001 a AC-006.
tests/acceptance/AUR-518.sh roda os dois pacotes num clone isolado
(go.mod go.sum cmd internal pkg), com um seletor por AC e AC-001-MUT-001:
a mutação troca effective.Rules = central.Rules por
effective.Rules = repo.Rules — "aplica o override do repo depois da
política" — e exige que AC-001 vire RED.