コンテンツにスキップ

エンタープライズ統合リハーサル

英語版の参考訳です(08/11/2026 更新)。内容が異なる場合は英語版が優先されます。識別子、コマンド、コードブロックは翻訳せずにそのまま掲載しています。

この任意の合成アプリケーションは、インストール済みのパッケージと実際のループバック HTTP を使って DCP を動かします。プロトコルのコア、SDK、本番用アダプターの外にあります。検証、アドミッション、委任のアクティベーション、アプリケーションの認可は、それぞれ別の判断です。 有効な署名はアクションを認可せず、一度だけの実行も保証しません。

このリハーサルでは TypeScript/Express と Python/FastAPI を使います。直接のアドミッションにはインストール済みのアダプターを使い、委任によるアドミッションとアクティベーションにはアプリケーション内で SDK の公開 API を使います。アダプターが委任の合成を実装しているとは主張しません。Go/Rust の相互運用性は適合性キットの範囲です。WASM は合成された委任チェーンを公開していません。

前提条件

macOS arm64 上で Node 22.15.0、npm 11.3.0、CPython 3.12.2 を使ってテストしました。Git、Python の venv サポート、POSIX のプロセスグループ、/bin/ps、公開の npm/PyPI レジストリへのアクセスが必要です。ほかのプラットフォームでは検証が必要です。アカウントの認証情報、実在するプリンシパルのデータ、稼働中のサービス、公開済みの開発用パッケージは不要です。

このキットと必要な SDK API を含むチェックアウトを使ってください。パッケージのソースには、追跡対象の変更があってはなりません。レビューしたパッケージのソースはコミット b3d41bd062ce035b537f8d3acd3e96e5b2ce310c のもので、キットはそれとは別のソース成果物です。バージョンだけではこれらのビルドを特定できません。ソースのコミットと成果物のハッシュを記録してください。公開済みのバージョンに、ここでテストした変更が含まれているとは考えないでください。

準備とインストール

次のブロックは、リポジトリのルートから同じシェルで実行してください。出力先のサブディレクトリはすべて新規でなければなりません。一時ディレクトリの親は、/tmp のようなプラットフォームの別名を避けるため、物理パスに解決します。

MP05_ROOT="$(pwd -P)"
MP05_TMP="$(mktemp -d)"
MP05_TMP="$(cd "$MP05_TMP" && pwd -P)"
python3 tools/enterprise-rehearsal/prepare.py \
  --source "$MP05_ROOT" --revision "$(git rev-parse HEAD)" \
  --work "$MP05_TMP/build"
python3 tools/enterprise-rehearsal/install.py \
  --manifest "$MP05_TMP/build/artifacts.json" \
  --work "$MP05_TMP/consumer"

prepare.py は 3 つのパッケージディレクトリを Git からエクスポートし、TypeScript と Express の tarball、Python の wheel/sdist をビルドして、ソース、ツール、コマンド、ハッシュを記録します。パッケージのソースを変更することも、何かを公開することもありません。Express のロックは、まず公開済みの SDK 2.2.0 への依存をダウンロードします。スクリプトはそれをローカルの SDK tarball に置き換え、コンパイルの前に内容を確認します。パッケージング時には、元のパッケージのマニフェストとロックを保持します。

install.py は分離されたコンシューマーを作成します。Node のサードパーティパッケージはキットのロックで固定され、変わるのはローカル tarball の integrity 値だけです。Python のサードパーティパッケージとビルドツールにはバージョン/ハッシュのロックがあり、DCP はローカルの wheel から --no-deps でインストールされます。ロックにはレジストリの wheel のハッシュが含まれますが、ほかのプラットフォームで入手できるかどうかは引き続き検証が必要です。編集可能インストールや、チェックアウトからの SDK の import は使いません。

リハーサルの実行

node tools/enterprise-rehearsal/node/rehearse.mjs \
  --manifest "$MP05_TMP/build/artifacts.json" \
  --consumer "$MP05_TMP/consumer" --work "$MP05_TMP/run"

ランチャーはまず、オフラインのインストールガードを実行します。対象は、成果物と内容のハッシュ、ロック、import の解決、入れ子になった SDK のコピー、Python のパスとディストリビューション、必要な API です。次に、キットを Node のコンシューマーにコピーし、ハッシュの一覧を STAGED.json に記録します。Python はコンシューマーのインタープリターを -I 付きで使います。サーバーはこの一覧、SDK の出所、ガードの記録を確認しますが、リクエストのたびにインストールの完全な監査を繰り返すことはしません。これらの確認は、すべてのサードパーティ依存関係の監査ではありません。

ランチャーは IPC を通じてランナーとサーバーを所有するため、ランナーがブロックしても、管理されたクリーンアップは妨げられません。サーバーは 127.0.0.1 のエフェメラルポートだけにバインドします。ランナーには 900 秒の期限、リクエストには 10 秒のタイムアウトがあり、各グループの後に 60 秒の経過時間チェックがあります。グループのチェックは、強制的に取り消す期限ではありません。リハーサル中に、リモートのアプリケーションエンドポイントに接続することはありません。

