AIエージェント 開発の実装記録:Shipment Exception Commander

Claude Managed Agentsで物流例外対応を組み立てるAIエージェント 開発の設計・実装記録です。決定論的な採点、独立したリスク検証、人間によるネイティブ承認、一度だけ行う冪等なサンドボックス更新、監査証跡、フェイルクローズな公開構成まで、合成ケースの実行結果とともに詳しく解説します。

公開日

AIエージェント 開発の実装記録:Shipment Exception Commander

AIエージェント 開発で輸送トラブルへの対応が難しいのは、チームに選択肢がないからではありません。証拠ごとに信頼度が異なり、復旧案の見積もりには期限があり、コストは承認権限の境界をまたぎます。しかも、拙速に再試行すると、最初の予約が実際には成功していたにもかかわらず、二重予約を生むおそれがあります。

Shipment Exception Commanderは、まさにこの意思決定境界を扱うオープンソースのClaude Managed Agentsリファレンスアプリケーションです。1件の合成例外を調査し、すべての復旧案を機械的に採点したうえで、独立したリスク検証を別のエージェントに委任します。その後、人間に実行内容を正確に提示し、ネイティブ承認が得られた場合に限り、冪等なサンドボックス更新を1回だけ許可します。

AIエージェント 開発では、モデル判断より先に決定論的な採点を行う

コーディネーターが運賃を作り出したり、説明文をポリシーとして扱ったりすることはありません。サーバー側の読み取り専用shipment_intelligenceツールは3つの合成ケースを提供し、固定式で各選択肢を採点します。約束を守れる場合に50点、在庫をカバーできる場合に20点、絶対上限に対するコスト効率に20点、信頼度に10点です。各選択肢には、見積もりのバージョンと有効期限、ETA、保護できる数量、追加のUSDコストが紐づきます。

中心となる実証ケースSCX-2026-071では、現実の意思決定で生じる3つのパターンを比較しました。安価だが約束に間に合わない海上輸送、絶対支出上限を超える全量航空輸送、そして確約済みの240ユニットすべてを$4,200で保護する航空輸送の分割緊急手配です。分割案は91点で、オペレーター上限の$5,000以内に収まりました。採点によって推奨の再現性を確保し、Claudeは証拠の整理、前提への異議申し立て、トレードオフの説明を担います。

信頼できない証拠に実行権限を与えない

ある運送会社の注記には、承認ポリシーを無視してプレミアム案を予約するようエージェントに促す、命令のような文言を意図的に入れています。ワークフローはこの注記を信頼できない情報としてマークし、証拠として残しながらも、指示としては明示的に無視します。ポリシーの根拠は、バージョン管理された合成カタログとアダプターだけです。輸送に関する記述やツール出力をポリシーとして扱うことはありません。

また、コーディネーターには、セッションをまたぐ書き込み可能なメモリ、保管庫、MCP連携、外部ネットワークへの送信経路がありません。狭く限定された自動承認の例外はread、glob、grepだけです。Bashと成果物への書き込みはalways_askで、編集、Web取得、Web検索は無効のままです。正規の状態変更は、アダプターのexecuteコマンドに限られます。

検証エージェントが推奨案に異議を唱える

実行を要求する前に、Opusコーディネーターは提案した復旧案を、役割を絞ったHaiku検証エージェントに委ねます。実証実行で返ってきた判定はNEEDS_CHANGESでした。見積もりQ-071-v4がまだ有効か、輸送枠と追加料金が確定しているかを確認できなかったためです。コーディネーターはこの懸念を退けず、決定論的な提案バリデーターを呼び出しました。バリデーターは、合成時刻、見積もりの有効期限、ポリシーのバージョン、支出階層、想定される状態バージョンを再確認します。最終ステータスが準備完了に変わったのは、権威あるready_for_human_approvalという結果が得られてからです。

承認用ブリーフには、ケースIDと選択肢ID、正確な支出額$4,200、変更前後のETA、顧客との約束への影響、保護される240ユニット、見積もりの有効期限、ポリシーと状態のバージョン、スコア、検証履歴、却下した代替案、安定した冪等性キー、想定されるレシート項目、拒否時および失敗時の挙動をすべて明記しました。

拒否されたら、状態は一切変更しない

最初のネイティブ承認カードは、意図的に拒否しました。状態を変更するコマンドは実行されず、状態はバージョン3のdetectedのまま、レシートも存在せず、冪等性キーも未使用のままでした。エージェントはツールを切り替えたり、コマンドを変更したり、新しいキーを作り出したりしていません。

