adversarial-python について
adversarial-python は、Python コードの構造と現代的な言語慣用法を合否判定するレビュー用スキルです。ブラインドレビューと根拠に基づくルールでコードの簡素化や再設計の必要性を評価し、自ら変更は行いません。
主な機能
- 01現代的な Python の慣用法と構造のルール
- 02根拠に基づく PASS、FAIL、N/A 判定
- 03Python バージョンを考慮したルール確認
- 04単一のブラインドレビュープロトコル
- 05不合格時に具体的な修正項目を提示
活用シーン
- 01マージ前の Python 変更レビュー
- 02Python の最低対応バージョン引き上げ後の確認
- 03リファクタリングが実際に簡素化するか評価
- 04新機能に引き継がれた旧式パターンの検出
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ pproenca/ dot-skills --skill adversarial-pythonインストール後、Claude Code で/adversarial-pythonを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
gotchas.mdmetadata.jsonassets/templates/verdict.mdreferences/_sections.mdalt-collapse-passthrough-layers.mdalt-compose-over-concrete-inheritance.mdalt-function-over-single-method-class.mdalt-no-single-impl-interfaces.mddisp-match-over-isinstance-ladders.mddisp-registry-over-branch-ladders.mddisp-split-boolean-switch-params.mddisp-strenum-over-string-states.mdflow-no-silent-broad-except.mdflow-taskgroup-over-orphan-tasks.mdmodel-dataclass-over-boilerplate.mdmodel-shape-the-data-clump.mdmodel-typed-boundary-payloads.mdreviewer-prompt.mdstd-aware-utc-datetimes.mdstd-no-hand-rolled-batteries.mdstd-pathlib-over-ospath.mdstd-zip-strict-independent-sources.mdtyping-builtin-generics-and-unions.mdtyping-pep695-generics.mdtyping-self-over-typevar-fluent.md詳細
敵対的 Python ゲート
Python の現代的なイディオムとコード構造をレビューするゲートです。合否は、単一のブラインドレビュー担当サブエージェントが敵対的な任務のもと、このゲートのルールに照らして作業を判定します。すべてのルールが PASS または N/A の場合にのみ合格となります。このスキルは判定を出しますが、作業を修正することはありません。
このルールが対象とするのは、根本原因が共通する 2 つの失敗パターンです。作者が形を設計するのではなく、既存の形を再現してしまうことです。訓練データの慣性によって、最新の Python 機能で丸ごと不要になるコードが生まれます。たとえば、match やレジストリで置き換えられる if/elif の連鎖、@dataclass(slots=True) で生成される __init__/__repr__/__eq__ の 3 点セット、PEP 695 によって不要になった TypeVar の儀式、標準搭載された itertools.batched と同じチャンク分割ヘルパーなどです。レガシーパターンの伝播によって、周囲のコードベースの悪い構造を忠実に拡張する新しいコードが生まれます。機能をエンドツーエンドで追跡し、モデル化する代わりに、イベント分岐の連鎖に分岐を 1 つ追加したり、受け渡しだけを行うサービスにメソッドを 1 つ追加したりします。各ルールには 違反の証拠 の段落があり、レビュー担当者は成果物の証拠だけから PASS/FAIL/N/A を判断できます。また、修正が言語バージョンに依存する場合は、Requires Python ≥ 3.X の条件が付いています。
適用するタイミング
- Python の機能、エンドポイント、またはモジュール(エージェントまたは人間が作成したもの)がマージされる前に、最新の Python と新たなアーキテクチャの視点によって削除または再構成できるかどうかについて、客観的な PASS/FAIL 判定が必要な場合。
- エージェントがレガシーなコードベースを拡張し、機能を再設計する代わりに、既存のパターン(イベント/バージョン分岐の連鎖、処理を転送するだけのサービス層、文字列で型を表す状態など)をコピーした疑いがある場合。
- コードベースの Python の最低バージョンを 3.12、3.13、3.14 以降に引き上げ、新しい最低バージョンで可能になったイディオムに変更後のコードを準拠させたい場合。
- リファクタリングでモダン化または簡素化をうたっており、その主張を差分の流し読みではなく判定によって検証したい場合。
Python ソースがない対象(レビュー担当者向けプロンプトの前提条件により、「GATE NOT APPLICABLE」で中止されます)、またはユーザーが判定ではなく説明やリファクタリングを求めている場合は適用しないでください。ゲートが意図的に対象外としている判断項目(命名の好み、関数の長さ、ドキュメント文字列やテストのカバレッジ、パフォーマンス調整)は、このゲートではなくアドバイザリースキルで扱います。
レビュープロトコル
次の手順を厳守してください。このゲートの価値は、すべてのレビューが同じ手順で実施されることにあります。
- 対象を特定します。 レビュー対象(差分、ファイル一式、PR)を正確に特定し、レビュー対象が曖昧さのない固定されたものになるよう、参照先とパスを記録します。リポジトリのルートも含めてください。複数の
alt-ルールとdisp-ルールでは、実装箇所、置換箇所、テスト用ダブル、呼び出し箇所を差分の範囲を超えて検索する必要があります(レビュアープロンプトに記載されています)。 - Python のバージョンを確認します。 対象がサポートする最低 Python バージョンを
pyproject.toml(requires-python)、.python-version、setup.cfg、または CI マトリックスから読み取り、出典を示します。宣言されていない場合は、最新の安定版 Python を基準に判断することを明記します。その後、最低バージョンを metadata.json のverified_pythonと比較します。- 最低バージョン ≤ 検証済みバージョン:続行します。最低バージョンより上のバージョンに依存するルールは N/A になります。
- 最低バージョン > 検証済みバージョン:差分に含まれる各バージョンについて
https://docs.python.org/3/whatsnew/3.{N}.htmlを取得し、差分ブリーフィングを作成します。新しい標準ライブラリの機能(std-no-hand-rolled-batteriesテーブルに追加)、新しい構文と型付けの形式(disp-/typing-ルールの適用範囲を拡張)を含め、各行に出典を記載します。ブリーフィングはレビュアープロンプトの{{VERSION_DELTA_BRIEFING}}スロットに入れます。レビュー後、ルールを再検証してverified_pythonを引き上げられるよう、差分を gotchas.md に記録します。
- ルールを読み込みます。 references/_sections.md と、
references/内のすべてのルールファイル(すべてのdisp-*.md、model-*.md、alt-*.md、typing-*.md、std-*.md、flow-*.mdファイル)を読みます。 - レビュアープロンプトを作成します。 ルール、対象、Python の最低バージョン、および該当する場合は差分ブリーフィングを references/reviewer-prompt.md に記入します。作成したプロンプトは完全に自己完結している必要があります。レビュアーには会話履歴が見えないため、プロンプト外のコンテキストを参照してはいけません。
- ブラインドレビュアーを 1 人だけ割り当てます。 作成したプロンプト全体のみを入力として、単一の Task サブエージェントを起動します。会話のコンテキストや、プロンプトに添えるコメントは一切含めません。
- フェイルクローズで判定します。 レビュアーの構造化出力が判定結果です。統合ステップはありません。全体の判定が PASS となるのは、すべてのルールが PASS または N/A の場合に限ります。1 つでも FAIL があれば、ゲートは FAIL です。平均化、重要度による比較、ルールの免除は一切行いません。「軽微」な FAIL も FAIL です。レビュアーが「GATE NOT APPLICABLE」(対象に Python ソースがない)を返した場合は、判定結果を出さずにそこで終了し、その旨を報告します。
- 判定結果を出力します。 assets/templates/verdict.md に記入します。FAIL の場合は、レビュアーの「PASS に必要な修正」の提案を集約して修正リストを作成し、重要度の高いカテゴリから順に、それぞれの箇所を明記します。FAIL となったルールはすべて修正リストに含め、記載どおりに適用できる具体的な変更を示します。レビュアーの提案が違反内容を言い換えただけの場合は、判定結果を出力する前に、そのルールの正しい例から修正方法を導きます。
変更されていない対象の再レビューで同じルールの判定が変わる場合、または人間が根拠を読んだうえで判定結果を覆す場合、そのルールには判定可能性の不具合があります。gotchas.md に記録してルールを明確化し、ゲートの判定を覆してはいけません。
判定形式
レビュアーはルールごとに、PASS | FAIL | N/A、根拠(file:line または引用。PASS と FAIL の両方で必須)を返します。FAIL の場合はすべて、適用すればルールを PASS にできる修正(変更内容と箇所を明記し、違反内容の言い換えは不可)を示します。最終レポートは assets/templates/verdict.md に従います。
ルールのカテゴリ
| # | カテゴリ | プレフィックス | 禁止する誤ったデフォルト |
|---|---|---|---|
| 1 | ディスパッチと制御フロー | disp- | ディスパッチ構文を使うべき設計での分岐の連鎖 — レジストリ/match を使わず、イベント/バージョンに対する if/elif を連ねる、パターンに対する isinstance の連鎖、StrEnum の代わりに状態を表す文字列リテラルを繰り返す、本文全体を分岐させるブール値パラメーター |
| 2 | データモデリング | model- | 形が定義されていないデータ — @dataclass(slots=True) の代わりに __init__/__repr__/__eq__ を手書きする、シグネチャ間で受け渡すパラメーターの寄せ集め、境界を越えて文字列キーで外部ペイロードをたどる |
| 3 | 抽象化の高さ | alt- | 判断を追加せず間接性だけを増やすレイヤー — 単一メソッドのクラス、1 対 1 のパススルーラッパー、単一実装の ABC(継ぎ目には利用側の Protocol を使用)、再利用を目的とした具象クラスの継承 |
| 4 | 最新の型付け | typing- | 習慣による Python 3.10 以前の表記 — 組み込み型や X | None の代わりに typing.List/Optional/Union を使う、PEP 695 の代わりに TypeVar/Generic を形式的に使う、Self の代わりにクラス名を戻り値の型として使う |
| 5 | 標準ライブラリの最新化 | std- | 標準機能を独自に再実装する — pathlib の代わりに os.path で処理する、batched/pairwise/cache/tomllib を再実装する、非推奨の utcnow()、独立したソースに対してチェックなしで zip を使う。バージョン差分の概要によって対象を拡張します |
| 6 | 非同期処理とエラーフロー | flow- | 失敗経路が見えなくなる — TaskGroup の代わりに create_task を呼び出して結果を確認しない、ログ記録も記録の保存もせずにエラーを握りつぶす広範な except ブロック |
注意事項
レビュアーを呼び出す前に注意事項を読んでください。ここにはスコープガード(バージョン確認の境界ケース、ブランドではなく形状を重視すること、差分とリポジトリの検索義務、「グリーンフィールドでの判断」が許可することと許可しないこと)が事前に記載されているため、レビュアーがルールの範囲外で判断することを防げます。
関連スキル
adversarial-ts-patterns— 同じ問題(過剰な抽象化とモデリング不足)を対象とする、TypeScript/React 向けの対応スキルです。同じプロトコルを使い、言語が異なります。radical-simplification— 助言を行う対応スキルです。判定を下すのではなく、失敗した判定を 修正 したいときに、複雑さを解消するための思考法を提示します。
参照ファイル
| ファイル | 説明 |
|---|---|
| references/reviewer-prompt.md | 各ブラインドレビュアー用の自己完結型プロンプトテンプレート |
| assets/templates/verdict.md | 判定レポートのテンプレート |
| references/_sections.md | カテゴリの定義と順序 |
| metadata.json | バージョン、verified_python、ソースへの参照 |