Riferimento

Riferimento della riga di comando

Ogni comando, flag, codice di uscita, variabile d'ambiente, chiave di policy e segnale di rischio dell'attuale Probe (ultima release: v0.5.1). Le voci contrassegnate con v0.4 fanno terminare un binario precedente alla v0.4.0 con uscita 3; consulta l'ordine delle release prima di fissarne una in CI. Premi / per cercare.

Questa pagina riguarda Probe per il codice, lo strumento da riga di comando. Devi sorvegliare file Word, Excel o PowerPoint? Vedi Probe Desktop.

Sintassi

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 analizza una modifica staticamente. Non esegue mai il codice del repository e non chiama mai un provider di IA.
  • review aggiunge controlli in sandbox su Docker, le fasi di evidenza facoltative (test della baseline modificati, test impattati, fuzzing differenziale, mutation testing, preparazione delle dipendenze) e, quando è configurato un modello, un'indagine dell'IA.
  • plan chiede al provider configurato un piano di implementazione prima che venga scritto codice, lo valuta con regole fisse e lo trasforma in un contratto rispetto al quale lint --plan e review --plan verificano il diff.
  • Vengono analizzati solo i file committati; le modifiche non committate e i file non tracciati vengono ignorati.
  • Per impostazione predefinita i report vengono scritti in .probe/ nel repository. L'output della console resta breve.
  • I flag accettano uno o due trattini (-ci o --ci). I booleani si attivano con --ci o --ci=true e si disattivano con --checks=false. Un valore si passa come --base main o --base=main.
  • Esegui probe <command> --help per vedere i flag di un comando.

Scelta delle revisioni

Entrambi i lati di un confronto vengono risolti in ID di commit immutabili, registrati nel report. Rinomine, eliminazioni, file binari e cambi di tipo di file sono gestiti.

FormaConfronta
--base main (predefinito)Dal merge base di main e --head fino a --head, come una pull request. I commit aggiunti a main dopo il punto di diramazione non fanno parte della modifica.
--base main --exactDalla punta di main direttamente a --head.
BASE..HEADI due commit esatti, per esempio HEAD~1..HEAD per rivedere l'ultimo commit. Ha la precedenza su --base, --head e --exact.
BASE...HEADDal merge base delle due revisioni fino a HEAD.

Un intervallo può comparire prima o dopo i flag: probe review main..HEAD --ci e probe review --ci main..HEAD sono equivalenti. È accettato al massimo un intervallo. Funziona qualsiasi revisione che Git comprende: branch, tag, origin/main, HEAD~3 o un ID di commit. I job di CI hanno bisogno di una cronologia sufficiente per risolvere la base (per esempio fetch-depth: 0).

La policy attendibile viene sempre letta dal branch di base, mai dalla modifica in revisione, così una pull request non può allentare le proprie regole.

probe lint

Analisi statica di una modifica: confronto Git, segnali di rischio e un report. Niente Docker, nessuna chiamata a provider, nessuna esecuzione del codice del repository. Sicuro da eseguire su branch non attendibili.

FlagPredefinitoDescrizione
--base REVmainBranch o revisione di base. Il confronto parte dal suo merge base con --head; la sua punta fornisce la policy attendibile.
--head REVHEADRevisione candidata in revisione.
--exactfalseConfronta la revisione di base stessa invece del merge base.
BASE..HEAD—Intervallo posizionale; vedi Scelta delle revisioni.
--repo PATH.Directory del repository. Va bene qualsiasi directory all'interno del work tree.
--config PATHpolicy della baseUsa questo file di policy locale invece di .probe.json del branch di base. Passa solo un file di cui ti fidi.
--out DIR.probeDirectory dei report, relativa alla radice del repository. Il percorso non può contenere link simbolici.
--format LISTmarkdown,jsonFormati di report da scrivere, separati da virgole: markdown, json, sarif v0.4, pr-comment v0.4. Vedi File di output.
--report-url URL v0.4—Un link https al report completo, citato in PR_COMMENT.md. Richiede il formato pr-comment; un URL che sembra contenere una credenziale viene rifiutato con uscita 3.
--impacttrueCostruisce l'indice d'impatto statico delle funzioni modificate. --impact=false lo salta.
--plan PATH—Un PLAN.json scritto da probe plan: verifica il diff rispetto al suo contratto e aggiunge una sezione e dei segnali plan_drift.
--cifalseTermina con codice 2 quando è necessaria una revisione umana. Vedi Codici di uscita.
--intent TEXT—Intento della pull request o criteri di accettazione, registrati nel report (al massimo 64 KiB).
--intent-file PATH—Legge l'intento da un file UTF-8. Non può essere combinato con --intent.
--checks, --reviewerfalseDeve restare false: lint termina con codice 3 se uno dei due è attivo. Usa review. I flag delle fasi riservate a review (--base-tests, --impacted-tests, --fuzz, --cache-dir, --parallel, --deadline, --allow-prepare-network) vengono rifiutati allo stesso modo.
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

