Referência
Referência da linha de comando
Cada comando, flag, código de saída, variável de ambiente, chave de política e sinal de risco do Probe atual (versão mais recente: v0.5.1). Entradas marcadas com v0.4 fazem um binário anterior à v0.4.0 sair com 3; consulte a ordem de releases antes de fixar uma delas no CI. Pressione / para pesquisar.
Esta página trata do Probe para código, a ferramenta de linha de comando. Vai monitorar arquivos Word, Excel ou PowerPoint? Veja o Probe Desktop.
Sinopse
probe init [--repo PATH] [--language go|typescript|javascript|python|rust]
probe lint [--base main] [--head HEAD] [--ci] [flags]
probe review [--base main] [--reviewer=false] [--ci] [flags]
probe review [flags] BASE..HEAD
probe plan --intent-file FILE [--base main] [--ci]
probe review --plan .probe/PLAN.json [flags]
probe report [--input .probe/confidence-report.json] [--out DIR] [--format LIST] [--report-url URL]
probe version
- lint analisa uma mudança de forma estática. Ele nunca executa código do repositório e nunca chama um provedor de IA.
- review acrescenta verificações em sandbox no Docker, as etapas opcionais de evidência (testes da baseline alterados, testes impactados, fuzzing diferencial, mutação, preparação de dependências) e, quando um modelo está configurado, uma investigação por IA.
- plan pede ao provedor configurado um plano de implementação antes de qualquer código ser escrito, avalia-o com regras fixas e o transforma em um contrato com o qual
lint --planereview --plancomparam o diff. - Somente arquivos commitados são analisados; edições não commitadas e arquivos não rastreados são ignorados.
- Por padrão, os relatórios são gravados em
.probe/no repositório. A saída do console continua curta. - As flags aceitam um ou dois hífens (
-ciou--ci). Booleanos são ativados com--ciou--ci=truee desativados com--checks=false. Um valor é informado como--base mainou--base=main. - Execute
probe <command> --helppara ver as flags de um comando.
Escolhendo revisões
Os dois lados de uma comparação são resolvidos em IDs de commit imutáveis, registrados no relatório. Renomeações, exclusões, arquivos binários e mudanças de tipo de arquivo são tratados.
| Forma | Compara |
|---|---|
--base main (padrão) | Da merge base de main e --head até --head, como um pull request. Commits adicionados à main desde o ponto de ramificação não fazem parte da mudança. |
--base main --exact | Da ponta de main diretamente até --head. |
BASE..HEAD | Os dois commits exatos, por exemplo HEAD~1..HEAD para revisar o último commit. Substitui --base, --head e --exact. |
BASE...HEAD | Da merge base das duas revisões até HEAD. |
Um intervalo pode aparecer antes ou depois das flags: probe review main..HEAD --ci e probe review --ci main..HEAD são equivalentes. No máximo um intervalo é aceito. Qualquer revisão que o Git entenda funciona: branches, tags, origin/main, HEAD~3 ou um ID de commit. Os jobs de CI precisam de histórico suficiente para resolver a base (por exemplo fetch-depth: 0).
A política confiável é sempre lida da branch base, nunca da mudança em revisão, então um pull request não consegue afrouxar as próprias regras.
probe lint
Análise estática de uma mudança: comparação Git, sinais de risco e um relatório. Sem Docker, sem chamada a provedor, sem execução de código do repositório. Seguro para rodar em branches não confiáveis.
| Flag | Padrão | Descrição |
|---|---|---|
--base REV | main | Branch ou revisão base. A comparação começa na merge base com --head; a ponta dela fornece a política confiável. |
--head REV | HEAD | Revisão candidata em análise. |
--exact | false | Comparar com a própria revisão base em vez da merge base. |
BASE..HEAD | — | Intervalo posicional; veja Escolhendo revisões. |
--repo PATH | . | Diretório do repositório. Qualquer diretório dentro da árvore de trabalho funciona. |
--config PATH | política da base | Usar este arquivo de política local em vez do .probe.json da branch base. Só informe um arquivo em que você confia. |
--out DIR | .probe | Diretório dos relatórios, relativo à raiz do repositório. O caminho não pode conter links simbólicos. |
--format LIST | markdown,json | Formatos de relatório a gravar, separados por vírgula: markdown, json, sarif v0.4, pr-comment v0.4. Veja Arquivos de saída. |
--report-url URL v0.4 | — | Um link https para o relatório completo, citado em PR_COMMENT.md. Exige o formato pr-comment; uma URL que pareça conter uma credencial é recusada com saída 3. |
--impact | true | Construir o índice de impacto estático das funções alteradas. --impact=false pula essa etapa. |
--plan PATH | — | Um PLAN.json gravado por probe plan: comparar o diff com o contrato dele e adicionar uma seção e sinais plan_drift. |
--ci | false | Sair com código 2 quando for necessária revisão humana. Veja Códigos de saída. |
--intent TEXT | — | Intenção ou critérios de aceitação do pull request, registrados no relatório (no máximo 64 KiB). |
--intent-file PATH | — | Ler a intenção de um arquivo UTF-8. Não pode ser combinado com --intent. |
--checks, --reviewer | false | Devem permanecer false: lint sai com código 3 se qualquer uma estiver ativada. Use review. As flags de etapas exclusivas do review (--base-tests, --impacted-tests, --fuzz, --cache-dir, --parallel, --deadline, --allow-prepare-network) são recusadas da mesma forma. |
probe lint HEAD~1..HEAD # the last commit
probe lint --base origin/main --ci # this branch as a pull request, for CI
probe lint --base main --format json # JSON report only
probe lint --base main --plan .probe/PLAN.json # scope drift against an approved plan
probe review
Tudo o que o lint faz, mais os comandos test, typecheck, build e coverage da política em contêineres Docker descartáveis, mais uma investigação por IA quando um modelo está configurado. Exige Docker com contêineres Linux e uma sandbox.image pré-carregada.
| Flag | Padrão | Descrição |
|---|---|---|
--base REV | main | Branch ou revisão base. A comparação começa na merge base com --head; a ponta dela fornece a política confiável. |
--head REV | HEAD | Revisão candidata em análise. |
--exact | false | Comparar com a própria revisão base em vez da merge base. |
BASE..HEAD | — | Intervalo posicional; veja Escolhendo revisões. |
--repo PATH | . | Diretório do repositório. |
--config PATH | política da base | Usar este arquivo de política local em vez do .probe.json da branch base, por exemplo para testar uma política antes de commitá-la. Só informe um arquivo em que você confia: ele decide o que é executado e para onde o código-fonte é enviado. |
--out DIR | .probe | Diretório dos relatórios, relativo à raiz do repositório. Os artefatos vão para DIR/artifacts/. |
--format LIST | markdown,json | Formatos de relatório a gravar, separados por vírgula: markdown, json, sarif v0.4, pr-comment v0.4. |
--report-url URL v0.4 | — | Um link https para o relatório completo, citado em PR_COMMENT.md. Exige o formato pr-comment. |
--ci | false | Sair com código 2 quando for necessária revisão humana, incluindo sinais de alto risco, áreas não verificadas ou verificações incompletas. |
--checks | true | Executar as verificações configuradas na sandbox. --checks=false as pula; um revisor configurado ainda pode executar experimentos na sandbox. |
--reviewer | auto | Investigação por IA. Ativada automaticamente quando um modelo está definido na política confiável ou em PROBE_REVIEWER_MODEL. --reviewer=false desativa todas as chamadas a provedores; --reviewer falha com saída 3 se nenhum modelo estiver configurado. |
--max-iterations N | política (20) | Substituir reviewer.max_iterations nesta execução, de 1 a 100. |
--intent TEXT | — | Intenção ou critérios de aceitação do pull request (no máximo 64 KiB). Registrados no relatório e passados ao revisor. |
--intent-file PATH | — | Ler a intenção de um arquivo UTF-8. Não pode ser combinado com --intent. |
--allow-network | false | Dar acesso à rede aos contêineres da sandbox. Só tem efeito se a política confiável também definir sandbox.network: true. |
--no-network | false | Forçar a rede da sandbox a ficar desligada. Não afeta as chamadas de API do revisor; para isso, adicione --reviewer=false. |
--plan PATH | — | Comparar o diff com o contrato de um PLAN.json. Uma mudança que desviou pede revisão humana (saída 2 com --ci), nunca saída 1. |
--impact | true | Construir o índice de impacto estático das funções alteradas. --impact=false pula essa etapa (e não pode ser combinado com --impacted-tests). |
--impacted-tests v0.4 | false | Executar, na baseline e na candidata, os testes Go não alterados que o índice de impacto indica como alcançando uma função alterada. Um teste que passa na base e falha na candidata é FAILS_ON_CANDIDATE: um motivo para revisar, não um defeito. |
--base-tests v0.4 | false | Executar a versão da baseline de cada função de teste Go que a mudança modificou ou removeu, no código da baseline e da candidata. |
--fuzz v0.4 | true | Executar o fuzzing diferencial configurado pelo objeto fuzz da política. --fuzz=false registra a etapa como desativada. |
--cache-dir DIR v0.4 | — | Cache opcional das execuções da baseline, fora do repositório e do diretório de saída. Uma execução da baseline reaproveitada do cache nunca sustenta um resultado positivo. |
--parallel N v0.4 | 1 | Executar as verificações iniciais N por vez, de 1 a 4. |
--deadline D v0.4 | — | Tempo limite total da execução, de 1m a 24h; 30 segundos dele são reservados para a limpeza e o relatório. |
--allow-prepare-network v0.4 | false | Dar acesso à rede ao contêiner de prepare, somente se prepare.network da política também permitir. As verificações continuam offline. |
probe review --base main --ci # typical pull request run
probe review HEAD~1..HEAD --reviewer=false # checks only, no provider
probe review --base main --checks=false --reviewer=false # static only, like lint
probe review --base main --intent-file PR.md # give acceptance criteria
probe review --base main --impacted-tests --base-tests --ci # run tests on both revisions
probe review --base main --format markdown,json,sarif,pr-comment --report-url "$RUN_URL"
A preparação de dependências roda primeiro, quando a política tem um objeto prepare. Em seguida, as verificações rodam na ordem test, typecheck, build e depois coverage, seguidas pelas etapas de evidência e pelo revisor. Cada contêiner roda sem root, com raiz e montagem do código-fonte somente leitura, sem capabilities adicionais, sem rede por padrão e com os limites de CPU, memória, PIDs e tempo da política de sandbox. O socket do Docker, o seu checkout de trabalho e as chaves de API nunca são montados. Se o Docker ou a imagem estiverem ausentes, a execução termina com saída 4; nada jamais recorre à sua máquina.
probe plan
Antes de a mudança ser escrita: o provedor configurado simula, em modo somente leitura, como implementaria uma intenção no commit base e envia um plano estruturado (arquivos, símbolos, dependências, etapas). O Probe o avalia com regras fixas e grava PLAN.json e PLAN.md. O modelo produz o plano; ele nunca julga o risco. Nada é modificado nem executado.
| Flag | Padrão | Descrição |
|---|---|---|
--intent-file PATH, --intent TEXT | — | A mudança a planejar. Obrigatória; no máximo 64 KiB de UTF-8, lida como a intenção do review. |
--base REV | main | A revisão de onde o plano parte. A ponta dela fornece a política confiável. |
--config PATH | política da base | Política local confiável explícita. |
--out DIR | .probe | Diretório de saída, relativo ao repositório. |
--ci | false | Sair com 2 quando uma categoria for sinalizada ou algo ficar sem verificação. |
--max-iterations N | política | Substituir o orçamento de iterações do provedor, de 1 a 100. |
--reviewer | true | Um provedor é obrigatório: sem um modelo configurado, ou com --reviewer=false, plan sai com 3 e não grava nada. |
As ferramentas do planejador são somente leitura e trabalham sobre um snapshot do commit base: list_files, read_file, search_code e as baseadas no índice find_references, inspect_symbol e find_callers, e então submit_plan uma única vez. A avaliação sinaliza quatro categorias, considerando apenas o plano e o commit base:
| Categoria | Sinais |
|---|---|
| Partes críticas | plan_critical_path (um caminho planejado corresponde a sensitive_paths), plan_sensitive_symbol (um nome ligado a autenticação, autorização ou pagamento). |
| Arquitetura | plan_exported_signature, plan_dependency_change, plan_new_package. |
| Risco de regressão | plan_wide_impact (10 ou mais chamadores), plan_untested_impact (há chamadores e nenhum teste os alcança), medidos no índice estático do commit base. |
| Outra mudança importante | plan_file_deletion, plan_large_scope (20 ou mais arquivos), plan_inconsistent, plan_unmeasured. |
Códigos de saída: 0; 2 com --ci quando uma categoria é sinalizada; 3 uso ou configuração; 4 falha do provedor ou nenhum plano aceito.
Desvio de escopo: --plan
lint --plan e review --plan leem o contrato do plano e comparam o diff real com ele. Cada diferença no diff também vira um sinal plan_drift. A seção fica drifted quando um item é de gravidade média ou maior.
| Item | Gravidade | Quando |
|---|---|---|
unplanned_file | média | Um arquivo alterado que o plano não lista (unplanned_test_file, baixa, para um arquivo de teste). |
unannounced_exported_change | alta | Uma declaração Go exportada alterada ou removida sem ter sido anunciada como signature ou remove. |
unannounced_critical_path | alta | Um caminho alterado corresponde a um glob crítico da política deste review e o plano não o listou. |
unannounced_dependency_change | média | Um manifesto de dependências mudou sem ter sido declarado. |
planned_file_untouched | baixa | Um arquivo planejado que a mudança não toca (apenas na seção). |
probe plan --intent-file task.md --ci # 1. plan; exit 2: a human validates it
# 2. an agent implements the plan
probe review --base origin/main --plan .probe/PLAN.json --ci # 3-4. exit 0: merge; exit 2: review
O plan gate
review --plan termina com uma decisão, plan_drift.decision, impressa no stdout e no topo da seção Plan Conformance. Com --ci, ela é o código de saída.
| Decisão | Quando |
|---|---|
no_human_review_required (saída 0) | Todas as condições: o plano, reavaliado pelo review a partir da sua proposta no commit base com a política confiável deste review, não sinaliza nenhuma categoria e não tem lacuna de medição; a mudança está em conformidade com o plano e com a sua base; pelo menos uma verificação rodou e todas passaram; nenhum problema reproduzido, sinal alto ou crítico, área não verificada ou outra seção pedindo revisão. |
human_review_required (saída 2) | Qualquer outro caso. Cada motivo é listado em plan_drift.decision_reasons. lint --plan não roda nenhuma verificação, então sempre exige revisão. |
As flags e o contrato armazenados em PLAN.json nunca são considerados confiáveis: o contrato é derivado novamente da proposta, então um plano editado não consegue ampliar o escopo sem avaliação, e probe report recalcula a decisão a partir do relatório registrado. O gate é uma decisão de processo, não um veredito sobre a correção. Um plano que não levanta nada não prova que a mudança é segura, e o desvio não verifica se a mudança implementa a intenção. Veja planos pré-mudança e a receita de CI.
probe init
Grava um .probe.json inicial para o projeto. Ele se recusa a sobrescrever um arquivo existente. Revise os comandos e a imagem e depois faça commit do arquivo na sua branch base.
| Flag | Padrão | Descrição |
|---|---|---|
--repo PATH | . | Diretório onde criar o .probe.json. |
--language NAME | detectada | go, typescript, javascript, python, rust ou unknown. Detectada a partir de go.mod/go.work, Cargo.toml, tsconfig.json, package.json e depois pyproject.toml/setup.py/requirements.txt. Seleciona os padrões. |
probe report
Renderiza novamente um relatório JSON salvo, por exemplo para regenerar o Markdown ou produzir SARIF no CI. Nada é executado de novo, e a nova renderização não autentica as evidências que o relatório contém; cada status é derivado novamente das verificações registradas, então um relatório editado é corrigido em vez de ser considerado confiável.
| Flag | Padrão | Descrição |
|---|---|---|
--input PATH | .probe/confidence-report.json | Relatório JSON salvo (versão 1, no máximo 64 MiB). |
--out DIR | .probe | Diretório de saída, relativo ao diretório atual. |
--format LIST | markdown,json | Formatos a gravar, separados por vírgula: markdown, json, sarif v0.4, pr-comment v0.4. |
--report-url URL v0.4 | — | Um link https para o relatório completo, citado em PR_COMMENT.md. |
probe version e ajuda
| Comando | Exibe |
|---|---|
probe version, --version | A versão, por exemplo probe v0.5.1, e o aviso de licença. |
probe help, -h, --help | A sinopse. Sem argumentos, o Probe exibe o mesmo texto. |
probe <command> --help | As flags de um comando, com seus valores padrão. |
Códigos de saída
| Código | Significado |
|---|---|
0 | Relatório concluído sem nenhum problema alto ou crítico reproduzido. Sem --ci, áreas não resolvidas não alteram este código. |
1 | Uma hipótese alta ou crítica é sustentada por uma falha diferencial: um teste gerado passou na base e falhou na candidata. Nada mais produz 1: nem uma divergência de fuzzing, nem um mutante sobrevivente, nem um teste impactado ou da baseline falhando, nem desvio do plano. |
2 | Somente com --ci: revisão humana necessária, incluindo sinais de alto risco, áreas não verificadas, verificações incompletas, um teste FAILS_ON_CANDIDATE, uma divergência de fuzzing ou etapa inconclusiva, desvio do plano, um plano que levantou uma categoria (o plan gate) ou (para plan) uma categoria sinalizada. |
3 | Argumentos inválidos, comparação Git ou configuração confiável (incluindo uma chave de política ou nome de comando desconhecido). |
4 | Erro operacional no harness, na análise ou na gravação do relatório, como Docker ou a imagem da sandbox indisponíveis, uma verificação que não pôde rodar, uma preparação de dependências que falhou ou uma falha do provedor durante o plan. |
Nenhum código significa "aprovado". Um 0 diz que nada foi reproduzido, não que a mudança está correta.
Variáveis de ambiente
O provedor de IA pertence à implantação, e não ao repositório, então essas configurações podem vir do ambiente. Nada mais pode: a imagem, os comandos, os orçamentos e os caminhos sensíveis são sempre decididos pela política confiável.
| Variável | Efeito |
|---|---|
PROBE_REVIEWER_ENDPOINT | Substitui reviewer.endpoint. Mesmas regras de URL da política. |
PROBE_REVIEWER_MODEL | Substitui reviewer.model e, sozinha, ativa o revisor durante o review. |
PROBE_API_KEY | Chave de API. O nome é definido por reviewer.api_key_env; este é o padrão. |
PROBE_API_KEY_FILE | Caminho de um arquivo que contém a chave, usado quando a variável acima não está definida. O arquivo precisa ser legível; caso contrário, a execução falha com saída 3. |
/run/secrets/PROBE_API_KEY | Docker secret lido por último, quando nenhuma das variáveis está definida. A ausência não é um erro. |
Uma variável em branco conta como não definida. Os arquivos de chave são lidos inteiros, com os espaços ao redor removidos, limitados a 8 KiB, e devem conter uma única linha. Quando o revisor roda, o log indica de onde veio cada valor, nunca o próprio valor. Quem controla este ambiente escolhe para onde o código-fonte com dados ocultados é enviado: mantenha-o fora de jobs que executam código de forks não confiáveis.
Arquivos de saída
| Caminho | Conteúdo |
|---|---|
.probe/CONFIDENCE_REPORT.md | O relatório a ler: resumo da mudança, verificações automatizadas, resumo da investigação, problemas reproduzidos, áreas não verificadas, revisão humana sugerida, superfície de revisão, execução das linhas alteradas, evidências registradas e artefatos. |
.probe/confidence-report.json | Os mesmos dados para ferramentas: IDs de commit, linhas alteradas, sinais, verificações, hipóteses, evidências, eventos de auditoria e hashes dos artefatos. Veja o JSON schema. |
.probe/confidence-report.sarif v0.4 | Com --format sarif: um log SARIF 2.1.0 para ferramentas de code scanning, contendo apenas achados sustentados por evidências registradas na sandbox. Nenhum achado não é aprovação. |
.probe/PR_COMMENT.md v0.4 | Com --format pr-comment: um comentário de pull request com um bloco de status e todos os achados sustentados por evidências. |
.probe/PLAN.json, PLAN.md | Gravado por probe plan: a proposta escrita pelo modelo, a avaliação determinística e o contrato (schema). |
.probe/artifacts/ | Logs das verificações, perfis de cobertura, fontes dos testes gerados, resultados de testes, patches dos mutantes e registros de fuzzing, cada um referenciado pelo seu hash SHA-256 no relatório. |
Adicione .probe/ ao .gitignore. O console exibe um único resumo: arquivos e linhas alterados, número de sinais e de problemas reproduzidos, a superfície de revisão focada e a execução das linhas alteradas.
Sinais de risco
Sinais são motivos para olhar, não defeitos confirmados. Arquivos Go recebem análise sensível à sintaxe; TypeScript/JavaScript, Python, Rust e outras linguagens usam heurísticas de texto identificadas como tal. Sinais nas mesmas linhas são mesclados em um único intervalo de revisão no relatório. Sinais de nível de arquivo (sensitive_path, dependency_change, migration_change, infrastructure_change, binary_change, file_deleted, file_type_change, large_change, branch_growth, no_test_change, prepare_input_changed, plan_drift) dizem respeito ao arquivo, não a uma linha: o relatório os lista sob o arquivo como arquivo inteiro, e o JSON os marca com "scope": "file". A line deles apenas os posiciona na primeira linha alterada do arquivo.
| Tipo | Gravidade | Gerado quando |
|---|---|---|
sensitive_path | alta | Um caminho alterado corresponde a um glob de sensitive_paths. |
private_key | crítica | Uma linha adicionada inicia um bloco de chave privada PEM (RSA, DSA, EC, OpenSSH, PGP, criptografada) ou uma chave PuTTY. A chave nunca é copiada para o relatório. |
hardcoded_secret | alta | Uma linha adicionada contém o formato de uma credencial (chaves da AWS, GitHub, GitLab, Slack, Stripe, Google, provedores de LLM, npm, Twilio/SendGrid, Azure Storage, JWTs) ou atribui um literal entre aspas de 8 ou mais caracteres, com um dígito ou símbolo, a uma chave com nome de segredo (password, api_key, token, client_secret…). Placeholders, templates e consultas ao ambiente ou a um cofre são ignorados; o valor é mascarado nas evidências. |
credential_in_url | alta | Uma URL adicionada contém user:password@ ou um parâmetro de query com nome de segredo (api_key=, token=, password=…). |
tls_verification_disabled | alta | InsecureSkipVerify: true, verify=False, rejectUnauthorized: false, NODE_TLS_REJECT_UNAUTHORIZED=0, curl -k, sslmode=disable, mínimos de TLS 1.0/1.1 e semelhantes. |
excessive_permissions | alta | Permissões com escrita para todos (chmod 777, 0666 em APIs de arquivo), contêineres privilegiados, escalonamento de privilégios, runAsUser: 0, USER root, PID ou rede do host, SYS_ADMIN, um socket do Docker montado, NOPASSWD: ALL. |
protection_disabled | alta | CSRF desativado ou com exceções, origens CORS curinga, cookies inseguros, autoescaping de templates desligado, algoritmo JWT none ou assinaturas não verificadas, SELinux, firewall, seccomp ou AppArmor desativados, buckets públicos ou ingress 0.0.0.0/0, workflow com permissions: write-all. |
debug_enabled | média | DEBUG = True, debug: true, app.run(debug=True), FLASK_DEBUG=1, gin.DebugMode e semelhantes. |
hardcoded_email, hardcoded_ip | baixa | Um endereço de e-mail adicionado, ou um endereço IPv4 dentro de uma string ou URL, fora de testes e documentação. Faixas de documentação, loopback e exemplo são ignoradas. |
auth_change | alta | Uma função Go cujo nome sugere autenticação ou autorização tem o corpo alterado, ou uma linha alterada menciona autorização, autenticação, JWT, bcrypt, argon2, CSRF ou CORS. |
sensitive_function_change | alta | Uma função Go cujo nome sugere pagamentos (payment, refund, charge, capture, withdraw, deposit, balance…) tem o corpo alterado. |
validation_removed | alta | Uma linha removida chamava uma função de validação, asserção ou sanitização, ou lançava um erro de validação. |
public_api_change | alta média | Go: uma declaração exportada foi removida ou alterada (alta) ou adicionada (média). Outras linguagens: uma linha parece uma declaração pública (média). |
database_write | alta | Uma linha alterada parece uma mutação ou transação de banco de dados (INSERT, UPDATE … SET, .Exec(, .Commit(…). |
dynamic_execution | alta | eval, execução de processos, subprocess, child_process, innerHTML e semelhantes. |
type_suppression | alta | Supressão de tipos ou de lint, como @ts-ignore, as any, unsafe, nolint, eslint-disable. |
migration_change | alta | Um caminho contendo migration ou terminado em .sql foi alterado. |
infrastructure_change | alta | Um workflow do GitHub, Dockerfile ou arquivo Terraform foi alterado. |
file_type_change | alta | O Git informa uma mudança de tipo, por exemplo um arquivo que virou link simbólico. |
network_change | média | Uma linha alterada faz chamadas HTTP, gRPC ou de socket, ou contém uma URL. |
error_handling_change | média | Verificações de erro, wrapping, panic/recover, catch ou except alterados. |
dependency_change | média | Um manifesto de dependências ou lockfile foi alterado (go.mod, package.json, Cargo.lock, pyproject.toml…). |
uncovered_change | média baixa | Linhas Go adicionadas não foram executadas pela execução de coverage registrada. Baixa quando a própria execução de cobertura falhou. |
branch_growth | média | Foram adicionadas em um arquivo pelo menos cinco linhas com construções de ramificação a mais do que as removidas. Não é uma métrica de complexidade. |
large_change | média | Mais de 400 linhas alteradas em um único arquivo. |
file_deleted | média | Um arquivo rastreado foi removido. |
binary_change | média | Um arquivo binário foi alterado e não pode ser analisado como texto. |
analysis_limited | média | A análise de declarações Go não pôde ser concluída para um arquivo, por exemplo porque ele não faz parse, ou o índice de impacto ficou limitado ou indisponível para funções alteradas (símbolo impact_index). |
test_focus_added v0.4 | alta | Um marcador de foco foi adicionado a um arquivo de teste (it.only, fdescribe…). |
test_assertion_removed, test_case_removed v0.4 | média | Um arquivo de teste perdeu mais linhas de asserção, ou mais declarações de teste, do que ganhou. Regras para Go, TS/JS, Python e Rust. |
test_skip_added, test_expectation_relaxed v0.4 | média | Um marcador de skip foi adicionado (t.Skip, it.skip, @pytest.mark.skip, #[ignore]…), ou expectativas exatas foram substituídas por outras mais frouxas em um hunk. |
surviving_mutant v0.4 | média | Uma mutação de uma linha Go adicionada não fez nenhum teste do pacote falhar. O mutante pode ser equivalente. |
prepare_input_changed v0.4 | média | A mudança toca um arquivo listado em prepare.inputs da política; a camada de dependências continuou sendo construída a partir do commit base. |
plan_drift | alta média baixa | Com --plan: o diff sai do contrato do plano. Veja desvio de escopo. |
impacted_caller | baixa | Código não alterado chama uma função alterada, segundo o índice de impacto. No máximo 10 por função e 100 por execução. |
no_test_change | baixa | Um arquivo-fonte foi alterado e nenhum arquivo de teste no mesmo diretório ou com o mesmo radical de nome foi alterado. A cobertura existente não é medida. |
todo_added | baixa | Um marcador TODO, FIXME, HACK ou XXX foi adicionado. |
Análise de impacto
Com --impact (o padrão), lint e review constroem um índice estático do commit candidato na máquina host, a partir dos objetos Git commitados, sem executar código do repositório. Para cada função alterada, ele lista os pontos do código não alterado que a chamam e os testes existentes que a alcançam em até 3 chamadas, adiciona sinais impacted_caller de gravidade baixa e dá suporte às ferramentas find_references, inspect_symbol e find_callers do revisor.
| Linguagem | Como é indexada | Resolução |
|---|---|---|
| Go | Analisado e verificado quanto a tipos com a biblioteca padrão do Go, pacote por pacote, com as build constraints linux/amd64. Chamadas de interface são dispatch possível. | static, interface |
| TypeScript/JavaScript, Python, Rust | Varredura léxica: funções, métodos e testes são encontrados a partir dos tokens, e uma chamada é ligada pelo nome às declarações de mesmo nome da mesma linguagem, preferindo a classe do chamador, o módulo ou tipo qualificador e o mesmo arquivo. node_modules, dist, target, venv e diretórios semelhantes são ignorados. | name |
Toda resposta é aproximada: um chamador listado é um ponto a revisar, e a ausência de chamadores não prova que não exista nenhum. --impacted-tests executa apenas os testes Go que alcançam a função. Veja análise de impacto.
Linguagens
| Recurso | Go | TS/JS | Python | Rust |
|---|---|---|---|---|
| Sinais de risco e regras de enfraquecimento de testes | sensível à sintaxe | texto | texto | texto |
| Índice de impacto e ferramentas de símbolos do revisor | com verificação de tipos | léxico | léxico | léxico |
Verificações na sandbox e padrões do init | sim | sim | sim | sim |
| Testes gerados verificados | sim | sim (JSON do Jest/Vitest) | executados, não verificados pelo nome | sem comando padrão |
| Fuzzing diferencial | sim | sim | — | — |
Cobertura, mutação, --base-tests, --impacted-tests | sim | — | — | — |
Arquivo de política: .probe.json
A política decide quais comandos rodam, em qual imagem, com quais limites e se um provedor de IA é usado. Ela é lida do .probe.json na branch base ou de --config PATH. Quando não há nenhuma, aplicam-se os padrões embutidos da linguagem detectada. As chaves omitidas assumem os valores padrão mostrados abaixo.
O arquivo deve ser um único objeto JSON de no máximo 1 MiB. Chaves desconhecidas, nomes de comando desconhecidos e chaves duplicadas são rejeitados com saída 3, então um binário mais antigo rejeita uma chave que não conhece.
| Chave | Tipo | Padrão | Descrição |
|---|---|---|---|
version | inteiro | 1 | Versão do formato da política. Deve ser 1. |
language | string | detectada | Linguagem gravada pelo init. Informativo. |
fuzz, mutation, prepare v0.4 | objeto | ausente | Etapas opcionais de evidência: fuzzing diferencial, mutação das linhas adicionadas e preparação confiável de dependências. O init nunca as grava. |
{
"version": 1,
"language": "go",
"commands": {
"test": ["go", "test", "./..."],
"typecheck": ["go", "vet", "./..."],
"build": ["go", "build", "./..."],
"generated_test": ["go", "test", "{package}"],
"coverage": ["go", "test", "-covermode=count", "-coverprofile={coverage_out}", "./..."]
},
"sandbox": { "image": "golang:1.26-bookworm", "network": false, "timeout_seconds": 120,
"max_runtime_seconds": 600, "max_output_bytes": 65536, "memory_mb": 1024, "cpus": 2 },
"reviewer": { "endpoint": "https://api.openai.com/v1/chat/completions", "model": "",
"api_key_env": "PROBE_API_KEY", "max_iterations": 20, "max_generated_tests": 10,
"timeout_seconds": 600, "max_input_bytes": 131072 },
"sensitive_paths": ["**/auth/**", "**/payment*/**", "**/migrations/**", ".github/workflows/**", ".probe.json"]
}
commands
Cada comando é um array argv, não uma string de shell: ["npm", "test"], nunca "npm test". No máximo 128 argumentos; configure apenas as verificações que o seu projeto oferece.
| Chave | Placeholders | Descrição |
|---|---|---|
commands.test | — | Suíte de testes, executada pelo review. |
commands.typecheck | — | Verificação de tipos ou estática, por exemplo go vet ou tsc --noEmit. |
commands.build | — | Comando de build. |
commands.generated_test | {file}, {package}, {results_out} | Como os testes temporários do revisor de IA (e o --impacted-tests) são executados na base e na candidata. O padrão do Go usa o pacote do teste para poder exercitar código não exportado. Experimentos Go verificados precisam de um único placeholder de alvo independente; um comando Jest ou Vitest que grave um relatório JSON em {results_out} torna os experimentos TS/JS verificáveis pelo nome do teste. |
commands.coverage | {coverage_out} (exatamente uma vez) | Somente Go. Mede quais linhas adicionadas uma execução na sandbox executou. Roda por último, além do test, dentro de sandbox.max_runtime_seconds. Adicione -coverpkg=./... para atribuir a execução entre pacotes. |
sandbox
| Chave | Padrão | Permitido | Descrição |
|---|---|---|---|
sandbox.image | golang:1.26-bookworm | nome da imagem | Imagem pré-carregada com o toolchain e as dependências. O Probe nunca a baixa; fixe-a por digest se puder. |
sandbox.network | false | booleano | Permitir rede nos contêineres. Também exige --allow-network na linha de comando. |
sandbox.timeout_seconds | 120 | 1–3600 | Tempo limite de cada comando. |
sandbox.max_runtime_seconds | 600 | 1–7200 | Tempo total de sandbox da execução, compartilhado entre verificações e experimentos. |
sandbox.max_output_bytes | 65536 | 1024–4194304 | Saída capturada mantida por comando. |
sandbox.memory_mb | 1024 | 128–32768 | Limite de memória de cada contêiner, em MiB. |
sandbox.cpus | 2 | 1–32 | Limite de CPU de cada contêiner. |
reviewer
| Chave | Padrão | Permitido | Descrição |
|---|---|---|---|
reviewer.model | "" | ID do modelo | Modelo com suporte a ferramentas. Vazio desativa o revisor. Substituído por PROBE_REVIEWER_MODEL. |
reviewer.endpoint | https://api.openai.com/v1/chat/completions | URL | Endpoint de Chat Completions com function calling; uma URL base /v1 também funciona. HTTPS, ou HTTP somente em loopback. Sem credenciais, query ou fragmento; redirecionamentos são recusados. |
reviewer.api_key_env | PROBE_API_KEY | nome da variável | Variável de ambiente que contém a chave; <NAME>_FILE e /run/secrets/<NAME> vêm em seguida. Vazio para um provedor que não precisa de chave. |
reviewer.max_iterations | 20 | 1–100 | Turnos do modelo por investigação. --max-iterations substitui este valor. |
reviewer.max_generated_tests | 10 | 0–100 | Testes temporários que o revisor pode criar. |
reviewer.timeout_seconds | 600 | 1–1800 | Tempo total da investigação. |
reviewer.max_input_bytes | 131072 | 4096–2097152 | Limite do contexto de código-fonte enviado ao provedor. |
sensitive_paths
Globs de caminhos que sempre geram um sinal sensitive_path de gravidade alta quando alterados. Os caminhos são relativos à raiz do repositório, com barras normais; * corresponde dentro de um segmento do caminho e ** atravessa segmentos. Caminhos absolutos, barras invertidas e .. são rejeitados.
| Glob padrão | Cobre |
|---|---|
**/auth/** | Qualquer diretório auth. |
**/payment*/** | Diretórios payment, payments e semelhantes. |
**/migrations/** | Migrações de banco de dados. |
.github/workflows/** | Workflows de CI. |
.probe.json | A própria política. |
fuzz v0.4
Passa as mesmas entradas geradas a partir de uma seed por cada função Go de nível de pacote alterada e cada função TS/JS exportada alterada (com assinatura inalterada), na baseline e na candidata, e compara o que as duas revisões registraram. Uma função diverged é uma observação, nunca um defeito: ela pede revisão (saída 2 com --ci) e nunca produz saída 1. {} a ativa com os padrões.
| Chave | Padrão | Permitido |
|---|---|---|
fuzz.max_functions | 8 | 1–32 funções por review |
fuzz.max_packages | 4 | 1–16 pacotes Go e módulos TS/JS |
fuzz.max_inputs | 64 | 1–256 entradas por função |
fuzz.call_timeout_ms | 1000 | 10–10000, no máximo o timeout do comando |
fuzz.max_runtime_seconds | 240 | 1–7200, dentro de sandbox.max_runtime_seconds |
mutation v0.4
Faz pequenas mudanças determinísticas nas linhas adicionadas de arquivos Go alterados que não são de teste e executa os testes do pacote uma vez por mutante. Um mutante que nenhum teste percebe vira um sinal surviving_mutant de gravidade média; nenhuma pontuação é calculada. As quatro chaves são obrigatórias.
"mutation": {
"command": ["go", "test", "-json", "-count=1", "-failfast", "{package}"],
"max_mutants": 20, "timeout_seconds": 60, "max_runtime_seconds": 300
}
| Chave | Permitido |
|---|---|
mutation.command | go test com exatamente um -json e um {package} independente; flags que mudam os testes selecionados ou o binário (-run, -exec, -o…) são recusadas. |
mutation.max_mutants | 1–200. |
mutation.timeout_seconds | De 1 a sandbox.timeout_seconds, por execução. |
mutation.max_runtime_seconds | De timeout_seconds a sandbox.max_runtime_seconds, dentro do orçamento compartilhado. |
prepare v0.4
Permite que a política confiável da branch base construa a camada de dependências: antes de qualquer código candidato rodar, o comando dela roda uma vez, em um único contêiner com limites, sobre os arquivos de dependências exportados do commit base, e o contêiner vira a imagem local de todas as verificações. Um review posterior com a mesma base e as mesmas entradas a reutiliza. Quando nenhuma imagem é produzida, o review sai com 4; ele nunca recorre à imagem não preparada.
"prepare": { "command": ["go", "mod", "download"], "inputs": ["go.mod", "go.sum"], "network": true }
| Chave | Padrão | Descrição |
|---|---|---|
prepare.command | obrigatório | Argv de 1 a 128 argumentos; nenhum placeholder é substituído. |
prepare.inputs | obrigatório | De 1 a 64 padrões relativos ao repositório (* nunca atravessa /, sem **). |
prepare.network | false | Rede para o contêiner de build, somente com --allow-prepare-network e sem --no-network. |
prepare.user | "sandbox" | "sandbox" (a identidade das verificações) ou "root". |
prepare.timeout_seconds | 600 | 1–3600. |
prepare.env | nenhum | Até 32 variáveis gravadas na imagem derivada; nomes que mudariam o que as verificações executam (GOFLAGS, NODE_OPTIONS, LD_PRELOAD, PROBE_*…) são recusados. |
prepare.max_added_mb | 4096 | 1–65536 MiB que a imagem derivada pode acrescentar. |
Padrões por linguagem
Gravados pelo probe init e usados quando a branch base não tem política. As imagens padrão de Node.js, Python e Rust não contêm as suas dependências: construa uma imagem que as contenha, ou adicione um objeto prepare, e adapte os comandos.
| Linguagem | Imagem | Comandos |
|---|---|---|
go | golang:1.26-bookworm | test go test ./... · typecheck go vet ./... · build go build ./... · generated_test go test {package} · coverage go test -covermode=count -coverprofile={coverage_out} ./... |
typescript, javascript | node:22-bookworm | test npm test · build npm run build · generated_test npx --no vitest run {file} --reporter=json --outputFile={results_out} |
python | python:3.13-bookworm | test python -m unittest discover · generated_test python -m unittest {file} |
rust | rust:1-bookworm | test cargo test --workspace --offline · typecheck cargo check --workspace --all-targets --offline · build cargo build --workspace --offline · sem generated_test |
unknown | golang:1.26-bookworm | Nenhum comando: o review não roda nenhuma verificação até você adicioná-las. |
Revisor de IA
Opcional. Quando um modelo está configurado, o review permite que ele investigue a mudança com ferramentas limitadas: ler arquivos e diffs com dados ocultados, pesquisar o código-fonte, consultar referências e chamadores no índice estático, executar as verificações existentes e criar e executar testes temporários na base e na candidata. Ele não tem shell nem acesso a URLs. As afirmações dele continuam sendo hipóteses até que um teste reproduza uma diferença.
{
"reviewer": {
"endpoint": "https://your-provider.example/v1",
"model": "your-tool-capable-model",
"api_key_env": "PROBE_API_KEY"
}
}
export PROBE_API_KEY=… # from your shell or CI secret store
probe review --base main --config .probe.json # try it before committing
probe review --base main --reviewer=false # turn it off for one run
- Somente a política confiável,
--configou o ambiente de implantação podem ativar o revisor; um pull request não pode. - Um contexto de código-fonte limitado e com dados ocultados é enviado ao provedor. O mascaramento de segredos é feito na base do melhor esforço; use um provedor local (por exemplo
http://127.0.0.1:1234/v1) se o código-fonte precisar ficar local. - As chaves de API nunca entram nos contêineres de teste. O
lintnunca chama um provedor. - Falhas do provedor e orçamentos esgotados preservam os resultados determinísticos e marcam a investigação como incompleta; com
--ci, isso exige revisão humana.
Nada na referência corresponde a este filtro.