Communitygithub.com

prove-it

1つのpytest回帰テストが、修正コミット前に指定されたバグを捕捉し、修正後にパスするかを、繰り返し実行とレビュー可能な証拠をもって検証します。バグ修正の主張を検証したり、修正なしでもパスするテストがないか確認する際に使用します。

prove-it とは?

このスキルは、特定のpytestテストノードが、あるバグを修正前に捕捉し、修正後にはパスすることを厳密に検証するためのツールです。単にテストスイートがパスするだけでは不十分な場合に、修正の有効性を証明するための証拠を提供します。Gitの2つのコミット参照(before/after)を指定し、指定されたアサーションメッセージを含むテストを3回ずつ実行。結果は `supported`(バグ捕捉確認)、`not_supported`(バグを捕捉できていない)、`inconclusive`(環境問題など)の3段階で報告され、詳細なレポートとログが生成されます。このスキルはClaude CodeやCursorなどの開発環境での使用を想定しており、テストの品質や全体的な正しさを証明するものではなく、あくまで特定のバグとテストの関係性を検証することに特化しています。

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

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

Prove It

狭い主張を確立します:同じテストが、修正前に指定された欠陥動作を捕捉し、修正後にはパスすること。スイート全体がパスするだけでは、これを確立できません。

証人を選ぶ

修正と該当テストを調査します。期待される入力/出力または状態遷移を特定し、正確に1つのpytestノードを選択します。2つのコミットされたローカルGit参照を使用します。after参照には修正とテストの両方が含まれている必要があります。コミットされていない編集は含まれません。このツールを実行するために他人の成果をコミットしないでください。

欠陥アサーションには、次のような特定のメッセージが必要です:

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

メッセージは、選択したテスト関数内のアサーションに記述する必要があります。関連のないアサーション、フィクスチャ、アプリケーションコード、print文には記述しないでください。このアサーションが実際にバグで説明されている動作を観察していることを確認してください。既存のテストにメッセージが必要な場合は、許可された編集範囲内でのみ追加し、そのテストをafterリビジョンに含めてください。それ以外の場合は、不足している入力を説明してください。

比較を実行する

バンドルされたスクリプトを、その絶対インストールパスを使用して実行します。選択したインタプリタには、pytestとプロジェクトの依存関係が既にインストールされている必要があります。依存関係のインストール、ネットワークアクセス、Gitチェックアウト、リセット、スタッシュ、またはコミットは実行されません。

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>

ランナーはafterリビジョンの選択されたテストファイルを両方のスナップショットに重ね合わせ、試行ごとに新しいコピーを使用し、デフォルトではリビジョンあたり3回の実行、実行あたり10秒のタイムアウトで実行します。必要に応じて--python、--repeat 2..5、または--timeoutを使用してください。テストがパラメータ化されている場合は、完全なパラメータIDを選択してください。

スナップショットはファイルを分離しますが、実行は分離しません。この環境で既に許可されているコードのみを実行してください。テストはユーザーのファイルシステム、ネットワーク、および資格情報へのアクセスを保持します。一時ディレクトリをセキュリティサンドボックスとして解釈しないでください。関連のないワークツリーやディレクトリを決してクリーンアップしないでください。ランナーは自身の一時スナップショットのみを削除し、証拠ディレクトリはレビューのために残します。

証拠を確認する

report.md、report.json、selected-test.py、fix.diff、および関連ログを読んでください。観察されたアサーション、選択されたノード、フェーズレコード、および変更されたパスを確認してください。

結果解釈終了コード
supportedすべての古い実行が宣言されたアサーションにヒットし、すべての新しい実行がパスする。0
not_supported古いテストもパスするか、修復されたリビジョンがまだそのアサーションにヒットする。1
inconclusive環境、無関係な失敗、タイムアウト、スキップ、不完全または不安定な実行。2

無関係な呼び出しの失敗は、新しいリビジョンがパスする場合でもinconclusiveです。コレクション、依存関係、構文、セットアップ、およびティアダウンの失敗は決して証人ではありません。それらを捕捉されたバグとして再ラベル付けしないでください。観察された原因をスコープ内で解決し、新しい証拠ディレクトリに再実行してください。変更されていない失敗したセットアップを繰り返さないでください。

supportedを受け入れる前に、リビジョン固有のフィクスチャ/設定を検査し、それらが変更を説明していないことを確認してください。選択されたテストファイルのみがオーバーレイされます。インストールされた依存関係は共有され、サードパーティのpytestプラグインの自動ロードは無効になり、プロジェクトのaddoptsはクリアされます。外部プラグインやビルドを必要とするプロジェクトは、別途準備された環境が必要になる場合があります。サポートされていない実行はそのまま報告してください。

テスト、参照、結果、証拠の場所、および重要な制限事項を報告してください。この証人は、これらの実行において指定された動作を捕捉したと言ってください。全体的な正しさ、フレーキネスの不在、一般的なテスト品質、または測定された生産性向上の証明を主張しないでください。ローカルパスやログを含むレポートを、それらをレビューし、該当する公開許可を得ずに公開しないでください。

関連スキル