Tutto ciò che fa lint, più i comandi test, typecheck, build e coverage della policy in container Docker usa e getta, più un'indagine dell'IA quando è configurato un modello. Richiede Docker con container Linux e una sandbox.image precaricata.

FlagPredefinitoDescrizione
--base REVmainBranch o revisione di base. Il confronto parte dal suo merge base con --head; la sua punta fornisce la policy attendibile.
--head REVHEADRevisione candidata in revisione.
--exactfalseConfronta la revisione di base stessa invece del merge base.
BASE..HEAD—Intervallo posizionale; vedi Scelta delle revisioni.
--repo PATH.Directory del repository.
--config PATHpolicy della baseUsa questo file di policy locale invece di .probe.json del branch di base, per esempio per provare una policy prima di committarla. Passa solo un file di cui ti fidi: decide cosa viene eseguito e dove viene inviato il codice sorgente.
--out DIR.probeDirectory dei report, relativa alla radice del repository. Gli artefatti vanno in DIR/artifacts/.
--format LISTmarkdown,jsonFormati di report da scrivere, separati da virgole: markdown, json, sarif v0.4, pr-comment v0.4.
--report-url URL v0.4—Un link https al report completo, citato in PR_COMMENT.md. Richiede il formato pr-comment.
--cifalseTermina con codice 2 quando è necessaria una revisione umana, inclusi segnali ad alto rischio, aree non verificate o controlli incompleti.
--checkstrueEsegue i controlli configurati nella sandbox. --checks=false li salta; un revisore configurato può comunque eseguire esperimenti nella sandbox.
--reviewerautoIndagine dell'IA. Si attiva automaticamente quando un modello è impostato nella policy attendibile o in PROBE_REVIEWER_MODEL. --reviewer=false disattiva ogni chiamata ai provider; --reviewer fallisce con uscita 3 se nessun modello è configurato.
--max-iterations Npolicy (20)Sostituisce reviewer.max_iterations per questa esecuzione, da 1 a 100.
--intent TEXT—Intento della pull request o criteri di accettazione (al massimo 64 KiB). Registrati nel report e forniti al revisore.
--intent-file PATH—Legge l'intento da un file UTF-8. Non può essere combinato con --intent.
--allow-networkfalseConcede ai container della sandbox l'accesso alla rete. Ha effetto solo se anche la policy attendibile imposta sandbox.network: true.
--no-networkfalseForza la disattivazione della rete nella sandbox. Non riguarda le chiamate API del revisore; per quelle aggiungi --reviewer=false.
--plan PATH—Verifica il diff rispetto al contratto di un PLAN.json. Una modifica che devia richiede una revisione umana (uscita 2 con --ci), mai l'uscita 1.
--impacttrueCostruisce l'indice d'impatto statico delle funzioni modificate. --impact=false lo salta (e non può essere combinato con --impacted-tests).
--impacted-tests v0.4falseEsegue, sulla baseline e sulla candidata, i test Go non modificati che l'indice d'impatto indica come in grado di raggiungere una funzione modificata. Un test che passa sulla base e fallisce sulla candidata è FAILS_ON_CANDIDATE: un motivo di revisione, non un difetto.
--base-tests v0.4falseEsegue la versione della baseline di ogni funzione di test Go che la modifica ha modificato o rimosso, sul codice della baseline e della candidata.
--fuzz v0.4trueEsegue il fuzzing differenziale configurato dall'oggetto fuzz della policy. --fuzz=false registra la fase come disattivata.
--cache-dir DIR v0.4—Cache facoltativa delle esecuzioni della baseline, fuori dal repository e dalla directory di output. Un'esecuzione della baseline riprodotta dalla cache non supporta mai un risultato positivo.
--parallel N v0.41Esegue i controlli iniziali N alla volta, da 1 a 4.
--deadline D v0.4—Limite di tempo complessivo dell'esecuzione, da 1m a 24h; 30 secondi sono riservati alla pulizia e al report.
--allow-prepare-network v0.4falseConcede l'accesso alla rete al container prepare, solo se anche prepare.network della policy lo abilita. I controlli restano 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"

La preparazione delle dipendenze viene eseguita per prima, quando la policy ha un oggetto prepare. Poi i controlli vengono eseguiti nell'ordine test, typecheck, build, quindi coverage, seguiti dalle fasi di evidenza e dal revisore. Ogni container è non-root, ha una root e un mount del codice sorgente in sola lettura, nessuna capability aggiuntiva, nessuna rete per impostazione predefinita e i limiti di CPU, memoria, PID e tempo della policy della sandbox. Il socket Docker, il tuo checkout di lavoro e le chiavi API non vengono mai montati. Se Docker o l'immagine mancano, l'esecuzione termina con uscita 4; non si ripiega mai sul tuo host.

