Skip to content

approval mode picker_ja

Kazushi Kamegawa edited this page Jul 19, 2026 · 2 revisions

Codex 承認モードピッカー

Date: 2026-07-19 Tracking: Issue #75、sub-issue #76・#77・#78 Status: 実装前レビューと修正済み

概要

チャットツールウィンドウに Agent 専用の permission ピッカーを追加する。手動承認、 Codex auto-reviewer による代理承認、Full access、Codex の実効設定、および capability で制御されたカスタム permission profile を選べるようにする。既存の Chat モードは read-only のまま維持する。

今回のレビューで、元の計画にあった次のブロッカーを修正した。

  1. 代理承認は approvalPolicy=on-failure ではなく approvalsReviewer=auto_review で制御する。
  2. Full access は Codex sandbox と通常の承認要求を回避する。app-server が承認要求を 送らない操作を Worker のポリシーエンジンが検査することはできない。
  3. 一般の [profiles.*] はプロセス起動時の設定であり、2 個の turn 値へ安全に縮約 できない。拡張側 TOML パーサーではなく app-server の permission-profile API を使う。
  4. turn/start override は後続 turn にも残るため、Custom でフィールドを省略しても override 済み thread はリセットされない。

プロトコル前提

同梱 schema と現行 app-server では、次の軸が分離されている。

  • approvalPolicy: untrusted / on-failure / on-request / never。 on-failure は deprecated であり auto-review ではない。
  • approvalsReviewer: user / auto_review / 互換用 guardian_subagent。
  • sandboxPolicy: readOnly / workspaceWrite / externalSandbox / dangerFullAccess の構造化ポリシー。
  • permissionProfile/list: 作業ディレクトリに対する built-in と [permissions.<id>] profile をページング付きで返す。
  • 実験的な turn permissions: 完全な permission profile を ID で選択する。 低レベル sandbox override と同時送信しない。
  • thread/settings/updated と thread start/resume/fork response は thread の実効 permission state を返す。永続化された既定値と同一視しない。

Permission profile の選択は Experimental API 設定と runtime capability/schema の両方が 対応する場合だけ有効にする。未対応 runtime では config.toml を直接解析せず、4 個の 組み込み選択肢を維持する。

組み込みマッピング

ピッカー項目 approvalPolicy approvalsReviewer sandboxPolicy 永続化 ID
Ask for approval on-request user {type: workspaceWrite} ask
Approve on my behalf on-request auto_review {type: workspaceWrite} auto
Full access never user {type: dangerFullAccess} full
Custom (config.toml) 新規/base thread では override なし override なし override なし custom
Permission: <id> 省略 省略 省略し permissions=<id> を送る permission:<id>
Chat モード never user {type: readOnly} このピッカーでは永続化しない

untrusted はより厳格な safe-command trust policy であり、通常の手動承認プリセットには 使わない。policy / reviewer / sandbox が別々に不整合にならないよう、1 個の catalog entry から完全な tuple を解決する。

希望する既定値と thread の実効状態

UI は次の 2 値を分離して保持する。

  • 希望する既定値: 将来の turn または新規 thread 用に保存する安定 ID。
  • thread の実効状態: 選択中 thread について app-server が返した approval policy、 reviewer、sandbox、active permission profile。

両者が異なる場合、/status は両方を表示する。thread start/resume/fork、thread 切替、 thread/settings/updated では実効値だけを同期し、ユーザーの希望値を上書きしない。

Custom は「拡張 override を使わず Codex 設定に従う」という意味である。override 済みの 既存 thread では後続 turn に設定が残るため、Ask / Auto / Full / permission profile から Custom へ戻す場合は、検証済み clear API が追加されるまでは新規 thread が必要になる。 UI はこの遷移を説明して新規 thread 作成を提示する。null やフィールド省略を reset と みなさない。

Full access の安全動作

Full access は Codex sandbox と通常の承認プロンプトを無効化する。Worker の IApprovalPolicyEngine / ProtectedDirectoryPolicy は app-server が承認要求を送った後に だけ実行されるため、Full access に対する独立した強制境界ではない。

  • ComboBox と slash command の両方で同じ明示確認を必須にする。
  • 警告を表示し Automation HelpText でも読み上げる。色だけで伝えない。
  • 保存済み Full access ID を再起動後に無確認で復元しない。再確認しなければ Custom を使う。
  • Fake server に承認要求を強制しても Full access の防護を証明したことにはならない。 承認要求が発生しない経路もテストする。

