Référence

Référence de la ligne de commande

Chaque commande, option, code de sortie, variable d’environnement, clé de politique et signal de risque de la version actuelle de Probe (dernière version : v0.5.1). Avec un binaire antérieur à v0.4.0, les éléments marqués v0.4 provoquent une sortie avec le code 3 ; consultez l’ordre des versions avant d’en figer une en CI. Appuyez sur / pour rechercher.

Cette page couvre Probe pour le code, l’outil en ligne de commande. Vous surveillez des fichiers Word, Excel ou PowerPoint ? Consultez Probe Desktop.

Synopsis

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 analyse une modification de façon statique. Il n’exécute jamais le code du dépôt et n’appelle jamais de fournisseur d’IA.
  • review ajoute des vérifications en bac à sable dans Docker, les étapes de preuve optionnelles (tests de référence modifiés, tests impactés, fuzzing différentiel, mutation, préparation des dépendances) et, lorsqu’un modèle est configuré, une investigation par IA.
  • plan demande au fournisseur configuré un plan d’implémentation avant l’écriture du moindre code, l’évalue avec des règles fixes et le transforme en un contrat auquel lint --plan et review --plan comparent le diff.
  • Seuls les fichiers commités sont analysés ; les modifications non commitées et les fichiers non suivis sont ignorés.
  • Par défaut, les rapports sont écrits dans .probe/ dans le dépôt. La sortie console reste concise.
  • Les options acceptent un ou deux tirets (-ci ou --ci). Les booléens s’activent avec --ci ou --ci=true et se désactivent avec --checks=false. Une valeur s’écrit --base main ou --base=main.
  • Lancez probe <command> --help pour afficher les options d’une commande.

Choisir les révisions

Les deux côtés d’une comparaison sont résolus en identifiants de commit immuables, enregistrés dans le rapport. Les renommages, suppressions, fichiers binaires et changements de type de fichier sont pris en charge.

FormeCompare
--base main (par défaut)De la base de fusion de main et --head jusqu’à --head, comme une pull request. Les commits ajoutés à main depuis le point de branchement ne font pas partie de la modification.
--base main --exactDe la pointe de main directement jusqu’à --head.
BASE..HEADLes deux commits exacts, par exemple HEAD~1..HEAD pour relire le dernier commit. Remplace --base, --head et --exact.
BASE...HEADDe la base de fusion des deux révisions jusqu’à HEAD.

Une plage peut figurer avant ou après les options : probe review main..HEAD --ci et probe review --ci main..HEAD sont équivalents. Une seule plage est acceptée au maximum. Toute révision comprise par Git fonctionne : branches, tags, origin/main, HEAD~3 ou un identifiant de commit. Les jobs de CI ont besoin d’un historique suffisant pour résoudre la base (par exemple fetch-depth: 0).

La politique de confiance est toujours lue depuis la branche de base, jamais depuis la modification relue : une pull request ne peut donc pas assouplir ses propres règles.

probe lint

Analyse statique d’une modification : comparaison Git, signaux de risque et rapport. Pas de Docker, pas d’appel à un fournisseur, aucune exécution du code du dépôt. Sans danger sur des branches non fiables.

OptionDéfautDescription
--base REVmainBranche ou révision de base. La comparaison démarre à sa base de fusion avec --head ; sa pointe fournit la politique de confiance.
--head REVHEADRévision candidate en cours de relecture.
--exactfalseComparer à la révision de base elle-même plutôt qu’à la base de fusion.
BASE..HEAD—Plage positionnelle ; voir Choisir les révisions.
--repo PATH.Répertoire du dépôt. N’importe quel répertoire de l’arbre de travail convient.
--config PATHpolitique de la baseUtiliser ce fichier de politique local au lieu du .probe.json de la branche de base. Ne passez qu’un fichier de confiance.
--out DIR.probeRépertoire des rapports, relatif à la racine du dépôt. Le chemin ne peut pas contenir de liens symboliques.
--format LISTmarkdown,jsonFormats de rapport à écrire, séparés par des virgules : markdown, json, sarif v0.4, pr-comment v0.4. Voir Fichiers produits.
--report-url URL v0.4—Un lien https vers le rapport complet, cité dans PR_COMMENT.md. Nécessite le format pr-comment ; une URL qui semble contenir un identifiant secret est refusée avec le code de sortie 3.
--impacttrueConstruire l’index d’impact statique des fonctions modifiées. --impact=false l’ignore.
--plan PATH—Un PLAN.json écrit par probe plan : comparer le diff à son contrat et ajouter une section et des signaux plan_drift.
--cifalseSortir avec le code 2 lorsqu’une relecture humaine est requise. Voir Codes de sortie.
--intent TEXT—Intention ou critères d’acceptation de la pull request, enregistrés dans le rapport (64 Kio au maximum).
--intent-file PATH—Lire l’intention depuis un fichier UTF-8. Incompatible avec --intent.
--checks, --reviewerfalseDoivent rester à false : lint sort avec le code 3 si l’une d’elles est activée. Utilisez review. Les options d’étapes réservées à review (--base-tests, --impacted-tests, --fuzz, --cache-dir, --parallel, --deadline, --allow-prepare-network) sont refusées de la même façon.
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

