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 --planundreview --planden 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 (
-cioder--ci). Boolesche Werte werden mit--cioder--ci=truegesetzt und mit--checks=falsezurückgesetzt. Ein Wert wird als--base mainoder--base=mainangegeben. - Führen Sie
probe <command> --helpaus, 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.
| Form | Vergleicht |
|---|---|
--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 --exact | Von der Spitze von main direkt bis --head. |
BASE..HEAD | Die beiden exakten Commits, zum Beispiel HEAD~1..HEAD, um den letzten Commit zu prüfen. Überschreibt --base, --head und --exact. |
BASE...HEAD | Von 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.
| Flag | Standard | Beschreibung |
|---|---|---|
--base REV | main | Basis-Branch oder -Revision. Der Vergleich beginnt an ihrer Merge-Basis mit --head; ihre Spitze liefert die vertrauenswürdige Policy. |
--head REV | HEAD | Zu prüfende Kandidaten-Revision. |
--exact | false | Die 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 PATH | Policy der Basis | Diese lokale Policy-Datei statt .probe.json aus dem Basis-Branch verwenden. Übergeben Sie nur eine Datei, der Sie vertrauen. |
--out DIR | .probe | Berichtsverzeichnis, relativ zum Repository-Stamm. Der Pfad darf keine symbolischen Links enthalten. |
--format LIST | markdown,json | Kommagetrennte 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. |
--impact | true | Den 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. |
--ci | false | Mit 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, --reviewer | false | Muss 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.
| Flag | Standard | Beschreibung |
|---|---|---|
--base REV | main | Basis-Branch oder -Revision. Der Vergleich beginnt an ihrer Merge-Basis mit --head; ihre Spitze liefert die vertrauenswürdige Policy. |
--head REV | HEAD | Zu prüfende Kandidaten-Revision. |
--exact | false | Die Basis-Revision selbst statt der Merge-Basis vergleichen. |
BASE..HEAD | — | Positionsbereich; siehe Revisionen wählen. |
--repo PATH | . | Repository-Verzeichnis. |
--config PATH | Policy der Basis | Diese 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 | .probe | Berichtsverzeichnis, relativ zum Repository-Stamm. Artefakte landen in DIR/artifacts/. |
--format LIST | markdown,json | Kommagetrennte 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. |
--ci | false | Mit Code 2 beenden, wenn ein menschliches Review erforderlich ist, auch bei Hochrisikosignalen, nicht verifizierten Bereichen oder unvollständigen Prüfungen. |
--checks | true | Die konfigurierten Prüfungen in der Sandbox ausführen. --checks=false überspringt sie; ein konfigurierter Reviewer kann trotzdem Sandbox-Experimente durchführen. |
--reviewer | auto | KI-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 N | Policy (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-network | false | Sandbox-Containern Netzwerkzugriff geben. Wirkt nur, wenn die vertrauenswürdige Policy ebenfalls sandbox.network: true setzt. |
--no-network | false | Sandbox-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. |
--impact | true | Den statischen Auswirkungsindex der geänderten Funktionen erstellen. --impact=false überspringt ihn (und kann nicht mit --impacted-tests kombiniert werden). |
--impacted-tests v0.4 | false | Die 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.4 | false | Die Baseline-Version jeder Go-Testfunktion, die die Änderung modifiziert oder entfernt hat, auf Baseline- und Kandidaten-Code ausführen. |
--fuzz v0.4 | true | Das 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.4 | 1 | Die 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.4 | false | Dem 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.
| Flag | Standard | Beschreibung |
|---|---|---|
--intent-file PATH, --intent TEXT | — | Die zu planende Änderung. Erforderlich; höchstens 64 KiB UTF-8, eingelesen wie der Review-Intent. |
--base REV | main | Die Revision, von der der Plan ausgeht. Ihre Spitze liefert die vertrauenswürdige Policy. |
--config PATH | Policy der Basis | Explizite, vertrauenswürdige lokale Policy. |
--out DIR | .probe | Ausgabeverzeichnis, relativ zum Repository. |
--ci | false | Exit-Code 2, wenn eine Kategorie markiert ist oder etwas nicht verifiziert wurde. |
--max-iterations N | Policy | Das Iterationsbudget des Anbieters überschreiben, 1 bis 100. |
--reviewer | true | Ein 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:
| Kategorie | Signale |
|---|---|
| Kritische Bereiche | plan_critical_path (ein geplanter Pfad passt zu sensitive_paths), plan_sensitive_symbol (ein Name aus Authentifizierung, Autorisierung oder Zahlung). |
| Architektur | plan_exported_signature, plan_dependency_change, plan_new_package. |
| Regressionsrisiko | plan_wide_impact (10 oder mehr Aufrufer), plan_untested_impact (Aufrufer, aber kein erreichender Test), gemessen am statischen Index des Basis-Commits. |
| Andere größere Änderung | plan_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.
| Eintrag | Schweregrad | Wann |
|---|---|---|
unplanned_file | mittel | Eine geänderte Datei, die der Plan nicht aufführt (unplanned_test_file, niedrig, für eine Testdatei). |
unannounced_exported_change | hoch | Eine exportierte Go-Deklaration wurde geändert oder entfernt, ohne als signature oder remove angekündigt zu sein. |
unannounced_critical_path | hoch | Ein geänderter Pfad passt zu einem kritischen Glob der Policy dieses Reviews, und der Plan hat ihn nicht aufgeführt. |
unannounced_dependency_change | mittel | Ein Abhängigkeitsmanifest wurde geändert, ohne deklariert zu sein. |
planned_file_untouched | niedrig | Eine 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.
| Entscheidung | Wann |
|---|---|
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.
| Flag | Standard | Beschreibung |
|---|---|---|
--repo PATH | . | Verzeichnis, in dem .probe.json angelegt wird. |
--language NAME | erkannt | go, 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.
| Flag | Standard | Beschreibung |
|---|---|---|
--input PATH | .probe/confidence-report.json | Gespeicherter JSON-Bericht (Version 1, höchstens 64 MiB). |
--out DIR | .probe | Ausgabeverzeichnis, relativ zum aktuellen Verzeichnis. |
--format LIST | markdown,json | Kommagetrennte 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
| Befehl | Gibt aus |
|---|---|
probe version, --version | Die Version, zum Beispiel probe v0.5.1, und den Lizenzhinweis. |
probe help, -h, --help | Die Kurzübersicht. Ohne Argument gibt Probe denselben Text aus. |
probe <command> --help | Die Flags eines Befehls mit ihren Standardwerten. |
Exit-Codes
| Code | Bedeutung |
|---|---|
0 | Bericht ohne reproduziertes hohes oder kritisches Problem abgeschlossen. Ohne --ci ändern ungeklärte Bereiche diesen Code nicht. |
1 | Eine 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. |
2 | Nur 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. |
3 | Ungültige Argumente, Fehler beim Git-Vergleich oder in der vertrauenswürdigen Konfiguration (einschließlich eines unbekannten Policy-Schlüssels oder Befehlsnamens). |
4 | Betriebsfehler 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.
| Variable | Wirkung |
|---|---|
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_KEY | API-Schlüssel. Der Name wird durch reviewer.api_key_env festgelegt; dies ist der Standard. |
PROBE_API_KEY_FILE | Pfad 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_KEY | Docker-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
| Pfad | Inhalt |
|---|---|
.probe/CONFIDENCE_REPORT.md | Der 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.json | Dieselben 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.4 | Mit --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.4 | Mit --format pr-comment: ein Pull-Request-Kommentar mit einem Statusblock und jedem durch Nachweise gestützten Befund. |
.probe/PLAN.json, PLAN.md | Geschrieben 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.
| Art | Schweregrad | Ausgelöst, wenn |
|---|---|---|
sensitive_path | hoch | Ein geänderter Pfad passt zu einem Glob aus sensitive_paths. |
private_key | kritisch | Eine 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_secret | hoch | Eine 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_url | hoch | Eine hinzugefügte URL enthält user:password@ oder einen Query-Parameter mit geheimnisartigem Namen (api_key=, token=, password=…). |
tls_verification_disabled | hoch | InsecureSkipVerify: true, verify=False, rejectUnauthorized: false, NODE_TLS_REJECT_UNAUTHORIZED=0, curl -k, sslmode=disable, TLS 1.0/1.1 als Minimum und Ähnliches. |
excessive_permissions | hoch | Fü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_disabled | hoch | CSRF 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_enabled | mittel | DEBUG = True, debug: true, app.run(debug=True), FLASK_DEBUG=1, gin.DebugMode und Ähnliches. |
hardcoded_email, hardcoded_ip | niedrig | Eine 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_change | hoch | Der 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_change | hoch | Der Rumpf einer Go-Funktion, deren Name auf Zahlungen hindeutet (payment, refund, charge, capture, withdraw, deposit, balance…), wurde geändert. |
validation_removed | hoch | Eine entfernte Zeile rief eine Validierungs-, Assertion- oder Bereinigungsfunktion auf oder löste einen Validierungsfehler aus. |
public_api_change | hoch mittel | Go: 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_write | hoch | Eine geänderte Zeile sieht wie eine Datenbankänderung oder Transaktion aus (INSERT, UPDATE … SET, .Exec(, .Commit(…). |
dynamic_execution | hoch | eval, Prozessausführung, subprocess, child_process, innerHTML und Ähnliches. |
type_suppression | hoch | Unterdrückung von Typ- oder Lint-Prüfungen wie @ts-ignore, as any, unsafe, nolint, eslint-disable. |
migration_change | hoch | Ein Pfad, der migration enthält oder auf .sql endet, wurde geändert. |
infrastructure_change | hoch | Ein GitHub-Workflow, ein Dockerfile oder eine Terraform-Datei wurde geändert. |
file_type_change | hoch | Git meldet eine Typänderung, zum Beispiel wenn eine Datei zu einem symbolischen Link wird. |
network_change | mittel | Eine geänderte Zeile führt HTTP-, gRPC- oder Socket-Aufrufe aus oder enthält eine URL. |
error_handling_change | mittel | Fehlerprüfungen, Wrapping, panic/recover, catch oder except wurden geändert. |
dependency_change | mittel | Ein Abhängigkeitsmanifest oder eine Lockfile wurde geändert (go.mod, package.json, Cargo.lock, pyproject.toml…). |
uncovered_change | mittel niedrig | Hinzugefügte Go-Zeilen wurden vom aufgezeichneten coverage-Lauf nicht ausgeführt. Niedrig, wenn der Coverage-Lauf selbst fehlschlug. |
branch_growth | mittel | In einer Datei wurden mindestens fünf Zeilen mit Verzweigungskonstrukten mehr hinzugefügt als entfernt. Keine Komplexitätsmetrik. |
large_change | mittel | Mehr als 400 geänderte Zeilen in einer Datei. |
file_deleted | mittel | Eine versionierte Datei wurde entfernt. |
binary_change | mittel | Eine Binärdatei wurde geändert und kann nicht als Text analysiert werden. |
analysis_limited | mittel | Die 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.4 | hoch | Einer Testdatei wurde ein Fokus-Marker hinzugefügt (it.only, fdescribe…). |
test_assertion_removed, test_case_removed v0.4 | mittel | Eine 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.4 | mittel | Ein 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.4 | mittel | Eine Mutation einer hinzugefügten Go-Zeile ließ keinen Test ihres Pakets fehlschlagen. Die Mutante kann äquivalent sein. |
prepare_input_changed v0.4 | mittel | Die Änderung betrifft eine Datei, die in prepare.inputs der Policy aufgeführt ist; die Abhängigkeitsschicht wurde weiterhin aus dem Basis-Commit gebaut. |
plan_drift | hoch mittel niedrig | Mit --plan: Der Diff verlässt den Vertrag des Plans. Siehe Abweichung vom Umfang. |
impacted_caller | niedrig | Unveränderter Code ruft laut Auswirkungsindex eine geänderte Funktion auf. Höchstens 10 pro Funktion und 100 pro Lauf. |
no_test_change | niedrig | Eine Quelldatei wurde geändert, aber keine Testdatei im selben Verzeichnis oder mit demselben Namensstamm. Die vorhandene Coverage wird nicht gemessen. |
todo_added | niedrig | Ein 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.
| Sprache | Wie indexiert wird | Auflösung |
|---|---|---|
| Go | Mit 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, Rust | Lexikalisch 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
| Funktion | Go | TS/JS | Python | Rust |
|---|---|---|---|---|
| Risikosignale und Regeln gegen abgeschwächte Tests | syntaxbewusst | Text | Text | Text |
| Auswirkungsindex und Symbolwerkzeuge des Reviewers | typgeprüft | lexikalisch | lexikalisch | lexikalisch |
Sandbox-Prüfungen und Standardwerte von init | ja | ja | ja | ja |
| Verifizierte generierte Tests | ja | ja (Jest/Vitest-JSON) | ausgeführt, nicht nach Namen verifiziert | kein Standardbefehl |
| Differenzielles Fuzzing | ja | ja | — | — |
Coverage, Mutation, --base-tests, --impacted-tests | ja | — | — | — |
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üssel | Typ | Standard | Beschreibung |
|---|---|---|---|
version | Integer | 1 | Version des Policy-Formats. Muss 1 sein. |
language | String | erkannt | Von init geschriebene Sprache. Nur zur Information. |
fuzz, mutation, prepare v0.4 | Objekt | nicht gesetzt | Optionale 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üssel | Platzhalter | Beschreibung |
|---|---|---|
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üssel | Standard | Erlaubt | Beschreibung |
|---|---|---|---|
sandbox.image | golang:1.26-bookworm | Image-Name | Vorab geladenes Image mit Toolchain und Abhängigkeiten. Wird von Probe nie gepullt; pinnen Sie es nach Möglichkeit per Digest. |
sandbox.network | false | Boolean | Container-Netzwerk erlauben. Erfordert zusätzlich --allow-network in der Befehlszeile. |
sandbox.timeout_seconds | 120 | 1–3600 | Zeitlimit jedes Befehls. |
sandbox.max_runtime_seconds | 600 | 1–7200 | Gesamte Sandbox-Zeit des Laufs, geteilt zwischen Prüfungen und Experimenten. |
sandbox.max_output_bytes | 65536 | 1024–4194304 | Pro Befehl aufbewahrte Ausgabe. |
sandbox.memory_mb | 1024 | 128–32768 | Speicherlimit jedes Containers, in MiB. |
sandbox.cpus | 2 | 1–32 | CPU-Limit jedes Containers. |
reviewer
| Schlüssel | Standard | Erlaubt | Beschreibung |
|---|---|---|---|
reviewer.model | "" | Modell-ID | Modell mit Tool-Unterstützung. Leer deaktiviert den Reviewer. Wird durch PROBE_REVIEWER_MODEL überschrieben. |
reviewer.endpoint | https://api.openai.com/v1/chat/completions | URL | Chat-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_env | PROBE_API_KEY | Variablenname | Umgebungsvariable, 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_iterations | 20 | 1–100 | Modellrunden pro Untersuchung. --max-iterations überschreibt den Wert. |
reviewer.max_generated_tests | 10 | 0–100 | Temporäre Tests, die der Reviewer anlegen darf. |
reviewer.timeout_seconds | 600 | 1–1800 | Gesamtzeit der Untersuchung. |
reviewer.max_input_bytes | 131072 | 4096–2097152 | Obergrenze 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-Glob | Deckt ab |
|---|---|
**/auth/** | Jedes auth-Verzeichnis. |
**/payment*/** | payment, payments und ähnliche Verzeichnisse. |
**/migrations/** | Datenbankmigrationen. |
.github/workflows/** | CI-Workflows. |
.probe.json | Die 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üssel | Standard | Erlaubt |
|---|---|---|
fuzz.max_functions | 8 | 1–32 Funktionen pro Review |
fuzz.max_packages | 4 | 1–16 Go-Pakete und TS/JS-Module |
fuzz.max_inputs | 64 | 1–256 Eingaben pro Funktion |
fuzz.call_timeout_ms | 1000 | 10–10000, höchstens das Befehls-Timeout |
fuzz.max_runtime_seconds | 240 | 1–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üssel | Erlaubt |
|---|---|
mutation.command | go 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_mutants | 1–200. |
mutation.timeout_seconds | 1 bis sandbox.timeout_seconds, pro Lauf. |
mutation.max_runtime_seconds | timeout_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üssel | Standard | Beschreibung |
|---|---|---|
prepare.command | erforderlich | Argv mit 1 bis 128 Argumenten; es werden keine Platzhalter ersetzt. |
prepare.inputs | erforderlich | 1 bis 64 Muster relativ zum Repository (* überschreitet nie /, kein **). |
prepare.network | false | Netzwerk 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_seconds | 600 | 1–3600. |
prepare.env | keine | Bis 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_mb | 4096 | 1–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.
| Sprache | Image | Befehle |
|---|---|---|
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 · kein generated_test |
unknown | golang:1.26-bookworm | Keine 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,
--configoder 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.
lintruft nie einen Anbieter auf. - Bei Anbieterfehlern und erschöpften Budgets bleiben die deterministischen Ergebnisse erhalten, und die Untersuchung wird als unvollständig markiert; mit
--cierfordert das ein menschliches Review.
Nichts in der Referenz passt zu diesem Filter.