Referenz

Kommandozeilenreferenz

Alle Befehle, Flags, Exit-Codes, Umgebungsvariablen, Policy-Schlüssel und Risikosignale des aktuellen Probe (neueste Version: v0.5.1). Mit v0.4 markierte Einträge lassen ein Binary älter als v0.4.0 mit 3 beenden; lesen Sie die Reihenfolge der Releases, bevor Sie eine Version in der CI festschreiben. Drücken Sie /, um zu suchen.

Diese Seite behandelt Probe für Code, das Kommandozeilenwerkzeug. Sie überwachen Word-, Excel- oder PowerPoint-Dateien? Siehe Probe Desktop.

Aufruf

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 analysiert eine Änderung statisch. Es führt niemals Code aus dem Repository aus und ruft niemals einen KI-Anbieter auf.
  • review ergänzt Prüfungen in einer Docker-Sandbox, die optionalen Nachweisstufen (geänderte Baseline-Tests, betroffene Tests, differenzielles Fuzzing, Mutation, Vorbereitung der Abhängigkeiten) und, wenn ein Modell konfiguriert ist, eine KI-Untersuchung.
  • plan fordert beim konfigurierten Anbieter einen Implementierungsplan an, bevor Code geschrieben wird, bewertet ihn mit festen Regeln und macht daraus einen Vertrag, gegen den lint --plan und review --plan den Diff prüfen.
  • Nur committete Dateien werden analysiert; nicht committete Änderungen und nicht versionierte Dateien werden ignoriert.
  • Berichte werden standardmäßig nach .probe/ im Repository geschrieben. Die Konsolenausgabe bleibt kurz.
  • Flags akzeptieren einen oder zwei Bindestriche (-ci oder --ci). Boolesche Werte werden mit --ci oder --ci=true gesetzt und mit --checks=false zurückgesetzt. Ein Wert wird als --base main oder --base=main angegeben.
  • Führen Sie probe <command> --help aus, um die Flags eines Befehls zu sehen.

Revisionen wählen

Beide Seiten eines Vergleichs werden zu unveränderlichen Commit-IDs aufgelöst, die im Bericht festgehalten werden. Umbenennungen, Löschungen, Binärdateien und Änderungen des Dateityps werden berücksichtigt.

FormVergleicht
--base main (Standard)Von der Merge-Basis von main und --head bis --head, wie ein Pull Request. Commits, die seit dem Abzweigen zu main hinzugekommen sind, gehören nicht zur Änderung.
--base main --exactVon der Spitze von main direkt bis --head.
BASE..HEADDie beiden exakten Commits, zum Beispiel HEAD~1..HEAD, um den letzten Commit zu prüfen. Überschreibt --base, --head und --exact.
BASE...HEADVon der Merge-Basis der beiden Revisionen bis HEAD.

Ein Bereich kann vor oder nach den Flags stehen: probe review main..HEAD --ci und probe review --ci main..HEAD sind gleichwertig. Es wird höchstens ein Bereich akzeptiert. Jede Revision, die Git versteht, funktioniert: Branches, Tags, origin/main, HEAD~3 oder eine Commit-ID. CI-Jobs benötigen genügend Historie, um die Basis aufzulösen (zum Beispiel fetch-depth: 0).

Die vertrauenswürdige Policy wird immer aus dem Basis-Branch gelesen, niemals aus der zu prüfenden Änderung, sodass ein Pull Request seine eigenen Regeln nicht lockern kann.

probe lint

Statische Analyse einer Änderung: Git-Vergleich, Risikosignale und ein Bericht. Kein Docker, kein Anbieteraufruf, keine Ausführung von Repository-Code. Unbedenklich auf nicht vertrauenswürdigen Branches.

FlagStandardBeschreibung
--base REVmainBasis-Branch oder -Revision. Der Vergleich beginnt an ihrer Merge-Basis mit --head; ihre Spitze liefert die vertrauenswürdige Policy.
--head REVHEADZu prüfende Kandidaten-Revision.
--exactfalseDie Basis-Revision selbst statt der Merge-Basis vergleichen.
BASE..HEAD—Positionsbereich; siehe Revisionen wählen.
--repo PATH.Repository-Verzeichnis. Jedes Verzeichnis innerhalb des Arbeitsbaums funktioniert.
--config PATHPolicy der BasisDiese lokale Policy-Datei statt .probe.json aus dem Basis-Branch verwenden. Übergeben Sie nur eine Datei, der Sie vertrauen.
--out DIR.probeBerichtsverzeichnis, relativ zum Repository-Stamm. Der Pfad darf keine symbolischen Links enthalten.
--format LISTmarkdown,jsonKommagetrennte Liste der zu schreibenden Berichtsformate: markdown, json, sarif v0.4, pr-comment v0.4. Siehe Ausgabedateien.
--report-url URL v0.4—Ein https-Link zum vollständigen Bericht, zitiert in PR_COMMENT.md. Erfordert das Format pr-comment; eine URL, die offenbar Zugangsdaten enthält, wird mit Exit-Code 3 abgelehnt.
--impacttrueDen statischen Auswirkungsindex der geänderten Funktionen erstellen. --impact=false überspringt ihn.
--plan PATH—Eine von probe plan geschriebene PLAN.json: den Diff gegen ihren Vertrag prüfen und einen Abschnitt plan_drift sowie Signale hinzufügen.
--cifalseMit Code 2 beenden, wenn ein menschliches Review erforderlich ist. Siehe Exit-Codes.
--intent TEXT—Intent oder Akzeptanzkriterien des Pull Requests, im Bericht festgehalten (höchstens 64 KiB).
--intent-file PATH—Den Intent aus einer UTF-8-Datei lesen. Kann nicht mit --intent kombiniert werden.
--checks, --reviewerfalseMuss false bleiben: lint endet mit Code 3, wenn eines davon aktiviert ist. Verwenden Sie review. Die Flags der reinen Review-Stufen (--base-tests, --impacted-tests, --fuzz, --cache-dir, --parallel, --deadline, --allow-prepare-network) werden auf dieselbe Weise abgelehnt.
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