probe plan

Prima che la modifica venga scritta: il provider configurato simula, in sola lettura, come implementerebbe un intento al commit di base e presenta un piano strutturato (file, simboli, dipendenze, passaggi). Probe lo valuta con regole fisse e scrive PLAN.json e PLAN.md. Il modello produce il piano; non ne giudica mai il rischio. Nulla viene modificato o eseguito.

FlagPredefinitoDescrizione
--intent-file PATH, --intent TEXT—La modifica da pianificare. Obbligatoria; al massimo 64 KiB di UTF-8, letta come l'intento della review.
--base REVmainLa revisione da cui parte il piano. La sua punta fornisce la policy attendibile.
--config PATHpolicy della basePolicy locale attendibile esplicita.
--out DIR.probeDirectory di output, relativa al repository.
--cifalseUscita 2 quando una categoria viene segnalata o qualcosa è rimasto non verificato.
--max-iterations NpolicySostituisce il budget di iterazioni del provider, da 1 a 100.
--reviewertrueUn provider è obbligatorio: senza un modello configurato, o con --reviewer=false, plan termina con uscita 3 e non scrive nulla.

Gli strumenti del pianificatore sono in sola lettura e lavorano su uno snapshot del commit di base: list_files, read_file, search_code e, basati sull'indice, find_references, inspect_symbol e find_callers, poi submit_plan una sola volta. La valutazione segnala quattro categorie basandosi solo sul piano e sul commit di base:

CategoriaSegnali
Parti criticheplan_critical_path (un percorso pianificato corrisponde a sensitive_paths), plan_sensitive_symbol (un nome legato ad autenticazione, autorizzazione o pagamento).
Architetturaplan_exported_signature, plan_dependency_change, plan_new_package.
Rischio di regressioneplan_wide_impact (10 o più chiamanti), plan_untested_impact (chiamanti e nessun test che li raggiunga), misurati sull'indice statico del commit di base.
Altra modifica rilevanteplan_file_deletion, plan_large_scope (20 o più file), plan_inconsistent, plan_unmeasured.

Codici di uscita: 0; 2 con --ci quando una categoria viene segnalata; 3 uso o configurazione; 4 errore del provider o nessun piano accettato.

Deriva dall'ambito: --plan

lint --plan e review --plan leggono il contratto del piano e lo confrontano con il diff reale. Ogni differenza nel diff diventa anche un segnale plan_drift. La sezione è drifted quando una voce è di livello medio o superiore.

VoceGravitàQuando
unplanned_filemediaUn file modificato che il piano non elenca (unplanned_test_file, bassa, per un file di test).
unannounced_exported_changealtaUna dichiarazione Go esportata modificata o rimossa senza essere annunciata come signature o remove.
unannounced_critical_pathaltaUn percorso modificato corrisponde a un glob critico della policy di questa review e il piano non lo elencava.
unannounced_dependency_changemediaUn manifest delle dipendenze è cambiato senza essere dichiarato.
planned_file_untouchedbassaUn file pianificato che la modifica non tocca (solo sezione).
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

Il plan gate

review --plan si conclude con una decisione, plan_drift.decision, stampata su stdout e in cima alla sezione Plan Conformance. Con --ci, è il codice di uscita.

DecisioneQuando
no_human_review_required (uscita 0)Tutte queste condizioni: il piano, rivalutato dalla review a partire dalla sua proposta al suo commit di base con la policy attendibile di questa review, non segnala alcuna categoria e non ha lacune di misurazione; la modifica è conforme al piano e alla sua base; almeno un controllo è stato eseguito e tutti sono passati; nessun problema riprodotto, nessun segnale alto o critico, nessuna area non verificata né altra sezione che richieda una revisione.
human_review_required (uscita 2)Tutto il resto. Ogni motivo è elencato in plan_drift.decision_reasons. lint --plan non esegue alcun controllo, quindi richiede sempre una revisione.

I flag e il contratto memorizzati in PLAN.json non sono mai considerati attendibili: il contratto viene ricavato di nuovo dalla proposta, così un piano modificato non può ampliare l'ambito senza essere valutato, e probe report ricalcola la decisione dal report registrato. Il gate è una decisione di processo, non un verdetto di correttezza. Un piano che non segnala nulla non prova che la modifica sia sicura, e la verifica della deriva non controlla che la modifica implementi l'intento. Vedi i piani preliminari alla modifica e la ricetta per la CI.

probe init

Scrive un .probe.json iniziale per il progetto. Si rifiuta di sovrascrivere un file esistente. Rivedi i comandi e l'immagine, poi committa il file sul tuo branch di base.

FlagPredefinitoDescrizione
--repo PATH.Directory in cui creare .probe.json.
--language NAMErilevatogo, typescript, javascript, python, rust o unknown. Rilevato da go.mod/go.work, Cargo.toml, tsconfig.json, package.json, poi pyproject.toml/setup.py/requirements.txt. Seleziona i valori predefiniti.