Tout ce que fait lint, plus les commandes test, typecheck, build et coverage de la politique dans des conteneurs Docker jetables, plus une investigation par IA lorsqu’un modèle est configuré. Nécessite Docker avec des conteneurs Linux et une sandbox.image préchargée.

OptionDéfautDescription
--base REVmainBranche ou révision de base. La comparaison démarre à sa base de fusion avec --head ; sa pointe fournit la politique de confiance.
--head REVHEADRévision candidate en cours de relecture.
--exactfalseComparer à la révision de base elle-même plutôt qu’à la base de fusion.
BASE..HEAD—Plage positionnelle ; voir Choisir les révisions.
--repo PATH.Répertoire du dépôt.
--config PATHpolitique de la baseUtiliser ce fichier de politique local au lieu du .probe.json de la branche de base, par exemple pour essayer une politique avant de la commiter. Ne passez qu’un fichier de confiance : il décide de ce qui s’exécute et de l’endroit où le code source est envoyé.
--out DIR.probeRépertoire des rapports, relatif à la racine du dépôt. Les artefacts vont dans DIR/artifacts/.
--format LISTmarkdown,jsonFormats de rapport à écrire, séparés par des virgules : markdown, json, sarif v0.4, pr-comment v0.4.
--report-url URL v0.4—Un lien https vers le rapport complet, cité dans PR_COMMENT.md. Nécessite le format pr-comment.
--cifalseSortir avec le code 2 lorsqu’une relecture humaine est requise, notamment en cas de signaux à risque élevé, de zones non vérifiées ou de vérifications incomplètes.
--checkstrueExécuter les vérifications configurées dans le bac à sable. --checks=false les ignore ; un relecteur configuré peut encore lancer des expériences dans le bac à sable.
--reviewerautoInvestigation par IA. Activée automatiquement lorsqu’un modèle est défini dans la politique de confiance ou dans PROBE_REVIEWER_MODEL. --reviewer=false désactive tout appel à un fournisseur ; --reviewer échoue avec le code 3 si aucun modèle n’est configuré.
--max-iterations Npolitique (20)Remplacer reviewer.max_iterations pour cette exécution, de 1 à 100.
--intent TEXT—Intention ou critères d’acceptation de la pull request (64 Kio au maximum). Enregistrés dans le rapport et transmis au relecteur.
--intent-file PATH—Lire l’intention depuis un fichier UTF-8. Incompatible avec --intent.
--allow-networkfalseDonner l’accès réseau aux conteneurs du bac à sable. Effectif uniquement si la politique de confiance définit aussi sandbox.network: true.
--no-networkfalseForcer la désactivation du réseau du bac à sable. N’affecte pas les appels d’API du relecteur ; ajoutez --reviewer=false pour cela.
--plan PATH—Comparer le diff au contrat d’un PLAN.json. Une modification qui dérive demande une relecture humaine (code 2 avec --ci), jamais le code 1.
--impacttrueConstruire l’index d’impact statique des fonctions modifiées. --impact=false l’ignore (et ne peut pas être combiné avec --impacted-tests).
--impacted-tests v0.4falseExécuter, sur la base et sur le candidat, les tests Go inchangés que l’index d’impact désigne comme atteignant une fonction modifiée. Un test qui réussit sur la base et échoue sur le candidat est FAILS_ON_CANDIDATE : une raison de relire, pas un défaut.
--base-tests v0.4falseExécuter la version de base de chaque fonction de test Go modifiée ou supprimée par la modification, sur le code de base et sur le code candidat.
--fuzz v0.4trueExécuter le fuzzing différentiel configuré par l’objet fuzz de la politique. --fuzz=false enregistre l’étape comme désactivée.
--cache-dir DIR v0.4—Cache optionnel des exécutions de base, hors du dépôt et du répertoire de sortie. Une exécution de base rejouée ne vient jamais étayer un résultat positif.
--parallel N v0.41Exécuter les vérifications initiales N à la fois, de 1 à 4.
--deadline D v0.4—Durée maximale de l’exécution, de 1m à 24h ; 30 secondes sont réservées au nettoyage et au rapport.
--allow-prepare-network v0.4falseDonner l’accès réseau au conteneur prepare, uniquement si le prepare.network de la politique l’autorise aussi. Les vérifications restent hors ligne.
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 préparation des dépendances s’exécute en premier, lorsque la politique contient un objet prepare. Les vérifications s’exécutent ensuite dans l’ordre test, typecheck, build, puis coverage, suivies des étapes de preuve et du relecteur. Chaque conteneur tourne sans root, avec une racine et un montage des sources en lecture seule, sans capacité ajoutée, sans réseau par défaut, et avec les limites de CPU, de mémoire, de PID et de durée de la politique du bac à sable. Le socket Docker, votre copie de travail et les clés d’API ne sont jamais montés. Si Docker ou l’image est absent, l’exécution se termine avec le code 4 ; rien ne bascule jamais sur votre machine hôte.