Alles, was lint tut, plus die Befehle test, typecheck, build und coverage der Policy in Wegwerf-Docker-Containern, plus eine KI-Untersuchung, wenn ein Modell konfiguriert ist. Erfordert Docker mit Linux-Containern und ein vorab geladenes sandbox.image.

FlagStandardBeschreibung
--base REVmainBasis-Branch oder -Revision. Der Vergleich beginnt an ihrer Merge-Basis mit --head; ihre Spitze liefert die vertrauenswürdige Policy.
--head REVHEADZu prüfende Kandidaten-Revision.
--exactfalseDie Basis-Revision selbst statt der Merge-Basis vergleichen.
BASE..HEAD—Positionsbereich; siehe Revisionen wählen.
--repo PATH.Repository-Verzeichnis.
--config PATHPolicy der BasisDiese lokale Policy-Datei statt .probe.json aus dem Basis-Branch verwenden, zum Beispiel um eine Policy vor dem Commit auszuprobieren. Übergeben Sie nur eine Datei, der Sie vertrauen: Sie bestimmt, was ausgeführt wird und wohin Quellcode gesendet wird.
--out DIR.probeBerichtsverzeichnis, relativ zum Repository-Stamm. Artefakte landen in DIR/artifacts/.
--format LISTmarkdown,jsonKommagetrennte Liste der zu schreibenden Berichtsformate: markdown, json, sarif v0.4, pr-comment v0.4.
--report-url URL v0.4—Ein https-Link zum vollständigen Bericht, zitiert in PR_COMMENT.md. Erfordert das Format pr-comment.
--cifalseMit Code 2 beenden, wenn ein menschliches Review erforderlich ist, auch bei Hochrisikosignalen, nicht verifizierten Bereichen oder unvollständigen Prüfungen.
--checkstrueDie konfigurierten Prüfungen in der Sandbox ausführen. --checks=false überspringt sie; ein konfigurierter Reviewer kann trotzdem Sandbox-Experimente durchführen.
--reviewerautoKI-Untersuchung. Automatisch aktiviert, wenn in der vertrauenswürdigen Policy oder in PROBE_REVIEWER_MODEL ein Modell gesetzt ist. --reviewer=false deaktiviert jeden Anbieteraufruf; --reviewer schlägt mit Exit-Code 3 fehl, wenn kein Modell konfiguriert ist.
--max-iterations NPolicy (20)reviewer.max_iterations für diesen Lauf überschreiben, 1 bis 100.
--intent TEXT—Intent oder Akzeptanzkriterien des Pull Requests (höchstens 64 KiB). Im Bericht festgehalten und an den Reviewer übergeben.
--intent-file PATH—Den Intent aus einer UTF-8-Datei lesen. Kann nicht mit --intent kombiniert werden.
--allow-networkfalseSandbox-Containern Netzwerkzugriff geben. Wirkt nur, wenn die vertrauenswürdige Policy ebenfalls sandbox.network: true setzt.
--no-networkfalseSandbox-Netzwerk zwingend abschalten. Betrifft keine API-Aufrufe des Reviewers; dafür --reviewer=false hinzufügen.
--plan PATH—Den Diff gegen den Vertrag einer PLAN.json prüfen. Eine abweichende Änderung fordert ein menschliches Review an (Exit-Code 2 mit --ci), niemals Exit-Code 1.
--impacttrueDen statischen Auswirkungsindex der geänderten Funktionen erstellen. --impact=false überspringt ihn (und kann nicht mit --impacted-tests kombiniert werden).
--impacted-tests v0.4falseDie unveränderten Go-Tests, die laut Auswirkungsindex eine geänderte Funktion erreichen, auf Baseline und Kandidat ausführen. Ein Test, der auf der Basis besteht und auf dem Kandidaten fehlschlägt, ist FAILS_ON_CANDIDATE: ein Grund für ein Review, kein Defekt.
--base-tests v0.4falseDie Baseline-Version jeder Go-Testfunktion, die die Änderung modifiziert oder entfernt hat, auf Baseline- und Kandidaten-Code ausführen.
--fuzz v0.4trueDas differenzielle Fuzzing ausführen, das das fuzz-Objekt der Policy konfiguriert. --fuzz=false vermerkt die Stufe als deaktiviert.
--cache-dir DIR v0.4—Optionaler Cache für Baseline-Ausführungen, außerhalb des Repositorys und des Ausgabeverzeichnisses. Ein wiederverwendeter Baseline-Lauf stützt niemals ein positives Ergebnis.
--parallel N v0.41Die ersten Prüfungen zu je N gleichzeitig ausführen, 1 bis 4.
--deadline D v0.4—Gesamtzeitlimit des Laufs, von 1m bis 24h; 30 Sekunden davon sind für Aufräumen und Bericht reserviert.
--allow-prepare-network v0.4falseDem prepare-Container Netzwerkzugriff geben, nur wenn prepare.network der Policy dies ebenfalls erlaubt. Prüfungen bleiben 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"

