Pular para conteúdo

AUR-522: o review e o gate funcionam em repositorio de qualquer linguagem

Documento historico do board. Para uso atual, consulte o guia do produto.

Decisao do runtime

A estrutura do codigo vem de gramaticas tree-sitter mantidas pela comunidade, lidas por um runtime em Go puro: github.com/odvcencio/gotreesitter v0.55.1 (MIT, sem cgo, go 1.22, dependencias golang.org/x/sync e gopkg.in/yaml.v3). Confirmado em 2026-10-02: o README declara "No CGo, no C toolchain" e 206 gramaticas; go build ./cmd/aurumcode compila offline na imagem selada. A alternativa (cgo) e proibida pelo card; nao foi preciso escolher outra.

O runtime fica atras de uma interface pequena, grammar.Provider (Languages, Detect, Analyze), em internal/grammar/provider.go. Um unico arquivo (runtime.go) importa o runtime; internal/context e internal/analyzer recebem o Provider por injecao (Resolver.WithGrammar, NewLanguageDetectorWith, NewDiffAnalyzerWith) e nao conhecem o runtime. Trocar de runtime e trocar runtime.go.

Nenhum nome de linguagem aparece em codigo Go novo: a lista de gramaticas e enumerada em tempo de execucao (Provider.Languages), a deteccao por nome e shebang e a do proprio runtime, e simbolos/imports saem da arvore (query de tags do runtime mais os campos name da gramatica). A unica tabela e dado, nao codigo: internal/analyzer/language_catalog.yml agrupa nomes de gramatica em categorias (backend, documentation, config...). Gramatica fora do catalogo e categoria other, tratada como codigo revisavel (falha fechada).

Substituido, nao estendido: as regexes e familyOf de internal/context/extract.go, a tabela de extensoes e as listas de internal/analyzer/language.go, e os extratores de funcao por linguagem de internal/analyzer/diff.go.

O que o review e o gate fazem agora

  • Binario e detectado pelo conteudo (grammar.LooksBinary: NUL ou maioria de bytes que nao sao texto), nunca pelo nome. Arquivo que se declara gerado (LooksGenerated) tambem fica fora do alcance. Ambos viram DiffNotice com Reason (binary, generated, too large).
  • Arquivo fora do alcance entra no aviso de cobertura com o motivo, conta como "nao revisado por completo" (o gate aplica inconclusive da politica) e retira a aprovacao do veredito (marcador do motor, que o modelo nao forja).
  • Arquivo sem gramatica segue para o modelo (so o texto) e e declarado no parecer: "nao tem gramatica no runtime: contexto estrutural nao produzido". Essa lacuna sozinha nao torna o review inconclusivo; so a politica decide.
  • Achado da politica em Terraform bloqueia como em Go (exitFindings).
  • Implementacao: cmd/aurumcode/structural_coverage.go (uma funcao chamada pelos caminhos --base e --pr), passes.go (aviso), internal/analyzer/textdiff.go.

Dependencia e imagem selada (procedimento do AUR-534)

  1. Cache de modulos do projeto preenchido por container nao-root com rede ($HOME/go/pkg/mod-aurumcode, sumdb montado a parte): go get github.com/odvcencio/gotreesitter@v0.55.1, sem go mod tidy (quebra num import legado preexistente, fora deste card).
  2. go mod download do Dockerfile passou a go mod download all: sem argumentos ele nao baixa golang.org/x/sync, exigido por parte do runtime.
  3. Imagem reconstruida a partir do Dockerfile versionado e do go.mod/go.sum novos (contexto limpo): tag aurum-bootstrap-go-bash:1.27.1-2026-10-02b, .Id e digest sha256:3aa0ce99e30b6548535a4009e8c9496f6953b10fd864895154633f2d7de5fee2.
  4. Repinagem como no AUR-534: image dos 10 locks, lock_digest de cada profile e de cada entrada de registry.v1.json, e image_set_digest = sha256("aurum-bootstrap-go-bash@sha256:<digest>") = e082db45c52a651bf8285f46023d1ce7f23508a650c34630b16324d705809845 (formula reproduzida com a imagem antiga: 82a807bb...).
  5. Smoke test (probe do oci-run) na imagem nova: command -v bash -> /bin/bash; go version -> go1.27.1 linux/amd64.

Gramaticas enumeradas em tempo de execucao

Provider.Languages() devolve as 206 gramaticas do runtime (teste TestLanguagesEnumeratedAtRuntime); a lista nao e copiada para o repositorio.

Resultado do corpus

internal/grammar/testdata/corpus (Java, C#, Kotlin, PHP, Ruby, Terraform, YAML de CI, Dockerfile, um arquivo gerado e um texto de extensao desconhecida; o binario pequeno e criado em tempo de teste). Saida medida: Java -> java, C# -> c_sharp, Kotlin -> kotlin, PHP -> php, Ruby -> ruby, Terraform -> hcl, CI -> yaml, Dockerfile -> dockerfile; simbolos extraidos em Java/C#/Kotlin/PHP/Ruby/HCL. notes.zzqx -> sem gramatica, declarado. bash tests/acceptance/AUR-522.sh all cobre AC-001..AC-004 e a mutacao AC-001-MUT-001 (aplicada numa copia).

Caminho --pr: binario, gerado e arquivo nao inspecionado

O --pr nao tem blobs na API (binario chega sem patch), entao a deteccao usa o checkout verificado do AUR-536 e a mesma funcao do --base:

  • analyzer.ClassifyBlob(path, content) (exportada de textdiff.go) e o unico classificador de conteudo (binario, gerado, grande); o --base e o --pr passam por ela.
  • uninspectedPRNotices(diff, verifiedDir) (cmd/aurumcode/structural_coverage.go) le cada arquivo alterado do checkout verificado (so arquivo regular, leitura limitada); sem checkout legivel, cai para as linhas adicionadas/de contexto do patch; sem nenhum dos dois, declara "nao revisado: sem patch (binario ou grande)" (NoticeReasonNoPatch). Nada sem conteudo inspecionado conta como revisado.
  • Os notices alimentam mergeReviewCoverage e applyStructuralCoverage, que aciona a retencao de aprovacao (PolicyGateWithheldKey, do motor).
  • Rename puro sem mudanca e sem checkout nao se distingue de binario no diff e e declarado "sem patch": decisao conservadora.

Mutacoes provadas (aplicadas numa copia, em tests/acceptance/AUR-522.sh)

  • AC-001-MUT-001: pular em silencio o arquivo sem gramatica (sem declaracao) deixa TestAUR522CorpusEveryFileReviewedOrDeclared vermelho.
  • AC-004-MUT-001: o --pr voltar a passar notices nulo deixa vermelhos os tres testes --pr (binario, gerado, sem checkout e sem patch).

O que ficou de fora

  • O ruido de simbolos: a varredura do campo name pode incluir nomes que nao sao definicoes (por exemplo o pacote de um import Java). E contexto, nao gate.
  • internal/prompt (por exemplo isCommentLine) e internal/context/skills ainda carregam nomes de linguagem como literais; com os nomes do runtime (bash) a heuristica de comentario cai no padrao //. Fora de paths deste card; tratado no AUR-559.
  • Nenhum linter real (AUR-492).