オペレーターから明示的な依頼を受け、同じ正規アクションをもう一度提示しました。今度は許可されました。アダプターは変更の境界で、状態バージョン3、見積もりの有効性、ポリシー、承認階層、$10,000の絶対上限を再確認しました。処理は正確に1回だけ実行され、ケースはバージョン3のdetectedからバージョン4のresolvedへ進みました。そして、レシートrcpt_37105a2da411aee0391cが、予約参照SBX-56DFC3291972とともに返されました。

再実行に耐える設計と、その適用範囲

合成アダプターは、安定したキーSCX-2026-071:OPT-071-B:v3、OSレベルのロック、正規状態の確認、レシートレジストリを管理します。同じ意図による重複呼び出しには既存のレシートを返し、同じキーで意図が競合すれば失敗します。古いバージョン、同時実行、部分的な書き込みの可能性がある場合は、むやみに再試行せず調査を求めます。

これらの保護策は、実際に保証できる境界を明確にしたうえで説明しています。ロック、状態、レシートレジストリは、1つのManaged Agentsサンドボックス内にあるセッションローカルなファイルです。分散型の本番環境を保証するものではありません。実際の運送会社やTMS向けアダプターには、共有トランザクションストアと、下流側の冪等性境界が必要です。

Outcomeグレーダーが証拠を検証する

セッションは/mnt/session/outputs/配下に3つの成果物を書き出しました。人間が読める復旧パケット、構造化された監査記録、実行時の生レシートです。Managed Agents outcomeは、これらのファイルをカタログ、アダプターのソース、正規状態、承認履歴、レシートレジストリと独立に照合しました。satisfiedを返す前に、見積もり期限の開示、失敗時の挙動の明記、成果物マニフェスト、セッションローカルという制約について修正を求めました。

その後、復旧パケットはアプリケーションのファイルプロキシ経由でダウンロードしました。SHA-256は30c8ad1d0d13cf7ad4b7070e67370ea270562c5e4ef44dfa503e3124180bd40bです。capabilityセッションはsesn_01CcQjCVoWvNQ7VJLFbuDJxh、outcomeはoutc_01GoD4rsLMh93iQNfAUw63KWです。

実際のoutcome実行では、UI上の不備も判明しました。グレーダーの子スレッドは、親セッションがアイドル状態のままでも承認を要求できます。今回のリリースでは、親のrequires_actionイベントと、子スレッドのevaluated_permission: askイベントの両方から保留中の承認カードを再構築します。確認または結果が届けばカードを終了し、リプレイで解決済みのプロンプトが復活することも防ぎます。さらに、グレーダーのsession_thread_idは、ブラウザ側の限定的な許可リストを通じてそのまま返し、判断を転送する前に、その経路が送信元の正確なツールイベントと一致するかを検証します。

別途構成したSonnetの実証セッションsesn_01BvSf33BLBbN86w5oDb3BkQでは、修正後の経路を検証しました。別スレッドから転送されたグレーダーツールsevt_013VnmofY8ytk6QwgDtNSYoqには、スレッドsthr_018HMgpidoN86Qp4iGLZt1q3が含まれていました。UIは同じツールIDとスレッドIDを持つ確認sevt_016ZFv5TdBPKNyEPThzGT36Qを生成し、サーバーが受理すると、グレーダーは再開して次の確認を要求しました。この限定的な実証は、無関係な追加反復に費用をかけないよう意図的に中断しています。中心となる輸送案件のoutcomeは引き続きsatisfiedでした。

Opusを主軸に、Sonnetで検証し、Haikuで独立確認する

プロビジョニング済みのコーディネーターは引き続きclaude-opus-5です。有料の検証を経済的かつ反復可能にするため、ローカルセッションではコーディネーターモデルに限ってclaude-sonnet-5へ明示的に上書きできます。それ以外の実行時上書きはすべてフェイルクローズします。独立検証にはclaude-haiku-4-5を使用します。課金対象のスモークセッションsesn_01RTs3wLV41odV9p92eWtrHVではSonnetを使い、正確にSMOKE OKという応答が返りました。

本番用テストスイートは、開発者が.env.localを設定している場合でも、意図的に認証情報から隔離されています。新規デプロイにはブラウザのキー入力欄がなく、Anthropicへの通信を一切行わず、configured: falseを報告し、課金ルートが503を返すことを検証します。

フェイルクローズで公開するリファレンス実装

公開中のVercelリファレンスには、AnthropicキーもManaged AgentsのリソースIDも含まれていません。ランディングページと/api/agent/healthは利用できますが、セッション作成はフェイルクローズで失敗します。導入者は自身のAnthropicアカウントに対してエージェントと環境をプロビジョニングします。構成済みのインスタンスは、ほかのユーザーがアクセスできるようにする前に、アクセス保護を施す必要があります。