probe plan

Avant l’écriture de la modification : le fournisseur configuré simule, en lecture seule, la façon dont il implémenterait une intention au commit de base et soumet un plan structuré (fichiers, symboles, dépendances, étapes). Probe l’évalue avec des règles fixes et écrit PLAN.json et PLAN.md. Le modèle produit le plan ; il n’en juge jamais le risque. Rien n’est modifié ni exécuté.

OptionDéfautDescription
--intent-file PATH, --intent TEXT—La modification à planifier. Obligatoire ; 64 Kio d’UTF-8 au maximum, lus comme l’intention de review.
--base REVmainLa révision dont part le plan. Sa pointe fournit la politique de confiance.
--config PATHpolitique de la basePolitique locale de confiance explicite.
--out DIR.probeRépertoire de sortie, relatif au dépôt.
--cifalseSortir avec le code 2 lorsqu’une catégorie est signalée ou qu’un élément n’a pas été vérifié.
--max-iterations NpolitiqueRemplacer le budget d’itérations du fournisseur, de 1 à 100.
--reviewertrueUn fournisseur est obligatoire : sans modèle configuré, ou avec --reviewer=false, plan sort avec le code 3 et n’écrit rien.

Les outils du planificateur sont en lecture seule et travaillent sur un instantané du commit de base : list_files, read_file, search_code et, adossés à l’index, find_references, inspect_symbol et find_callers, puis submit_plan une seule fois. L’évaluation signale quatre catégories à partir du plan et du commit de base uniquement :

CatégorieSignaux
Parties critiquesplan_critical_path (un chemin prévu correspond à sensitive_paths), plan_sensitive_symbol (un nom lié à l’authentification, l’autorisation ou le paiement).
Architectureplan_exported_signature, plan_dependency_change, plan_new_package.
Risque de régressionplan_wide_impact (10 appelants ou plus), plan_untested_impact (des appelants mais aucun test qui les atteint), mesurés sur l’index statique du commit de base.
Autre modification majeureplan_file_deletion, plan_large_scope (20 fichiers ou plus), plan_inconsistent, plan_unmeasured.

Codes de sortie : 0 ; 2 avec --ci lorsqu’une catégorie est signalée ; 3 utilisation ou configuration ; 4 échec du fournisseur ou aucun plan accepté.

Dérive du périmètre : --plan

lint --plan et review --plan lisent le contrat du plan et le comparent au diff réel. Chaque écart dans le diff devient aussi un signal plan_drift. La section est drifted lorsqu’un élément est de niveau moyen ou supérieur.

ÉlémentGravitéQuand
unplanned_filemoyenneUn fichier modifié que le plan ne liste pas (unplanned_test_file, faible, pour un fichier de test).
unannounced_exported_changeélevéeUne déclaration Go exportée modifiée ou supprimée sans avoir été annoncée comme signature ou remove.
unannounced_critical_pathélevéeUn chemin modifié correspond à un motif critique de la politique de cette review et le plan ne le listait pas.
unannounced_dependency_changemoyenneUn manifeste de dépendances a changé sans avoir été déclaré.
planned_file_untouchedfaibleUn fichier prévu que la modification ne touche pas (section uniquement).
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

La plan gate

review --plan se termine par une décision, plan_drift.decision, affichée sur stdout et en tête de la section Plan Conformance. Avec --ci, c’est le code de sortie.

DécisionQuand
no_human_review_required (code 0)Toutes les conditions suivantes : le plan, réévalué par la review à partir de sa proposition à son commit de base avec la politique de confiance de cette review, ne signale aucune catégorie et ne présente aucune lacune de mesure ; la modification est conforme au plan et à sa base ; au moins une vérification s’est exécutée et toutes ont réussi ; aucun problème reproduit, signal élevé ou critique, zone non vérifiée ni autre section demandant une relecture.
human_review_required (code 2)Tout autre cas. Chaque raison est listée dans plan_drift.decision_reasons. lint --plan n’exécute aucune vérification : il exige donc toujours une relecture.

Les options et le contrat stockés dans PLAN.json ne sont jamais considérés comme fiables : le contrat est redérivé de la proposition, si bien qu’un plan modifié ne peut pas élargir le périmètre sans évaluation, et probe report recalcule la décision à partir du rapport enregistré. La gate est une décision de processus, pas un verdict sur la correction. Un plan qui ne signale rien ne prouve pas que la modification est sûre, et la dérive ne vérifie pas que la modification met en œuvre l’intention. Voir les plans préalables et la recette CI.

probe init

Écrit un .probe.json de départ pour le projet. Refuse d’écraser un fichier existant. Relisez les commandes et l’image, puis commitez le fichier sur votre branche de base.

