# スマホ・タブレットでの起動と保存・再開

## 何ができるか

`public_runtime_pwa_secure` 版は、同じ正規の実効 `full` 人工生命・音響runtimeへPWA shellを加え、スマホやタブレットのブラウザからホーム画面へ追加し、アプリアイコンから起動できるようにした配布版です。第二の簡易アプリではありません。

できることは次の通りです。

- ホーム画面のアイコンから `Artificial Life Orgel` を開く。
- 同じ端末内に、最新の実行状態を1つだけ自動保存する。
- 次に開いた時、保存済みセッションがあれば再開する。
- Tools から「今すぐ保存」「保存から再開」「保存を削除」「アプリ保存を書き出す」を使う。

## 保存されるもの

保存されるのは、既存の状態保存（snapshot）と同じ実行状態です。個体、場、好み、Flow、音響設定、乱数状態など、再開に必要な実行状態を1つの包みにして端末内へ保存します。

詳細OFFの `やさしい` / `ふつう` は文章だけのページ内表示であり、この保存には含めません。新しい文書ではHTML上の既定で `やさしい` から始まり、アプリ自身はこの選択を永続化しません。一方、Flowは実行状態の一部なので、再開時は保存済みの値を保ちます。詳細ON/OFFや文章表示の切替だけで、復元したFlowを `おまかせ（流れを自動でまぜる）` へ上書きしません。表示とFlowの現行仕様は `05_CURRENT_VERSION_OVERVIEW_JA.md` を正本とします。

保存は利用者から見ると1枠ですが、破損や途中終了を見分けるため、端末内では
IndexedDB と localStorage の検証済みコピーを照合することがあります。
localStorage 側には、置換途中か確定済みかを示す小さな guard も置きます。
これは保存枠が2つあるという意味ではありません。同じ1枠について世代、内容の
長さ、破損検出用 hash、guard を照合し、採用できるコピーを決める仕組みです。
hash は偶発的な破損やコピー不一致を見分けるためのもので、暗号学的な認証では
ありません。

正確には、この1枠は同じブラウザープロファイルと同じ origin（scheme、host、port）
に対する固定キーです。別のブラウザーや別プロファイルとは共有しません。同じ origin
なら、URLのpathやservice workerのscopeが違っても、この保存枠は共有されます。

保存枠は無制限ではありません。最新版1枠だけです。長期の全履歴アーカイブ、医療記録、個人データ保存、クラウド同期ではありません。

## 保存されないもの

- 外部サーバーへのデータ送信。
- 医療情報、診断情報、個人識別情報。
- `lab.html` や研究用 runbook。
- 新しい Life Kernel 入力。
- 新しい音響制御入口。
- 新しい好み入力入口。
- 新しい研究用自動調整入口。

## 再開の意味

再開は、前回の実行状態に戻るための操作です。

この保存機能が扱う範囲は、ブラウザアプリとして前回の状態を読み込み直すことです。

保存済みセッションを検出した起動では、利用者が「再開」「新しく始める」、
「保存を削除」または明示的な「今すぐ保存」を選ぶまで、時間間隔、画面非表示、
ページ終了に伴う自動保存を止めます。起動直後の新しい状態で、まだ選んでいない
保存枠を上書きしないためです。

「今すぐ保存」は「再開」ではありません。現在この画面で動いている状態を最新枠として
意図的に採用し、既存枠を置き換える操作です。前回状態へ戻したい時は先に「再開」を
選んでください。

「再開」は、通常の状態読込を直接呼びません。既存の復元トランザクション入口を使い、
実行ループ、音、interval、描画、環境 worker を停止したことを確認してから状態を
適用します。停止を確認できない、正規の復元入口がない、状態検証に失敗した、または
復元後の再起動に失敗した場合は、安全側へ閉じて保存枠を残し、失敗状態を表示します。
成功後の実行は既存の Start 経路へ戻ります。復元前に worker を使っていた場合でも、
worker 高速化を同じ形で再生成・維持することまでは保証せず、安全な main-thread 実行へ
継続し得ます。

> **【留意点】**
> 「生物学的な記憶」や「意識の継続」を主張するものではありません。

## 使い方

1. `public_runtime_pwa_secure` ZIPを展開します。
2. HTTPSの静的ホスト、または同じ端末の `localhost` / `127.0.0.1` 相当のsecure
   contextで `_v47_pkg/_v32/index.html` を開きます。任意の平文HTTPホストでの
   インストール動作は保証しません。
