Communityライティング&編集github.com

SebastienElet/agent-skills

拒否を目的としたコード(フック、ガード、バリデーター、パーミッションチェック、リントルール、CIゲート)を作成する際に使用します。パスまたは失敗を決定する制御を追加または変更するときに使用します。チェックがバイパスされたり実行に失敗したりする可能性がある場合(ラッパーやポリシーと呼ばれる場合でも)必ず使用してください。

agent-skills とは?

このスキルは、AIエージェントがセキュリティゲートや検証制御を記述する際に、単なる「正常系テスト」ではなく「拒否の質」で評価されるコードを書くためのガイドラインを提供します。特に、危険な値を直接検査せずにその表現(シェルコマンド文字列、差分、ログ行など)で判断する「ヒューリスティック」と、制御が実行できなかったために成功を返す「失敗閉じ」が、レビューをすり抜ける2つの重大な障害モードであると指摘します。このスキルはClaude Code、Cursor、CodexなどのAIエージェントで使用でき、フック、ガード、バリデーター、パーミッションチェック、リントルール、CIゲートの作成・変更に適用します。具体的なステップとして、保護対象の値へのシンクの特定、プローブの可視性の維持、バイパス手法の列挙とテストケース化、さらに新たなコンテキストを持つサブエージェントによる敵対的テストの実施を推奨します。これにより、単なる正常系テストでは発見できない脆弱性やバイパス経路を体系的に洗い出し、より堅牢な制御を実現できます。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/SebastienElet/agent-skills/tree/HEAD/skills/code-enforcement

Installed? Explore more ライティング&編集 skills: steipete/notion, langchain-ai/langchain, bytedance/podcast-generation · View all 6 →

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

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

ドキュメント

コード強制

概要

ガードは、誰かがそれを回避しようとしたときに何を拒否するかで評価され、正常パスを通るかどうかでは評価されません。レビューをすり抜ける2つの障害モードは、危険な値自体ではなくその表現を検査する制御、および実行できなかったために成功を返す制御です。どちらも、作者自身の前提から書かれたすべてのテストではグリーンに見えます。

使用方法

フック、ガード、バリデーター、パーミッションチェック、リントルール、またはCIゲートを作成または変更する際は、ファイルを開く前に以下の手順に従ってください。ステップ1でコードの配置場所が変わることが多いためです。

典型的なケース: 「リポジトリ外での rm -rf をブロックする」(ステップ1で判断をコマンド文字列から移動)、「マイグレーションにロールバックがない場合にCIを失敗させる」(ステップ3と4で、マイグレーションリストが空で戻ってきたときにゲートがパスするのを防ぐ)、「署名付きコミットがないプッシュを拒否する」(ステップ5でエイリアス、--no-verify、2番目のリモートを列挙する)。

手順

  1. シンクに名前を付ける。 保護対象に到達する正確な値を書き留めます。展開されたargv、リクエストボディ、SQLパラメーター、解決されたパスなどです。その値を検証します。
  2. 実際にそれが見えるかどうかを確認する。 コードが値の表現しか持っていない場合(シェルコマンド文字列、差分、ログ行、コミットメッセージ)、その判断はチェックではなくヒューリスティックです。コメントと配達ノートでそう述べ、そのレイヤーをアドバイザリとラベル付けします。元に戻せない結果に対して、ヒューリスティックを唯一の障壁にしてはいけません。
  3. 閉じて失敗する。 ランタイムの欠落、読み取り不可能な入力、パーサー例外、未解決の変数、空の結果:拒否し、何が欠けていたかを明示します。実行できなかったために終了コード0で終了するガードは無効なガードであり、数ヶ月間静かに無効のままになります。
  4. プローブの失敗を可視化する。 ガードが実行可能かどうかを決定するコマンドに 2>/dev/null を付けず、空の結果を成功に変えるブランチも作らないでください。プローブが静かに失敗することを許容すると、ステップ3は実施不可能になります。
  5. 修正を書く前にバイパスを列挙する。 制御が満たされたりスキップされたりする方法をリストします。複合コマンド、重複フラグ、2回目の呼び出し、エイリアスまたは関数、インタプリタの欠落、別のホスト、サブシェル、名前変更されたファイルなどです。リストをコミット本文またはテストファイルに保持します。
  6. そのリストの各エントリをテストケースに変換し、プロジェクトの自動チェックに組み込みます。手動のセルフテストはカウントされません。それは実行したセッションとともに消えてしまいます。
  7. バイパスが安価でその結果が現実的である場合、敵対的パスを実行する。 レビューではなくガードを破ることを任務とする、新しいコンテキストのサブエージェントを起動します。その出力は試行とその結果のリストです。最悪のケースが警告である制御についてはこれをスキップします。

注意点

  • シェルコマンドを解析して判断する。 引用、$()、&&、エイリアス、env プレフィックスはすべて、最終的に実行される内容を変更します。そのようなレイヤーはスピードバンプです。本当のチェックはコマンドの効果が及ぶ場所に属します。
  • command -v ガード。 if command -v tool > /dev/null; then check; fi は、ツールがないマシンではチェックを静かにスキップします。まさにそのツールが最も必要なマシンでです。それを反転させます:ツールがないときに拒否します。
  • 何も見つからない発見ステップ。 git grep -E は \b をサポートしていないため、そのようなパターンはエラーなしでゼロファイルにマッチし、ゲートは何も読まずにパスします。カナリア(その出力に現れることがわかっているファイル)でステップをガードします。
  • 実装した拒否のみをテストする。 興味深いテストは、あなたが考えもしなかった入力です。それがステップ5が生み出すものです。
  • 手動でのみテストされたガード。 作者のマシンではパスしますが、その後腐ります。プロジェクトにテストを組み込む場所がない場合、その欠落したハーネスも作業の一部です。
  • ガードを書いたコンテキストはそれを破れない。 それは穴を生み出した盲点を共有し、自身の設計を確認することになります。新しいコンテキストだけが敵対的です。

制約

  • 保護された値自体に到達可能な場合、その値のプロキシで判断してはいけません。
  • ガードがその仕事をできなかったパスで終了コード0で終了してはいけません。拒否し、原因を明示します。
  • ガードが実行可能かどうかを確立するプローブのエラーを抑制してはいけません。
  • 列挙されたすべてのバイパスは、デリバリー前に自動テストとして存在しなければなりません。
  • どのレイヤーがアドバイザリで、どのレイヤーが強制かを明確に述べてください。保証として提示されたヒューリスティックは、ガードがないよりも悪いです。

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

関連スキル