終了コード 0 には、選択した計画の完了、期待どおりの結果、秘密情報スキャンの成功、クリーンなシャットダウンが必要です。エラー、観測の欠落、想定外のコード、余分な効果、残留したプロセス、クリーンアップの失敗があると、コマンドは失敗します。呼び出しごとに新しい作業ディレクトリが必要で、以前に成功したレポートが新しい実行の条件を満たすことはありません。--lanes node または --lanes python は診断用の一部を選ぶもので、2 レーンすべての受け入れ実行ではありません。

Express のサンプルは、認証、本文の解析、DCP の前に、接続元ごとのリクエストを 60 秒のウィンドウで 600 件に制限します。オペレーターの読み取りも含み、超過時は 429 APP_RATE_LIMITED を返します。転送ヘッダーで接続元を選ぶことはできません。このローカルなメモリ内の予算は Express リハーサルのもので、プロトコルの規則ではなく、FastAPI レーンに同等のレート制限があることも示しません。

シナリオと期待される判断

完全な計画は 1 レーンあたり 100 ステップ、合計 200 ステップです。期待値はリクエストの前に書かれ、HTTP ステータス、DCP とアプリケーションのコード、認証されたテナント、実際の DCP の結果、ソースの呼び出し、予約、効果を含みます。どのグループにも肯定と否定の対照があります。

グループ 実行する内容
G1 帯域外で受け取ったフィンガープリントによるプリンシパルの登録。誤ったフィンガープリントや改変された鍵ドキュメントは拒否
G2 直接のアドミッション、セッションの期限切れ、オーディエンス、アプリケーションのアクション、署名済みの引数
G3 合成の bearer から導出されるテナント。別のテナント、信頼の欠如、偽装されたヘッダー、エンベロープの余分なフィールド
G4 再起動なしでの信頼の撤回と復元
G5 失効したエージェント/鍵、利用できない拒否リストや本当に古い拒否リスト、不正な形式の日付、復元
G6 プリンシパル/エージェントの鍵のローテーション、重複期間、廃止。再発行されたマンデートと確認応答
G7 委任の合成とアクティベーション、マンデートの失効/有効期間、欠落または誤った確認応答、マンデートリストだけの障害
G8 すべてのマンデートと交差させたアプリケーションのポリシー。アクション、ドメイン、データクラス、上限、署名済みの引数
G9 ローカルの単回使用の予約、別のリクエスト ID/シリアライズでのリプレイ、8 件の同時 HTTP リクエスト
G10 両ルートでの生バイトの取り込み:複数の深さでの重複キー、数値の形式、Unicode/UTF-8、宣言された本文予算とストリーミングでの本文予算

アドミッション済み/アクティブな証拠でも、実際の DCP の結果は action_authorized=false のままです。アプリケーションは別途 application_authorized を返し、その効果を記録します。確認応答が欠けていると、証拠はアドミッションされても委任は非アクティブのままになることがあり、その場合は効果が生じません。古いリストは元の日付のまま提供され、受信時に黙って更新されることはありません。オペレーターが新しいスナップショットを明示的に公開します。

アプリケーションはテナントを認証し、その信頼セットを帯域外で選び、bundle は JSON 本文でのみ受け付けます。ヘッダー経由でアドミッションされた証拠とは異なる本文を認可しないように、X-DCP-Bundle を拒否します。これはキットの判断であり、アダプターからヘッダーのサポートを取り除くものではありません。未知のエンベロープフィールドはソースの呼び出し前に拒否されます。この拒否自体は、SDK における信頼の失敗を証明するものではありません。

証拠と保持

build/artifacts.json、consumer/installed.json、そして run/verify.json、stage.json、supervision.json と、新しく作られた run-*/report.json/plan.json を保管してください。レーンごとの証拠には、観測、ソースへの問い合わせ、予約、効果が記録されます。レポートにはローカルのファイルシステムのパスが含まれます。キットのソースまたはそのファイルのハッシュを、パッケージのコミットとともに保存してください。成果物のバージョンは、ソースが異なっていてもレジストリのバージョンと一致することがあります。

フィクスチャは TEST ONLY の秘密鍵と bearer トークンを、アクセスを制限したディレクトリに生成します。ランナーは、既知のバイト/hex/base64 表現が証拠に含まれていないかをスキャンしてから、秘密情報のディレクトリを削除します。外部のスーパーバイザーも、強制終了されたランナーが残した秘密情報を、自分の新しい作業ディレクトリの中でスキャンして削除します。証拠は保持し、そのディレクトリの外を指すリンクを通じた削除は拒否します。このスキャナーは汎用の DLP ではありません。実際の鍵、トークン、個人データで置き換えないでください。

管理されたタイムアウトと割り込みには対応しています。ランチャー自体への SIGKILL、停電、ファイルシステムの同時改ざんの場合は、クリーンアップを保証できません。そのような中断の後は、作業ディレクトリを確認し、残っている合成の秘密情報を保持ポリシーに従って処分してください。HTTP リハーサルは秘密情報のディレクトリを削除します。以下のフィクスチャのテストは、最後のクリーンアップコマンドを実行するまで、$MP05_TMP/helper-tests に TEST ONLY のデータを保持します。

