# アプリ連携の受け入れ確認

> アカウントモードのプローブは短期間有効な ID アサーションを取得します。Launch の否定的な購入状態は購入の証拠にすぎず、Licentivo のランタイム拒否の証明ではありません。ランタイムの証明には公式 SDK プローブが必要です。本番デプロイや SDK 公開を意味するものではありません。[アカウントの境界](/ja/launch-documents/account-purchase-boundary/)を参照してください。

証拠には、制御されたローカル自動チェックと外部事業者サンドボックスプローブの 2 つの別々の水準があります。テストダブル、カタログ取得の成功、生成された設定、ヘルスチェックの成功はいずれも実際の決済、ライセンス発行、アクティベーションを証明しません。外部サービスの設定は今回の開発で明示的に延期されました。

## ローカル自動チェック

リポジトリのルートから実行します：

```powershell
go test ./...
go vet ./...
node --check internal/httpapi/web/app.js
node --check internal/httpapi/web/integration.js
node --check internal/httpapi/web/integration-prompts.js
node --test scripts/integration-prompts.test.mjs scripts/integration-state.test.mjs
python scripts/test_acceptance.py
./scripts/test-mysql.ps1
```

MySQL ヘルパーは `.cache` 内に隔離された新しいサーバーとデータベースを作成します。顧客のデータベースを指定してはいけません。通常の `go test ./...` は隔離された DSN を指定しない限りデータベースシナリオをスキップします。SDK／パッケージのテストとビルドは [integration-packages.md](/ja/launch-documents/integration-packages/) に記載されています。テスト出力とツールバージョンをリリース記録とともに保持してください。

ローカルマトリクスには認証、条件付きメール認証、製品／環境の所有権、保留／期限切れ／停止状態、決済イベントの再実行、ライセンス照合、更新／返金、アカウント切り替え、保護されたセッションの永続化、オフラインフォールバックの判断が含まれます。ライフサイクルテストは制御されたランタイムを使用します。実際の暗号学的ランタイム検証は公式 SDK の責任であり、リリース前に別途実施します。

**運用ツール → AI クイック連携** では、9 言語すべての選択肢、プラットフォーム／プロジェクト／機能の選択、未設定ドラフト、検証済み公開設定から生成されたプロンプトを確認します。コピーとダウンロードが表示されたプロンプトと一致することを確認し、製品または環境を変更しても以前の検証済み設定が残らないことを確認します。プロンプトにはセッション、パスワード、ランタイムのライセンス／デバイス認証情報、管理キーを含めず、生成やコピーによって AI サービスを呼び出してはいけません。上記のソースバンドル Node テストコマンドは純粋な生成器を検証します。生成されたプロンプトや、その後 AI ツールが作成したコードには、引き続き言語テストと以下の外部受け入れ確認が必要です。

## 外部サンドボックス受け入れ確認の準備

1. アクセス可能な HTTPS オリジンとプロバイダー Webhook を備えた専用 Launch テストインスタンスをデプロイします。本番販売は無効のままにします。
2. 決済プロバイダー **1 社**のサンドボックス認証情報と Licentivo 読み書き接続を設定します。決済サンドボックスの記録は分離されますが、設定された Licentivo サービスを使用し、実際のテストライセンス／デバイス記録を作成することがあります。専用のテスト製品／ポリシーとテスト顧客を使用してください。
3. sandbox プランを公開し、**アプリ連携**を使用して `launch-config.json` と検証済みの `product.json` を `.local/acceptance/` にエクスポートします。
4. レビュー済みの Launch Python パッケージのみをローカルにインストールします：`python -m pip install ./sdk/python`、またはその wheel をインストールします。非公開 SDK 実装は含まれています。
5. `export` など従量制でないテスト機能を使用します。`--activate` は公式 SDK を起動し、`refresh_online()` を同期的に呼び出し、有効なオンライン状態を要求して、保護操作 API を呼び出します。キャッシュされたオフライン許可だけではこのプローブに合格できません。このプローブは計量を検証しません。

認証情報はエコーせずに入力を求めます。自動化では非公開のプロセス環境に `LAUNCH_ACCEPTANCE_EMAIL` と `LAUNCH_ACCEPTANCE_PASSWORD` を指定できます。パスワードをコマンド引数、レポート、スクリーンショット、コミットするファイルに含めないでください。ツールは各認証済みプローブ後に一時デスクトップセッションを失効させますが、通常終了時にはデバイスを非アクティベーションしません。

```powershell
python scripts/acceptance.py preflight --config .local/acceptance/launch-config.json --report .local/acceptance/01-preflight.json
python scripts/acceptance.py verify --config .local/acceptance/launch-config.json --expect not_purchased --report .local/acceptance/02-no-purchase.json
```

ツールは live 環境設定、ループバック以外の HTTP、認証情報を含むリダイレクト、不一致の製品、ランタイム秘密情報を含む公開設定を拒否します。リクエスト前に、`verify` 以外のアクティベーション／注文アサーションと `checkout` 以外のチェックアウト作成オプションを拒否します。既存レポートは上書きされません。レポートには許可リストに基づく証拠のみを含み、生のレスポンス、アクセストークン、ライセンスキーは含みません。サーバーまたは SDK がない場合はプローブ失敗となり、合成された成功にはなりません。

ローカル事業者プローブは `scope: local_sandbox_probe` と `licensing_scope: not_called` を使用します。`verify --activate` は事業者が localhost で実行されている場合も公式の外部ライセンスサービスに接続します。この組み合わせは `local_merchant_external_licensing_probe` と `licensing_scope: official_external_service` として記録されます。

