yoi/tickets/permission-extension-point.md

55 lines
2.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# パーミッション: パターンベースのツール実行制御
## 背景
現状の `Scope` はディレクトリ単位の書き込み制約で、静的な境界線。
実際のエージェント運用では、ツール単位・引数パターン単位の動的な権限制御が必要になる。
OpenCode はパターンベースのルールtool × pattern → allow/deny/askを持ち、
`*.env` への書き込み拒否や `rm -rf` の実行拒否を宣言的に設定できる。
## 方針
`PreToolCall` Hook として実装する。マニフェストにルールを宣言し、
insomnia 層の Hook 実装がツール呼び出し時に評価する。
```toml
[[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](remove-hook-module.md)~~ — 完了。PreToolCall は Pod 層の `hook::Hook<PreToolCall>` として利用可能