Communitygithub.com

prove-it

Vérifie qu'un test pytest capture un bogue spécifique avant un correctif et réussit après, avec des exécutions répétées et des preuves vérifiables. Utilisez-le pour valider une affirmation de correction de bogue ou pour vérifier qu'un test passe également sans le correctif.

Qu'est-ce que prove-it ?

L'outil **prove-it** permet d'établir de manière reproductible qu'un test pytest donné capture précisément un bogue décrit avant l'application d'un correctif et passe après celui-ci. En choisissant un seul nœud pytest, le développeur définit une assertion contenant un marqueur spécifique (ex. `PROVEIT:expiry-boundary`). L'outil exécute ensuite le test plusieurs fois avec un délai d'attente paramétrable, en utilisant le fichier de test de la révision après correctif superposé sur les deux versions (avant et après). Les résultats sont produits sous forme de rapport structuré (JSON, Markdown) et classés en trois catégories : `supported` (le test échoue avant et réussit après), `not_supported` (le test réussit des deux côtés) ou `inconclusive` (problème d'environnement, échec non lié, timeout). Prove-it s'appuie sur deux références Git locales déjà validées, sans effectuer de checkout, reset, stash ou commit. Il isole les fichiers de test par snapshot mais ne crée pas de bac à sable de sécurité : les tests conservent l'accès aux fichiers, au réseau et aux identifiants de l'utilisateur. L'outil est particulièrement utile pour valider des affirmations de correction de bogue dans les revues de code, ou pour vérifier qu'un test existant couvre correctement le bogue avant de l'intégrer. Il est compatible avec tout projet Python utilisant pytest et ne nécessite pas d'installation supplémentaire si les dépendances sont déjà présentes. Les rapports générés doivent être examinés attentivement avant publication, car ils contiennent des chemins locaux et des logs. Prove-it ne prétend pas prouver l'absence de régression, la qualité générale du test ou une amélioration mesurable de productivité. Il se limite à établir une affirmation précise et vérifiable pour un seul test et un seul bogue.`

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/K-kiron/ProveIt/tree/main/skills/prove-it

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Prove It

Établir une affirmation précise : le même test capture le comportement défectueux spécifié avant une réparation et réussit après. Une suite de tests qui réussit seule n'établit pas cela.

Choisir le témoin

Inspectez le correctif et le test concerné. Identifiez l'entrée/sortie attendue ou la transition d'état, et sélectionnez exactement un nœud pytest. Utilisez deux références Git locales déjà validées ; la référence "après" doit contenir à la fois le correctif et le test. Les modifications non validées ne sont pas incluses. Ne validez pas le travail d'autrui uniquement pour exécuter cet outil.

L'assertion de défaut nécessite un message spécifique, par exemple :

assert expired(now=10, deadline=10), "PROVEIT:expiry-boundary"

Le message doit se trouver sur une assertion dans la fonction de test sélectionnée. Ne le placez pas sur des assertions non liées, dans une fixture, dans le code de l'application ou dans une instruction print. Vérifiez que cette assertion observe réellement le comportement décrit par le bogue. Si le test existant a besoin d'un message, ajoutez-le uniquement dans le périmètre d'édition autorisé et incluez ce test dans la révision "après". Sinon, expliquez l'entrée manquante.

Exécuter la comparaison

Exécutez le script fourni en utilisant son chemin absolu installé. L'interpréteur sélectionné a besoin de pytest et des dépendances du projet déjà installés. Aucune installation de dépendance, accès réseau, checkout Git, reset, stash ou commit n'est effectué.

python <skill-directory>/scripts/proveit.py --repo <repository> --before <old-ref> --after <fixed-ref> --test tests/test_expiry.py::test_at_deadline --expect PROVEIT:expiry-boundary --output <new-directory-outside-repository>

L'exécuteur superpose le fichier de test sélectionné de la révision "après" sur les deux instantanés, utilise une copie fraîche par tentative, et par défaut effectue trois exécutions par révision avec un délai d'attente de 10 secondes par exécution. Utilisez --python, --repeat 2..5 ou --timeout uniquement selon les besoins de la tâche. Sélectionnez un ID de paramètre complet si le test est paramétré.

Les instantanés isolent les fichiers, pas l'exécution. N'exécutez que du code dont l'exécution est déjà autorisée dans cet environnement. Les tests conservent l'accès aux fichiers, au réseau et aux identifiants de l'utilisateur. N'interprétez pas un répertoire temporaire comme un bac à sable de sécurité. Ne nettoyez jamais les arbres de travail ou répertoires non liés. L'exécuteur supprime uniquement ses propres instantanés temporaires et laisse le répertoire de preuves pour examen.

Examiner les preuves

Lisez report.md, report.json, selected-test.py, fix.diff et les journaux pertinents. Vérifiez l'assertion observée, le nœud sélectionné, les enregistrements de phase et les chemins modifiés.

RésultatInterprétationSortie
supportedChaque ancienne exécution atteint l'assertion déclarée ; chaque nouvelle exécution réussit.0
not_supportedL'ancien test réussit également, ou la révision réparée atteint encore cette assertion.1
inconclusiveEnvironnement, échec non lié, timeout, saut, exécution incomplète ou instable.2

Un échec d'appel non lié est considéré comme non concluant même si la nouvelle révision réussit. Les échecs de collecte, de dépendance, de syntaxe, de configuration et de démontage ne sont jamais un témoin. Ne les requalifiez pas comme un bogue détecté. Résolvez la cause observée dans le périmètre et relancez dans un nouveau répertoire de preuves ; ne répétez pas une configuration échouée inchangée.

Avant d'accepter supported, inspectez les fixtures/configuration spécifiques à la révision et confirmez qu'elles n'expliquent pas le changement. Seul le fichier de test choisi est superposé. Les dépendances installées sont partagées, le chargement automatique des plugins pytest tiers est désactivé, et les addopts du projet sont effacés. Les projets nécessitant des plugins externes ou des constructions peuvent nécessiter un environnement préparé séparément ; signalez une exécution non prise en charge clairement.

Signalez le test, les références, le résultat, l'emplacement des preuves et les limitations matérielles. Dites que ce témoin a capturé le comportement spécifié lors de ces exécutions. Ne revendiquez pas une preuve de correction globale, d'absence d'instabilité, de qualité générale du test ou d'amélioration mesurable de productivité. Ne publiez pas de rapports contenant des chemins locaux ou des journaux sans les avoir examinés et obtenu l'autorisation de publication applicable.

Skills associés