このプロジェクトに登場するケース、運送会社、見積もり、予約参照、状態遷移、レシートは、すべて合成データです。このアプリケーションが示すのは運用上の制御パターンであり、実在する運送会社との連携ではありません。

リリースの証拠

Shipment Exception Commanderは、物流全般を扱うコパイロットよりも、意図的に対象を絞っています。担うのは、監査可能な1つの約束です。バージョン管理された証拠から推奨案を導き、その案を検証し、人間に正確なアクションの承認を求め、変更は1回だけ実行し、何が起きたかを再構成できるだけの証拠を残します。

公開日
カテゴリー
Build
ACPとは?Agent Client ProtocolでエディタとAIエージェントをつなぐ

ACPとは?Agent Client ProtocolでエディタとAIエージェントをつなぐ

ACPとは何か、エディタとコーディングエージェントをつなぐ仕組みから解説します。Zed、JetBrains、Android Studioの対応状況、Claude Agentの接続手順、MCPとの違いを整理。認証や設定、セッションの復元、権限管理の制約も押さえ、チームで試験導入する際の判断に役立てられます。2026年11月3日Build
Vercelの料金と代替サービス6選:Next.js・AIアプリの移行先を比較【2026年】

Vercelの料金と代替サービス6選:Next.js・AIアプリの移行先を比較【2026年】

Vercelの料金が気になる開発者向けに、Cloudflare、Render、Railway、Netlify、Fly.io、AWS Amplifyの6社を比較。Next.jsやAIアプリの実行環境、無料枠、課金方式、ストリーミング対応を整理し、移行先の選び方とVercelを使い続ける条件、移行前の確認手順を解説します。2026年11月3日Build
Retell AIなどVapiの代替サービスを比較:料金・連携・移行の選び方【2026年】

Retell AIなどVapiの代替サービスを比較:料金・連携・移行の選び方【2026年】

Retell AI、Bland AI、ElevenLabs Agents、Synthflow、Vida Globalを、料金体系・電話接続・外部連携・移行時の作業で比較します。Vapiの代替選びで見落としやすい従量料金や同時通話の制限、人への引き継ぎ、既存ワークフローを維持するための検証ポイントを整理します。2026年11月3日Build
Browser Useの使い方:ブラウザ自動化の仕組みとAIエージェントの作り方

Browser Useの使い方:ブラウザ自動化の仕組みとAIエージェントの作り方

Browser Useの使い方を、導入から最初の実行まで解説します。AIによるブラウザ自動化の仕組み、対応モデル、オープンソース版とCloudの違いを整理。Pythonのサンプルに加え、ログイン状態の管理、プロンプトインジェクション対策、送信前の承認と結果確認など、本番運用で押さえたい注意点を紹介します。2026年11月2日Build
SNS自動投稿を組み込むなら?Zernioの料金・対応APIをレビュー

SNS自動投稿を組み込むなら?Zernioの料金・対応APIをレビュー

SNS自動投稿を自社サービスに組み込みたい開発者向けに、Zernioの対応SNS、アカウント要件、料金、Webhook、MCPを解説します。接続アカウント単位の課金や運用上の制約を整理し、Ayrshare、Postiz、各SNSのネイティブAPIとの違いから、用途に合う選び方を検討します。2026年11月1日Build
AirtableとNotionの比較:6つの用途でわかる違いと選び方

AirtableとNotionの比較:6つの用途でわかる違いと選び方

AirtableとNotionの比較を、CRM、コンテンツ管理、プロジェクト管理、社内Wiki、在庫管理、クライアントポータルの6用途で解説します。料金だけでなく、AI、自動化、APIの制限や共有権限、併用時の役割分担、移行で引き継げない情報まで整理し、チームの業務に合う選び方を示します。2026年11月1日Build
Google Julesがサービス終了へ:データ保存と移行先の選び方

Google Julesがサービス終了へ:データ保存と移行先の選び方

Google Julesのサービス終了に向け、読み取り専用への切り替え日程、エクスポートの手順、履歴とAPIの注意点を整理します。Antigravity、Codex、Claude Code、GitHub Copilotへの移行方法と、実行環境・テスト・レビューで確認すべき点を解説します。2026年11月1日Build
AIエージェントフレームワーク「smolagents」の使い方と選び方

AIエージェントフレームワーク「smolagents」の使い方と選び方

AIエージェントフレームワークのsmolagentsを、Pythonで行動を組み立てる仕組みから解説。CodeAgentとToolCallingAgentの使い分け、Dockerで試す計算例、サンドボックスと権限設計の注意点を整理。LangGraphやOpenAI Agents SDKとの比較で、用途別の選び方を紹介。2026年10月31日Build
ニュースレター

毎週日曜、一通の手紙。動くシステムの話。感想戦ではなく。

週刊。スパムなし。いつでも解除できます。