probe report

Rigenera un report JSON salvato, per esempio per riprodurre il Markdown o produrre SARIF in CI. Nulla viene rieseguito, e la rigenerazione non autentica le prove che contiene; ogni stato viene ricavato di nuovo dai controlli registrati, così un report modificato viene corretto anziché considerato attendibile.

FlagPredefinitoDescrizione
--input PATH.probe/confidence-report.jsonReport JSON salvato (versione 1, al massimo 64 MiB).
--out DIR.probeDirectory di output, relativa alla directory corrente.
--format LISTmarkdown,jsonFormati da scrivere, separati da virgole: markdown, json, sarif v0.4, pr-comment v0.4.
--report-url URL v0.4—Un link https al report completo, citato in PR_COMMENT.md.

probe version e aiuto

ComandoStampa
probe version, --versionLa versione, per esempio probe v0.5.1, e l'avviso di licenza.
probe help, -h, --helpLa sintassi. Senza argomenti, Probe stampa lo stesso testo.
probe <command> --helpI flag di un comando, con i relativi valori predefiniti.

Codici di uscita

CodiceSignificato
0Report completato senza problemi alti o critici riprodotti. Senza --ci, le aree non risolte non cambiano questo codice.
1Un'ipotesi alta o critica è supportata da un fallimento differenziale: un test generato è passato sulla base ed è fallito sulla candidata. Nient'altro produce 1: né una divergenza del fuzzing, né un mutante sopravvissuto, né un test impattato o della baseline che fallisce, né una deriva dal piano.
2Solo con --ci: revisione umana necessaria, inclusi segnali ad alto rischio, aree non verificate, controlli incompleti, un test FAILS_ON_CANDIDATE, una divergenza del fuzzing o una fase inconcludente, una deriva dal piano, un piano che ha segnalato una categoria (il plan gate), oppure (per plan) una categoria segnalata.
3Argomenti non validi, confronto Git o configurazione attendibile (inclusi una chiave di policy o un nome di comando sconosciuti).
4Errore operativo nell'harness, nell'analisi o nella scrittura del report, per esempio Docker o l'immagine della sandbox non disponibili, un controllo che non è stato possibile eseguire, una preparazione delle dipendenze fallita o un errore del provider durante plan.

Nessun codice significa "approvato". Uno 0 dice che non è stato riprodotto nulla, non che la modifica è corretta.

Variabili d'ambiente

Il provider di IA appartiene al deployment e non al repository, quindi queste impostazioni possono provenire dall'ambiente. Nient'altro può: immagine, comandi, budget e percorsi sensibili sono sempre decisi dalla policy attendibile.

VariabileEffetto
PROBE_REVIEWER_ENDPOINTSostituisce reviewer.endpoint. Stesse regole sugli URL della policy.
PROBE_REVIEWER_MODELSostituisce reviewer.model e, da sola, attiva il revisore durante review.
PROBE_API_KEYChiave API. Il nome è impostato da reviewer.api_key_env; questo è il predefinito.
PROBE_API_KEY_FILEPercorso di un file contenente la chiave, usato quando la variabile precedente non è impostata. Il file deve essere leggibile, altrimenti l'esecuzione fallisce con uscita 3.
/run/secrets/PROBE_API_KEYSecret Docker letto per ultimo, quando nessuna delle due variabili è impostata. La sua assenza non è un errore.

Una variabile vuota conta come non impostata. I file delle chiavi vengono letti per intero eliminando gli spazi iniziali e finali, sono limitati a 8 KiB e devono contenere una sola riga. Quando il revisore viene eseguito, il log indica da dove proviene ogni valore, mai il valore stesso. Chi controlla questo ambiente sceglie dove viene inviato il codice sorgente oscurato: tienilo fuori dai job che eseguono codice non attendibile proveniente da fork.

File di output

PercorsoContenuto
.probe/CONFIDENCE_REPORT.mdIl report da leggere: riepilogo della modifica, controlli automatici, riepilogo dell'indagine, problemi riprodotti, aree non verificate, revisione umana suggerita, superficie di revisione, esecuzione delle righe modificate, prove registrate e artefatti.
.probe/confidence-report.jsonGli stessi dati per gli strumenti: ID di commit, righe modificate, segnali, controlli, ipotesi, prove, eventi di audit e hash degli artefatti. Vedi lo schema JSON.
.probe/confidence-report.sarif v0.4Con --format sarif: un log SARIF 2.1.0 per gli strumenti di code scanning, contenente solo le segnalazioni supportate da prove registrate nella sandbox. Nessuna segnalazione non equivale ad approvazione.
.probe/PR_COMMENT.md v0.4Con --format pr-comment: un commento per la pull request con un blocco di stato e ogni segnalazione supportata da prove.
.probe/PLAN.json, PLAN.mdScritto da probe plan: la proposta scritta dal modello, la valutazione deterministica e il contratto (schema).
.probe/artifacts/Log dei controlli, profili di coverage, sorgenti dei test generati, risultati dei test, patch dei mutanti e registrazioni del fuzzing, ognuno referenziato dal suo hash SHA-256 nel report.