OptionDéfautDescription
--repo PATH.Répertoire dans lequel créer .probe.json.
--language NAMEdétectégo, typescript, javascript, python, rust ou unknown. Détecté à partir de go.mod/go.work, Cargo.toml, tsconfig.json, package.json, puis pyproject.toml/setup.py/requirements.txt. Sélectionne les valeurs par défaut.

probe report

Régénère le rendu d’un rapport JSON enregistré, par exemple pour recréer le Markdown ou produire du SARIF en CI. Rien n’est réexécuté, et le nouveau rendu n’authentifie pas les preuves qu’il contient ; chaque statut est redérivé des vérifications enregistrées, si bien qu’un rapport modifié est corrigé plutôt que cru sur parole.

OptionDéfautDescription
--input PATH.probe/confidence-report.jsonRapport JSON enregistré (version 1, 64 Mio au maximum).
--out DIR.probeRépertoire de sortie, relatif au répertoire courant.
--format LISTmarkdown,jsonFormats à écrire, séparés par des virgules : markdown, json, sarif v0.4, pr-comment v0.4.
--report-url URL v0.4—Un lien https vers le rapport complet, cité dans PR_COMMENT.md.

probe version et aide

CommandeAffiche
probe version, --versionLa version, par exemple probe v0.5.1, et la mention de licence.
probe help, -h, --helpLe synopsis. Sans argument, Probe affiche le même texte.
probe <command> --helpLes options d’une commande, avec leurs valeurs par défaut.

Codes de sortie

CodeSignification
0Rapport terminé sans problème élevé ou critique reproduit. Sans --ci, les zones non résolues ne modifient pas ce code.
1Une hypothèse élevée ou critique est étayée par un échec différentiel : un test généré a réussi sur la base et échoué sur le candidat. Rien d’autre ne produit 1 : ni une divergence de fuzzing, ni un mutant survivant, ni l’échec d’un test impacté ou de base, ni une dérive par rapport au plan.
2Avec --ci uniquement : relecture humaine requise, notamment en cas de signaux à risque élevé, de zones non vérifiées, de vérifications incomplètes, d’un test FAILS_ON_CANDIDATE, d’une divergence de fuzzing ou d’une étape non concluante, d’une dérive par rapport au plan, d’un plan ayant signalé une catégorie (la plan gate) ou (pour plan) d’une catégorie signalée.
3Arguments invalides, comparaison Git ou configuration de confiance (y compris une clé de politique ou un nom de commande inconnus).
4Erreur opérationnelle du harnais, de l’analyse ou de l’écriture du rapport, par exemple Docker ou l’image du bac à sable indisponibles, une vérification qui n’a pas pu s’exécuter, un échec de préparation des dépendances ou une défaillance du fournisseur pendant plan.

Aucun code ne signifie « approuvé ». Un 0 indique que rien n’a été reproduit, pas que la modification est correcte.

Variables d’environnement

Le fournisseur d’IA relève du déploiement plutôt que du dépôt : ces réglages peuvent donc venir de l’environnement. Rien d’autre ne le peut : l’image, les commandes, les budgets et les chemins sensibles sont toujours décidés par la politique de confiance.

VariableEffet
PROBE_REVIEWER_ENDPOINTRemplace reviewer.endpoint. Mêmes règles d’URL que la politique.
PROBE_REVIEWER_MODELRemplace reviewer.model et, à elle seule, active le relecteur pendant review.
PROBE_API_KEYClé d’API. Le nom est défini par reviewer.api_key_env ; celui-ci est la valeur par défaut.
PROBE_API_KEY_FILEChemin d’un fichier contenant la clé, utilisé lorsque la variable ci-dessus n’est pas définie. Le fichier doit être lisible, sinon l’exécution échoue avec le code 3.
/run/secrets/PROBE_API_KEYSecret Docker lu en dernier, lorsqu’aucune des deux variables n’est définie. Son absence n’est pas une erreur.

Une variable vide est considérée comme non définie. Les fichiers de clé sont lus en entier, espaces de début et de fin retirés, limités à 8 Kio, et doivent tenir sur une seule ligne. Lorsque le relecteur s’exécute, le journal indique la provenance de chaque valeur, jamais la valeur elle-même. Quiconque contrôle cet environnement choisit où le code source expurgé est envoyé : tenez-le à l’écart des jobs qui exécutent du code de forks non fiables.

Fichiers produits

