-
Notifications
You must be signed in to change notification settings - Fork 0
approval mode picker_ja
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 のまま維持する。
今回のレビューで、元の計画にあった次のブロッカーを修正した。
- 代理承認は
approvalPolicy=on-failureではなくapprovalsReviewer=auto_reviewで制御する。 - Full access は Codex sandbox と通常の承認要求を回避する。app-server が承認要求を 送らない操作を Worker のポリシーエンジンが検査することはできない。
- 一般の
[profiles.*]はプロセス起動時の設定であり、2 個の turn 値へ安全に縮約 できない。拡張側 TOML パーサーではなく app-server の permission-profile API を使う。 -
turn/startoverride は後続 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 を解決する。
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 は Codex sandbox と通常の承認プロンプトを無効化する。Worker の
IApprovalPolicyEngine / ProtectedDirectoryPolicy は app-server が承認要求を送った後に
だけ実行されるため、Full access に対する独立した強制境界ではない。
- ComboBox と slash command の両方で同じ明示確認を必須にする。
- 警告を表示し Automation HelpText でも読み上げる。色だけで伝えない。
- 保存済み Full access ID を再起動後に無確認で復元しない。再確認しなければ Custom を使う。
- Fake server に承認要求を強制しても Full access の防護を証明したことにはならない。 承認要求が発生しない経路もテストする。
-
[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 固定で あることを説明する。
- 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 を使う。
- 手書き
[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 を弱めず、保存値も上書きしない。
-
/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 を更新する。
- 固定対象 Codex version から schema を再生成・比較し、
approvalsReviewerや permission-profile 選択がない runtime でも安全に degrade することを確認する。 - warnings-as-errors の決定的 solution build を 1 回行い、両 test project を
--no-buildで実行する。 - Ask / Auto / Full / Chat / 新規 thread の Custom / permission profile の正確な JSON tuple を 検証する。Ask/Full/Profile から Custom への遷移と resume も含める。
- permission-profile pagination、
cwd、managed restriction、timeout、不正/巨大項目、loading placeholder、欠落項目、一時失敗をテストする。 - 最終 VSIX 内の Worker、両 Contracts assembly、raw embedded Remote UI XAML を検査し、 package/deployment assembly hash を照合する。
- Experimental Instance で keyboard、mouse、狭幅、Light/Dark/Blue、High Contrast、high DPI、 live theme switch、永続化、確認、両 slash-command 名を検証する。
- 対応する実 Codex で、手動承認がユーザーへ届くこと、Auto が eligible request を reviewer に 送ること、Full access では警告後に通常は承認要求が発生しないこと、Custom が実効設定で 新規 thread を開始することを確認する。