3. スマホやタブレットのブラウザメニューから「ホーム画面に追加」を選びます。
4. 以後はホーム画面のアイコンから起動できます。
5. 保存済みセッションがある場合、画面上部に再開プロンプトが出ます。
6. 再開したい場合は「再開」を選びます。停止確認または状態検証に失敗した時は、保存を
   消さずに失敗表示へ戻ります。
7. 新しく始めたい場合は「新しく始める」を1回押して確認状態にし、表示が
   「Confirm new session」に変わっている間にもう1回押します。新しい実行の Start が
   成功した後でだけ、旧保存の削除へ進みます。この操作は現在読み込まれている実行を
   開始して再開用の保存枠の削除を試みるもので、Flow、個体、場など現在の実行状態全体を
   初期値へ戻すリセットではありません。復元後に選ばれていたFlowもそのまま保ちます。
8. Start 後の削除を確認できなかった時は、実行開始と保存削除を同じ成功として扱いません。
   `cleanup pending` と表示し、自動保存を止めて旧保存の上書きを避けます。削除の再試行、
   明示的な「今すぐ保存」、または検証済みの再開で解消します。
9. 「保存を削除」が成功した時も、その文書では終了時・画面非表示時の自動保存を止め、
   直後に同じ枠を作り直しません。「今すぐ保存」または確認済みの「新しく始める」で
   再び保存を有効にできます。ページを再読込すると別の文書セッションになり、保存枠が
   空の通常起動として自動保存を再開し得ます。永続的なautosave無効設定ではありません。

## 同時に複数画面を開く場合

ブラウザが Web Locks を提供する時は、同じ origin の保存・再開・削除・書き出し・
New session を1本ずつ処理し、lock 取得後に保存を読み直します。別画面が後から作成、
更新、削除した枠を検出した文書は、明示的な再開または手動保存なしに自動上書きしません。
lock取得には `4,000 ms` のアプリケーションタイマーを設定します。ブラウザーの
schedulingや端末のsuspendにより、実時間上の発火は遅れることがあります。タイマーが
発火した後は失敗表示へ閉じ、遅れて許可されたcallbackもstorageを読み書きしません。
ただし「保存なし」を受理して起動済みの別文書が、他画面での保存作成と
削除の両方を観測しなかった場合、その別文書は後で自分の新しい最新枠を作り得ます。
「保存を削除」は同じorigin全体へautosave無効を配信する永続tombstoneではなく、
操作した文書の停止です。Web Locks がない時も、
1つの文書内では処理順と再照合を保ちますが、別タブや別PWAウィンドウまで含む完全な
同時実行防止は保証しません。状態表示の `single_document_fallback` は、この制限を
明示する語です。複数画面で同時に保存操作を行わないでください。

## 失敗時の境界

IndexedDB、localStorage、guard のどれかを読めない、同じ世代の内容が一致しない、
期待するコピーが欠ける、lock を取得できない、または期限内に保存処理を確認できない
場合は、残った片方を無条件に正しいものとして上書き・復元・削除しません。この
fail-closed 動作はデータ消失を避けるための境界であり、あらゆる端末故障から必ず
復旧できるという保証ではありません。ブラウザの保存容量、OSによる終了時刻、
private browsing、利用者または同一origin scriptによるstorage消去は外部条件です。

## 注意

`public_runtime_secure` は、監査済みの最小静的公開rootです。こちらは service worker とPWA cacheを意図的に外しています。

`public_runtime_pwa_secure` は、スマホ・タブレットでの使いやすさを上げる別artifact・展開レーンです。別なのは配布・証拠境界であって、人工生命・音響engineではありません。公開ホスティング証明や `external_complete` の証跡を置き換えるものではありません。

service workerのcache名には、このアプリのprefixだけでなく、実際に登録された
scopeも含めます。更新時に削除するのは同じprefix・同じscopeの旧cacheだけで、
同じoriginに置かれた別scopeのアプリや、名前が似ているだけのcacheは削除しません。
すでに開いた旧ページや、更新を受け取る前の完全offline起動に、新版が即時反映された
とはみなしません。更新後のonline navigationと、新しいcache世代の取得を確認して
ください。
