Pular para conteúdo

AUR-607 — Saída em pt-BR de ponta a ponta

Com review.language: pt-BR, as frases que a revisão mostra a uma pessoa (terminal, linhas e status do gate, linhas de publicação do parecer, aviso de arquivo pulado, achado de segredo e próximo passo do MCP) saem do catálogo internal/i18n/catalog.yml. Com en (ou sem language), a saída fica igual à anterior byte a byte: os textos em inglês foram copiados para o catálogo e os testes conferem o texto antigo literal.

Textos migrados (antes → depois em pt-BR)

onde antes (en, mantido) depois (pt-BR)
internal/gate/verdict.go gate verdict reuse unavailable (AURUMCODE_CACHE_DIR not set): … reaproveitamento do veredito do gate indisponível (AURUMCODE_CACHE_DIR não definido): …
review_base_analysis.go no LLM provider configured: quality review skipped; running deterministic analysis only nenhum provedor de modelo configurado: revisão por modelo não executada; rodando só a análise determinística
review_base_analysis.go texto longo de errNoProviderConfigured (uma linha) seis linhas curtas: o que definir para o provedor, o formato do fixture offline, rule_id obrigatório, exemplo
review_base_analysis.go --exigir-qualidade: the quality review did not run, so this run is not a clean review --exigir-qualidade: a revisão por modelo não rodou, então esta execução não é uma revisão completa
review_base_publish.go LLM quality review did not run. The following report covers deterministic analysis only. A revisão por modelo não rodou. O relatório abaixo cobre só a análise determinística.
review_gate.go (só a linha do --fail-on) 1 finding(s) at severity error or above (--fail-on error) 1 achado com severidade error ou maior (--fail-on error) / 3 achados …
review_batches.go the diff did not fit one prompt; reviewed in N batches … o diff não coube em um só prompt; revisado em N lotes por diretório …
pr.go could not understand the model's response (…), degrading to deterministic analysis; … não foi possível entender a resposta do modelo (…), voltando à análise determinística; a revisão por modelo ficou inconclusiva
internal/render/no_findings.go No issues found. Nenhum problema encontrado.
internal/analyzer (aviso) binary file, skipped: x, generated file, skipped: x arquivo binário, não revisado: x, arquivo gerado, não revisado: x
internal/gate/policy.go review inconclusive (partial_coverage) revisão inconclusiva — parte do diff ficou fora da revisão [partial_coverage]
internal/gate/scanner.go SAST (…) inconclusivo (sast_unavailable) SAST (…) inconclusivo (análise estática habilitada, mas o Semgrep não está instalado [sast_unavailable])
dtrack.go, analysisdata.go, dependencies.go, aviso de scanner e deps.notice.inconclusive … revisão inconclusiva (dtrack_secret_missing): … (código cru) … revisão inconclusiva (falta a chave de acesso ao Dependency-Track [dtrack_secret_missing]): …
cmd_sbom.go aurumcode sbom: policy gate: review inconclusive (sbom_generation_failure) aurumcode sbom: policy gate: revisão inconclusiva — o SBOM não pôde ser gerado ou validado [sbom_generation_failure]
internal/gate/verdict.go %d achado(s) de uma revisão concluída anterior deste conteúdo reaplicado(s) (já em português, mantido em en) 1 achado … foi reaplicado / 2 achados … foram reaplicados
status aurumcode/review 2 achado(s) grave(s) no pull request #7 2 achados graves / 1 achado grave / nenhum achado grave
review_base_quality.go reused 3 file(s) from cache (not resent to the model) 3 arquivos reaproveitados do cache (não reenviados ao modelo)
review_pr_model.go (--pr sem provedor) texto longo de errNoProviderConfigured as mesmas linhas curtas do --base
linha final sem achados …; inconclusivo: a, b (códigos) …; inconclusivo: <frase> [a]; <frase> [b]
status aurumcode/policy-gate falha: achado(s) reprovam o gate no pull request #7: <linhas> (corte no meio da palavra) falha: 1 achado reprova o gate — <título> (<severidade>) em <arquivo:linha>; detalhes no parecer
status, inconclusivo inconclusivo: revisão inconclusiva (bloqueio) no pull request #7: review inconclusive (x) inconclusivo: a revisão não cobriu tudo e o gate reprova por configuração — <frase> [x] (… só avisa … em warn)
status, aprovado aprovado: gate de política aprovado no pull request #7 aprovado: gate de política aprovado
review_pr_publish.go review formal "APPROVE" publicado no pull request #7 (0 comentário(s) na linha). parecer publicado na PR #7 como aprovação (sem comentários na linha).
review_pr_publish.go parecer publicado no pull request #7 (2 comentário(s) na linha). parecer publicado na PR #7 (2 comentários na linha).
achado do Gitleaks <descrição>. in commit <id> (gitleaks <v>) (rule gitleaks:<regra>) Segredo ou credencial escrito no código (regra \gitleaks:`). Texto original do Gitleaks: (commit , gitleaks )`
MCP next_step / how_to_fix textos em inglês catálogo; inconclusivo diz o que configurar (LLM_API_KEY/LLM_BASE_URL no ambiente que inicia aurumcode mcp, ou instalar o scanner que faltou)
.github/workflows/review.yml ::error::AurumCode needs LLM_API_KEY and LLM_BASE_URL repository secrets; … ::error title=AurumCode sem provedor de modelo:: com o efeito exato (a revisão não roda e o status aurumcode/policy-gate não é publicado; com o status exigido, a PR fica esperando), onde cadastrar e como repassar (secrets: ou secrets: inherit)
plurais (s) do catálogo %d arquivo(s) …, %d achado(s) …, item(ns) forma _one para 1 e plural correto; affected_tests e coverage_summary reescritos sem concordância de número
aviso de cobertura ignore … a ausência deles no contexto NÃO prova … 1 arquivo ignorado (regra \ignore` do repositório ou binário): não foi revisado e não entra na cobertura. Ignorado não significa aprovado.`

Cada motivo de inconclusivo tem frase própria em gate.reason.<código> (internal/gate/reasons): modelo e cobertura, as três falhas de cada categoria de scanner (sast, secrets, lint), dados de análise, Dependency-Track, verificação de dependências, auditoria/SARIF, deliberation_limit:<limite> e contributor_error:<fonte>. Código sem frase no catálogo sai como motivo sem descrição no catálogo [código], nunca em branco. Em en o texto do motivo é o próprio código.

Onde o idioma vem

Todas as linhas acima rodam depois de a configuração ser lida (reviewLanguage da sessão, gate.Run.Language, SessionOutcome.Language no MCP). Exceções documentadas: failedAnswer do MCP (a sessão não rodou e não leu configuração) usa o idioma padrão; o review.yml não conhece review.language e sai em pt-BR (público-alvo), com os nomes técnicos.

Compatibilidade

  • en: os textos do catálogo reproduzem a saída anterior; o status do gate, a linha do parecer formal e as dicas do MCP em en seguem o código anterior (legacyGateStatusDescription, legacyReviewCheckDescription, formalReviewLine, parecerLine, inconclusiveHints). As formas _one em en são o plural com 1.
  • Decisão do gate, exit code, ordem do parecer, JSON de auditoria, SARIF e nomes de campos não mudam. A auditoria e o SARIF são dado de máquina e não mudam de idioma: o reason da auditoria junta gate.Result.AuditLines() (cada linha mostrada em pt-BR guarda o texto anterior, com o código cru), e a mensagem do achado de segredo no SARIF é a do motor (Scan.ToolMessages, complianceArtifactInputs.machineMessage). As linhas de dependência já eram escritas no idioma da revisão antes deste card e continuam como estavam.
  • O status aurumcode/policy-gate reconhece a linha de inconclusivo pelo modelo do catálogo (reasons.IsLine), não pelas palavras em inglês; uma reprovação sem achado nomeável (dependências, Dependency-Track) usa gate.status.breach_lines com a reprovação antes da linha de inconclusivo (AUR-538 AC-007).
  • gate.EvaluateGate, gate.ApplyScannerGate, render.NoFindingsLine e publishPolicyGateStatus/publishCheckStatus mantêm a assinatura (en); as variantes com idioma são EvaluateGateIn, ApplyScannerGateIn, NoFindingsLineIn, publishPolicyGateStatusIn e publishCheckStatusIn.

Provas

tests/acceptance/AUR-607.sh (cópia de go.mod go.sum cmd internal pkg):

id testes
AC-001 TestAUR607BaseReviewSpeaksTheReviewLanguage (review --base real, sem provedor, pt-BR e en), PullRequestWithoutProviderSpeaksTheLanguage, ReappliedVerdictCount, ReviewCheckAndCacheLinesFollowTheLanguage, RequiredQualityLineFollowsTheLanguage, NoProviderTextIsShortLinesInPortuguese, FailOnLineCountsInTheLanguage, TerminalTextsBothLanguages, SkippedFileNoticeFollowsTheLanguage, PublicationLinesFollowTheLanguage, NextStepFollowsTheLanguage, HowToFixFollowsTheLanguage, NewKeysExistInBothLocales, EnglishSingularIsThePluralWithOne, PortugueseHasNoParenthesizedPlural, LookupReportsMissingKeys
AC-002 TestAUR607InconclusiveReasonIsASentenceWithItsCode (todos os códigos), DTrackReasonFollowsTheLanguage, AuditAndSARIFIgnoreTheLanguage, AuditLinesIgnoreTheLanguage, InconclusiveLineBothLanguages, ScannerInconclusiveLineFollowsTheLanguage, PolicyLineAndFirstBreach, ClosingLineNamesTheReasons, PolicyGateStatusInPortuguese
AC-003 TestAUR607PolicyGateStatusInPortuguese, PolicyGateStatusCutsAtAWord, PolicyGateStatusEnglishUnchanged, BreachWithoutFindingKeepsTheBreachAhead
AC-004 TestAUR607GitleaksFindingLeadsWithTheCatalogLabel, SARIFKeepsTheEngineMessage
AC-005 grep no review.yml (título, onde cadastrar, secrets: inherit, sem o texto antigo)
MUT-001 linha de terminal volta ao inglês fixo → TestAUR607BaseReviewSpeaksTheReviewLanguage cai
MUT-002 motivo volta ao código cru → TestAUR607InconclusiveReasonIsASentenceWithItsCode cai

AC-006 (saídas gravadas e capturas dos tutoriais) é provado por run.sh --check de cada tutorial, regravado com a imagem desta árvore. Os exemplos dos tutoriais com .aurumcode/config.yml agora declaram review.language: pt-BR.

Fora deste card (pendências)

  • aurumcode fix: working tree does not match the suggestion's current_code vem de internal/apply (checkAgainstFile), fora dos paths, sem erro tipado; o comando também não lê a configuração. fixvalidate.go ficou como estava para não traduzir só metade da mesma mensagem.
  • Citação (rule x: Título) dos achados do modelo: cmd/aurumcode/cache_redaction.go e a regex ruleCitation de internal/gate/sources.go leem esse formato; só o achado de scanner de segredos usa (regra `x`).
  • Linhas ainda fixas: gate contributor %s failed, %d ci_analysis item(s) discarded, reviewing the same range computed from the verified checkout (antes de a configuração da PR ser lida), avisos de descarte do modelo (internal/review/reviewer.go, scope.go), aurumcode dependencies, xbom e realimentacao, diff too large (o detalhe medido vem só na mensagem do analisador).
  • Prefixo policy gate: das linhas do gate (nome do check aurumcode/policy-gate): mantido nos dois idiomas, porque tests/acceptance/AUR-567.sh procura policy gate: .*origem <fonte> na gravação do tutorial gate.
  • Location: LEFT (removed line in base) do relatório do terminal: TestAUR514AC002TerminalAndPRShowTheSameFields fixa esse texto nos dois idiomas.
  • Licença de dependência desconhecida: o motivo é texto livre do pacote internal/dependencies, não código.
  • Âncoras de mutação atualizadas em aceites antigos: tests/acceptance/AUR-572.sh (render.NoFindingsLineIn(language, inconclusiveReason) em main.go) e tests/acceptance/AUR-533.sh (ApplyAnalysisDataGate(ctx, run.Language, run.Cfg.AnalysisData)); os blocos <!-- arquivo: … --> de docs/tutorials acompanham os config.yml com language: pt-BR.

Aviso de triagem do AUR-608 (revisão de 2026-10-09)

Depois do rebase sobre o AUR-608, o aviso notice.triage_not_run ainda mostrava o motivo como código cru em pt-BR (… não ocorreu (quality_skipped)). Agora o motivo passa por reasons.Text: em pt-BR vem depois de um travessão, como frase com o código entre colchetes; em inglês continua o próprio código entre parênteses, byte a byte. Testes: TestAUR607TriageNoticeShowsTheReasonSentence e as expectativas pt-BR de triage_failclosed_test.go; exemplo atualizado em docs/configuration.md.