# Launch SDK アカウントログアウトと複数インスタンスの修正、両側連携テスト

日付：2026-10-24。ユーザーが承認した第 1、3 項のうち Launch SDK が担当する修正を完了しました。AUTH-08 のアカウント永続化部分と AUTH-10 に対応します。Licentivo が提供した更新を同期し、ローカル連携テストを完了しました。**このタスクでは本番公開、SDK 公開、Git のコミットやプッシュは行っていません。**

## 修正結果

アカウントログアウトの保留タスクと現在復元可能なログインは安全なストレージ内の異なるキーを使用します。ログアウトマーカーの書き込みに失敗した場合、このインスタンスに属する古いログインのみを消去し、他のセッションは削除しません。追加のローカルアカウントログアウト意思はスコープとセッション認証情報のハッシュで記録します。アカウント復元前にこれをチェックし、安全なストレージの書き込み／削除失敗やミューテックスのタイムアウト後の再起動シナリオも含みます。bearer、ID アサーション、ライセンスは保存せず、機能権限は判断しません。

同じ OS ユーザーとデバイス上のアカウントライフサイクル操作は、インスタンス間・プロセス間で調整されます。旧インスタンスの遅延したログアウト、HTTP 401 による消去、失敗後の再送、成功後の再ログアウトは、後から保存された新しいログインを上書きまたは削除できません。旧セッションの保留タスクはアカウント失効を独立して再送でき、現在の別セッションの認可ランタイムを再構築しません。

Go、JavaScript、Python、C#、Java、Ruby、Rust、C/C++ の Application ライフサイクルエントリーポイント、ネイティブサンプル、連携手順を同期しました。安全な Store の公開メソッドシグネチャは変更されず、複数の不透明なキーとアトミック保存を正しくサポートする必要があります。デフォルトの MemoryStore のアカウント認証情報は引き続きメモリにのみ保存されます。安全な Store とローカルログアウトマーカーのどちらも永続化できない場合、SDK は明示的にエラーを返してこのインスタンスを停止し、再起動を越えて有効なログアウトが完了したとは主張しません。

## Licentivo の更新

今回実行したテストでは公式 SDK 0.11.1 を使用し、固定スナップショット識別子は `local-20261024-5d74ba5ea131` です。リポジトリ既存のインポートスクリプトで同期し、マニフェストは合計 115 ファイル、**実際の変更 23 件、変更なし 92 件、追加ファイルなし**です。変更は上流ソース 17 ファイルに対応し、C コアはネイティブ、Ruby、Rust パッケージ内に重複して同梱されています。このテスト対象のインポートでは、テスト完了時に対象ファイルと上流スナップショットのハッシュを確認しました。

Licentivo サーバー側ソースコードはこのタスクで変更していません。SDK の認可実装は相手側が提供したバージョンを採用しました。更新後の契約に従ってローカルテストを調整しました。ログアウト時は共有マシンの認証情報とライセンスファイルを保持し、SDK のログアウト記録が旧セッションをブロックします。重複する紐付け解除の 2 件目のレシートは stale になり得ます。実際の実行拒否、新しい紐付けの復元、セルフサービス枠は引き続きチェックし、これらの業務要件は緩和していません。


<!-- final-workspace-sdk-version-2026-10-24 -->

最終段階でワークスペースは別途 Licentivo SDK **0.11.2**（`licentivo-sdk-v0.11.2-release-20261024`）に更新されました。現在の 115 個の対象ファイルはマニフェストと上流ソースファイルのハッシュにすべて一致します。今回テストしたスナップショットと比較すると、上流ソースファイルの変更は VERSION、Ruby VERSION 定数、CMake バージョン番号のみで、認可実装は一致しています。現在のインポートスクリプトには Ruby gem 拡張ディレクトリのネイティブライブラリ検索も追加されています。上記の実行テスト記録は固定された 0.11.1 スナップショットに対応し、本報告は 0.11.2 リリースパッケージの受け入れ記録ではありません。

## 検証

| 範囲 | 結果 |
| --- | --- |
| Launch Go アカウント HTTP、DPAPI、ログアウトストレージ障害、プロセス間ロック | サブケースを含む 26 件の合格記録。失敗・スキップなし |
| 公式 SDK 同期後の Go アカウントと署名 SDK の回帰 | 21 件が成功。独立したデータベースを必要とする 2 件の HTTP テストはスキップし、前行および実際の両側連携テストで検証済み |
| 現在の Licentivo HTTP 認可回帰と専用チェック | ケースごとに 2 回の実行を統合し、最終的に 62 件の合格記録。重複レシートのアサーション修正後の再確認を含む |
| 現在の公式 Go SDK | 67 件の合格記録、失敗なし |
| JavaScript / Python | 14 / 12 項目が成功。実際の署名済みランタイムを含む |
| C# / Java | ライフサイクルと公式ランタイムが成功。Java のアカウント／セキュリティテスト 9 組が成功 |
| Ruby / Rust | Ruby のラッパーと実際のネイティブ SDK 17 項目が成功。Rust は 16 項目が成功 |
| C / C++ | 2 つの実際の署名 SDK ライフサイクルドライバーがともに成功。DPAPI、ネットワーク切断、ストレージ障害、旧インスタンスのログアウトを対象 |

実際の両側連携テストでは実際の Launch、現在の Licentivo、MySQL、Go Launch SDK、公式認可 SDK、DPAPI を使用し、**18 件の段階合格記録（17 の検証段階と完了記録）**を得ました。購入期間の同期、実際の保護機能、通常終了からの復元、ログアウト時のストレージ書き込み失敗／書き込みと削除の両方の失敗に両側のネットワーク切断が重なった場合、再起動後の旧アカウント復元拒否、ネットワーク復旧後の失効再送、新しいログイン、応答喪失、リモート解除、更新返金、チャージバック後の認可拒否を含みます。

専用の実サービス検証では、同じ紐付け世代に異なる操作番号を送信してもセルフサービス枠は 1 回しか消費しないこと、旧ログアウトが新しい紐付けの認証情報とライセンスを削除せずオフラインでも新しい紐付けを復元できること、同じ旧 sid で新しい JWT を発行してもログアウト済み紐付けを復元できず新しい実ログインではアクティベーションできること、旧ログアウトチケットが新しい紐付けに影響しないこと、オフライン実行が既知の署名済み期限を越えないことも確認しました。

今回、新たな業務上の阻害要因は見つかりませんでした。実行テストは Windows で完了し、実際の両側の業務フローには Go を使用、他の言語はローカルの署名 SDK テストを完了しました。決済と翻訳サービスは隔離された模擬サービスであり、実際の請求、返金、デプロイはありません。192.168.2.177 にはアクセスしていません。一時的な Licentivo サービスと MySQL は停止を確認し、既存サービスとワークスペースの他の変更は保持しました。

元のログ、テスト対象のソーススナップショット、プローブは無視対象ディレクトリ `.local/account-store-fix-20261024/` にあります。共有可能な要約は[検証証拠](https://github.com/spf86/licentivo-launch/blob/main/docs/account-store-fix-evidence-2026-10-24.json)を参照してください。