## 初回決済とアクティベーション

事業者サイトでテスト用チェックアウトを作成するか、安定した操作 UUID で作成します：

```powershell
$operation = [guid]::NewGuid().ToString()
python scripts/acceptance.py checkout --config .local/acceptance/launch-config.json --provider stripe --plan-version-id PLAN_VERSION_UUID --operation-id $operation --report .local/acceptance/03-checkout.json
```

プロバイダーとプランバージョンを公開済みの sandbox プランに置き換えます。結果が不明なチェックアウト作成を再試行するときは同じ操作 UUID を保持して再利用します。ツールは注文 ID を表示します。プロバイダー公式の sandbox チェックアウトを使用し、事業者のアカウントセンターで所有するその注文を完了してください。プローブはプロバイダー UI の操作を意図的にシミュレートしません。

プロバイダーが支払いを確認し、Webhook を受信した後：

```powershell
python scripts/acceptance.py verify --config .local/acceptance/launch-config.json --order-id ORDER_UUID --expect-order paid --expect active --activate --product-config .local/acceptance/product.json --feature export --report .local/acceptance/04-activation.json
```

認証済みアカウント、所有する sandbox 注文、権利、認証情報と製品の対応、公式 SDK の実際の保護操作をチェックします。保留中の認可は `Retry-After` を守り、上限付きの時間枠（デフォルト 30 秒、最大 120）内で最大 5 回試行します。予期しない認可失敗は SDK の生のエラーテキストを公開せずに記録します。

## ライフサイクル受け入れ確認マトリクス

リリースされた各言語／OS の組み合わせについて、ソースリビジョン、Launch／クライアント／SDK バージョン、プロバイダー環境、匿名化した顧客ラベル、注文 ID、期待結果、観測結果、関連レポートのファイル名を含む日付付き記録を保存します。未実行の行は **未実行** と記載します。初回決済プローブだけでマトリクス全体を合格としないでください。

| シナリオ | 手順 | 必要な証拠 |
| --- | --- | --- |
| 登録／認証 | 購入せず登録し、認証の有効／無効それぞれで繰り返す | 無効な認証はブロックせず、有効な認証は完了まで `EMAIL_VERIFICATION_REQUIRED` を返す |
| 未購入 | `verify --expect not_purchased` を実行 | 認証情報が拒否され、保護操作が実行されない |
| 初回購入 | sandbox 決済を完了し、アクティベーションプローブを実行 | プロバイダーが決済を確認。支払い済み権利 1 件、同期済みライセンス 1 件、SDK 操作成功 |
| 再起動 | 選択した言語のサンプルをログインを記憶した状態で終了し、新しいプロセスを起動して復元 | パスワード入力なし。同じアカウント／製品のキャッシュと有効な署名済み許可 |
| オフライン起動 | ログインを記憶したアクティベーションの成功後、そのテストプロセス／マシンのネットワークを無効にして再起動 | 署名済みキャッシュ許可はポリシーで許可された操作のみを許可し、オフライン禁止／フローティングポリシーは起動を拒否 |
| オフライン期限切れ／時計の巻き戻し | 短期間のテストポリシーと使い捨てのテストマシンを使用 | SDK が期限切れ／時計巻き戻し状態を拒否し、機能コールバックは実行されない |
| 更新／アップグレード | sandbox ストアで更新または見積もり済みアップグレードを購入 | 正しい注文／対象期間。同期と SDK 更新後に新しい有効期間／機能が表示される |
| 返金 | sandbox の全額返金を要求／承認し、プロバイダーの確認を待つ | プロバイダーの返金とローカルの対象期間が一致し、適切に `verify --expect suspended` または `--expect expired` を実行。他の支払い済み対象期間は引き続き利用可能 |
| ログアウト／アカウント切り替え | A をログアウトし、未購入の B でログイン。再起動して動作を確認 | A の保存済みセッション／キャッシュが削除され、B は A のライセンス、デバイス、機能を使用できない |
| 製品／環境の分離 | 別の製品を使用し、sandbox/live 設定も個別に切り替える | 認証情報とキャッシュは ID の範囲を越えて使用できず、外部プローブ自体も live を拒否 |
| デバイス上限／解放 | ポリシーの最大数の異なるテストデバイスでアクティベーションし、さらに 1 台試した後、1 台を明示的に解放 | SDK は超過デバイスを拒否し、解放確認後に交換を許可。通常終了では解放枠を消費しない |
| 復旧 | 発行待ちの間に Launch を再起動し、署名済み sandbox Webhook を再実行 | 注文対象期間／ライセンスは 1 件で、最終的に照合される。チェックアウトや請求は重複しない |

既に発行されたオフライン許可への返金／停止の影響は、公式 SDK の署名済みオフラインポリシーの範囲に制約されます。切断中の即時失効は保証しません。契約期限時に Launch が長時間停止すると上流の停止が遅れることがあります。[契約上の制限](/ja/launch-documents/licentivo-contract/)を参照してください。

## 完了と保持する証拠

各プローブレポートは意図的に `acceptance_complete: false` を設定します。その実行で実際に行ったチェックのみを記録するためです。リリースを受け入れる前にマトリクスとプロバイダーの記録を確認してください。外部サービスを後で設定して上記コマンドを再開し、欠けた結果を合格フラグで置き換えたり、ローカルテストの成功だけを理由に本番販売を有効化したりしないでください。
