*.delete。それらには
ループに人を入れたい:呼び出しを保留し、人間に見せ、それから yes のときのみ進めます。
それがまさに pending_approval 判定が行うことです。
このページはヒューマンインザループのエージェント承認フローをエンドツーエンドで
カバーします:保留された呼び出しがどう表面化するか、レビュアーがコンソールまたは
webhook からどう解決するか、そしてエージェントが承認された呼び出しをどう再送信するか。
判定がルール文法のどこに位置するかについては
ファイアウォールルールを;その周りのポリシーモデルに
ついてはファイアウォールの概要を参照してください。
1. 保留された呼び出しがどう見えるか
ルールがpending_approval に解決すると、エンジンは承認レコードをエンキューし、
呼び出しはツールに到達しません。リレーは error.code firewall_approval_pending の
HTTP 400 を返します;エージェントがポーリングする承認 id は人間可読の
error.message で運ばれます:
error.metadata(存在する場合)は判定の理由詳細 — reason_code、
factors、risk_score — を運び、承認 id ではありません。id をメッセージからパース
するか、下記の SDK ヘルパーから取得します。
保留は即時です — リクエストをブロックするインラインのロングポールはありません。
エージェントは id を返してもらい、呼び出しはサーバー側で pending 状態にパークされ、
解決は帯域外で行われます。
保留された呼び出しは判定
pending_approval のファイアウォールイベントとして記録される
ため、events ログで deny イベントのすぐ隣で
フィルタ可能です — 何が保留されたか、そして承認レコードを介して何が解決されたかを
常に見られます。2. 具体例 1 つ
本番接続への任意の書き込みを人間のために保留するルールを作成します:エージェントがツールを呼ぶ
エージェントが
prod に対して db.write を発行します。ルールがマッチし、エンジンが
呼び出しを保留し、リレーが approval_id を持つ 400 firewall_approval_pending を
返します。人間(またはシステム)がレビューする
レビュアーが承認を解決します — コンソールで、または署名付き webhook コールバック
経由で(§3 を参照)。
エージェントが解決までポーリングする
エージェントは状態が
pending でなくなるまで承認 id をポーリングします
(§4 を参照)。3. 承認を解決する
pending 承認を approved または rejected に変える方法は 2 つあります。両方とも
最初の決定が勝つ保証を共有します — 着地する最初の解決がアトミックに適用され、
後の解決(または重複)は 200 を返す冪等の no-op です。
コンソール — レビュアーが承認/拒否をクリック(Developer+)
コンソール — レビュアーが承認/拒否をクリック(Developer+)
Approvals タブは保留中の保留を最古順にリストし、それぞれにツール名と、ポリシーと
発火したルール句を名指しする「Held because…」行が付きます。(生の呼び出し引数は
承認レコードに保存されません — ツール名、来歴、args ハッシュのみ — そのため
レビュアーはツールとマッチした句から決定します。)レビュアーは次のように 1 つを
解決します:
decision は approved または rejected でなければなりません。このルートは
UserAuth(レビュアーのコンソールセッション)であり Developer+ にゲート
されています — レビュアーのアイデンティティが認可なので、共有シークレットは
関与しません。解決はワークスペース監査ログに書き込まれます。Webhook — 独自のシステムが決定、HMAC 署名付き
Webhook — 独自のシステムが決定、HMAC 署名付き
承認を外部システム(Slack 承認、チケットワークフロー)に配線するには、ワークスペースの
承認 webhook シークレットを設定し、それから決定を POST して返します:コールバックは HMAC-SHA256 で認証されます:
X-Orca-Signature: sha256=<hex>
ヘッダーを、ワークスペースの承認 webhook シークレットでキー付けされた
<approval_id>\n<raw_body> の HMAC に設定します。id は署名された素材の一部なので、
キャプチャされた署名を別の承認に対してリプレイできません。設定されたシークレットが
なければ、コールバック駆動の解決は拒否されます — 代わりにコンソールの PATCH 経由で
解決します。4. ポーリングしてから再送信する
エージェント側はポーリングループに続いて 1 回の再送信です。 ファイアウォールゲートウェイスコープのトークンで承認状態をポーリングします:/evaluate と MCP
ゲートウェイに使われるのと同じ専用ゲートウェイキー)を
必要とします;通常のリレーキーは 403 を受け取ります。承認ドキュメントを返します —
state が pending ではなく approved または rejected になるまで待ちます。
クロスワークスペースまたは未知の id は 404 を返し、別のテナントにそれが存在することを
決して開示しません。
状態が approved になったら再送信します:同じツール呼び出しを、単回使用の
ヘッダーに承認 id を運んで再発行します:
rejected 承認は決してクレーム可能では
ないため、エージェントは拒否を終端の deny として扱い、別のパスを選ぶべきです。
5. 状態とロール概観
| 状態 | 意味 | エージェントのアクション |
|---|---|---|
pending | 保留、決定待ち | ポーリングを続ける |
approved | レビュアーが yes と言った | ヘッダーとともに一度再送信 |
rejected | レビュアーが no と言った | deny として扱う |
| アクション | ルート | 認証 · ロール |
|---|---|---|
| キューをリスト | GET /api/workspace/firewall/approvals | UserAuth · Developer+ |
| 解決 | PATCH /api/workspace/firewall/approvals/:id | UserAuth · Developer+ |
| Webhook コールバック | POST /api/v1/firewall/approvals/:id/callback | HMAC 署名付き |
| 状態をポーリング | GET /api/v1/firewall/approvals/:id | ゲートウェイトークン |
6. 承認がどこに収まるか
pending_approval 判定はファイアウォール判定の
ひとつです — ポリシー内の他のすべてと合成されます。知っておく価値のある 2 つの相互
作用:
- スキル隔離が保留にエスカレートする。 保留されたツール呼び出しが
隔離されたスキルによって所有されている場合、deny
未満のものは自動的に
pending_approvalにエスカレートされます — 隔離と承認は 2 つの 方向から見た同じレビューゲートです。 - シャドウモードがそれを平坦化する。
シャドウモードでは、
pending_approval判定はauditに格下げされ[shadow] would …としてログされるため、保留が実トラフィックを ゲートし始める前に、それがどのくらいの頻度で発火するであろうかを測定できます。
次に進む場所
判定
6 つすべてのファイアウォール判定とデフォルト判定。
ゲートウェイキー
承認のポーリングに使うファイアウォールゲートウェイトークンを発行。
シャドウモード
保留が実トラフィックをゲートする前に測定。
ルールリファレンス
pending_approval 判定を生成するルールを作成。
