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 --planereview --planverificano 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 (
-cio--ci). I booleani si attivano con--cio--ci=truee si disattivano con--checks=false. Un valore si passa come--base maino--base=main. - Esegui
probe <command> --helpper 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.
| Forma | Confronta |
|---|---|
--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 --exact | Dalla punta di main direttamente a --head. |
BASE..HEAD | I due commit esatti, per esempio HEAD~1..HEAD per rivedere l'ultimo commit. Ha la precedenza su --base, --head e --exact. |
BASE...HEAD | Dal 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.
| Flag | Predefinito | Descrizione |
|---|---|---|
--base REV | main | Branch o revisione di base. Il confronto parte dal suo merge base con --head; la sua punta fornisce la policy attendibile. |
--head REV | HEAD | Revisione candidata in revisione. |
--exact | false | Confronta 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 PATH | policy della base | Usa questo file di policy locale invece di .probe.json del branch di base. Passa solo un file di cui ti fidi. |
--out DIR | .probe | Directory dei report, relativa alla radice del repository. Il percorso non può contenere link simbolici. |
--format LIST | markdown,json | Formati 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. |
--impact | true | Costruisce 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. |
--ci | false | Termina 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, --reviewer | false | Deve 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.
| Flag | Predefinito | Descrizione |
|---|---|---|
--base REV | main | Branch o revisione di base. Il confronto parte dal suo merge base con --head; la sua punta fornisce la policy attendibile. |
--head REV | HEAD | Revisione candidata in revisione. |
--exact | false | Confronta la revisione di base stessa invece del merge base. |
BASE..HEAD | — | Intervallo posizionale; vedi Scelta delle revisioni. |
--repo PATH | . | Directory del repository. |
--config PATH | policy della base | Usa 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 | .probe | Directory dei report, relativa alla radice del repository. Gli artefatti vanno in DIR/artifacts/. |
--format LIST | markdown,json | Formati 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. |
--ci | false | Termina con codice 2 quando è necessaria una revisione umana, inclusi segnali ad alto rischio, aree non verificate o controlli incompleti. |
--checks | true | Esegue i controlli configurati nella sandbox. --checks=false li salta; un revisore configurato può comunque eseguire esperimenti nella sandbox. |
--reviewer | auto | Indagine 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 N | policy (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-network | false | Concede ai container della sandbox l'accesso alla rete. Ha effetto solo se anche la policy attendibile imposta sandbox.network: true. |
--no-network | false | Forza 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. |
--impact | true | Costruisce l'indice d'impatto statico delle funzioni modificate. --impact=false lo salta (e non può essere combinato con --impacted-tests). |
--impacted-tests v0.4 | false | Esegue, 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.4 | false | Esegue 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.4 | true | Esegue 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.4 | 1 | Esegue 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.4 | false | Concede 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.
| Flag | Predefinito | Descrizione |
|---|---|---|
--intent-file PATH, --intent TEXT | — | La modifica da pianificare. Obbligatoria; al massimo 64 KiB di UTF-8, letta come l'intento della review. |
--base REV | main | La revisione da cui parte il piano. La sua punta fornisce la policy attendibile. |
--config PATH | policy della base | Policy locale attendibile esplicita. |
--out DIR | .probe | Directory di output, relativa al repository. |
--ci | false | Uscita 2 quando una categoria viene segnalata o qualcosa è rimasto non verificato. |
--max-iterations N | policy | Sostituisce il budget di iterazioni del provider, da 1 a 100. |
--reviewer | true | Un 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:
| Categoria | Segnali |
|---|---|
| Parti critiche | plan_critical_path (un percorso pianificato corrisponde a sensitive_paths), plan_sensitive_symbol (un nome legato ad autenticazione, autorizzazione o pagamento). |
| Architettura | plan_exported_signature, plan_dependency_change, plan_new_package. |
| Rischio di regressione | plan_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 rilevante | plan_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.
| Voce | Gravità | Quando |
|---|---|---|
unplanned_file | media | Un file modificato che il piano non elenca (unplanned_test_file, bassa, per un file di test). |
unannounced_exported_change | alta | Una dichiarazione Go esportata modificata o rimossa senza essere annunciata come signature o remove. |
unannounced_critical_path | alta | Un percorso modificato corrisponde a un glob critico della policy di questa review e il piano non lo elencava. |
unannounced_dependency_change | media | Un manifest delle dipendenze è cambiato senza essere dichiarato. |
planned_file_untouched | bassa | Un 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.
| Decisione | Quando |
|---|---|
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.
| Flag | Predefinito | Descrizione |
|---|---|---|
--repo PATH | . | Directory in cui creare .probe.json. |
--language NAME | rilevato | go, 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.
| Flag | Predefinito | Descrizione |
|---|---|---|
--input PATH | .probe/confidence-report.json | Report JSON salvato (versione 1, al massimo 64 MiB). |
--out DIR | .probe | Directory di output, relativa alla directory corrente. |
--format LIST | markdown,json | Formati 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
| Comando | Stampa |
|---|---|
probe version, --version | La versione, per esempio probe v0.5.1, e l'avviso di licenza. |
probe help, -h, --help | La sintassi. Senza argomenti, Probe stampa lo stesso testo. |
probe <command> --help | I flag di un comando, con i relativi valori predefiniti. |
Codici di uscita
| Codice | Significato |
|---|---|
0 | Report completato senza problemi alti o critici riprodotti. Senza --ci, le aree non risolte non cambiano questo codice. |
1 | Un'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. |
2 | Solo 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. |
3 | Argomenti non validi, confronto Git o configurazione attendibile (inclusi una chiave di policy o un nome di comando sconosciuti). |
4 | Errore 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.
| Variabile | Effetto |
|---|---|
PROBE_REVIEWER_ENDPOINT | Sostituisce reviewer.endpoint. Stesse regole sugli URL della policy. |
PROBE_REVIEWER_MODEL | Sostituisce reviewer.model e, da sola, attiva il revisore durante review. |
PROBE_API_KEY | Chiave API. Il nome è impostato da reviewer.api_key_env; questo è il predefinito. |
PROBE_API_KEY_FILE | Percorso 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_KEY | Secret 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
| Percorso | Contenuto |
|---|---|
.probe/CONFIDENCE_REPORT.md | Il 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.json | Gli 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.4 | Con --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.4 | Con --format pr-comment: un commento per la pull request con un blocco di stato e ogni segnalazione supportata da prove. |
.probe/PLAN.json, PLAN.md | Scritto 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.
| Tipo | Gravità | Sollevato quando |
|---|---|---|
sensitive_path | alta | Un percorso modificato corrisponde a un glob di sensitive_paths. |
private_key | critica | Una 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_secret | alta | Una 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_url | alta | Un URL aggiunto contiene user:password@ o un parametro di query dal nome segreto (api_key=, token=, password=…). |
tls_verification_disabled | alta | InsecureSkipVerify: true, verify=False, rejectUnauthorized: false, NODE_TLS_REJECT_UNAUTHORIZED=0, curl -k, sslmode=disable, minimi TLS 1.0/1.1 e simili. |
excessive_permissions | alta | Permessi 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_disabled | alta | CSRF 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_enabled | media | DEBUG = True, debug: true, app.run(debug=True), FLASK_DEBUG=1, gin.DebugMode e simili. |
hardcoded_email, hardcoded_ip | bassa | Un 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_change | alta | Una 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_change | alta | Una funzione Go il cui nome suggerisce pagamenti (payment, refund, charge, capture, withdraw, deposit, balance…) ha il corpo modificato. |
validation_removed | alta | Una riga rimossa chiamava una funzione di validazione, asserzione o sanificazione, oppure sollevava un errore di validazione. |
public_api_change | alta media | Go: una dichiarazione esportata è stata rimossa o modificata (alta) o aggiunta (media). Altri linguaggi: una riga sembra una dichiarazione pubblica (media). |
database_write | alta | Una riga modificata sembra una modifica ai dati del database o una transazione (INSERT, UPDATE … SET, .Exec(, .Commit(…). |
dynamic_execution | alta | eval, esecuzione di processi, subprocess, child_process, innerHTML e simili. |
type_suppression | alta | Soppressione di controlli di tipo o di lint come @ts-ignore, as any, unsafe, nolint, eslint-disable. |
migration_change | alta | È cambiato un percorso contenente migration o che termina con .sql. |
infrastructure_change | alta | È cambiato un workflow GitHub, un Dockerfile o un file Terraform. |
file_type_change | alta | Git segnala un cambio di tipo, per esempio un file che diventa un link simbolico. |
network_change | media | Una riga modificata effettua chiamate HTTP, gRPC o socket, oppure contiene un URL. |
error_handling_change | media | Sono cambiati controlli degli errori, wrapping, panic/recover, catch o except. |
dependency_change | media | È cambiato un manifest delle dipendenze o un lockfile (go.mod, package.json, Cargo.lock, pyproject.toml…). |
uncovered_change | media bassa | Le righe Go aggiunte non sono state eseguite dall'esecuzione di coverage registrata. Bassa quando l'esecuzione della coverage stessa è fallita. |
branch_growth | media | In un file sono state aggiunte almeno cinque righe con costrutti di diramazione in più rispetto a quelle rimosse. Non è una metrica di complessità. |
large_change | media | Più di 400 righe modificate in un solo file. |
file_deleted | media | Un file tracciato è stato rimosso. |
binary_change | media | Un file binario è cambiato e non può essere analizzato come testo. |
analysis_limited | media | L'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.4 | alta | È stato aggiunto un marcatore di focus a un file di test (it.only, fdescribe…). |
test_assertion_removed, test_case_removed v0.4 | media | Un 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.4 | media | È 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.4 | media | Una mutazione di una riga Go aggiunta non ha fatto fallire alcun test del suo package. Il mutante potrebbe essere equivalente. |
prepare_input_changed v0.4 | media | La modifica tocca un file elencato in prepare.inputs della policy; il livello delle dipendenze è stato comunque costruito dal commit di base. |
plan_drift | alta media bassa | Con --plan: il diff esce dal contratto del piano. Vedi deriva dall'ambito. |
impacted_caller | bassa | Codice non modificato chiama una funzione modificata, secondo l'indice d'impatto. Al massimo 10 per funzione e 100 per esecuzione. |
no_test_change | bassa | Un 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_added | bassa | È 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.
| Linguaggio | Come viene indicizzato | Risoluzione |
|---|---|---|
| Go | Analizzato 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, Rust | Scansione 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à | Go | TS/JS | Python | Rust |
|---|---|---|---|---|
| Segnali di rischio e regole sull'indebolimento dei test | basata sulla sintassi | testuale | testuale | testuale |
| Indice d'impatto e strumenti sui simboli del revisore | con type-checking | lessicale | lessicale | lessicale |
Controlli in sandbox e valori predefiniti di init | sì | sì | sì | sì |
| Test generati verificati | sì | sì (JSON di Jest/Vitest) | eseguiti, non verificati per nome | nessun comando predefinito |
| Fuzzing differenziale | sì | sì | — | — |
Coverage, mutation, --base-tests, --impacted-tests | sì | — | — | — |
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.
| Chiave | Tipo | Predefinito | Descrizione |
|---|---|---|---|
version | intero | 1 | Versione del formato della policy. Deve essere 1. |
language | stringa | rilevato | Linguaggio scritto da init. Informativo. |
fuzz, mutation, prepare v0.4 | oggetto | assente | Fasi 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.
| Chiave | Segnaposto | Descrizione |
|---|---|---|
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
| Chiave | Predefinito | Consentiti | Descrizione |
|---|---|---|---|
sandbox.image | golang:1.26-bookworm | nome dell'immagine | Immagine precaricata con la toolchain e le dipendenze. Probe non la scarica mai; se puoi, fissala tramite digest. |
sandbox.network | false | booleano | Consente la rete nei container. Richiede anche --allow-network sulla riga di comando. |
sandbox.timeout_seconds | 120 | 1–3600 | Limite di tempo di ogni comando. |
sandbox.max_runtime_seconds | 600 | 1–7200 | Tempo totale di sandbox per l'esecuzione, condiviso tra controlli ed esperimenti. |
sandbox.max_output_bytes | 65536 | 1024–4194304 | Output catturato conservato per ogni comando. |
sandbox.memory_mb | 1024 | 128–32768 | Limite di memoria di ogni container, in MiB. |
sandbox.cpus | 2 | 1–32 | Limite di CPU di ogni container. |
reviewer
| Chiave | Predefinito | Consentiti | Descrizione |
|---|---|---|---|
reviewer.model | "" | ID del modello | Modello in grado di usare strumenti. Vuoto disattiva il revisore. Sostituito da PROBE_REVIEWER_MODEL. |
reviewer.endpoint | https://api.openai.com/v1/chat/completions | URL | Endpoint 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_env | PROBE_API_KEY | nome della variabile | Variabile d'ambiente che contiene la chiave; <NAME>_FILE e /run/secrets/<NAME> vengono dopo. Vuota per un provider che non richiede chiave. |
reviewer.max_iterations | 20 | 1–100 | Turni del modello per indagine. --max-iterations lo sostituisce. |
reviewer.max_generated_tests | 10 | 0–100 | Test temporanei che il revisore può creare. |
reviewer.timeout_seconds | 600 | 1–1800 | Tempo totale per l'indagine. |
reviewer.max_input_bytes | 131072 | 4096–2097152 | Limite 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 predefinito | Copre |
|---|---|
**/auth/** | Qualsiasi directory auth. |
**/payment*/** | Directory payment, payments e simili. |
**/migrations/** | Migrazioni del database. |
.github/workflows/** | Workflow di CI. |
.probe.json | La 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.
| Chiave | Predefinito | Consentiti |
|---|---|---|
fuzz.max_functions | 8 | 1–32 funzioni per review |
fuzz.max_packages | 4 | 1–16 package Go e moduli TS/JS |
fuzz.max_inputs | 64 | 1–256 input per funzione |
fuzz.call_timeout_ms | 1000 | 10–10000, al massimo il timeout del comando |
fuzz.max_runtime_seconds | 240 | 1–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
}
| Chiave | Consentiti |
|---|---|
mutation.command | go 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_mutants | 1–200. |
mutation.timeout_seconds | Da 1 a sandbox.timeout_seconds, per esecuzione. |
mutation.max_runtime_seconds | Da 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 }
| Chiave | Predefinito | Descrizione |
|---|---|---|
prepare.command | obbligatorio | Argv da 1 a 128 argomenti; nessun segnaposto viene sostituito. |
prepare.inputs | obbligatorio | Da 1 a 64 pattern relativi al repository (* non attraversa mai /, niente **). |
prepare.network | false | Rete 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_seconds | 600 | 1–3600. |
prepare.env | nessuno | Fino 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_mb | 4096 | 1–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.
| Linguaggio | Immagine | Comandi |
|---|---|---|
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 · nessun generated_test |
unknown | golang:1.26-bookworm | Nessun 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,
--configo 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.
lintnon chiama mai un provider. - Gli errori del provider e i budget esauriti conservano i risultati deterministici e segnano l'indagine come incompleta; con
--ciquesto richiede una revisione umana.
Nessuna voce del riferimento corrisponde a questo filtro.