Die Vorbereitung der Abhängigkeiten läuft zuerst, wenn die Policy ein prepare-Objekt enthält. Danach laufen die Prüfungen in der Reihenfolge test, typecheck, build, dann coverage, gefolgt von den Nachweisstufen und dem Reviewer. Jeder Container läuft ohne Root, mit schreibgeschütztem Root-Dateisystem und Quellcode-Mount, ohne zusätzliche Capabilities, standardmäßig ohne Netzwerk und mit den CPU-, Speicher-, PID- und Zeitlimits der Sandbox-Policy. Der Docker-Socket, Ihr Arbeits-Checkout und API-Schlüssel werden niemals eingebunden. Fehlen Docker oder das Image, endet der Lauf mit Exit-Code 4; es gibt nie ein Ausweichen auf Ihren Host.

probe plan

Bevor die Änderung geschrieben wird: Der konfigurierte Anbieter simuliert schreibgeschützt, wie er einen Intent auf dem Basis-Commit umsetzen würde, und reicht einen strukturierten Plan ein (Dateien, Symbole, Abhängigkeiten, Schritte). Probe bewertet ihn mit festen Regeln und schreibt PLAN.json und PLAN.md. Das Modell erstellt den Plan; es beurteilt nie dessen Risiko. Nichts wird verändert oder ausgeführt.

FlagStandardBeschreibung
--intent-file PATH, --intent TEXT—Die zu planende Änderung. Erforderlich; höchstens 64 KiB UTF-8, eingelesen wie der Review-Intent.
--base REVmainDie Revision, von der der Plan ausgeht. Ihre Spitze liefert die vertrauenswürdige Policy.
--config PATHPolicy der BasisExplizite, vertrauenswürdige lokale Policy.
--out DIR.probeAusgabeverzeichnis, relativ zum Repository.
--cifalseExit-Code 2, wenn eine Kategorie markiert ist oder etwas nicht verifiziert wurde.
--max-iterations NPolicyDas Iterationsbudget des Anbieters überschreiben, 1 bis 100.
--reviewertrueEin Anbieter ist Pflicht: Ohne konfiguriertes Modell oder mit --reviewer=false endet plan mit Exit-Code 3 und schreibt nichts.

Die Werkzeuge des Planers sind schreibgeschützt und arbeiten auf einem Snapshot des Basis-Commits: list_files, read_file, search_code und die indexgestützten find_references, inspect_symbol und find_callers, dann einmal submit_plan. Die Bewertung markiert vier Kategorien, allein anhand des Plans und des Basis-Commits:

KategorieSignale
Kritische Bereicheplan_critical_path (ein geplanter Pfad passt zu sensitive_paths), plan_sensitive_symbol (ein Name aus Authentifizierung, Autorisierung oder Zahlung).
Architekturplan_exported_signature, plan_dependency_change, plan_new_package.
Regressionsrisikoplan_wide_impact (10 oder mehr Aufrufer), plan_untested_impact (Aufrufer, aber kein erreichender Test), gemessen am statischen Index des Basis-Commits.
Andere größere Änderungplan_file_deletion, plan_large_scope (20 oder mehr Dateien), plan_inconsistent, plan_unmeasured.

Exit-Codes: 0; 2 mit --ci, wenn eine Kategorie markiert ist; 3 Bedienung oder Konfiguration; 4 Anbieterfehler oder kein akzeptierter Plan.

Abweichung vom Umfang: --plan

lint --plan und review --plan lesen den Vertrag des Plans und vergleichen den tatsächlichen Diff damit. Jede Abweichung im Diff wird außerdem zu einem plan_drift-Signal. Der Abschnitt ist drifted, wenn ein Eintrag mittel oder höher ist.

EintragSchweregradWann
unplanned_filemittelEine geänderte Datei, die der Plan nicht aufführt (unplanned_test_file, niedrig, für eine Testdatei).
unannounced_exported_changehochEine exportierte Go-Deklaration wurde geändert oder entfernt, ohne als signature oder remove angekündigt zu sein.
unannounced_critical_pathhochEin geänderter Pfad passt zu einem kritischen Glob der Policy dieses Reviews, und der Plan hat ihn nicht aufgeführt.
unannounced_dependency_changemittelEin Abhängigkeitsmanifest wurde geändert, ohne deklariert zu sein.
planned_file_untouchedniedrigEine geplante Datei, die die Änderung nicht berührt (nur Abschnitt).
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

Das Plan-Gate

review --plan endet mit einer Entscheidung, plan_drift.decision, die auf stdout und oben im Abschnitt „Plan Conformance“ ausgegeben wird. Mit --ci ist sie der Exit-Code.

EntscheidungWann
no_human_review_required (Exit-Code 0)Alles Folgende: Der Plan, vom Review neu bewertet anhand seines Vorschlags auf seinem Basis-Commit mit der vertrauenswürdigen Policy dieses Reviews, markiert keine Kategorie und hat keine Messlücke; die Änderung entspricht dem Plan und ihrer Basis; mindestens eine Prüfung lief und alle waren erfolgreich; kein reproduziertes Problem, kein hohes oder kritisches Signal, kein nicht verifizierter Bereich und kein anderer Abschnitt, der ein Review anfordert.
human_review_required (Exit-Code 2)Alles andere. Jeder Grund ist in plan_drift.decision_reasons aufgeführt. lint --plan führt keine Prüfung aus und erfordert daher immer ein Review.

Den in PLAN.json gespeicherten Flags und dem Vertrag wird nie vertraut: Der Vertrag wird aus dem Vorschlag neu abgeleitet, sodass ein bearbeiteter Plan den Umfang nicht unbewertet erweitern kann, und probe report berechnet die Entscheidung aus dem gespeicherten Bericht neu. Das Gate ist eine Prozessentscheidung, kein Urteil über die Korrektheit. Ein Plan, der nichts meldet, beweist nicht, dass die Änderung sicher ist, und die Abweichungsprüfung kontrolliert nicht, ob die Änderung den Intent umsetzt. Siehe Pläne vor der Änderung und das CI-Rezept.

