Skip to main content
カスタムポリシーは、トレースや監査から得た障害パターンを、エージェントの動作中にリアルタイムで実行される判断に変換します。ポリシーはアクションを許可したり、エージェントにガイダンスを提供したり、問題が再発する前にアクションを拒否したりできます。 ツール、パス、コマンド、環境、または運用ルールに依存する動作に対してカスタムポリシーを使用してください。既存の制御を再作成しないよう、まず組み込みポリシーカタログを確認してください。

カスタムポリシーを作成する

  1. Admin → policy editor に移動し、New policy を選択して、防止したい障害を説明します。
  2. ポリシーソースを追加し、エディターで期待される一致ケースと安全な非一致ケースをテストします。すべてのバリデーションエラーを解消してください。
  3. ドラフトを保存し、Publish version を選択してイミュータブルなバージョンを作成します。
  4. Admin → enforcement に移動し、テストマシンに observe モードでバージョンをデプロイし、適用前に Observe → policy で判断内容を確認します。 カスタムポリシーを作成・公開するためのポリシーエディター。

狭いルールから始める

このポリシーは、コマンドがproduction環境を対象としている場合にのみ、破壊的なKubernetesコマンドをブロックします。その正確な障害モード以外のすべてのケースは allow() を返します。
良いポリシーは、一文で説明できるほど狭いものです。エージェントの意図ではなく、観測可能なアクションにマッチさせ、ルールが適用されない場合はすぐに allow() を返します。

判断を選択する

理由は回復しなければならないエージェント向けに記述してください。何が検出されたか、そして代わりに何をすべきかを説明してください。
安全境界には instruct() を使用しないでください。ガイダンスの配信はエージェントハーネスによって異なります。アクションを防止しなければならない場合は deny() を使用してください。

ポリシーオブジェクト

ツールのフィルタリングは fn 内で行ってください。match.toolNames はパブリックなカスタムポリシー型には含まれていません。

ポリシーコンテキスト

すべてのポリシーは PolicyContext を受け取ります。 すべてのオプション値は本当にオプションとして扱ってください。エージェントのバージョンやイベントタイプによって、提供されるフィールドが異なります。

一般的なツール入力

Failproof AI はサポートされているハーネス間で一般的なツールを正規化するため、通常1つの入力形式でポリシーを使用できます。 ツール入力値は unknown として型付けされているため、防御的な型変換を使用してください:

イベントを選択する

イベントの可用性とブロック動作はエージェントハーネスによって異なります。混在フリートでイベントに依存する前に、エージェントハーネスを確認してください。
SessionStartSessionEndUserPromptSubmitPreToolUsePermissionRequestPermissionDeniedPostToolUsePostToolUseFailureNotificationSubagentStartSubagentStopTaskCreatedTaskCompletedStopStopFailureTeammateIdleInstructionsLoadedConfigChangeCwdChangedFileChangedWorktreeCreateWorktreeRemovePreCompactPostCompactElicitationElicitationResultUserPromptExpansionPostToolBatchSetup

一般的なポリシーパターンを作成する

保護されたパスへの書き込みをブロックする

ノンブロッキングガイダンスを提供する

セッション完了をゲートする

拒否された Stop イベントはエージェントを再試行させる可能性があります。現在の環境でエージェントが満たせる条件のみをゲートとして使用し、すべてのサブプロセスやネットワーク呼び出しに上限を設けてください。

ポリシーファイルを読み込む

コンベンションファイル

コンベンションファイルは自動的に読み込まれます:
  • プロジェクトとユーザーのポリシーディレクトリは両方とも読み込まれます。
  • ファイルは各ディレクトリ内でアルファベット順に読み込まれます。
  • ファイルは policies.jspolicies.mjs、または policies.ts で終わる必要があります。
  • 1つのファイルで複数の customPolicies.add() 呼び出しがサポートされています。
  • ローカルモジュールからの相対インポートがサポートされています。
  • プロジェクトポリシーはコミットできるため、同じルールがリポジトリに従います。

明示的なファイル

バリデーションや設定でエントリファイルを直接指定する必要がある場合は、明示的なパスを使用してください:
明示的なファイルが最初に読み込まれ、次にプロジェクトコンベンションファイル、最後にユーザーコンベンションファイルが読み込まれます。両方のパスで見つかったファイルは一度だけ読み込まれます。

バリデートしてテストする

バリデーションはモジュールをプロダクションローダーで実行し、少なくとも1つのポリシーが登録されていることを確認します。
バリデーションはファイルの欠如、構文エラー、未解決のインポート、トップレベルの例外、モジュール読み込みタイムアウトを検出します。ただし、マッチロジックが正しいことは証明しません。 少なくとも以下のケースをテストしてください:
  • 一致して意図したポリシー理由を生成するアクションを1つ。
  • allow() を返す必要のある近いが安全なアクションを1つ。
  • 欠落または不正なツールフィールド。
  • 代替コマンド構文、パス、引用符、大文字小文字、空白。
  • 利用不可能なサブプロセスまたはネットワーク依存関係。
Observe → policy で結果をカスタムポリシーに帰属させてください。異なる組み込みポリシーが判断を行った場合、ブロックされたテストだけでは不十分です。

ランタイムの動作

  • 組み込みポリシーはカスタムポリシーより前に評価されます。
  • 最初の deny がそれ以降のポリシー評価を停止します。
  • イベントを拒否するポリシーがない場合、複数の instruct 結果を組み合わせることができます。
  • ポリシー関数の実行期限は10秒です。
  • スローされた例外またはタイムアウトはログに記録され、allow() として扱われます。
  • 読み込みに失敗したコンベンションファイルはスキップされ、他のカスタムファイルと組み込みポリシーは継続します。
  • トップレベルのモジュール読み込みにも10秒の期限があります。
  • クラウドオブザーブモードはポリシーを実行しますが、非allowの判断を強制せずに記録します。
ポリシーモジュールは決定論的で高速に保ってください。トップレベルのネットワーク呼び出しやサーバーの起動を避けてください。fn 内の処理に上限を設け、依存関係の失敗をキャッチし、その失敗が操作を許可すべきか拒否すべきかを意図的に選択してください。

APIエクスポート

TypeScript は PolicyContextPolicyResultCustomHookPolicyDecisionPolicyFunction をエクスポートします。

カスタムポリシーをデプロイする

バージョンを公開し、observeモードでデプロイし、判断内容を確認して、適用に移行します。