AUR-611 — Versão da ferramenta no parecer, na auditoria e no SARIF
Problema
O Dockerfile compilava o binário sem -X main.version e o CI construía a
imagem sem --build-arg. Todo SARIF real saía com tool.driver.version:
"dev", e nem o parecer nem a auditoria diziam qual AurumCode decidiu.
Desenho
| arquivo | responsabilidade |
|---|---|
Dockerfile |
ARG AURUMCODE_VERSION=dev e -X main.version=${AURUMCODE_VERSION} no go build. O padrão dev mantém tutoriais e builds locais como estavam. |
internal/version/version.go |
Info (New, IsDev, Label): valor carimbado no build; vazio ou dev é dev, e Label nunca devolve versão vazia. |
cmd/aurumcode/tool_version.go |
toolVersion() lê main.version por internal/version; toolVersionLine monta a linha do parecer, vazia para dev; joinDetails a acrescenta depois das seções. |
cmd/aurumcode/pr_summary_format.go, review_copy.go, internal/i18n/catalog.yml |
detailsSections termina com a linha review.tool_version ("Revisado com AurumCode %s" / "Reviewed with AurumCode %s"). Sem outra seção, o bloco de detalhes passa a existir só com a versão. |
internal/render/audit.go |
Campo tool_version (omitempty), AuditRecord.StampToolVersion (só fora de dev) e redação do campo como os demais. |
cmd/aurumcode/compliance_artifacts.go, cmd_dependencies.go, main.go |
Auditoria carimbada; SARIF da revisão e das dependências e --version leem toolVersion().Label(). |
.github/workflows/review.yml (dois builds), .github/workflows/providers-smoke.yml |
Passo "Resolve AurumCode version" (id: tool_version, texto idêntico entre marcadores AUR-611-VERSION-BEGIN/END): tag vX.Y.Z que aponta exatamente para o SHA, via git ls-remote --tags, senão os 12 primeiros caracteres do SHA; o build recebe --build-arg AURUMCODE_VERSION="$AURUMCODE_VERSION" pelo env. |
docs/releases.md |
De onde vem a versão mostrada no parecer, na auditoria e no SARIF. |
Por que ls-remote e não git describe --tags --exact-match: o checkout da
ferramenta é raso (fetch-depth: 1) e pedido por SHA. Nesse caso
fetch-tags: true do actions/checkout não traz tag nenhuma (o refspec do
SHA não tem destino, então o git não segue tags), e fetch-depth: 0 baixaria
o histórico inteiro da ferramenta em toda revisão. ls-remote lê só a lista
de tags; se falhar, a versão é o SHA curto e o job segue. Só tags
vX.Y.Z são aceitas; qualquer outro nome cai no SHA curto, então o valor
injetado no build nunca carrega caractere fora de [0-9a-zv.].
Provas
tests/acceptance/AUR-611.sh (cópia de go.mod go.sum cmd internal pkg):
| id | prova | última linha |
|---|---|---|
| AC-001 | Executa a própria linha go build do Dockerfile com AURUMCODE_VERSION=v9.9.9 (--version imprime aurumcode v9.9.9) e com o padrão do ARG (aurumcode dev); TestAUR611SARIFCarriesStampedVersion, TestAUR611VersionFlagPrintsStampedVersion, TestAUR611StampedVersionIsNotDev, TestAUR611UnstampedVersionIsDev |
AUR-611/AC-001/pass |
| AC-002 | TestAUR611DetailsCarryToolVersionWhenNotDev (linha dentro de <details>, pt-BR e en, o resto do parecer igual), TestAUR611DetailsOmitToolVersionWhenDev (parecer de dev byte a byte igual ao capturado antes da mudança), TestEveryKeyExistsInEveryLocale |
AUR-611/AC-002/pass |
| AC-003 | TestAUR611AuditRecordsToolVersionOnlyWhenNotDev (render: dev grava os mesmos bytes de um registro sem carimbo), TestAUR611AuditFileCarriesToolVersionOnlyWhenNotDev (o arquivo que a revisão escreve) |
AUR-611/AC-003/pass |
| AC-004 | Os dois builds do review.yml e o do smoke usam --build-arg AURUMCODE_VERSION vindo de steps.tool_version; os três resolvedores são o mesmo texto; o resolvedor roda com um git falso: tag anotada e tag leve no SHA (a maior vX.Y.Z), tag em outro SHA, nomes fora de vX.Y.Z e ls-remote falhando dão o SHA curto; SHA malformado falha |
AUR-611/AC-004/pass |
| MUT-001 | if info.IsDev() { vira if false { em tool_version.go: o parecer de dev ganha "AurumCode dev" |
AUR-611/MUT-001/rejected (TestAUR611DetailsOmitToolVersionWhenDev) |
Compatibilidade
- Build sem o argumento continua
dev: parecer, auditoria e SARIF dos tutoriais ficam byte a byte iguais (nenhuma saída gravada muda). - Fora de dev, o parecer ganha uma linha nos detalhes e a auditoria ganha
tool_version; consumidores que leem a auditoria por chave não quebram. - A chave de reaproveitamento do veredito (
binaryIdentity) já incluíamain.version: com a versão real, cada versão da ferramenta tem a sua. - Fora do escopo: aviso de versão mais nova e chamada à API do GitHub.