対象を絞ったテスト

これらの対照は、一時的なフィクスチャとインストール済みのコンシューマーを使います。最初の 2 つのコマンドは、準備の失敗とインストールの改ざんを扱います。改ざんは使い捨てのコピーの中でだけ行います。API を欠いた合成の SDK は、API のチェックだけでなく、実行前にその内容によって拒否されます。

python3 -B -m unittest discover -s tools/enterprise-rehearsal -p test_prepare.py -v
python3 tools/enterprise-rehearsal/negative_controls.py \
  --manifest "$MP05_TMP/build/artifacts.json" --work "$MP05_TMP/consumer"
node --test tools/enterprise-rehearsal/process.test.mjs tools/enterprise-rehearsal/secrets.test.mjs
REHEARSAL_PYTHON="$MP05_TMP/consumer/python/bin/python" \
REHEARSAL_VERIFY_REPORT="$MP05_TMP/run/verify.json" \
REHEARSAL_WORK="$MP05_TMP/helper-tests" \
  node --test "$MP05_TMP/consumer/node/rehearsal/node/test/"*.test.mjs
"$MP05_TMP/consumer/python/bin/python" -I -m unittest discover \
  -s "$MP05_TMP/consumer/node/rehearsal/python" -p 'test_*.py' -v
rm -rf -- "$MP05_TMP/helper-tests"

生の取り込みコーパスは、HTTP とは独立して実行することもできます。これらのテスト補助ファイルをインストール済みの Node パッケージの隣にコピーしてください。チェックアウト内の SDK に対しては実行しないでください。

mkdir "$MP05_TMP/consumer/node/ingress-controls"
for name in ingress-node.mjs ingress_python.py ingress-cases.json test-ingress.mjs test_ingress.py; do
  cp "$MP05_ROOT/tools/enterprise-rehearsal/$name" "$MP05_TMP/consumer/node/ingress-controls/$name"
done
node "$MP05_TMP/consumer/node/ingress-controls/test-ingress.mjs" \
  "$MP05_TMP/consumer/node/ingress-controls/ingress-cases.json"
"$MP05_TMP/consumer/python/bin/python" -I \
  "$MP05_TMP/consumer/node/ingress-controls/test_ingress.py" \
  "$MP05_TMP/consumer/node/ingress-controls/ingress-cases.json"

ランナーの対照は、反転した期待値、欠落した観測/グループ、重複、インフラストラクチャのエラー、古いレポートの再利用を拒否します。スーパーバイザーの対照は、ブロックしたランナーや突然終了したランナー、協力しないサーバー、不正な形式のリクエスト、起動の失敗、プロセステーブルの失敗、残った秘密情報を扱い、あわせてクリーンな肯定の実行も確認します。

実際の統合における境界

  • プロトコル: アイデンティティの証拠、検証、アドミッション、オプトインのアクティベーション。dcp-jcs-v1 は変わりません。アプリケーションはバイトの取り込みポリシーに実験的なスキャナーを再利用しますが、新しい正規化プロファイルを有効にすることはありません。
  • アダプター: 直接の strict-v1 アドミッション。本文/ソースのオプトインの予算、取り消し、テナントごとの監視を伴います。委任のルートはアプリケーション内で別の上限付き HTTP ソースを使うため、合成されたチェーンについてのアダプターのソース割り当ては示しません。
  • アプリケーション: テナントの認証、信頼の管理、アクションと引数のポリシー、ローカルの台帳。SKU、通貨、max_amount の意味はアプリケーションの規則です。マンデート間の縮小は、引き続きプロトコルの規則です。
  • オペレーター: 実際のオンボーディング、認証、TLS、鍵の保管/HSM/KMS、失効の公開、保持、デプロイの管理。合成の bearer やフィンガープリントは、OIDC でも人間向けの PKI でもなく、エージェントがオンラインであることの証明でもありません。ループバックは本番 TLS のテストではありません。
  • 台帳: ローカルでのアトミックな予約は、試行が最大 1 回であることを意味します。厳密に 1 回だけの実行、外部サービスとのトランザクション、分散協調、クラッシュ後の物理的な永続性は保証しません。管理上の変更は直列化されます。8 件の同時 HTTP リクエストは、8 件の暗号検証が並行して行われることを意味しません。ソースのタイムアウトは、同期的な暗号処理を取り消しません。

レビュー済みのリハーサルは、公開コンテンツだけからなる独立したコピーで 200/200 ステップに合格し、4 つのサーバーはクリーンに終了し、合成の秘密情報は削除されました。独立してビルドした 4 つのパッケージ成果物は、最初の準備で作られたものとバイト単位で同一でした。これは再現可能な統合の証拠であり、本番環境への準備ができていることの認定でも、外部のセキュリティ監査でもありません。サポートされる境界については、アドミッションと運用上の上限を参照してください。パッケージの公開とパイロット環境へのデプロイの検証は、別のステップです。