CheminContenu
.probe/CONFIDENCE_REPORT.mdLe rapport à lire : résumé de la modification, vérifications automatisées, résumé de l’investigation, problèmes reproduits, zones non vérifiées, relecture humaine suggérée, surface de relecture, exécution des lignes modifiées, preuves enregistrées et artefacts.
.probe/confidence-report.jsonLes mêmes données pour les outils : identifiants de commit, lignes modifiées, signaux, vérifications, hypothèses, preuves, événements d’audit et empreintes des artefacts. Voir le schéma JSON.
.probe/confidence-report.sarif v0.4Avec --format sarif : un journal SARIF 2.1.0 pour les outils d’analyse de code, ne contenant que des constats étayés par des preuves enregistrées dans le bac à sable. L’absence de constat ne vaut pas approbation.
.probe/PR_COMMENT.md v0.4Avec --format pr-comment : un commentaire de pull request avec un bloc de statut et chaque constat étayé par des preuves.
.probe/PLAN.json, PLAN.mdÉcrit par probe plan : la proposition rédigée par le modèle, l’évaluation déterministe et le contrat (schéma).
.probe/artifacts/Journaux des vérifications, profils de couverture, sources des tests générés, résultats des tests, patchs des mutants et enregistrements de fuzzing, chacun référencé par son empreinte SHA-256 dans le rapport.

Ajoutez .probe/ à .gitignore. La console affiche un seul résumé : fichiers et lignes modifiés, nombre de signaux et de problèmes reproduits, surface de relecture ciblée et exécution des lignes modifiées.

Signaux de risque

Les signaux sont des raisons de regarder, pas des défauts confirmés. Les fichiers Go bénéficient d’une analyse syntaxique ; TypeScript/JavaScript, Python, Rust et les autres langages utilisent des heuristiques textuelles étiquetées comme telles. Les signaux portant sur les mêmes lignes sont fusionnés en une seule plage de relecture dans le rapport. Les signaux au niveau du fichier (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) concernent le fichier, pas une ligne : le rapport les liste sous le fichier avec la mention fichier entier, et le JSON les marque "scope": "file". Leur line ne sert qu’à les placer sur la première ligne modifiée du fichier.