probe init

Eine erste .probe.json für das Projekt schreiben. Eine vorhandene Datei wird nicht überschrieben. Prüfen Sie die Befehle und das Image und committen Sie die Datei dann in Ihren Basis-Branch.

FlagStandardBeschreibung
--repo PATH.Verzeichnis, in dem .probe.json angelegt wird.
--language NAMEerkanntgo, typescript, javascript, python, rust oder unknown. Erkannt anhand von go.mod/go.work, Cargo.toml, tsconfig.json, package.json, dann pyproject.toml/setup.py/requirements.txt. Wählt die Standardwerte aus.

probe report

Einen gespeicherten JSON-Bericht neu ausgeben, zum Beispiel um Markdown neu zu erzeugen oder in der CI SARIF zu erstellen. Nichts wird erneut ausgeführt, und die Neuausgabe authentifiziert die enthaltenen Nachweise nicht; jeder Status wird aus den aufgezeichneten Prüfungen neu abgeleitet, sodass ein bearbeiteter Bericht korrigiert statt übernommen wird.

FlagStandardBeschreibung
--input PATH.probe/confidence-report.jsonGespeicherter JSON-Bericht (Version 1, höchstens 64 MiB).
--out DIR.probeAusgabeverzeichnis, relativ zum aktuellen Verzeichnis.
--format LISTmarkdown,jsonKommagetrennte Liste der zu schreibenden Formate: markdown, json, sarif v0.4, pr-comment v0.4.
--report-url URL v0.4—Ein https-Link zum vollständigen Bericht, zitiert in PR_COMMENT.md.

probe version und Hilfe

BefehlGibt aus
probe version, --versionDie Version, zum Beispiel probe v0.5.1, und den Lizenzhinweis.
probe help, -h, --helpDie Kurzübersicht. Ohne Argument gibt Probe denselben Text aus.
probe <command> --helpDie Flags eines Befehls mit ihren Standardwerten.

Exit-Codes

CodeBedeutung
0Bericht ohne reproduziertes hohes oder kritisches Problem abgeschlossen. Ohne --ci ändern ungeklärte Bereiche diesen Code nicht.
1Eine hohe oder kritische Hypothese wird durch ein differenzielles Fehlschlagen gestützt: Ein generierter Test bestand auf der Basis und schlug auf dem Kandidaten fehl. Nichts anderes erzeugt 1: weder eine Fuzzing-Abweichung noch eine überlebende Mutante, ein fehlschlagender betroffener oder Baseline-Test oder eine Abweichung vom Plan.
2Nur mit --ci: menschliches Review erforderlich, auch bei Hochrisikosignalen, nicht verifizierten Bereichen, unvollständigen Prüfungen, einem Test mit FAILS_ON_CANDIDATE, einer Fuzzing-Abweichung oder einer ergebnislosen Stufe, einer Abweichung vom Plan, einem Plan, der eine Kategorie markiert hat (das Plan-Gate), oder (bei plan) einer markierten Kategorie.
3Ungültige Argumente, Fehler beim Git-Vergleich oder in der vertrauenswürdigen Konfiguration (einschließlich eines unbekannten Policy-Schlüssels oder Befehlsnamens).
4Betriebsfehler in der Ausführungsumgebung, der Analyse oder beim Schreiben des Berichts, etwa wenn Docker oder das Sandbox-Image nicht verfügbar ist, eine Prüfung nicht laufen konnte, die Vorbereitung der Abhängigkeiten fehlschlug oder der Anbieter während plan ausfiel.

Kein Code bedeutet „freigegeben“. Eine 0 besagt, dass nichts reproduziert wurde, nicht, dass die Änderung korrekt ist.

Umgebungsvariablen

Der KI-Anbieter gehört zur Bereitstellung, nicht zum Repository, daher können diese Einstellungen aus der Umgebung kommen. Sonst nichts: Image, Befehle, Budgets und sensible Pfade werden immer von der vertrauenswürdigen Policy bestimmt.

VariableWirkung
PROBE_REVIEWER_ENDPOINTÜberschreibt reviewer.endpoint. Es gelten dieselben URL-Regeln wie in der Policy.
PROBE_REVIEWER_MODELÜberschreibt reviewer.model und aktiviert für sich allein den Reviewer bei review.
PROBE_API_KEYAPI-Schlüssel. Der Name wird durch reviewer.api_key_env festgelegt; dies ist der Standard.
PROBE_API_KEY_FILEPfad einer Datei mit dem Schlüssel, verwendet, wenn die obige Variable nicht gesetzt ist. Die Datei muss lesbar sein, sonst schlägt der Lauf mit Exit-Code 3 fehl.
/run/secrets/PROBE_API_KEYDocker-Secret, das zuletzt gelesen wird, wenn keine der beiden Variablen gesetzt ist. Sein Fehlen ist kein Fehler.

Eine leere Variable gilt als nicht gesetzt. Schlüsseldateien werden vollständig gelesen, umgebende Leerzeichen entfernt, sie sind auf 8 KiB begrenzt und müssen eine einzige Zeile enthalten. Wenn der Reviewer läuft, nennt das Protokoll die Herkunft jedes Werts, nie den Wert selbst. Wer diese Umgebung kontrolliert, bestimmt, wohin geschwärzter Quellcode gesendet wird: Halten Sie sie aus Jobs heraus, die nicht vertrauenswürdigen Code aus Forks ausführen.

Ausgabedateien

