Pular para conteúdo

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.yml reaproveitando Parse (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 em review.context que a política declara deve existir sob root, senão o erro nomeia o arquivo.
  • ApplyCentralPolicy(repo, central *Config) (*Config, []ProviderWarning): central == nil devolve repo inalterado e nil — o caminho sem política é byte-idêntico ao de antes do card. Com política, o config efetivo é uma cópia de repo onde Rules e Ignore vêm exclusivamente de central (cada entrada de repo.Rules/repo.Ignore é descartada e gera um aviso ProviderWarning{Provider: "politica central", ...} nomeando a regra ou o padrão) e Review.Language/Review.Publication vêm de central quando ele os declara. O resto de Review — incluindo o Context do 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.