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 --planetreview --plancomparent 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 (
-ciou--ci). Les booléens s’activent avec--ciou--ci=trueet se désactivent avec--checks=false. Une valeur s’écrit--base mainou--base=main. - Lancez
probe <command> --helppour 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.
| Forme | Compare |
|---|---|
--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 --exact | De la pointe de main directement jusqu’à --head. |
BASE..HEAD | Les deux commits exacts, par exemple HEAD~1..HEAD pour relire le dernier commit. Remplace --base, --head et --exact. |
BASE...HEAD | De 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.
| Option | Défaut | Description |
|---|---|---|
--base REV | main | Branche ou révision de base. La comparaison démarre à sa base de fusion avec --head ; sa pointe fournit la politique de confiance. |
--head REV | HEAD | Révision candidate en cours de relecture. |
--exact | false | Comparer à 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 PATH | politique de la base | Utiliser ce fichier de politique local au lieu du .probe.json de la branche de base. Ne passez qu’un fichier de confiance. |
--out DIR | .probe | Répertoire des rapports, relatif à la racine du dépôt. Le chemin ne peut pas contenir de liens symboliques. |
--format LIST | markdown,json | Formats 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. |
--impact | true | Construire 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. |
--ci | false | Sortir 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, --reviewer | false | Doivent 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.
| Option | Défaut | Description |
|---|---|---|
--base REV | main | Branche ou révision de base. La comparaison démarre à sa base de fusion avec --head ; sa pointe fournit la politique de confiance. |
--head REV | HEAD | Révision candidate en cours de relecture. |
--exact | false | Comparer à 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 PATH | politique de la base | Utiliser 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 | .probe | Répertoire des rapports, relatif à la racine du dépôt. Les artefacts vont dans DIR/artifacts/. |
--format LIST | markdown,json | Formats 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. |
--ci | false | Sortir 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. |
--checks | true | Exé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. |
--reviewer | auto | Investigation 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 N | politique (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-network | false | Donner l’accès réseau aux conteneurs du bac à sable. Effectif uniquement si la politique de confiance définit aussi sandbox.network: true. |
--no-network | false | Forcer 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. |
--impact | true | Construire 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.4 | false | Exé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.4 | false | Exé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.4 | true | Exé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.4 | 1 | Exé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.4 | false | Donner 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é.
| Option | Défaut | Description |
|---|---|---|
--intent-file PATH, --intent TEXT | — | La modification à planifier. Obligatoire ; 64 Kio d’UTF-8 au maximum, lus comme l’intention de review. |
--base REV | main | La révision dont part le plan. Sa pointe fournit la politique de confiance. |
--config PATH | politique de la base | Politique locale de confiance explicite. |
--out DIR | .probe | Répertoire de sortie, relatif au dépôt. |
--ci | false | Sortir avec le code 2 lorsqu’une catégorie est signalée ou qu’un élément n’a pas été vérifié. |
--max-iterations N | politique | Remplacer le budget d’itérations du fournisseur, de 1 à 100. |
--reviewer | true | Un 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égorie | Signaux |
|---|---|
| Parties critiques | plan_critical_path (un chemin prévu correspond à sensitive_paths), plan_sensitive_symbol (un nom lié à l’authentification, l’autorisation ou le paiement). |
| Architecture | plan_exported_signature, plan_dependency_change, plan_new_package. |
| Risque de régression | plan_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 majeure | plan_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ément | Gravité | Quand |
|---|---|---|
unplanned_file | moyenne | Un fichier modifié que le plan ne liste pas (unplanned_test_file, faible, pour un fichier de test). |
unannounced_exported_change | élevée | Une déclaration Go exportée modifiée ou supprimée sans avoir été annoncée comme signature ou remove. |
unannounced_critical_path | élevée | Un chemin modifié correspond à un motif critique de la politique de cette review et le plan ne le listait pas. |
unannounced_dependency_change | moyenne | Un manifeste de dépendances a changé sans avoir été déclaré. |
planned_file_untouched | faible | Un 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écision | Quand |
|---|---|
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.
| Option | Défaut | Description |
|---|---|---|
--repo PATH | . | Répertoire dans lequel créer .probe.json. |
--language NAME | dé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.
| Option | Défaut | Description |
|---|---|---|
--input PATH | .probe/confidence-report.json | Rapport JSON enregistré (version 1, 64 Mio au maximum). |
--out DIR | .probe | Répertoire de sortie, relatif au répertoire courant. |
--format LIST | markdown,json | Formats à é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
| Commande | Affiche |
|---|---|
probe version, --version | La version, par exemple probe v0.5.1, et la mention de licence. |
probe help, -h, --help | Le synopsis. Sans argument, Probe affiche le même texte. |
probe <command> --help | Les options d’une commande, avec leurs valeurs par défaut. |
Codes de sortie
| Code | Signification |
|---|---|
0 | Rapport terminé sans problème élevé ou critique reproduit. Sans --ci, les zones non résolues ne modifient pas ce code. |
1 | Une 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. |
2 | Avec --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. |
3 | Arguments invalides, comparaison Git ou configuration de confiance (y compris une clé de politique ou un nom de commande inconnus). |
4 | Erreur 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.
| Variable | Effet |
|---|---|
PROBE_REVIEWER_ENDPOINT | Remplace reviewer.endpoint. Mêmes règles d’URL que la politique. |
PROBE_REVIEWER_MODEL | Remplace reviewer.model et, à elle seule, active le relecteur pendant review. |
PROBE_API_KEY | Clé d’API. Le nom est défini par reviewer.api_key_env ; celui-ci est la valeur par défaut. |
PROBE_API_KEY_FILE | Chemin 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_KEY | Secret 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
| Chemin | Contenu |
|---|---|
.probe/CONFIDENCE_REPORT.md | Le 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.json | Les 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.4 | Avec --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.4 | Avec --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.
| Type | Gravité | Levé lorsque |
|---|---|---|
sensitive_path | élevée | Un chemin modifié correspond à un motif sensitive_paths. |
private_key | critique | Une 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ée | Une 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ée | Une 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ée | InsecureSkipVerify: 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ée | Droits 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ée | CSRF 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_enabled | moyenne | DEBUG = True, debug: true, app.run(debug=True), FLASK_DEBUG=1, gin.DebugMode et équivalents. |
hardcoded_email, hardcoded_ip | faible | Une 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ée | Le 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ée | Le corps d’une fonction Go dont le nom évoque les paiements (payment, refund, charge, capture, withdraw, deposit, balance…) a changé. |
validation_removed | élevée | Une ligne supprimée appelait une fonction de validation, d’assertion ou d’assainissement, ou levait une erreur de validation. |
public_api_change | élevée moyenne | Go : 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ée | Une ligne modifiée ressemble à une mutation ou à une transaction en base de données (INSERT, UPDATE … SET, .Exec(, .Commit(…). |
dynamic_execution | élevée | eval, exécution de processus, subprocess, child_process, innerHTML et équivalents. |
type_suppression | élevée | Suppression de contrôle de type ou de lint, par exemple @ts-ignore, as any, unsafe, nolint, eslint-disable. |
migration_change | élevée | Un chemin contenant migration ou se terminant par .sql a changé. |
infrastructure_change | élevée | Un workflow GitHub, un Dockerfile ou un fichier Terraform a changé. |
file_type_change | élevée | Git signale un changement de type, par exemple un fichier devenu lien symbolique. |
network_change | moyenne | Une ligne modifiée effectue des appels HTTP, gRPC ou socket, ou contient une URL. |
error_handling_change | moyenne | Des vérifications d’erreur, des encapsulations, panic/recover, catch ou except ont changé. |
dependency_change | moyenne | Un manifeste de dépendances ou un fichier de verrouillage a changé (go.mod, package.json, Cargo.lock, pyproject.toml…). |
uncovered_change | moyenne faible | Des 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_growth | moyenne | Au 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_change | moyenne | Plus de 400 lignes modifiées dans un même fichier. |
file_deleted | moyenne | Un fichier suivi a été supprimé. |
binary_change | moyenne | Un fichier binaire a changé et ne peut pas être analysé comme du texte. |
analysis_limited | moyenne | L’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ée | Un marqueur de focus a été ajouté à un fichier de test (it.only, fdescribe…). |
test_assertion_removed, test_case_removed v0.4 | moyenne | Un 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.4 | moyenne | Un 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.4 | moyenne | Une 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.4 | moyenne | La 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 faible | Avec --plan : le diff sort du contrat du plan. Voir dérive du périmètre. |
impacted_caller | faible | Du 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_change | faible | Un 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_added | faible | Un 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.
| Langage | Mode d’indexation | Résolution |
|---|---|---|
| Go | Analysé 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, Rust | Analysé 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é | Go | TS/JS | Python | Rust |
|---|---|---|---|---|
| Signaux de risque et règles d’affaiblissement des tests | syntaxique | texte | texte | texte |
| Index d’impact et outils de symboles du relecteur | vérifié par typage | lexical | lexical | lexical |
Vérifications en bac à sable et valeurs par défaut de init | oui | oui | oui | oui |
| Tests générés vérifiés | oui | oui (JSON Jest/Vitest) | exécutés, non vérifiés par nom | pas de commande par défaut |
| Fuzzing différentiel | oui | oui | — | — |
Couverture, mutation, --base-tests, --impacted-tests | oui | — | — | — |
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é | Type | Défaut | Description |
|---|---|---|---|
version | entier | 1 | Version du format de politique. Doit valoir 1. |
language | chaîne | détecté | Langage écrit par init. À titre informatif. |
fuzz, mutation, prepare v0.4 | objet | absent | É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é | Placeholders | Description |
|---|---|---|
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éfaut | Autorisé | Description |
|---|---|---|---|
sandbox.image | golang:1.26-bookworm | nom d’image | Image 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.network | false | booléen | Autoriser le réseau des conteneurs. Nécessite aussi --allow-network en ligne de commande. |
sandbox.timeout_seconds | 120 | 1–3600 | Durée maximale de chaque commande. |
sandbox.max_runtime_seconds | 600 | 1–7200 | Temps total de bac à sable pour l’exécution, partagé entre vérifications et expériences. |
sandbox.max_output_bytes | 65536 | 1024–4194304 | Sortie capturée conservée par commande. |
sandbox.memory_mb | 1024 | 128–32768 | Limite de mémoire de chaque conteneur, en Mio. |
sandbox.cpus | 2 | 1–32 | Limite de CPU de chaque conteneur. |
reviewer
| Clé | Défaut | Autorisé | Description |
|---|---|---|---|
reviewer.model | "" | identifiant de modèle | Modèle capable d’utiliser des outils. Vide, il désactive le relecteur. Remplacé par PROBE_REVIEWER_MODEL. |
reviewer.endpoint | https://api.openai.com/v1/chat/completions | URL | Endpoint 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_env | PROBE_API_KEY | nom de variable | Variable 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_iterations | 20 | 1–100 | Tours du modèle par investigation. --max-iterations la remplace. |
reviewer.max_generated_tests | 10 | 0–100 | Tests temporaires que le relecteur peut créer. |
reviewer.timeout_seconds | 600 | 1–1800 | Temps total de l’investigation. |
reviewer.max_input_bytes | 131072 | 4096–2097152 | Limite 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éfaut | Couvre |
|---|---|
**/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.json | La 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éfaut | Autorisé |
|---|---|---|
fuzz.max_functions | 8 | 1 à 32 fonctions par review |
fuzz.max_packages | 4 | 1 à 16 packages Go et modules TS/JS |
fuzz.max_inputs | 64 | 1 à 256 entrées par fonction |
fuzz.call_timeout_ms | 1000 | 10 à 10000, au plus le délai d’expiration de la commande |
fuzz.max_runtime_seconds | 240 | 1 à 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.command | go 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_mutants | 1–200. |
mutation.timeout_seconds | De 1 à sandbox.timeout_seconds, par exécution. |
mutation.max_runtime_seconds | De 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éfaut | Description |
|---|---|---|
prepare.command | obligatoire | Argv de 1 à 128 arguments ; aucun placeholder n’est substitué. |
prepare.inputs | obligatoire | 1 à 64 motifs relatifs au dépôt (* ne traverse jamais /, pas de **). |
prepare.network | false | Ré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_seconds | 600 | 1–3600. |
prepare.env | aucun | Jusqu’à 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_mb | 4096 | 1 à 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.
| Langage | Image | Commandes |
|---|---|---|
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 · pas de generated_test |
unknown | golang:1.26-bookworm | Aucune 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,
--configou 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.
lintn’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.
Aucun élément de la référence ne correspond à ce filtre.