TypeGravitéLevé lorsque
sensitive_pathélevéeUn chemin modifié correspond à un motif sensitive_paths.
private_keycritiqueUne ligne ajoutée ouvre un bloc de clé privée PEM (RSA, DSA, EC, OpenSSH, PGP, chiffrée) ou une clé PuTTY. La clé n’est jamais copiée dans le rapport.
hardcoded_secretélevéeUne ligne ajoutée présente la forme d’un identifiant secret (clés AWS, GitHub, GitLab, Slack, Stripe, Google, fournisseur de LLM, npm, Twilio/SendGrid, stockage Azure, JWT) ou affecte une chaîne littérale d’au moins 8 caractères contenant un chiffre ou un symbole à une clé au nom de secret (password, api_key, token, client_secret…). Les valeurs fictives, les modèles et les lectures depuis l’environnement ou un coffre-fort sont ignorés ; la valeur est masquée dans les preuves.
credential_in_urlélevéeUne URL ajoutée contient user:password@ ou un paramètre de requête au nom de secret (api_key=, token=, password=…).
tls_verification_disabledélevéeInsecureSkipVerify: true, verify=False, rejectUnauthorized: false, NODE_TLS_REJECT_UNAUTHORIZED=0, curl -k, sslmode=disable, versions minimales TLS 1.0/1.1 et équivalents.
excessive_permissionsélevéeDroits en écriture pour tous (chmod 777, 0666 dans les API de fichiers), conteneurs privilégiés, élévation de privilèges, runAsUser: 0, USER root, PID ou réseau de l’hôte, SYS_ADMIN, socket Docker monté, NOPASSWD: ALL.
protection_disabledélevéeCSRF désactivé ou exempté, origines CORS génériques, cookies non sécurisés, échappement automatique des templates désactivé, algorithme JWT none ou signatures non vérifiées, SELinux, pare-feu, seccomp ou AppArmor désactivés, buckets publics ou entrée 0.0.0.0/0, workflow avec permissions: write-all.
debug_enabledmoyenneDEBUG = True, debug: true, app.run(debug=True), FLASK_DEBUG=1, gin.DebugMode et équivalents.
hardcoded_email, hardcoded_ipfaibleUne adresse e-mail ajoutée, ou une adresse IPv4 dans une chaîne ou une URL, en dehors des tests et de la documentation. Les plages de documentation, de loopback et d’exemple sont ignorées.
auth_changeélevéeLe corps d’une fonction Go dont le nom évoque l’authentification ou l’autorisation a changé, ou une ligne modifiée mentionne authorization, authentication, JWT, bcrypt, argon2, CSRF ou CORS.
sensitive_function_changeélevéeLe corps d’une fonction Go dont le nom évoque les paiements (payment, refund, charge, capture, withdraw, deposit, balance…) a changé.
validation_removedélevéeUne ligne supprimée appelait une fonction de validation, d’assertion ou d’assainissement, ou levait une erreur de validation.
public_api_changeélevée moyenneGo : une déclaration exportée a été supprimée ou modifiée (élevée) ou ajoutée (moyenne). Autres langages : une ligne ressemble à une déclaration publique (moyenne).
database_writeélevéeUne ligne modifiée ressemble à une mutation ou à une transaction en base de données (INSERT, UPDATE … SET, .Exec(, .Commit(…).
dynamic_executionélevéeeval, exécution de processus, subprocess, child_process, innerHTML et équivalents.
type_suppressionélevéeSuppression de contrôle de type ou de lint, par exemple @ts-ignore, as any, unsafe, nolint, eslint-disable.
migration_changeélevéeUn chemin contenant migration ou se terminant par .sql a changé.
infrastructure_changeélevéeUn workflow GitHub, un Dockerfile ou un fichier Terraform a changé.
file_type_changeélevéeGit signale un changement de type, par exemple un fichier devenu lien symbolique.
network_changemoyenneUne ligne modifiée effectue des appels HTTP, gRPC ou socket, ou contient une URL.
error_handling_changemoyenneDes vérifications d’erreur, des encapsulations, panic/recover, catch ou except ont changé.
dependency_changemoyenneUn manifeste de dépendances ou un fichier de verrouillage a changé (go.mod, package.json, Cargo.lock, pyproject.toml…).
uncovered_changemoyenne faibleDes lignes Go ajoutées n’ont pas été exécutées par l’exécution coverage enregistrée. Faible lorsque l’exécution de couverture a elle-même échoué.
branch_growthmoyenneAu moins cinq lignes contenant des branchements ont été ajoutées de plus que supprimées dans un fichier. Ce n’est pas une mesure de complexité.
large_changemoyennePlus de 400 lignes modifiées dans un même fichier.
file_deletedmoyenneUn fichier suivi a été supprimé.
binary_changemoyenneUn fichier binaire a changé et ne peut pas être analysé comme du texte.
analysis_limitedmoyenneL’analyse des déclarations Go n’a pas pu aboutir pour un fichier, par exemple parce qu’il ne se parse pas, ou l’index d’impact était limité ou indisponible pour des fonctions modifiées (symbole impact_index).
test_focus_added v0.4élevéeUn marqueur de focus a été ajouté à un fichier de test (it.only, fdescribe…).
test_assertion_removed, test_case_removed v0.4moyenneUn fichier de test a perdu plus de lignes d’assertion, ou de déclarations de test, qu’il n’en a gagné. Règles pour Go, TS/JS, Python et Rust.
test_skip_added, test_expectation_relaxed v0.4moyenneUn marqueur d’omission a été ajouté (t.Skip, it.skip, @pytest.mark.skip, #[ignore]…), ou des attentes exactes ont été remplacées par des attentes plus lâches dans un bloc de diff.
surviving_mutant v0.4moyenneUne mutation d’une ligne Go ajoutée n’a fait échouer aucun test de son package. Le mutant est peut-être équivalent.
prepare_input_changed v0.4moyenneLa modification touche un fichier listé dans le prepare.inputs de la politique ; la couche de dépendances a tout de même été construite à partir du commit de base.
plan_driftélevée moyenne faibleAvec --plan : le diff sort du contrat du plan. Voir dérive du périmètre.
impacted_callerfaibleDu code inchangé appelle une fonction modifiée, d’après l’index d’impact. Au plus 10 par fonction et 100 par exécution.
no_test_changefaibleUn fichier source a changé sans qu’aucun fichier de test du même répertoire ou de même radical de nom n’ait changé. La couverture existante n’est pas mesurée.
todo_addedfaibleUn marqueur TODO, FIXME, HACK ou XXX a été ajouté.

Analyse d’impact

Avec --impact (par défaut), lint et review construisent sur l’hôte un index statique du commit candidat, à partir des objets Git commités, sans exécuter le code du dépôt. Pour chaque fonction modifiée, il liste les endroits du code inchangé qui l’appellent et les tests existants qui l’atteignent en 3 appels au plus, ajoute des signaux impacted_caller faibles et alimente les outils find_references, inspect_symbol et find_callers du relecteur.

LangageMode d’indexationRésolution
GoAnalysé et vérifié par typage avec la bibliothèque standard Go, package par package, avec les contraintes de build linux/amd64. Les appels d’interface sont des dispatchs possibles.static, interface
TypeScript/JavaScript, Python, RustAnalysé lexicalement : les fonctions, méthodes et tests sont repérés à partir des tokens, et un appel est relié par son nom aux déclarations homonymes du même langage, en privilégiant la classe de l’appelant, le module ou le type qualifiant et le même fichier. node_modules, dist, target, venv et les répertoires similaires sont ignorés.name

Chaque réponse est approximative : un appelant listé est un endroit à relire, et l’absence d’appelant ne prouve pas qu’il n’en existe aucun. --impacted-tests n’exécute que les tests Go qui atteignent la fonction. Voir l’analyse d’impact.

Langages

FonctionnalitéGoTS/JSPythonRust
Signaux de risque et règles d’affaiblissement des testssyntaxiquetextetextetexte
Index d’impact et outils de symboles du relecteurvérifié par typagelexicallexicallexical
Vérifications en bac à sable et valeurs par défaut de initouiouiouioui
Tests générés vérifiésouioui (JSON Jest/Vitest)exécutés, non vérifiés par nompas de commande par défaut
Fuzzing différentielouioui——
Couverture, mutation, --base-tests, --impacted-testsoui———

Fichier de politique : .probe.json

La politique décide quelles commandes s’exécutent, dans quelle image, avec quelles limites, et si un fournisseur d’IA est utilisé. Elle est lue depuis .probe.json sur la branche de base, ou depuis --config PATH. En son absence, les valeurs par défaut intégrées pour le langage détecté s’appliquent. Les clés omises prennent les valeurs par défaut indiquées ci-dessous.

Le fichier doit être un unique objet JSON de 1 Mio au maximum. Les clés inconnues, les noms de commande inconnus et les clés en double sont rejetés avec le code 3 : un binaire plus ancien rejette donc une clé qu’il ne connaît pas.

CléTypeDéfautDescription
versionentier1Version du format de politique. Doit valoir 1.
languagechaînedétectéLangage écrit par init. À titre informatif.
fuzz, mutation, prepare v0.4objetabsentÉtapes de preuve optionnelles : fuzzing différentiel, mutation des lignes ajoutées et préparation de confiance des dépendances. init ne les écrit jamais.
{
  "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

Chaque commande est un tableau argv, pas une chaîne shell : ["npm", "test"], jamais "npm test". 128 arguments au maximum ; ne configurez que les vérifications que votre projet fournit.

CléPlaceholdersDescription
commands.test—Suite de tests, exécutée par review.
commands.typecheck—Vérification de types ou statique, par exemple go vet ou tsc --noEmit.
commands.build—Commande de build.
commands.generated_test{file}, {package}, {results_out}Manière dont les tests temporaires du relecteur IA (et --impacted-tests) sont exécutés sur la base et sur le candidat. La valeur par défaut pour Go utilise le package du test afin de pouvoir exercer du code non exporté. Les expériences Go vérifiées nécessitent un placeholder de cible unique et autonome ; une commande Jest ou Vitest qui écrit un rapport JSON dans {results_out} rend les expériences TS/JS vérifiables par nom de test.
commands.coverage{coverage_out} (exactement une fois)Go uniquement. Mesure quelles lignes ajoutées une exécution en bac à sable a exécutées. S’exécute en dernier, en plus de test, dans la limite de sandbox.max_runtime_seconds. Ajoutez -coverpkg=./... pour attribuer l’exécution entre packages.

sandbox

CléDéfautAutoriséDescription
sandbox.imagegolang:1.26-bookwormnom d’imageImage préchargée contenant la chaîne d’outils et les dépendances. Jamais téléchargée par Probe ; épinglez-la par digest si possible.
sandbox.networkfalsebooléenAutoriser le réseau des conteneurs. Nécessite aussi --allow-network en ligne de commande.
sandbox.timeout_seconds1201–3600Durée maximale de chaque commande.
sandbox.max_runtime_seconds6001–7200Temps total de bac à sable pour l’exécution, partagé entre vérifications et expériences.
sandbox.max_output_bytes655361024–4194304Sortie capturée conservée par commande.
sandbox.memory_mb1024128–32768Limite de mémoire de chaque conteneur, en Mio.
sandbox.cpus21–32Limite de CPU de chaque conteneur.

reviewer

CléDéfautAutoriséDescription
reviewer.model""identifiant de modèleModèle capable d’utiliser des outils. Vide, il désactive le relecteur. Remplacé par PROBE_REVIEWER_MODEL.
reviewer.endpointhttps://api.openai.com/v1/chat/completionsURLEndpoint Chat Completions avec appel de fonctions ; une URL de base en /v1 fonctionne aussi. HTTPS, ou HTTP en loopback uniquement. Ni identifiants, ni requête, ni fragment ; les redirections sont refusées.
reviewer.api_key_envPROBE_API_KEYnom de variableVariable d’environnement contenant la clé ; <NAME>_FILE et /run/secrets/<NAME> sont consultés ensuite. Vide pour un fournisseur qui n’a pas besoin de clé.
reviewer.max_iterations201–100Tours du modèle par investigation. --max-iterations la remplace.
reviewer.max_generated_tests100–100Tests temporaires que le relecteur peut créer.
reviewer.timeout_seconds6001–1800Temps total de l’investigation.
reviewer.max_input_bytes1310724096–2097152Limite du contexte source envoyé au fournisseur.

sensitive_paths

Motifs glob de chemins qui lèvent toujours un signal sensitive_path élevé lorsqu’ils sont modifiés. Les chemins sont relatifs à la racine du dépôt, avec des barres obliques ; * correspond au sein d’un segment de chemin et ** à travers les segments. Les chemins absolus, les barres obliques inverses et .. sont rejetés.

Motif par défautCouvre
**/auth/**Tout répertoire auth.
**/payment*/**Les répertoires payment, payments et similaires.
**/migrations/**Migrations de base de données.
.github/workflows/**Workflows de CI.
.probe.jsonLa politique elle-même.

fuzz v0.4

Fait passer les mêmes entrées à graine fixe dans chaque fonction Go de niveau package modifiée et chaque fonction TS/JS exportée modifiée (à signature inchangée), sur la base et sur le candidat, puis compare ce que les deux révisions ont enregistré. Une fonction diverged est une observation, jamais un défaut : elle demande une relecture (code 2 avec --ci) et ne produit jamais le code 1. {} l’active avec les valeurs par défaut.

CléDéfautAutorisé
fuzz.max_functions81 à 32 fonctions par review
fuzz.max_packages41 à 16 packages Go et modules TS/JS
fuzz.max_inputs641 à 256 entrées par fonction
fuzz.call_timeout_ms100010 à 10000, au plus le délai d’expiration de la commande
fuzz.max_runtime_seconds2401 à 7200, dans la limite de sandbox.max_runtime_seconds

mutation v0.4

Apporte de petites modifications déterministes aux lignes ajoutées des fichiers Go modifiés hors tests et exécute les tests du package une fois par mutant. Un mutant qu’aucun test ne remarque devient un signal surviving_mutant moyen ; aucun score n’est calculé. Les quatre clés sont obligatoires.

"mutation": {
  "command": ["go", "test", "-json", "-count=1", "-failfast", "{package}"],
  "max_mutants": 20, "timeout_seconds": 60, "max_runtime_seconds": 300
}
CléAutorisé
mutation.commandgo test avec exactement un -json et un {package} autonome ; les options qui changent les tests sélectionnés ou le binaire (-run, -exec, -o…) sont refusées.
mutation.max_mutants1–200.
mutation.timeout_secondsDe 1 à sandbox.timeout_seconds, par exécution.
mutation.max_runtime_secondsDe timeout_seconds à sandbox.max_runtime_seconds, dans le budget partagé.

prepare v0.4

Permet à la politique de confiance de la branche de base de construire la couche de dépendances : avant l’exécution de tout code candidat, sa commande s’exécute une fois, dans un conteneur borné, sur les fichiers de dépendances exportés depuis le commit de base, et le conteneur devient l’image locale de toutes les vérifications. Une review ultérieure avec la même base et les mêmes entrées la réutilise. Si aucune image n’est produite, la review sort avec le code 4 ; elle ne se rabat jamais sur l’image non préparée.

"prepare": { "command": ["go", "mod", "download"], "inputs": ["go.mod", "go.sum"], "network": true }
CléDéfautDescription
prepare.commandobligatoireArgv de 1 à 128 arguments ; aucun placeholder n’est substitué.
prepare.inputsobligatoire1 à 64 motifs relatifs au dépôt (* ne traverse jamais /, pas de **).
prepare.networkfalseRéseau pour le conteneur de build, uniquement avec --allow-prepare-network et sans --no-network.
prepare.user"sandbox""sandbox" (l’identité des vérifications) ou "root".
prepare.timeout_seconds6001–3600.
prepare.envaucunJusqu’à 32 variables intégrées à l’image dérivée ; les noms qui changeraient ce qu’exécutent les vérifications (GOFLAGS, NODE_OPTIONS, LD_PRELOAD, PROBE_*…) sont refusés.
prepare.max_added_mb40961 à 65536 Mio que l’image dérivée peut ajouter.

Valeurs par défaut par langage

Écrites par probe init et utilisées lorsque la branche de base n’a pas de politique. Les images standard Node.js, Python et Rust ne contiennent pas vos dépendances : construisez une image qui les contient, ou ajoutez un objet prepare, et adaptez les commandes.

LangageImageCommandes
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 · pas de generated_test
unknowngolang:1.26-bookwormAucune commande : review n’exécute aucune vérification tant que vous n’en ajoutez pas.

Relecteur IA

Facultatif. Lorsqu’un modèle est configuré, review le laisse examiner la modification avec des outils bornés : lecture de fichiers et de diffs expurgés, recherche dans le code source, consultation des références et des appelants dans l’index statique, exécution des vérifications existantes, création et exécution de tests temporaires sur la base et sur le candidat. Il n’a ni shell ni accès aux URL. Ses affirmations restent des hypothèses tant qu’un test ne reproduit pas une différence.

{
  "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
  • Seuls la politique de confiance, --config ou l’environnement de déploiement peuvent activer le relecteur ; une pull request ne le peut pas.
  • Un contexte source borné et expurgé est envoyé au fournisseur. Le masquage des secrets se fait au mieux ; utilisez un fournisseur local (par exemple http://127.0.0.1:1234/v1) si le code source doit rester en local.
  • Les clés d’API n’entrent jamais dans les conteneurs de test. lint n’appelle jamais de fournisseur.
  • En cas de défaillance du fournisseur ou d’épuisement des budgets, les résultats déterministes sont conservés et l’investigation est marquée incomplète ; avec --ci, cela exige une relecture humaine.