Aggiungi .probe/ a .gitignore. La console stampa un unico riepilogo: file e righe modificati, numero di segnali e di problemi riprodotti, la superficie di revisione mirata e l'esecuzione delle righe modificate.

Segnali di rischio

I segnali sono motivi per guardare, non difetti confermati. I file Go ricevono un'analisi basata sulla sintassi; TypeScript/JavaScript, Python, Rust e gli altri linguaggi usano euristiche testuali etichettate. I segnali sulle stesse righe vengono uniti in un unico intervallo di revisione nel report. I segnali a livello di file (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) riguardano il file, non una riga: il report li elenca sotto il file come intero file, e il JSON li contrassegna con "scope": "file". La loro line serve solo a collocarli sulla prima riga modificata del file.

TipoGravitàSollevato quando
sensitive_pathaltaUn percorso modificato corrisponde a un glob di sensitive_paths.
private_keycriticaUna riga aggiunta inizia un blocco di chiave privata PEM (RSA, DSA, EC, OpenSSH, PGP, cifrata) o una chiave PuTTY. La chiave non viene mai copiata nel report.
hardcoded_secretaltaUna riga aggiunta contiene una forma di credenziale (chiavi AWS, GitHub, GitLab, Slack, Stripe, Google, provider di LLM, npm, Twilio/SendGrid, Azure Storage, JWT) oppure assegna un letterale tra virgolette di 8 o più caratteri con una cifra o un simbolo a una chiave dal nome segreto (password, api_key, token, client_secret…). Segnaposto, template e letture da variabili d'ambiente o vault vengono ignorati; il valore viene mascherato nelle prove.
credential_in_urlaltaUn URL aggiunto contiene user:password@ o un parametro di query dal nome segreto (api_key=, token=, password=…).
tls_verification_disabledaltaInsecureSkipVerify: true, verify=False, rejectUnauthorized: false, NODE_TLS_REJECT_UNAUTHORIZED=0, curl -k, sslmode=disable, minimi TLS 1.0/1.1 e simili.
excessive_permissionsaltaPermessi scrivibili da tutti (chmod 777, 0666 nelle API dei file), container privilegiati, escalation dei privilegi, runAsUser: 0, USER root, PID o rete dell'host, SYS_ADMIN, un socket Docker montato, NOPASSWD: ALL.
protection_disabledaltaCSRF disattivato o con eccezioni, origini CORS jolly, cookie non sicuri, autoescaping dei template disattivato, algoritmo JWT none o firme non verificate, SELinux, firewall, seccomp o AppArmor disattivati, bucket pubblici o ingress 0.0.0.0/0, permissions: write-all nei workflow.
debug_enabledmediaDEBUG = True, debug: true, app.run(debug=True), FLASK_DEBUG=1, gin.DebugMode e simili.
hardcoded_email, hardcoded_ipbassaUn indirizzo e-mail aggiunto, o un indirizzo IPv4 all'interno di una stringa o di un URL, fuori da test e documentazione. Gli intervalli di documentazione, loopback e di esempio vengono ignorati.
auth_changealtaUna funzione Go il cui nome suggerisce autenticazione o autorizzazione ha il corpo modificato, oppure una riga modificata menziona autorizzazione, autenticazione, JWT, bcrypt, argon2, CSRF o CORS.
sensitive_function_changealtaUna funzione Go il cui nome suggerisce pagamenti (payment, refund, charge, capture, withdraw, deposit, balance…) ha il corpo modificato.
validation_removedaltaUna riga rimossa chiamava una funzione di validazione, asserzione o sanificazione, oppure sollevava un errore di validazione.
public_api_changealta mediaGo: una dichiarazione esportata è stata rimossa o modificata (alta) o aggiunta (media). Altri linguaggi: una riga sembra una dichiarazione pubblica (media).
database_writealtaUna riga modificata sembra una modifica ai dati del database o una transazione (INSERT, UPDATE … SET, .Exec(, .Commit(…).
dynamic_executionaltaeval, esecuzione di processi, subprocess, child_process, innerHTML e simili.
type_suppressionaltaSoppressione di controlli di tipo o di lint come @ts-ignore, as any, unsafe, nolint, eslint-disable.
migration_changealtaÈ cambiato un percorso contenente migration o che termina con .sql.
infrastructure_changealtaÈ cambiato un workflow GitHub, un Dockerfile o un file Terraform.
file_type_changealtaGit segnala un cambio di tipo, per esempio un file che diventa un link simbolico.
network_changemediaUna riga modificata effettua chiamate HTTP, gRPC o socket, oppure contiene un URL.
error_handling_changemediaSono cambiati controlli degli errori, wrapping, panic/recover, catch o except.
dependency_changemediaÈ cambiato un manifest delle dipendenze o un lockfile (go.mod, package.json, Cargo.lock, pyproject.toml…).
uncovered_changemedia bassaLe righe Go aggiunte non sono state eseguite dall'esecuzione di coverage registrata. Bassa quando l'esecuzione della coverage stessa è fallita.
branch_growthmediaIn un file sono state aggiunte almeno cinque righe con costrutti di diramazione in più rispetto a quelle rimosse. Non è una metrica di complessità.
large_changemediaPiù di 400 righe modificate in un solo file.
file_deletedmediaUn file tracciato è stato rimosso.
binary_changemediaUn file binario è cambiato e non può essere analizzato come testo.
analysis_limitedmediaL'analisi delle dichiarazioni Go non è stata completata per un file, per esempio perché non si riesce a interpretarlo, oppure l'indice d'impatto era limitato o non disponibile per le funzioni modificate (simbolo impact_index).
test_focus_added v0.4altaÈ stato aggiunto un marcatore di focus a un file di test (it.only, fdescribe…).
test_assertion_removed, test_case_removed v0.4mediaUn file di test ha perso più righe di asserzione, o più dichiarazioni di test, di quante ne abbia guadagnate. Regole per Go, TS/JS, Python e Rust.
test_skip_added, test_expectation_relaxed v0.4mediaÈ stato aggiunto un marcatore di skip (t.Skip, it.skip, @pytest.mark.skip, #[ignore]…), oppure in un hunk aspettative esatte sono state sostituite da altre più permissive.
surviving_mutant v0.4mediaUna mutazione di una riga Go aggiunta non ha fatto fallire alcun test del suo package. Il mutante potrebbe essere equivalente.
prepare_input_changed v0.4mediaLa modifica tocca un file elencato in prepare.inputs della policy; il livello delle dipendenze è stato comunque costruito dal commit di base.
plan_driftalta media bassaCon --plan: il diff esce dal contratto del piano. Vedi deriva dall'ambito.
impacted_callerbassaCodice non modificato chiama una funzione modificata, secondo l'indice d'impatto. Al massimo 10 per funzione e 100 per esecuzione.
no_test_changebassaUn file sorgente è cambiato e nessun file di test nella stessa directory o con la stessa radice del nome è cambiato. La coverage esistente non viene misurata.
todo_addedbassaÈ stato aggiunto un marcatore TODO, FIXME, HACK o XXX.

Analisi d'impatto

Con --impact (il predefinito), lint e review costruiscono sull'host un indice statico del commit candidato, a partire dagli oggetti Git committati, senza eseguire codice del repository. Per ogni funzione modificata elenca i punti del codice non modificato che la chiamano e i test esistenti che la raggiungono entro 3 chiamate, aggiunge segnali impacted_caller di livello basso e alimenta gli strumenti find_references, inspect_symbol e find_callers del revisore.

LinguaggioCome viene indicizzatoRisoluzione
GoAnalizzato e sottoposto a type-checking con la libreria standard di Go, package per package, con i vincoli di build linux/amd64. Le chiamate tramite interfaccia sono dispatch possibili.static, interface
TypeScript/JavaScript, Python, RustScansione lessicale: funzioni, metodi e test vengono individuati dai token, e una chiamata viene collegata per nome alle dichiarazioni omonime dello stesso linguaggio, preferendo la classe del chiamante, il modulo o tipo qualificante e lo stesso file. node_modules, dist, target, venv e directory simili vengono saltate.name

Ogni risposta è approssimativa: un chiamante elencato è un punto da rivedere, e l'assenza di un chiamante non prova che non ne esistano. --impacted-tests esegue solo i test Go che raggiungono la funzione. Vedi analisi d'impatto.

Linguaggi

FunzionalitàGoTS/JSPythonRust
Segnali di rischio e regole sull'indebolimento dei testbasata sulla sintassitestualetestualetestuale
Indice d'impatto e strumenti sui simboli del revisorecon type-checkinglessicalelessicalelessicale
Controlli in sandbox e valori predefiniti di initsìsìsìsì
Test generati verificatisìsì (JSON di Jest/Vitest)eseguiti, non verificati per nomenessun comando predefinito
Fuzzing differenzialesìsì——
Coverage, mutation, --base-tests, --impacted-testssì———

File di policy: .probe.json

La policy decide quali comandi vengono eseguiti, in quale immagine, con quali limiti, e se viene usato un provider di IA. Viene letta da .probe.json sul branch di base, oppure da --config PATH. In sua assenza si applicano i valori predefiniti integrati per il linguaggio rilevato. Le chiavi che ometti assumono i valori predefiniti indicati qui sotto.

Il file deve essere un unico oggetto JSON di al massimo 1 MiB. Chiavi sconosciute, nomi di comando sconosciuti e chiavi duplicate vengono rifiutati con uscita 3, così un binario più vecchio rifiuta una chiave che non conosce.

ChiaveTipoPredefinitoDescrizione
versionintero1Versione del formato della policy. Deve essere 1.
languagestringarilevatoLinguaggio scritto da init. Informativo.
fuzz, mutation, prepare v0.4oggettoassenteFasi di evidenza facoltative: fuzzing differenziale, mutazione delle righe aggiunte e preparazione attendibile delle dipendenze. init non le scrive mai.
{
  "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

Ogni comando è un array argv, non una stringa di shell: ["npm", "test"], mai "npm test". Al massimo 128 argomenti; configura solo i controlli che il tuo progetto prevede.

ChiaveSegnapostoDescrizione
commands.test—Suite di test, eseguita da review.
commands.typecheck—Controllo di tipo o statico, per esempio go vet o tsc --noEmit.
commands.build—Comando di build.
commands.generated_test{file}, {package}, {results_out}Come vengono eseguiti sulla base e sulla candidata i test temporanei del revisore IA (e --impacted-tests). Il predefinito per Go usa il package del test, così può esercitare codice non esportato. Gli esperimenti Go verificati richiedono un unico segnaposto di target autonomo; un comando Jest o Vitest che scrive un report JSON in {results_out} rende gli esperimenti TS/JS verificabili per nome del test.
commands.coverage{coverage_out} (esattamente una volta)Solo Go. Misura quali righe aggiunte sono state eseguite da un'esecuzione nella sandbox. Viene eseguito per ultimo, in aggiunta a test, entro sandbox.max_runtime_seconds. Aggiungi -coverpkg=./... per attribuire l'esecuzione tra i package.

sandbox

ChiavePredefinitoConsentitiDescrizione
sandbox.imagegolang:1.26-bookwormnome dell'immagineImmagine precaricata con la toolchain e le dipendenze. Probe non la scarica mai; se puoi, fissala tramite digest.
sandbox.networkfalsebooleanoConsente la rete nei container. Richiede anche --allow-network sulla riga di comando.
sandbox.timeout_seconds1201–3600Limite di tempo di ogni comando.
sandbox.max_runtime_seconds6001–7200Tempo totale di sandbox per l'esecuzione, condiviso tra controlli ed esperimenti.
sandbox.max_output_bytes655361024–4194304Output catturato conservato per ogni comando.
sandbox.memory_mb1024128–32768Limite di memoria di ogni container, in MiB.
sandbox.cpus21–32Limite di CPU di ogni container.

reviewer

ChiavePredefinitoConsentitiDescrizione
reviewer.model""ID del modelloModello in grado di usare strumenti. Vuoto disattiva il revisore. Sostituito da PROBE_REVIEWER_MODEL.
reviewer.endpointhttps://api.openai.com/v1/chat/completionsURLEndpoint Chat Completions con function calling; funziona anche un URL di base /v1. HTTPS, oppure HTTP solo su loopback. Niente credenziali, query o frammento; i redirect vengono rifiutati.
reviewer.api_key_envPROBE_API_KEYnome della variabileVariabile d'ambiente che contiene la chiave; <NAME>_FILE e /run/secrets/<NAME> vengono dopo. Vuota per un provider che non richiede chiave.
reviewer.max_iterations201–100Turni del modello per indagine. --max-iterations lo sostituisce.
reviewer.max_generated_tests100–100Test temporanei che il revisore può creare.
reviewer.timeout_seconds6001–1800Tempo totale per l'indagine.
reviewer.max_input_bytes1310724096–2097152Limite del contesto di codice sorgente inviato al provider.

sensitive_paths

Glob di percorsi che sollevano sempre un segnale sensitive_path alto quando vengono modificati. I percorsi sono relativi alla radice del repository, con barre in avanti; * corrisponde all'interno di un segmento di percorso e ** attraverso i segmenti. Percorsi assoluti, backslash e .. vengono rifiutati.

Glob predefinitoCopre
**/auth/**Qualsiasi directory auth.
**/payment*/**Directory payment, payments e simili.
**/migrations/**Migrazioni del database.
.github/workflows/**Workflow di CI.
.probe.jsonLa policy stessa.

fuzz v0.4

Esegue gli stessi input generati da un seed su ogni funzione Go a livello di package modificata e su ogni funzione TS/JS esportata modificata (con firma invariata), sulla baseline e sulla candidata, e confronta ciò che le due revisioni hanno registrato. Una funzione diverged è un'osservazione, mai un difetto: richiede una revisione (uscita 2 con --ci) e non produce mai l'uscita 1. {} la attiva con i valori predefiniti.

ChiavePredefinitoConsentiti
fuzz.max_functions81–32 funzioni per review
fuzz.max_packages41–16 package Go e moduli TS/JS
fuzz.max_inputs641–256 input per funzione
fuzz.call_timeout_ms100010–10000, al massimo il timeout del comando
fuzz.max_runtime_seconds2401–7200, entro sandbox.max_runtime_seconds

mutation v0.4

Apporta piccole modifiche deterministiche alle righe aggiunte dei file Go modificati che non sono di test ed esegue i test del package una volta per mutante. Un mutante che nessun test rileva diventa un segnale surviving_mutant medio; non viene calcolato alcun punteggio. Tutte e quattro le chiavi sono obbligatorie.

"mutation": {
  "command": ["go", "test", "-json", "-count=1", "-failfast", "{package}"],
  "max_mutants": 20, "timeout_seconds": 60, "max_runtime_seconds": 300
}
ChiaveConsentiti
mutation.commandgo test con esattamente un -json e un {package} autonomo; i flag che cambiano i test selezionati o il binario (-run, -exec, -o…) vengono rifiutati.
mutation.max_mutants1–200.
mutation.timeout_secondsDa 1 a sandbox.timeout_seconds, per esecuzione.
mutation.max_runtime_secondsDa timeout_seconds a sandbox.max_runtime_seconds, all'interno del budget condiviso.

prepare v0.4

Consente alla policy attendibile del branch di base di costruire il livello delle dipendenze: prima che venga eseguito qualsiasi codice candidato, il suo comando viene eseguito una volta, in un container con limiti, sui file delle dipendenze esportati dal commit di base, e il container diventa l'immagine locale di ogni controllo. Una review successiva con la stessa base e gli stessi input la riutilizza. Se non produce alcuna immagine, la review termina con uscita 4; non ripiega mai sull'immagine non preparata.

"prepare": { "command": ["go", "mod", "download"], "inputs": ["go.mod", "go.sum"], "network": true }
ChiavePredefinitoDescrizione
prepare.commandobbligatorioArgv da 1 a 128 argomenti; nessun segnaposto viene sostituito.
prepare.inputsobbligatorioDa 1 a 64 pattern relativi al repository (* non attraversa mai /, niente **).
prepare.networkfalseRete per il container di build, solo con --allow-prepare-network e senza --no-network.
prepare.user"sandbox""sandbox" (l'identità dei controlli) o "root".
prepare.timeout_seconds6001–3600.
prepare.envnessunoFino a 32 variabili incorporate nell'immagine derivata; i nomi che cambierebbero ciò che i controlli eseguono (GOFLAGS, NODE_OPTIONS, LD_PRELOAD, PROBE_*…) vengono rifiutati.
prepare.max_added_mb40961–65536 MiB che l'immagine derivata può aggiungere.

Valori predefiniti per linguaggio

Scritti da probe init e usati quando il branch di base non ha una policy. Le immagini standard di Node.js, Python e Rust non contengono le tue dipendenze: costruisci un'immagine che le contenga, oppure aggiungi un oggetto prepare, e adatta i comandi.

LinguaggioImmagineComandi
gogolang:1.26-bookwormtest go test ./... · typecheck go vet ./... · build go build ./... · generated_test go test {package} · coverage go test -covermode=count -coverprofile={coverage_out} ./...
typescript, javascriptnode:22-bookwormtest npm test · build npm run build · generated_test npx --no vitest run {file} --reporter=json --outputFile={results_out}
pythonpython:3.13-bookwormtest python -m unittest discover · generated_test python -m unittest {file}
rustrust:1-bookwormtest cargo test --workspace --offline · typecheck cargo check --workspace --all-targets --offline · build cargo build --workspace --offline · nessun generated_test
unknowngolang:1.26-bookwormNessun comando: review non esegue alcun controllo finché non ne aggiungi.

Revisore IA

Facoltativo. Quando è configurato un modello, review gli permette di indagare sulla modifica con strumenti limitati: leggere file e diff oscurati, cercare nel codice sorgente, consultare riferimenti e chiamanti nell'indice statico, eseguire i controlli esistenti, e creare ed eseguire test temporanei sulla base e sulla candidata. Non ha shell né strumenti per scaricare URL. Le sue affermazioni restano ipotesi finché un test non riproduce una differenza.

{
  "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
  • Solo la policy attendibile, --config o l'ambiente di deployment possono attivare il revisore; una pull request non può.
  • Al provider viene inviato un contesto di codice sorgente limitato e oscurato. Il mascheramento dei segreti è best effort; usa un provider locale (per esempio http://127.0.0.1:1234/v1) se il codice sorgente deve restare in locale.
  • Le chiavi API non entrano mai nei container di test. lint non chiama mai un provider.
  • Gli errori del provider e i budget esauriti conservano i risultati deterministici e segnano l'indagine come incompleta; con --ci questo richiede una revisione umana.