PfadInhalt
.probe/CONFIDENCE_REPORT.mdDer zu lesende Bericht: Zusammenfassung der Änderung, automatisierte Prüfungen, Zusammenfassung der Untersuchung, reproduzierte Probleme, nicht verifizierte Bereiche, empfohlenes menschliches Review, Review-Umfang, Ausführung der geänderten Zeilen, aufgezeichnete Nachweise und Artefakte.
.probe/confidence-report.jsonDieselben Daten für Werkzeuge: Commit-IDs, geänderte Zeilen, Signale, Prüfungen, Hypothesen, Nachweise, Audit-Ereignisse und Artefakt-Hashes. Siehe das JSON-Schema.
.probe/confidence-report.sarif v0.4Mit --format sarif: ein SARIF-2.1.0-Log für Code-Scanning-Werkzeuge, das nur Befunde enthält, die durch aufgezeichnete Sandbox-Nachweise gestützt sind. Keine Befunde bedeuten keine Freigabe.
.probe/PR_COMMENT.md v0.4Mit --format pr-comment: ein Pull-Request-Kommentar mit einem Statusblock und jedem durch Nachweise gestützten Befund.
.probe/PLAN.json, PLAN.mdGeschrieben von probe plan: der vom Modell verfasste Vorschlag, die deterministische Bewertung und der Vertrag (Schema).
.probe/artifacts/Prüfprotokolle, Coverage-Profile, generierte Testquellen, Testergebnisse, Mutanten-Patches und Fuzzing-Aufzeichnungen, jeweils über ihren SHA-256-Hash im Bericht referenziert.

Fügen Sie .probe/ zu .gitignore hinzu. Die Konsole gibt eine Zusammenfassung aus: geänderte Dateien und Zeilen, Anzahl der Signale und reproduzierten Probleme, den fokussierten Review-Umfang und die Ausführung der geänderten Zeilen.

Risikosignale

Signale sind Gründe, genauer hinzusehen, keine bestätigten Defekte. Go-Dateien werden syntaxbewusst analysiert; TypeScript/JavaScript, Python, Rust und andere Sprachen nutzen gekennzeichnete Textheuristiken. Signale auf denselben Zeilen werden im Bericht zu einem Review-Bereich zusammengefasst. Signale auf Dateiebene (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) betreffen die Datei, nicht eine Zeile: Der Bericht führt sie unter der Datei als ganze Datei auf, und das JSON kennzeichnet sie mit "scope": "file". Ihre line verortet sie nur auf der ersten geänderten Zeile der Datei.

