はじめに
プロジェクトのアシスタントは同僚が計画文書を読むのを手伝います。アシスタントは documents.read のような構造化要求であるツール呼び出しを提案し、Tool Server が操作を実行します。もっともらしい提案も、実行の許可ではありません。
合成データを使う学習用サービスを保守します。正常な読み取りから始め、2 回の小さなポリシー編集で不要な書き込み・削除権限を除きます。提案は決定的な再生で、ライブモデルの応答ではありません。認証、サーバー判断、文書操作は実際に行われます。このラボはプロンプトインジェクションへの耐性を試しません。
設定の保守には Policy Editor、認証済み要求には Test Client、再生ページには Assistant Tool Lab タブを使います。両ターミナルは同一インスタンス上の異なる OS ユーザーです。Policy Editor は意図的に保守権限を持ち、Test Client はポリシー編集も sudo の使用もできません。基本的なターミナル操作ができれば十分です。
読み取りを維持して書き込みを除く
このステップでは正常な文書読み取りを観察し、アシスタントの書き込み権限を除きます。
このステップを始めるには、ラボ画面の Assistant Tool Lab タブを選択してください。
学習用アカウントは alice と bob です。主体とは認証で確定したユーザーの識別情報です。各アカウントにはツール権限をまとめる assistant ロールがあります。文書は合成データです。alice-notes は Alice、bob-notes は Bob が所有し、Bob は team-plan を Alice と共有しています。使い捨ての実演に使えるのは demo-pad だけです。
Assistant Tool Lab タブに切り替えます。alice を選び、パスワード training-alice を入力して Sign in を押します。ツール documents.read、文書 alice-notes のまま Replay proposal を押します。トレースは信頼できない提案とサーバー結果を分けて示します。HTTP 200、主体 alice、判断 allowed、Synthetic Alice planning notes が期待されます。これは実際の文書読み取りです。

Test Client タブでは、準備済みの assistant コマンドが認証アカウントで HTTP 要求を送ります。replay は再生ルートへ提案を送り、call は直接ツールハンドラーへ進みます。その後の 2 語がツールと文書を指定します。実行してください。
次のコマンドを実行する前に、Test Client タブに切り替えてください。
assistant replay documents.read team-plan
HTTP 200 と Synthetic shared project plan が期待されます。次は使い捨て文書だけで過剰な権限を観察します。
assistant replay documents.write demo-pad
HTTP 200 と "effect": "written" が期待されます。サーバーはこの実演用文書を実際に変更しました。読み取り専用の業務ロールには、この操作は不要です。
Policy Editor タブに切り替えます。cat はファイルを表示します。この絶対パスは有効なツール許可リストを指します。
次のコマンドを実行する前に、Policy Editor タブに切り替えてください。
cat /home/labex/project/tools.json
JSON は名前と値を引用符で囲み、その間をコロンで区切り、リストに角括弧を使います。現在の assistant リストには読み取り・書き込み・削除があります。メニュー項目を消しても直接要求は残ります。サーバーは要求ごとにハンドラーのガード内でこのリストを読み込みます。
次の中間ポリシーでファイルを置き換えます。cat > path は表示の代わりにテキストを書き込みます。引用された EOF が文字をそのまま扱うヒアドキュメントを開始し、最後の EOF は単独行に置きます。小さなファイル全体を置き換えるため、誤字は再実行で直せます。
cat > /home/labex/project/tools.json <<'EOF'
{
"assistant": ["documents.read", "documents.delete"]
}
EOF
Test Client タブに戻り、書き込み提案を繰り返します。
次のコマンドを実行する前に、Test Client タブに切り替えてください。
assistant replay documents.write demo-pad
HTTP 403 と tool_denied が期待されます。403 はサービスが要求を受信して拒否したことを表し、接続エラーは判断に到達していないことを表します。CLI は意図した拒否を表示してもシェルを終了しません。policy_error が出たら Policy Editor タブに切り替えて完全な JSON 編集を繰り返し、Test Client タブに戻って要求を再試行します。再起動は不要です。
assistant call documents.read alice-notes
読み取りは引き続き HTTP 200 を返す必要があります。チェックポイントは両方の認証ユーザーで書き込み拒否と正常読み取りを調べます。出力のコピーは求めません。
直接削除の経路を閉じる
このステップでは読み取り専用ロールを完成させ、直接ハンドラーと再生の両方を試します。
このステップを始めるには、ラボ画面の Policy Editor タブを選択してください。
削除は別の操作です。書き込みを止めても削除は自動では止まりません。Policy Editor タブで、ロールに必要な唯一の操作だけのリストに置き換えます。同じファイル全体の編集方法を使います。
次のコマンドを実行する前に、Policy Editor タブに切り替えてください。
cat > /home/labex/project/tools.json <<'EOF'
{
"assistant": ["documents.read"]
}
EOF
Test Client タブで、使い捨て文書に直接削除要求を送ります。
次のコマンドを実行する前に、Test Client タブに切り替えてください。
assistant call documents.delete demo-pad
HTTP 403 と tool_denied が期待されます。call は再生ページを通らないため、可視インターフェース自体が強制境界ではないと分かります。直接書き込みも試します。
assistant call documents.write demo-pad
同じ拒否が期待されます。Alice が正当に共有された文書を読めることも確認します。
assistant call documents.read team-plan
HTTP 200 と Synthetic shared project plan が期待されます。Assistant Tool Lab タブで Alice のログインを保ち、documents.delete を選び、demo-pad を入力して Replay proposal を押します。ここでもサーバーは tool_denied で拒否しなければなりません。

「読み取りだけしてください」というプロンプトはこのガードを代替できません。バックエンドは提案とは独立に判断する必要があります。すべてのツールを無効にしてもアシスタントの有用な仕事が壊れます。読み取りが拒否されたら JSON リスト内の documents.read のつづりを確認してください。チェックポイントは使い捨てのメモリ内文書に対して同一の書き込み・削除ハンドラーのガードを呼び、実際の許可された読み取りを確認します。学習者の文書は削除しません。
読み取りツールは、まだ他のユーザーの非公開オブジェクトを要求できます。次のラボで独立した文書境界を加えます。
まとめ
正常な読み取りを保ちつつ書き込み・削除権限を除きました。再生された提案も直接呼び出しも、同じ実際のサーバーガードを通るようになりました。ツール権限は一つの境界です。許可された読み取りにも文書ごとの判断が必要です。



