commerce-trust-safety について
ショッピングおよびマーチャントエージェントの信頼性と安全性に関するルールを定めるスキルです。信頼できない内容の隔離、データの来歴確認、操作制限、メモリ管理を扱い、共通 executor や関連 MCP サーバーの安全境界の実装・レビューに役立ちます。
主な機能
- 01第三者コンテンツの正規化と隔離
- 02データ来歴に基づく書き込み制御
- 03数値や用語に関する質問の根拠確認
- 04セッション識別と所有権の検証
- 05メモリの制限と削除
活用シーン
- 01カタログやウェブ内容によるプロンプト注入の抑制
- 02カートとマーチャント変更操作の検証
- 03メモリの検証・保持ルールの確認
- 04MCP サーバーのローカルインターフェースへの制限
MCP 対応
README では、認証ゲートウェイが前段にあることを環境変数で示さない限り、参照 MCP サーバーは loopback にバインドすると説明されています。サーバーは環境から主体を取得します。
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ anthropics/ commerce-agents --skill commerce-trust-safetyインストール後、Claude Code で/commerce-trust-safetyを入力して読み込まれたか確認します。
詳細
信頼と安全性に関するルール
commerce_common/ は commerce-common/commerce_common/、shopping_agent/ は shopping-agent/core/shopping_agent/、merchant_agent/ は merchant-agent/core/merchant_agent/ です。docs/safety.md にも同じルールが記載されています。ツール呼び出し内のルールは、1つのエグゼキューター(commerce-architecture)を共有する3つのパスすべてに適用されます。ルール10と15では、適用されるパスを明記しています。マーチャントのステージング、ガードレール、承認、マーケットプレイスの対応方針については、commerce-merchant-operations を参照してください。
サードパーティーのコンテンツを隔離する
- カタログ、レビュー、ポリシー、注文、指標、メッセージ、またはウェブコンテンツから得られるすべてのツール結果は、
Fence.fence_payload(commerce_common/fencing.py)を通します。NFKC 正規化され、不可視文字と制御文字が削除され、フェンスマーカー、偽造されたターンマーカー、特殊トークンが置換され、ロールのラベルで囲まれたうえで、max_fenced_charsで切り詰められます。エグゼキューターの_fencedがすべてのハンドラーに適用します。 - ラベルと通知はロールごとの定数(
shopping_agent/fencing.pyのSTOREFRONT_FENCE、merchant_agent/fencing.pyのMERCHANT_FENCE)です。通知は静的プロンプト内に一度だけ記載し、その中に信頼できない情報は含めません。 - リクエストごとのブロック(プロフィール、カート、メモリの事実、ページ、ストアコンテキスト)は、キャッシュブレークポイントの後で同じフェンス内に配置します(各ロールの
prompt.pyにあるbuild_dynamic_context)。バックエンドのコンテキストブロックには、それぞれ独自の上限があります。 - モデルから提供された結果件数は、
max_search_resultsを上限として制限されます(commerce_common/execution.pyのclamp_limit)。
出所と上限に基づいて書き込みを制御する
- カートへの書き込みで受け付けるのは、
ShoppingSessionState.seen_productsに含まれる ID のみです。この値はセッションのカタログ読み取りと注文読み取りによって設定されます(shopping_agent/gates.pyのcheck_provenanceとremember_order_items)。更新と削除では、すでにカートにある商品行も受け付けます。マーチャントのステージングで受け付けるのはseen_listingsに含まれる ID のみで、適用と破棄で受け付けるのはseen_changesに含まれる ID のみです(merchant_agent/gates.py、commerce-merchant-operations)。 - セッションロックのもとで、書き込み後の商品行には
max_quantity_per_item、カートにはmax_cart_linesが上限として適用されます(shopping_agent/gates.pyのgated_add_to_cart、上限はshopping_agent/config.py)。ロックはプロセスごとのため、StorefrontBackendのカートメソッドでも上限を適用します。適格性、価格、在庫は、どちらのロールでもバックエンドが管理します。 - どちらのインターフェースにも、料金の請求や注文の確定を行う機能はありません。
checkoutはカートを表示し(shopping_agent/enrichment.pyのenrich_checkout)、ホストが注文を完了します。購入後のサポートは読み取りのみで、キャンセルや返金を行うツールはありません。 - 出所情報はセッション状態(
ShoppingSessionState、MerchantSessionState)に保持され、リクエストまたはターンの終了時にセッションとともに保存されます(examples/demo_common/sessions.pyのSessionStore。トランスクリプトの隣にバージョン管理された状態ドキュメントが保存されるため、別のプロセスで処理されるリクエストでも読み込めます)。各マップでは最新のPROVENANCE_CAP件のレコードが保持されます(commerce_common/types.pyのremember)。破棄された ID を使うには、再度読み取る必要があります。 - コンポーネントは検証され、その商品、注文、指標、または変更がこれらのレコードから結合され、出所情報のない ID は破棄されて報告されます(
commerce_common/presentation.pyのrun_presentation、各ロールのenrichment.py、commerce-ui-tools)。
数値や用語に関する回答の根拠を示す
- 用語についての質問、注文についての質問、未確認の商品 ID(
shopping_agent/grounding.pyのGROUNDING_RULES)、パフォーマンスについての質問、またはステージング済みの内容がない状態での申請リクエスト(merchant_agent/grounding.py)は、該当する読み取りから開始します。commerce_common/grounding.pyのfirst_forced_toolが読み取りを選択し、Messages API ランタイムはtool_choiceでそれを強制し、SDK ランタイムはルールにプリフェッチ形式がある場合に事前取得します(commerce_common/agent_sdk.pyのground。用語のルールにはありません)。ホスト型の経路ではプロンプトのみを使用します。 - 用語集は設定タプル(
policy_intent_terms、order_intent_terms、product_id_patterns、metrics_intent_termsと、それぞれの手がかり)です。デプロイ時に独自の単語を追加でき、ゲートフラグでルールを無効にできますが、どちらもプロンプトのバイト列は変更しません。
サーバー上で本人性を維持する
- セッション開始時に、認証済みプリンシパルを推測困難なセッション ID に紐付けます。後続のリクエストで送信するのはその ID のみであり、ルートはレコードからプリンシパルを取得します(
examples/demo_common/sessions.pyのSessionStore.startとsession_dependency)。リクエストのフィールドやツール引数でユーザー、マーチャント、オペレーターを指定することはありません。MCP サーバーは環境からプリンシパルを取得し、本番サーバーではリクエストから取得します。 - プリンシパルがレコード(注文、チケット、出品)を所有しているかどうか、および呼び出しが依存する手順が完了しているかどうかは、バックエンドがストアを照合して確認します。ID の由来がわかっていても、所有者であることや準備ができていることの証明にはなりません。
記憶する内容を制限する
- 2 つの書き込み経路(
save_memoryとターン後の抽出)を通るすべての事実は、commerce_common/memory.pyのvalidate_factによる検証を通ります。キーは最大 64 文字、値は最大 200 文字、MemoryCategoryの 3 つの値のいずれかである必要があり、さらにデフォルトで識別子の形式の値を拒否するMemoryWriteFilterによるチェックも行われます。memory_blocked_patternsでパターンを追加でき、checksが設定されたフィルターは既存のフィルターを置き換えます(MemoryRuntime.build)。 - 抽出では直近のやり取りにおけるユーザーとアシスタントのテキストを読み取ります(
commerce_common/turn.pyのtranscript_text)。extract_and_storeは、その間に対象が削除されていた場合、バッチ全体を破棄します。Messages API ランタイムは抽出を実行し(update_memory)、SDK ホストはランタイムを呼び出します。ホスト型の経路ではsave_memory経由でのみ書き込みます。 memory_retention_days(with_retention)、MemoryStore.delete_fact、MemoryStore.clear、enable_memoryは、すべての経路で適用され、プロンプトやツールのバイト列は変更しません。サンプルでは読み取りルートと削除ルートを公開し(examples/demo_common/memory.pyのinstall_memory_routes)、アカウント削除時にはclearを実行します。- 対象は、買い物客の
user_idまたは操作のmerchant_idです(各ロールのexecutor.pyにあるmemory_subject)。
結果で拒否し、インターフェースを固定する
- 保留された呼び出しは、ゲート名を含む通常の結果を返します(
commerce_common/streaming.pyのToolOutcome.held。ホストのtool_resultイベントにはstatus: blockedが含まれます)。失敗時にはエラー結果を返し、executeが例外を送出することはありません。 - ツール一覧は設定によって決まります。
enable_web_search(デフォルトではオフ)でツールが追加され、SDK ランタイムでは登録済みの名前を許可リストで制限し、マニフェストではツールを 1 つずつ有効にします。 - リファレンス MCP サーバーは、認証を行うゲートウェイが前段にあることを環境変数で明示しない限り、ループバックにバインドします(
commerce_common/mcp_server.pyのenforce_local_only_bind)。
敵対的評価のための 2 つのルール
- 有害な出品、レビュー、メッセージは、デモデータやカタログデータの外部にある評価用フィクスチャとして保存され、実行ごとにマージされます。
- すべての拒否ケースには、同じ領域に処理すべきケースを対にして用意します。これにより、スイートで過剰な拒否も検出できます(commerce-evals)。
コメント
Markdown 対応