yoi/tickets/permission-extension-point.md

2.0 KiB
Raw Blame History

パーミッション: パターンベースのツール実行制御

背景

現状の Scope はディレクトリ単位の書き込み制約で、静的な境界線。 実際のエージェント運用では、ツール単位・引数パターン単位の動的な権限制御が必要になる。

OpenCode はパターンベースのルールtool × pattern → allow/deny/askを持ち、 *.env への書き込み拒否や rm -rf の実行拒否を宣言的に設定できる。

方針

PreToolCall Hook として実装する。マニフェストにルールを宣言し、 insomnia 層の Hook 実装がツール呼び出し時に評価する。

[[permission]]
tool = "bash"
pattern = "rm *"
action = "deny"

[[permission]]
tool = "file_write"
pattern = "*.env"
action = "deny"

[[permission]]
tool = "*"
pattern = "*"
action = "allow"

評価順序OpenCode に倣う):

  1. 最初にマッチした deny → 拒否
  2. すべてマッチする allow → 許可
  3. それ以外 → ask(ユーザー確認)

設計ポイント

  • 設計原則3: 新しい trait は作らない。PreToolCall Hook として実装
  • 設計原則2: マニフェストに宣言した以上、insomnia 層が解決する
  • ask アクションは Pod Protocol の拡張が必要Method に PermissionReply を追加)
  • Scope との関係: Scope は書き込みの物理的境界、Permission はツール実行のポリシー。補完関係
  • ルール評価はパターンマッチのみ。コンテキスト依存の判断はしない(シンプルに保つ)

段階的実装

  1. 拡張ポイントの記録(今): docs/pod.md の拡張ポイント表に追加
  2. deny/allow の実装(ツール実装時): PreToolCall Hook でパターン評価
  3. ask の実装Protocol 拡張時): Method/Event に Permission 関連メッセージを追加

依存チケット

  • remove-hook-module.md — 完了。PreToolCall は Pod 層の hook::Hook<PreToolCall> として利用可能