PrufGate について
PrufGateは、コーディングエージェントや人が作成したコードを確認するチーム向けの、決定論的な読み取り専用コード検査ツールです。Pythonエンジンで、コンパイルや通常のリンティングだけでは見つけにくい偽の動作、弱いテスト、危険な差分、未宣言の依存関係、アクセス制御の不備を調べ、人とコードスキャン用のレポートを出力します。
主な機能
- 01偽装や未実装の動作を検出
- 02テストの完全性と変更を監査
- 03危険な差分や抑制設定を警告
- 04依存関係とAPIルート契約を確認
- 05BOLA/IDORのアクセス不備を検出
- 06SARIFとMarkdownレポートを出力
活用シーン
- 01プルリクエストでテストの弱体化を確認
- 02所有者やテナントの検査がないルートを確認
- 03リンターやSASTと併用したコード検査
- 04MCP経由でコーディングエージェントに読み取り専用の検出結果を提供
MCP 対応
PrufGateは`prufgate mcp`を通じて、エージェント向けに9つの読み取り専用ツールを提供します。コード検査と検出結果を扱うMCPサーバーですが、READMEには通信方式やリモートエンドポイントの記載がありません。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
9掲載時のツール一覧 · 3 日前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| base_ref | string | いいえ | 差分比較のベースとなる git ref。例:origin/main |
| workspace_path | string | いいえ | スキャンするリポジトリのパス |
詳細
リンターは、コードがコンパイルできるかを確認します。PrufGate は、コンパイルできて、一見したところレビューにも通るのに、実際には役に立たないコードを探します。これは、タスクが完了したように見せるために AI コーディングエージェント(または急いでいる人間)が書くコードです。
- ハードコードされた成功オブジェクトを返す
catchブロック。 - 何もしないクリックハンドラー。
trueをアサートするテスト、またはテスト対象の関数自体をモックするテスト。- 差分に紛れ込んだ
.skip、@ts-ignore、または引き下げられたカバレッジしきい値。 - どこにも宣言されていないパッケージのインポート。
- 所有者を確認せずに ID でレコードを読み込む API ルート。
PrufGate は決定論的です。純粋な Python で、ネットワーク呼び出しはなく、求められない限り LLM も使いません。プルリクエスト上で数秒で実行でき、コードスキャン用の SARIF と、人が読むための Markdown を出力します。リンターや SAST ツールに置き換わるものではなく、それらと並行して使うことを想定しています。
6 つのエンジン
| # | エンジン | 検出する内容 |
|---|---|---|
| 1 | 捏造防止(prufgate/anti_fabrication) | エラー経路での定型的な成功応答、シミュレートされた戻り値、本番コード内の MOCK_*/SAMPLE_* データ、スタブの UI ハンドラー、偽の「最新」タイムスタンプ、未実装のスタブ、証拠を渡さずに判定を求める LLM プロンプト、本番環境でのドキュメント用アドレス。 |
| 2 | テストの完全性(prufgate/anti_reward_hacking) | アサーションのないテスト、失敗しないアサーション、テスト対象のユニットをモックするテスト、握りつぶされた例外、差分で削除または弱められたアサーション、差分で削除されたテストファイルやテストケース、本番コードでテストのリテラル入力を特別扱いする処理。 |
| 3 | 差分ガード(prufgate/diff_guard) | 課題への参照なしに追加されたスキップやフォーカス(.skip、.only、xit、pytest.mark.skip、t.Skip()、#[ignore]、@Disabled)、テストやテストセットアップに追加された偽の終了処理(sys.exit(0)、process.exit(0)、モジュールレベルの SkipTest)、無条件の抑制(@ts-ignore、# noqa、// nolint、#[allow])、as unknown as T キャスト、弱められたリンター/CI/カバレッジ設定、PrufGate 自体の設定に追加された新たな例外。 |
| 4 | コントラクトガード(prufgate/contract_guard) | package.json、pyproject.toml/requirements*.txt、go.mod、Cargo.toml に宣言されていないインポート、デフォルト値なしで読み取られ、.env.example にも記載されていない環境変数、存在しない API ルートへのフロントエンドからの呼び出し。 |
| 5 | BOLA/IDOR(prufgate/bola) | 認証ガードやテナント/所有者によるスコープ制限がないまま、クライアントから渡された ID でレコードを検索するルートハンドラー。対象は Express、Next.js、NestJS、FastAPI、Flask、Django、Go(net/http、Gin、Echo、Chi)、Spring、Rails、Laravel です。自分が所有する稼働中のサービスに対する、2 つのトークンを使った任意のライブプローブにも対応しています。 |
| 6 | 差分レビューアー(prufgate/review) | 変更行を対象とする高精度ルール(文字列から構築された SQL、シェルインジェクション、TLS 検証の無効化、ハードコードされた認証情報、サニタイズされていない HTML、無視された Go のエラー、認証情報のログ出力)、GitHub の提案ブロック、および任意で選択した AI CLI または API への委任。 |
各エンジンの詳細、ルール ID、対応言語、既知の制限については、docs/ENGINES.md をご覧ください。
PrufGate はパターンと構造に基づくヒューリスティックを使用しており、すべての言語を対象とする完全なパーサーではありません。検出できない問題がある一方で、正しいコードを誤検出する場合もあります。各検出結果にはルールが明記されます。また、インラインの prufgate-ignore: rule -- reason コメント、例外、ベースラインを使って、その理由を記録できます。
クイックスタート
PrufGate の実行には、Python 3.9 以降と Git が必要です。
pipx install prufgate # or: pip install prufgate (the `prufgate` and `prufgate-mcp` commands)
prufgate --self-check # every engine against its built-in fixtures
uvx prufgate --version # or run it without installing, with uv
または、最新リリース(1.0.0 以降のリリース)から prufgate.pyz という 1 つのファイルをダウンロードしてください。これは PyYAML(純粋な Python 実装)を含む zipapp なので、Python 3.9 以降があれば実行できます。
curl -LO https://github.com/GuardianVigil-Labs/Prufgate/releases/latest/download/prufgate.pyz
curl -LO https://github.com/GuardianVigil-Labs/Prufgate/releases/latest/download/SHA256SUMS
sha256sum -c --ignore-missing SHA256SUMS
gh attestation verify prufgate.pyz --repo GuardianVigil-Labs/Prufgate
python3 prufgate.pyz --self-check
python3 prufgate.pyz check .
prufgate init --hooks が書き込むフックは PATH 上の prufgate を呼び出すため、フックを使う場合はこのファイルをコマンドとしてインストールしてください:install -m 755 prufgate.pyz ~/.local/bin/prufgate。zipapp では、mcp を除き、pip でインストールした場合と同じすべてのコマンドを実行できます(MCP サーバーには pipx install prufgate を使用してください)。pip でのインストールと同様、シェル用の追加ツール(ast-grep、gitleaks、zizmor を使う ./prufgate.sh fast / full)は含まれません。prufgate.pyz fast と full では、Python エンジンのみが実行されます。すべてのツールを使用するには、コンテナイメージまたはチェックアウトを利用してください。OS ごとのネイティブバイナリはありません。リリースのたびに 3 つの OS すべてでビルドする必要があり、zipapp で同じニーズに対応できるためです。python3 scripts/build_pyz.py を実行すると、チェックアウトから同じファイルをビルドできます。このコマンドは、ハッシュが固定された PyYAML の sdist を PyPI からダウンロードし、requirements.txt と一致しない場合は処理を拒否します。
または、ast-grep、gitleaks、zizmor を含むフルゲートを追加した、署名済みのコンテナイメージを実行してください。
docker run --rm -v "$PWD:/workspace" ghcr.io/guardianvigil-labs/prufgate:1.1.0 # the fast gate on this repository
docker run --rm -v "$PWD:/workspace" ghcr.io/guardianvigil-labs/prufgate:1.1.0 prufgate check .
または、v1.1.0 タグのコミット SHA に固定した GitHub Action を、プルリクエストのワークフローに追加してください(完全な例)。
- uses: actions/checkout@<commit-sha>
with: { fetch-depth: 0, persist-credentials: false }
- run: python3 -m pip install "PyYAML>=6.0"
- uses: GuardianVigil-Labs/Prufgate@<commit-sha-of-v1.1.0>
すべてのリリースには署名が付与され、ビルドの来歴情報と SBOM が含まれています:リリースを検証する。
または、pre-commit の設定ファイル .pre-commit-config.yaml に追加してください(詳細)。
repos:
- repo: https://github.com/GuardianVigil-Labs/Prufgate
rev: v1.1.0
hooks:
- id: prufgate # changed files, on every commit
- id: prufgate-full # whole repository, before a push (pre-commit install --hook-type pre-push)
次に、プロジェクト内で以下を実行します。
prufgate check . # engines 1-5 on the whole repository
prufgate check --changed --base origin/main # only what this branch changed
prufgate init --hooks # starter config + coding-agent hooks
終了コードはどの方法でも同じです:0 問題なし、1 ブロック対象の検出結果あり(P0/P1)、2 PrufGate を実行できませんでした(設定の誤り、ベース参照の誤り、ファイルを読み取れない、エンジンのクラッシュ)。クラッシュが成功として扱われることはありません。
実行方法
| 目的 | 使用方法 |
|---|---|
| コーディング中に手早くチェックする | prufgate check --changed |
| VS Code 内に指摘を表示する | VS Code 拡張機能(ソース):保存時に prufgate check --changed を実行します。信頼済みワークスペースのみが対象です(現時点では .vsix からインストールしてください) |
| 1つのエンジンを実行する | prufgate test-audit、prufgate bola、prufgate review |
| SARIF と Markdown のレポートを含むフルゲートを実行する | チェックアウトから ./prufgate.sh fast(変更されたファイル)または ./prufgate.sh full を実行します。レポートは reports/prufgate.sarif、reports/prufgate-review.md、reports/gl-code-quality-report.json(GitLab Code Quality)、reports/prufgate-junit.xml に出力されます。 |
| GitHub でプルリクエストのゲートを実行する | このリポジトリのコンポジットアクション:docs/CI_INTEGRATION.md |
| 停止前に指摘を修正するようコーディングエージェントに促す | prufgate init --hooks(Claude Code Stop フックは1回確認します。Cursor ルール、pre-commit フック、CI ゲートが強制します) |
| フックのスキップ、強制プッシュ、テストや CI 設定の削除をコーディングエージェントに禁止する | prufgate init --hooks(Claude Code、Cursor)または --agent copilot|codex|gemini:prufgate hook <agent> <event> を実行するフェイルクローズ方式のフック(サポート一覧) |
| ベースブランチのテストをヘッドコードに対して実行する(リポジトリのテストを実行します。サンドボックスまたは CI のみ、オプトイン) | prufgate verify --differential --allow-run-tests |
| インストール済みの mutmut、Stryker、PIT、gremlins、go-mutesting、cargo-mutants を使って変更行のミューテーションスモークテストを実行する(リポジトリのテストを実行します。オプトイン) | prufgate verify --mutation --allow-run-tests |
Claude Code プラグインとして PrufGate を使う(フックと /prufgate:prufgate-check スキル) | pipx install prufgate を実行し、続いて Claude Code で /plugin marketplace add GuardianVigil-Labs/Prufgate と /plugin install prufgate@prufgate を実行します(詳細) |
| PrufGate の指摘を使うよう他のエージェントや AI レビュアー(Cursor Bugbot、Copilot review)に指示する | prufgate init --agents-md(AGENTS.md)と --bugbot(.cursor/BUGBOT.md):マーカー付きのセクションが作成され、再実行時にはその場で更新されます(詳細) |
| PrufGate の信頼度が低い指摘のみについて AI にセカンドオピニオンを求める(オプトイン。選択したプロバイダーに数行のコードを送信します) | 設定で ai_adjudicate: true を指定します。AI による判定を参照してください |
| MCP 経由でエージェント向けのツールを使う | prufgate mcp:読み取り専用ツールが9つ |
| Webhook でスキャンするサービスを使う | prufgate api:Bearer トークンを使用し、デフォルトではループバックのみで待ち受けます |
コマンドとオプションの完全なリファレンスは docs/GETTING_STARTED.md に、設定キーの一覧は docs/CONFIGURATION.md にあります。
設定の概要
PrufGate は設定なしで動作します。調整するには .prufgate/config.yaml を追加します。
version: 1
packs: [core, web-ui, ai-safety] # cti is an opt-in domain pack
exclude: ["dist/**", "vendor/**"]
auth_guards: [requireUser, get_current_user]
tenant_keys: [organization_id, account_id]
exempt:
src/legacy/adapter.ts:
route-canned-fallback: "#104: legacy fallback until the payments API migration"
known_debt:
stub-click-handler: 0 # a ceiling that can only go down
プルリクエスト(ベース参照を指定する実行すべて)では、PrufGate はベースブランチ上のこのファイルを読み込みます。そのため、設定変更はマージ後に反映されます。変更によって、その変更自体の指摘を免除することはできません。
AI による判定
PrufGate はデフォルトでは決定論的に動作し、情報を外部に送信しません。オプトイン方式のモードを 2 つ用意しており、選択した AI プロバイダー(claude CLI、OPENAI_API_KEY、ANTHROPIC_API_KEY、OLLAMA_HOST。別のプロバイダーを指定する場合は --ai-provider を使用)を利用します。
prufgate review --aiはモデルに差分全体のレビューを依頼します。- 設定の
ai_adjudicate: true(プルリクエストではベース参照から読み込まれ、prufgate checkとprufgate.shゲートで使用されます。これが設定されていない場合、--ai-adjudicate単独では何も行いません)を指定すると、信頼度が低い各検出結果について、実際の問題かどうかを尋ねる質問を 1 つずつ行います(設定によりmediumも対象になります)。プロンプトにはルール、検出メッセージ、および周辺の数行を匿名化して含めます。ファイル全体が含まれることはありません。
判定結果によって非本質的な検出結果を非表示にすることはできますが、それ以外の変更はありません。実際の問題ではないと判定された検出結果はブロック対象から外れ、モデルの理由とともに「AI による却下」リストに移されます。このリストは prufgate check の出力と Markdown レポートに表示され、SARIF には external 種別の suppressions エントリー(AI-dismissed: <reason>)が追加されます。信頼度の高い検出結果が送信されることはありません。また、検出結果が追加されたり、深刻度が引き上げられたりすることもありません。プロバイダーのエラー、タイムアウト、{"real": true|false, "reason": "..."} と完全一致しない応答、予算を超過した実行、または判定者に向けたコード(AI、LLM、judge、reviewer、PrufGate に言及するコメント)がある場合、AI を使用しない場合と同様に検出結果は維持されます。判定結果はリポジトリの外部にキャッシュされます。設定については、docs/CONFIGURATION.md を参照してください。
ドキュメント
- はじめに:インストール、コマンド、レポート、終了コード
- 設定リファレンス:すべてのキー、抑制設定、環境変数
- エンジン:ルール、言語、制限
- CI とエージェントの統合:GitHub Action、その他の CI、エージェントフック、MCP、REST API
- カスタムルール:独自の ast-grep ルールとフック
- アーキテクチャ
- ベンチマーク:ラベル付きコーパスで測定した適合率と再現率、および事例の追加方法
- 変更履歴
コントリビューションとセキュリティ
コントリビューションを歓迎します。CONTRIBUTING.md とメンテナーガイド AGENTS.md をご覧ください。脆弱性は SECURITY.md の説明に従って、非公開で報告してください。
PrufGate は GuardianVigil によって Apache License 2.0 のもとで公開されています。名称とロゴは商標です。TRADEMARKS.md をご覧ください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。