Remote UI と設定モデル

  • [DataContract] option 型に [DataMember] の ID、表示名、説明、source を持たせ、 ComboBox は安定 ID(SelectedValuePath)で bind する。表示文字列は永続化しない。
  • option collection、選択 ID、Agent 専用の計算 enablement property に [DataMember] を 付け、Mode 変更時に依存 PropertyChanged を通知する。
  • turn 作成と /status は同じ catalog/resolver を使う。未知 Mode は Custom へ安全に fallback し、保存済み Full access を適用しない。
  • 設定ストアを注入可能にし、テストで利用者の AppData に書かない。保存は atomic に行い、 同時保存を直列化する。
  • 保存済み dynamic profile は discovery 成功まで placeholder を残す。RPC 失敗では選択を 保持する。catalog 取得成功後、欠落項目を削除する前に Custom を選ぶ。
  • profile ID/説明は untrusted UI input として件数・長さを制限し、表示名の改行・制御文字を 除去する。raw stable ID は別に保持し、予約 ID 衝突と曖昧な slash-command match を拒否する。
  • Visual Studio の ComboBox style と DynamicResource を維持し、狭幅、keyboard、High Contrast、 high DPI、live theme switch を検証する。
  • AutomationProperties.Name と AutomationProperties.HelpText を設定する。無効な permission picker は Tab 移動で飛ばされるため、隣接する Mode control でも Chat が read-only 固定で あることを説明する。

Sub-issue A — 組み込みモード、プロトコル意味論、永続化 (#76)

  • typed Remote UI option と stable selected ID を追加する。
  • StartTurnRequest、Worker contract、Worker serialization、Fake app-server log、wire test に ApprovalsReviewer を追加し、contract version を 10 から 11 へ上げる。
  • 明示的な Agent だけでレビュー済みマッピングを適用する。Chat は常に never/user/readOnly を優先し、未知 Mode は安全側へ fallback する。
  • injectable/atomic settings store を追加する。安全な選択は復元するが Full access の復元には 再確認を要求する。
  • desired/effective state と Custom へ戻る際の新規 thread 遷移を実装する。
  • ComboBox、正確な Full access 警告/確認、automation metadata、XAML/DataMember 回帰テストを追加する。
  • /status も turn/start と同じ resolver を使う。

Sub-issue B — app-server 経由の permission profile (#77)

  • 手書き [profiles.*] TOML reader をスコープから削除する。
  • Worker RPC に permissionProfile/list を追加し、cwd、pagination、cancellation、timeout、 page/item 上限、unsupported-method degrade を扱う。contract version を 11 から 12 へ上げる。
  • Experimental/runtime capability check 後にだけ [permissions.<id>] を一覧へ追加する。
  • 選択 ID は実験的 turn permissions で送信し、低レベル policy/reviewer/sandbox override と 排他的にする。
  • start/resume/fork と thread/settings/updated から実効状態を同期する。
  • app-server/managed-policy の結果に従う。未対応や一時失敗で policy を弱めず、保存値も上書きしない。

Sub-issue C — /permissions、/approve、status、docs (#78)

  • /permissions を正式な setting command とし、/approve は互換 alias にする。
  • 引数なしは選択肢一覧を表示する。引数ありは stable ID の完全一致または一意な表示名だけを 受け付け、曖昧な入力を拒否する。
  • Chat モードでは read-only 固定を案内する。active turn 中の変更は既存の coalesced setting command と同じく次の turn に適用する。
  • Full access は ComboBox と同じ確認を通す。
  • /status、slash-command reference、design、implementation docs を更新する。

検証

  1. 固定対象 Codex version から schema を再生成・比較し、approvalsReviewer や permission-profile 選択がない runtime でも安全に degrade することを確認する。
  2. warnings-as-errors の決定的 solution build を 1 回行い、両 test project を --no-build で実行する。
  3. Ask / Auto / Full / Chat / 新規 thread の Custom / permission profile の正確な JSON tuple を 検証する。Ask/Full/Profile から Custom への遷移と resume も含める。
  4. permission-profile pagination、cwd、managed restriction、timeout、不正/巨大項目、loading placeholder、欠落項目、一時失敗をテストする。
  5. 最終 VSIX 内の Worker、両 Contracts assembly、raw embedded Remote UI XAML を検査し、 package/deployment assembly hash を照合する。
  6. Experimental Instance で keyboard、mouse、狭幅、Light/Dark/Blue、High Contrast、high DPI、 live theme switch、永続化、確認、両 slash-command 名を検証する。
  7. 対応する実 Codex で、手動承認がユーザーへ届くこと、Auto が eligible request を reviewer に 送ること、Full access では警告後に通常は承認要求が発生しないこと、Custom が実効設定で 新規 thread を開始することを確認する。

Clone this wiki locally