ArtSchweregradAusgelöst, wenn
sensitive_pathhochEin geänderter Pfad passt zu einem Glob aus sensitive_paths.
private_keykritischEine hinzugefügte Zeile beginnt einen PEM-Block mit privatem Schlüssel (RSA, DSA, EC, OpenSSH, PGP, verschlüsselt) oder einen PuTTY-Schlüssel. Der Schlüssel wird nie in den Bericht kopiert.
hardcoded_secrethochEine hinzugefügte Zeile enthält etwas, das wie Zugangsdaten aussieht (AWS, GitHub, GitLab, Slack, Stripe, Google, LLM-Anbieter, npm, Twilio/SendGrid, Azure-Storage-Schlüssel, JWTs), oder weist einem Schlüssel mit geheimnisartigem Namen (password, api_key, token, client_secret…) ein Literal in Anführungszeichen mit mindestens 8 Zeichen und einer Ziffer oder einem Sonderzeichen zu. Platzhalter, Templates sowie Umgebungs- oder Vault-Abfragen werden ignoriert; der Wert wird in den Nachweisen maskiert.
credential_in_urlhochEine hinzugefügte URL enthält user:password@ oder einen Query-Parameter mit geheimnisartigem Namen (api_key=, token=, password=…).
tls_verification_disabledhochInsecureSkipVerify: true, verify=False, rejectUnauthorized: false, NODE_TLS_REJECT_UNAUTHORIZED=0, curl -k, sslmode=disable, TLS 1.0/1.1 als Minimum und Ähnliches.
excessive_permissionshochFür alle beschreibbare Modi (chmod 777, 0666 in Datei-APIs), privilegierte Container, Rechteausweitung, runAsUser: 0, USER root, Host-PID oder -Netzwerk, SYS_ADMIN, ein eingebundener Docker-Socket, NOPASSWD: ALL.
protection_disabledhochCSRF deaktiviert oder ausgenommen, CORS-Wildcard-Origins, unsichere Cookies, abgeschaltetes Template-Autoescaping, JWT-Algorithmus none oder unverifizierte Signaturen, deaktiviertes SELinux, Firewall, seccomp oder AppArmor, öffentliche Buckets oder Ingress von 0.0.0.0/0, Workflow mit permissions: write-all.
debug_enabledmittelDEBUG = True, debug: true, app.run(debug=True), FLASK_DEBUG=1, gin.DebugMode und Ähnliches.
hardcoded_email, hardcoded_ipniedrigEine hinzugefügte E-Mail-Adresse oder eine IPv4-Adresse in einem String oder einer URL, außerhalb von Tests und Dokumentation. Dokumentations-, Loopback- und Beispielbereiche werden ignoriert.
auth_changehochDer Rumpf einer Go-Funktion, deren Name auf Authentifizierung oder Autorisierung hindeutet, wurde geändert, oder eine geänderte Zeile erwähnt Autorisierung, Authentifizierung, JWT, bcrypt, argon2, CSRF oder CORS.
sensitive_function_changehochDer Rumpf einer Go-Funktion, deren Name auf Zahlungen hindeutet (payment, refund, charge, capture, withdraw, deposit, balance…), wurde geändert.
validation_removedhochEine entfernte Zeile rief eine Validierungs-, Assertion- oder Bereinigungsfunktion auf oder löste einen Validierungsfehler aus.
public_api_changehoch mittelGo: Eine exportierte Deklaration wurde entfernt oder geändert (hoch) oder hinzugefügt (mittel). Andere Sprachen: Eine Zeile sieht wie eine öffentliche Deklaration aus (mittel).
database_writehochEine geänderte Zeile sieht wie eine Datenbankänderung oder Transaktion aus (INSERT, UPDATE … SET, .Exec(, .Commit(…).
dynamic_executionhocheval, Prozessausführung, subprocess, child_process, innerHTML und Ähnliches.
type_suppressionhochUnterdrückung von Typ- oder Lint-Prüfungen wie @ts-ignore, as any, unsafe, nolint, eslint-disable.
migration_changehochEin Pfad, der migration enthält oder auf .sql endet, wurde geändert.
infrastructure_changehochEin GitHub-Workflow, ein Dockerfile oder eine Terraform-Datei wurde geändert.
file_type_changehochGit meldet eine Typänderung, zum Beispiel wenn eine Datei zu einem symbolischen Link wird.
network_changemittelEine geänderte Zeile führt HTTP-, gRPC- oder Socket-Aufrufe aus oder enthält eine URL.
error_handling_changemittelFehlerprüfungen, Wrapping, panic/recover, catch oder except wurden geändert.
dependency_changemittelEin Abhängigkeitsmanifest oder eine Lockfile wurde geändert (go.mod, package.json, Cargo.lock, pyproject.toml…).
uncovered_changemittel niedrigHinzugefügte Go-Zeilen wurden vom aufgezeichneten coverage-Lauf nicht ausgeführt. Niedrig, wenn der Coverage-Lauf selbst fehlschlug.
branch_growthmittelIn einer Datei wurden mindestens fünf Zeilen mit Verzweigungskonstrukten mehr hinzugefügt als entfernt. Keine Komplexitätsmetrik.
large_changemittelMehr als 400 geänderte Zeilen in einer Datei.
file_deletedmittelEine versionierte Datei wurde entfernt.
binary_changemittelEine Binärdatei wurde geändert und kann nicht als Text analysiert werden.
analysis_limitedmittelDie Analyse der Go-Deklarationen konnte für eine Datei nicht abgeschlossen werden, zum Beispiel weil sie sich nicht parsen lässt, oder der Auswirkungsindex war für geänderte Funktionen eingeschränkt oder nicht verfügbar (Symbol impact_index).
test_focus_added v0.4hochEiner Testdatei wurde ein Fokus-Marker hinzugefügt (it.only, fdescribe…).
test_assertion_removed, test_case_removed v0.4mittelEine Testdatei hat mehr Assertion-Zeilen oder mehr Testdeklarationen verloren als hinzugewonnen. Regeln für Go, TS/JS, Python und Rust.
test_skip_added, test_expectation_relaxed v0.4mittelEin Skip-Marker wurde hinzugefügt (t.Skip, it.skip, @pytest.mark.skip, #[ignore]…) oder exakte Erwartungen wurden in einem Hunk durch lockerere ersetzt.
surviving_mutant v0.4mittelEine Mutation einer hinzugefügten Go-Zeile ließ keinen Test ihres Pakets fehlschlagen. Die Mutante kann äquivalent sein.
prepare_input_changed v0.4mittelDie Änderung betrifft eine Datei, die in prepare.inputs der Policy aufgeführt ist; die Abhängigkeitsschicht wurde weiterhin aus dem Basis-Commit gebaut.
plan_drifthoch mittel niedrigMit --plan: Der Diff verlässt den Vertrag des Plans. Siehe Abweichung vom Umfang.
impacted_callerniedrigUnveränderter Code ruft laut Auswirkungsindex eine geänderte Funktion auf. Höchstens 10 pro Funktion und 100 pro Lauf.
no_test_changeniedrigEine Quelldatei wurde geändert, aber keine Testdatei im selben Verzeichnis oder mit demselben Namensstamm. Die vorhandene Coverage wird nicht gemessen.
todo_addedniedrigEin Marker TODO, FIXME, HACK oder XXX wurde hinzugefügt.

Auswirkungsanalyse

Mit --impact (Standard) erstellen lint und review auf dem Host einen statischen Index des Kandidaten-Commits aus committeten Git-Objekten, ohne Repository-Code auszuführen. Für jede geänderte Funktion listet er die Stellen in unverändertem Code, die sie aufrufen, und die vorhandenen Tests, die sie innerhalb von 3 Aufrufen erreichen, fügt niedrige impacted_caller-Signale hinzu und speist die Werkzeuge find_references, inspect_symbol und find_callers des Reviewers.

SpracheWie indexiert wirdAuflösung
GoMit der Go-Standardbibliothek geparst und typgeprüft, Paket für Paket, mit den Build-Constraints linux/amd64. Interface-Aufrufe gelten als möglicher Dispatch.static, interface
TypeScript/JavaScript, Python, RustLexikalisch gescannt: Funktionen, Methoden und Tests werden anhand von Tokens gefunden, und ein Aufruf wird über den Namen mit den gleichnamigen Deklarationen derselben Sprache verknüpft, wobei die Klasse des Aufrufers, das qualifizierende Modul oder der Typ und dieselbe Datei bevorzugt werden. node_modules, dist, target, venv und ähnliche Verzeichnisse werden übersprungen.name

Jede Antwort ist eine Näherung: Ein aufgeführter Aufrufer ist eine Stelle zum Prüfen, und ein fehlender Aufrufer beweist nicht, dass es keinen gibt. --impacted-tests führt nur erreichende Go-Tests aus. Siehe Auswirkungsanalyse.

Sprachen

FunktionGoTS/JSPythonRust
Risikosignale und Regeln gegen abgeschwächte TestssyntaxbewusstTextTextText
Auswirkungsindex und Symbolwerkzeuge des Reviewerstypgeprüftlexikalischlexikalischlexikalisch
Sandbox-Prüfungen und Standardwerte von initjajajaja
Verifizierte generierte Testsjaja (Jest/Vitest-JSON)ausgeführt, nicht nach Namen verifiziertkein Standardbefehl
Differenzielles Fuzzingjaja——
Coverage, Mutation, --base-tests, --impacted-testsja———

Policy-Datei: .probe.json

Die Policy bestimmt, welche Befehle in welchem Image mit welchen Limits laufen und ob ein KI-Anbieter verwendet wird. Sie wird aus .probe.json im Basis-Branch gelesen oder aus --config PATH. Gibt es keine, gelten die eingebauten Standardwerte für die erkannte Sprache. Weggelassene Schlüssel erhalten die unten gezeigten Standardwerte.

Die Datei muss ein einzelnes JSON-Objekt von höchstens 1 MiB sein. Unbekannte Schlüssel, unbekannte Befehlsnamen und doppelte Schlüssel werden mit Exit-Code 3 abgelehnt, sodass ein älteres Binary einen Schlüssel ablehnt, den es nicht kennt.

SchlüsselTypStandardBeschreibung
versionInteger1Version des Policy-Formats. Muss 1 sein.
languageStringerkanntVon init geschriebene Sprache. Nur zur Information.
fuzz, mutation, prepare v0.4Objektnicht gesetztOptionale Nachweisstufen: differenzielles Fuzzing, Mutation hinzugefügter Zeilen und vertrauenswürdige Vorbereitung der Abhängigkeiten. init schreibt sie nie.
{
  "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

Jeder Befehl ist ein argv-Array, kein Shell-String: ["npm", "test"], niemals "npm test". Höchstens 128 Argumente; konfigurieren Sie nur die Prüfungen, die Ihr Projekt bietet.

SchlüsselPlatzhalterBeschreibung
commands.test—Testsuite, ausgeführt von review.
commands.typecheck—Typ- oder statische Prüfung, zum Beispiel go vet oder tsc --noEmit.
commands.build—Build-Befehl.
commands.generated_test{file}, {package}, {results_out}Wie die temporären Tests des KI-Reviewers (und --impacted-tests) auf Basis und Kandidat ausgeführt werden. Der Go-Standard verwendet das Paket des Tests, damit er nicht exportierten Code ansprechen kann. Verifizierte Go-Experimente benötigen einen einzelnen eigenständigen Ziel-Platzhalter; ein Jest- oder Vitest-Befehl, der einen JSON-Bericht nach {results_out} schreibt, macht TS/JS-Experimente anhand des Testnamens verifizierbar.
commands.coverage{coverage_out} (genau einmal)Nur Go. Misst, welche hinzugefügten Zeilen ein Sandbox-Lauf ausgeführt hat. Läuft zuletzt, zusätzlich zu test, innerhalb von sandbox.max_runtime_seconds. Fügen Sie -coverpkg=./... hinzu, um die Ausführung paketübergreifend zuzuordnen.

sandbox

SchlüsselStandardErlaubtBeschreibung
sandbox.imagegolang:1.26-bookwormImage-NameVorab geladenes Image mit Toolchain und Abhängigkeiten. Wird von Probe nie gepullt; pinnen Sie es nach Möglichkeit per Digest.
sandbox.networkfalseBooleanContainer-Netzwerk erlauben. Erfordert zusätzlich --allow-network in der Befehlszeile.
sandbox.timeout_seconds1201–3600Zeitlimit jedes Befehls.
sandbox.max_runtime_seconds6001–7200Gesamte Sandbox-Zeit des Laufs, geteilt zwischen Prüfungen und Experimenten.
sandbox.max_output_bytes655361024–4194304Pro Befehl aufbewahrte Ausgabe.
sandbox.memory_mb1024128–32768Speicherlimit jedes Containers, in MiB.
sandbox.cpus21–32CPU-Limit jedes Containers.

reviewer

SchlüsselStandardErlaubtBeschreibung
reviewer.model""Modell-IDModell mit Tool-Unterstützung. Leer deaktiviert den Reviewer. Wird durch PROBE_REVIEWER_MODEL überschrieben.
reviewer.endpointhttps://api.openai.com/v1/chat/completionsURLChat-Completions-Endpunkt mit Function Calling; eine Basis-URL mit /v1 funktioniert ebenfalls. HTTPS oder HTTP nur auf Loopback. Keine Zugangsdaten, kein Query-String, kein Fragment; Weiterleitungen werden abgelehnt.
reviewer.api_key_envPROBE_API_KEYVariablennameUmgebungsvariable, die den Schlüssel enthält; danach folgen <NAME>_FILE und /run/secrets/<NAME>. Leer bei einem Anbieter, der keinen Schlüssel benötigt.
reviewer.max_iterations201–100Modellrunden pro Untersuchung. --max-iterations überschreibt den Wert.
reviewer.max_generated_tests100–100Temporäre Tests, die der Reviewer anlegen darf.
reviewer.timeout_seconds6001–1800Gesamtzeit der Untersuchung.
reviewer.max_input_bytes1310724096–2097152Obergrenze für den an den Anbieter gesendeten Quellcode-Kontext.

sensitive_paths

Globs von Pfaden, die bei einer Änderung immer ein hohes sensitive_path-Signal auslösen. Pfade sind relativ zum Repository-Stamm und verwenden Schrägstriche; * passt innerhalb eines Pfadsegments, ** über Segmente hinweg. Absolute Pfade, Backslashes und .. werden abgelehnt.

Standard-GlobDeckt ab
**/auth/**Jedes auth-Verzeichnis.
**/payment*/**payment, payments und ähnliche Verzeichnisse.
**/migrations/**Datenbankmigrationen.
.github/workflows/**CI-Workflows.
.probe.jsonDie Policy selbst.

fuzz v0.4

Schickt dieselben Seed-Eingaben durch jede geänderte Go-Funktion auf Paketebene und jede geänderte exportierte TS/JS-Funktion (mit unveränderter Signatur), auf Baseline und Kandidat, und vergleicht, was die beiden Revisionen aufgezeichnet haben. Eine Funktion mit diverged ist eine Beobachtung, nie ein Defekt: Sie fordert ein Review an (Exit-Code 2 mit --ci) und erzeugt nie Exit-Code 1. {} aktiviert es mit den Standardwerten.

SchlüsselStandardErlaubt
fuzz.max_functions81–32 Funktionen pro Review
fuzz.max_packages41–16 Go-Pakete und TS/JS-Module
fuzz.max_inputs641–256 Eingaben pro Funktion
fuzz.call_timeout_ms100010–10000, höchstens das Befehls-Timeout
fuzz.max_runtime_seconds2401–7200, innerhalb von sandbox.max_runtime_seconds

mutation v0.4

Nimmt kleine deterministische Änderungen an den hinzugefügten Zeilen geänderter Go-Dateien (ohne Tests) vor und führt die Tests des Pakets einmal pro Mutante aus. Eine Mutante, die kein Test bemerkt, wird zu einem mittleren surviving_mutant-Signal; es wird kein Score berechnet. Alle vier Schlüssel sind erforderlich.

"mutation": {
  "command": ["go", "test", "-json", "-count=1", "-failfast", "{package}"],
  "max_mutants": 20, "timeout_seconds": 60, "max_runtime_seconds": 300
}
SchlüsselErlaubt
mutation.commandgo test mit genau einem -json und einem eigenständigen {package}; Flags, die die ausgewählten Tests oder das Binary ändern (-run, -exec, -o…), werden abgelehnt.
mutation.max_mutants1–200.
mutation.timeout_seconds1 bis sandbox.timeout_seconds, pro Lauf.
mutation.max_runtime_secondstimeout_seconds bis sandbox.max_runtime_seconds, innerhalb des gemeinsamen Budgets.

prepare v0.4

Lässt die vertrauenswürdige Policy des Basis-Branches die Abhängigkeitsschicht bauen: Bevor Kandidaten-Code läuft, wird ihr Befehl einmal in einem begrenzten Container auf den aus dem Basis-Commit exportierten Abhängigkeitsdateien ausgeführt, und der Container wird zum lokalen Image jeder Prüfung. Ein späteres Review mit derselben Basis und denselben Eingaben verwendet es wieder. Entsteht kein Image, endet das Review mit Exit-Code 4; es weicht nie auf das unvorbereitete Image aus.

"prepare": { "command": ["go", "mod", "download"], "inputs": ["go.mod", "go.sum"], "network": true }
SchlüsselStandardBeschreibung
prepare.commanderforderlichArgv mit 1 bis 128 Argumenten; es werden keine Platzhalter ersetzt.
prepare.inputserforderlich1 bis 64 Muster relativ zum Repository (* überschreitet nie /, kein **).
prepare.networkfalseNetzwerk für den Build-Container, nur mit --allow-prepare-network und ohne --no-network.
prepare.user"sandbox""sandbox" (die Identität der Prüfungen) oder "root".
prepare.timeout_seconds6001–3600.
prepare.envkeineBis zu 32 Variablen, die in das abgeleitete Image eingebacken werden; Namen, die ändern würden, was Prüfungen ausführen (GOFLAGS, NODE_OPTIONS, LD_PRELOAD, PROBE_*…), werden abgelehnt.
prepare.max_added_mb40961–65536 MiB, die das abgeleitete Image hinzufügen darf.

Standardwerte je Sprache

Von probe init geschrieben und verwendet, wenn der Basis-Branch keine Policy hat. Die Standard-Images für Node.js, Python und Rust enthalten Ihre Abhängigkeiten nicht: Bauen Sie ein Image, das sie enthält, oder fügen Sie ein prepare-Objekt hinzu, und passen Sie die Befehle an.

SpracheImageBefehle
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 · kein generated_test
unknowngolang:1.26-bookwormKeine Befehle: review führt keine Prüfungen aus, bis Sie welche hinzufügen.

KI-Reviewer

Optional. Wenn ein Modell konfiguriert ist, lässt review es die Änderung mit begrenzten Werkzeugen untersuchen: geschwärzte Dateien und Diffs lesen, Quellcode durchsuchen, Referenzen und Aufrufer im statischen Index nachschlagen, vorhandene Prüfungen ausführen sowie temporäre Tests auf Basis und Kandidat anlegen und ausführen. Es hat keine Shell und keinen URL-Abruf. Seine Aussagen bleiben Hypothesen, bis ein Test einen Unterschied reproduziert.

{
  "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
  • Nur die vertrauenswürdige Policy, --config oder die Umgebung der Bereitstellung können den Reviewer aktivieren; ein Pull Request kann es nicht.
  • Begrenzter, geschwärzter Quellcode-Kontext wird an den Anbieter gesendet. Das Maskieren von Secrets erfolgt nach bestem Bemühen; verwenden Sie einen lokalen Anbieter (zum Beispiel http://127.0.0.1:1234/v1), wenn der Quellcode lokal bleiben muss.
  • API-Schlüssel gelangen nie in Test-Container. lint ruft nie einen Anbieter auf.
  • Bei Anbieterfehlern und erschöpften Budgets bleiben die deterministischen Ergebnisse erhalten, und die Untersuchung wird als unvollständig markiert; mit --ci erfordert das ein menschliches Review.