はじめに

データベース優先の状態管理リファクタリング

データベース優先の状態リファクタリング

決定事項

2階層の SQLite レイアウトを使用します。

  • グローバルデータベース: ~/.openclaw/state/openclaw.sqlite
  • エージェントデータベース: エージェントが所有するワークスペース、トランスクリプト、VFS、成果物、およびエージェントごとの大規模なランタイム状態用に、エージェントごとに1つの SQLite データベース
  • 設定は引き続きファイルに保存されます: openclaw.json はデータベース外に残ります。ランタイム認証プロファイルは SQLite に移行し、外部プロバイダーまたは CLI の認証情報ファイルは OpenClaw のデータベース外で引き続き各所有者によって管理されます。

グローバルデータベースはコントロールプレーンのデータベースです。エージェント検出、共有 Gateway 状態、ペアリング、デバイス/Node 状態、タスクおよびフローの台帳、Plugin 状態、スケジューラーのランタイム状態、バックアップメタデータ、移行状態を所有します。

エージェントデータベースはデータプレーンのデータベースです。エージェントのセッションメタデータ、トランスクリプトイベントストリーム、VFS ワークスペースまたはスクラッチ名前空間、ツール成果物、実行成果物、検索およびインデックス作成が可能なエージェントローカルのキャッシュデータを所有します。

これにより、大規模なエージェントワークスペース、トランスクリプト、バイナリスクラッチデータを共有 Gateway の書き込みレーンに押し込むことなく、永続的なグローバルビューを1つ提供できます。

厳格な契約

この移行には、正規のランタイム形状が1つだけあります。

  • セッション行には、セッションメタデータのみを永続化します。transcriptLocator、トランスクリプトファイルのパス、同階層の JSONL パス、ロックパス、プルーニングメタデータ、またはファイル時代の互換性ポインターを永続化してはなりません。
  • トランスクリプトの識別情報は常に SQLite の識別情報です。つまり、{agentId, sessionId} に加え、プロトコルで必要な場合は任意のトピックメタデータを使用します。
  • sqlite-transcript://... はランタイムまたはプロトコルの識別情報ではありません。新しいコードでは、トランスクリプトロケーターを導出、永続化、受け渡し、解析、または移行してはなりません。ランタイムとテストには擬似ロケーターを一切含めないでください。ドキュメントでこの文字列に言及できるのは、それを禁止する場合のみです。
  • 従来の sessions.json、トランスクリプト JSONL、.jsonl.lock、プルーニング、切り詰め、および旧セッションパスのロジックは、doctor の移行/インポートパスにのみ属します。
  • 従来のセッション設定エイリアスは、doctor の移行にのみ属します。ランタイムは、session.idleMinutessession.resetByType.dm、または設定済みの別エージェントに対するエージェント間の agent:main:* メインセッションエイリアスを解釈しません。
  • セッションルーティングの識別情報は、型付きのリレーショナル状態です。ホットランタイムと UI のパスは、sessions.session_scopesessions.account_idsessions.primary_conversation_idconversations、および session_conversations を読み取る必要があります。旧呼び出し箇所の削除中に互換性用のシャドウとして使用する場合を除き、session_key を解析したり、プロバイダー識別情報を得るために session_entries.entry_json を掘り下げたりしてはなりません。
  • dmdirect のようなチャネルレベルのダイレクトメッセージマーカーは、ルーティング用語であり、トランスクリプトロケーターやファイルストア互換性ハンドルではありません。
  • 従来のフックハンドラー設定は、doctor の警告/移行サーフェスにのみ属します。ランタイムは hooks.internal.handlers を読み込んではなりません。フックは、検出されたフックディレクトリと HOOK.md メタデータのみを通じて実行されます。
  • ランタイム起動、ホット応答パス、Compaction、リセット、復旧、診断、TTS、メモリフック、サブエージェント、Plugin コマンドルーティング、プロトコル境界、およびフックでは、ランタイム全体を通して {agentId, sessionId} を渡す必要があります。
  • テストでは、{agentId, sessionId} を通じて SQLite トランスクリプト行をシードし、アサートする必要があります。JSONL パスの転送、呼び出し元が指定したロケーターの保持、またはトランスクリプトファイルの互換性だけを証明するテストは、doctor のインポート、セッション外のサポート/デバッグ用マテリアライズ、またはプロトコル形状を対象とする場合を除き、削除する必要があります。
  • runEmbeddedPiAgent(...)、準備済みワーカー実行、および内部の組み込み試行では、トランスクリプトロケーターを受け入れてはなりません。これらは {agentId, sessionId} によって SQLite トランスクリプトマネージャーを開き、そのマネージャーを内部化された PI 互換エージェントセッションに渡します。これにより、古い呼び出し元がランナーに JSON/JSONL トランスクリプトを書き込ませることを防ぎます。
  • ランナー診断では、ランタイム/キャッシュ/ペイロードのトレースレコードを SQLite に保存する必要があります。ランタイム診断では、JSONL ファイルのオーバーライド調整項目や汎用トランスクリプト JSONL エクスポートヘルパーを公開してはなりません。ユーザー向けエクスポートでは、ファイル名をランタイムへ戻さずに、データベース行から明示的な成果物をマテリアライズできます。
  • 生ストリームログでは、OPENCLAW_RAW_STREAM=1 と SQLite 診断行を使用します。旧 pi-mono の PI_RAW_STREAMPI_RAW_STREAM_PATH、および raw-openai-completions.jsonl ファイルロガー契約は、OpenClaw のランタイムまたはテストには含まれません。
  • QMD メモリインデックスでは、SQLite トランスクリプトを Markdown ファイルにエクスポートしてはなりません。QMD がインデックス化するのは、設定済みのメモリファイルのみです。セッショントランスクリプト検索は引き続き SQLite を基盤とします。
  • 新しいコードでは、QMD SDK サブパスは QMD 専用です。SQLite セッショントランスクリプトのインデックス作成ヘルパーは memory-core-host-engine-session-transcripts に配置します。QMD による再エクスポートは互換性専用であり、ランタイムコードで使用してはなりません。
  • 組み込みメモリインデックスは、所有元のエージェントデータベースに格納されます。ランタイム設定および解決済みランタイム契約では、memorySearch.store.path を公開してはなりません。doctor はその従来の設定キーを削除し、現行コードはエージェントの databasePath を内部的に渡します。

doctor/インポート/エクスポート/デバッグ境界の外側に例外を残さず、これらの記述が成立するまで、実装作業ではコードを削除し続ける必要があります。

目標状態と進捗

最終目標

  • 1つのグローバル SQLite データベースがコントロールプレーン状態を所有します: state/openclaw.sqlite
  • エージェントごとに1つの SQLite データベースがデータプレーン状態を所有します: agents/<agentId>/agent/openclaw-agent.sqlite
  • 設定は引き続きファイルに保存されます。openclaw.json は、このデータベースリファクタリングには含まれません。
  • 従来のファイルは、doctor の移行入力としてのみ使用されます。
  • ランタイムは、アクティブな状態としてセッションまたはトランスクリプトの JSONL を書き込みも読み取りもしません。

目標状態

  • not-started: ファイル時代のランタイムコードが、まだアクティブな状態を書き込んでいます。
  • migrating: doctor/インポートコードがファイルデータを SQLite に移動できます。
  • dual-read: 一時的なブリッジが SQLite と従来のファイルの両方を読み取ります。このリファクタリングでは、doctor 専用であることが明示的に文書化されていない限り、この状態は禁止されます。
  • sqlite-runtime: ランタイムは SQLite のみを読み書きします。
  • clean: 従来のランタイム API とテストが削除され、ガードがリグレッションを防止します。
  • done: ドキュメント、テスト、バックアップ、doctor の移行、および変更チェックによって、クリーンな状態が証明されます。

現在の状態

  • セッション: ランタイムでは clean。セッション行はエージェントごとのデータベースに格納され、ランタイム API は {agentId, sessionId} または {agentId, sessionKey} を使用し、sessions.json は doctor 専用の従来入力です。
  • トランスクリプト: ランタイムでは clean。トランスクリプトイベント、識別情報、スナップショット、および軌跡ランタイムイベントは、エージェントごとのデータベースに格納されます。ランタイムはトランスクリプトロケーターや JSONL トランスクリプトパスを受け付けなくなりました。
  • PI 組み込みランナー: clean。組み込み PI 実行、準備済みワーカー、Compaction、および再試行ループでは SQLite セッションスコープを使用し、古いトランスクリプトハンドルを拒否します。
  • Cron: ランタイムでは clean。ランタイムは cron_jobs と Cron が所有する task_runs を使用します。ランタイムテストでは SQLite の storeKey 命名を使用し、ファイル時代の Cron パスは doctor の従来移行テストにのみ残ります。
  • タスクレジストリ: clean。タスクおよび TaskFlow のランタイム行は state/openclaw.sqlite に格納され、未リリースのサイドカー SQLite インポーターは削除されています。
  • Plugin 状態: clean。Plugin の状態/BLOB 行は共有グローバルデータベースに格納され、旧 Plugin 状態サイドカー SQLite ヘルパーはガードによって防止されます。
  • メモリ: 組み込みメモリおよびセッショントランスクリプトのインデックス作成では sqlite-runtime。メモリインデックステーブルはエージェントごとのデータベースに格納され、Plugin メモリ状態は共有 Plugin 状態行を使用します。従来のメモリファイルは doctor の移行入力またはユーザーワークスペースのコンテンツです。
  • バックアップ: sqlite-runtime。バックアップは圧縮済み SQLite スナップショットをステージングし、稼働中の WAL/SHM サイドカーを除外し、SQLite の整合性を検証して、バックアップ実行をグローバルデータベースに記録します。
  • ワークスペースのセットアップ: sqlite-runtime。セットアップ完了、ワークスペース証明、および生成済みブートストラップハッシュは、型付きの共有 SQLite テーブルに格納されます。ランタイムは廃止されたワークスペース JSON および .attested サイドカーを読み書きしません。Doctor が、それらの検証済みインポートと検証後の削除を担当します。
  • Doctor の移行: 意図どおり migrating。Doctor は従来の JSON、JSONL、および廃止されたサイドカーストアを SQLite にインポートし、移行の実行/ソースを記録して、成功したソースを削除します。
  • 実行承認: file-runtime。TypeScript と macOS は、アクティブ状態ディレクトリの exec-approvals.json を引き続き読み書きします。予約済みの exec_approvals_config スキーマには、まだランタイム所有者が存在しません。将来の切り替えでは、同一状態の doctor インポートを追加し、両方のランタイムを同時に移行する必要があります。
  • E2E スクリプト: ランタイムカバレッジでは clean。Docker MCP のシード処理は SQLite 行を書き込みます。ランタイムコンテキスト用 Docker スクリプトは、doctor の移行シード内でのみ従来の JSONL を作成し、従来のセッションインデックスパスを明示的に指定します。

残作業

  • [x] doctor の従来入力でない限り、Cron ランタイムテストのストア変数名から storePath を除くように変更します。 ファイル: src/cron/service.test-harness.tssrc/cron/service.runs-one-shot-main-job-disables-it.test.tssrc/cron/service/timer.regression.test.tssrc/cron/service/ops.test.tssrc/cron/service/store.test.tssrc/cron/service.heartbeat-ok-summary-suppressed.test.tssrc/cron/service.main-job-passes-heartbeat-target-last.test.tssrc/cron/store.test.ts。 証明: pnpm check:database-first-legacy-storesrg -n 'storePath' src/cron --glob '!**/commands/doctor/**'
  • [x] 廃止されたファイル時代のエクスポートテストモックを削除または改名します。 ファイル: src/auto-reply/reply/commands-export-test-mocks.ts。 証明: rg -n 'resolveSessionFilePath|sessionFile|storePath|transcriptLocator' src/auto-reply/reply
  • [x] Docker ランタイムコンテキストの従来 JSONL シードが doctor 専用であることを明確にします。 ファイル: scripts/e2e/session-runtime-context-docker-client.ts。 証明: rg -n 'sessions\\.json|sessionFile|\\.jsonl' scripts/e2e/session-runtime-context-docker-client.ts には seedBrokenLegacySessionForDoctorMigration のみが表示されます。
  • [x] スキーマ変更後も、Kysely の生成型を整合させます。 ファイル: src/state/openclaw-state-schema.sqlsrc/state/openclaw-agent-schema.sqlsrc/state/*generated*。 証明: 今回はスキーマ変更なし。pnpm db:kysely:checkpnpm lint:kysely
  • [x] 変更したストア、コマンド、スクリプトの対象テストを再実行します。 証明: pnpm test src/cron/service/store.test.ts src/cron/store.test.ts src/cron/service.heartbeat-ok-summary-suppressed.test.ts src/cron/service.main-job-passes-heartbeat-target-last.test.ts src/cron/service.every-jobs-fire.test.ts src/cron/service.persists-delivered-status.test.ts src/cron/service.runs-one-shot-main-job-disables-it.test.ts src/cron/service/ops.test.ts src/cron/service/timer.regression.test.ts src/auto-reply/reply/commands-export-session.test.ts extensions/telegram/src/thread-bindings.test.ts extensions/slack/src/monitor/message-handler/prepare.test.ts src/acp/translator.session-lineage-meta.test.tsgit diff --check
  • [x] done を宣言する前に、変更ゲートまたはリモートでの広範な検証を実行します。 証明: 一時的な Node 24/pnpm セットアップと、同期された .git のないワークスペースに対する明示的なパスルーティングの後、Hetzner Crabbox 実行 run_3f1cabf6b25cpnpm check:changed --timed -- <changed extension paths> が成功しました。

リグレッション禁止事項

  • トランスクリプトロケーターを使用しないこと。
  • アクティブなセッションファイルを使用しないこと。
  • doctor の従来移行テストを除き、偽の JSONL テストフィクスチャを使用しないこと。
  • Kysely の使用が想定される箇所で、生の SQLite アクセスを使用しないこと。
  • ファイル時代の新しい DB 移行を追加しないこと。グローバルスキーマのバージョンは 1 のままです。リリース済みのエージェントごとのバージョン 1 スキーマには、安定したメモリソース識別情報のため、バージョン 2 への限定的なランタイム移行が1つあります。

コード確認時の前提

この計画を妨げる追加のプロダクト決定はありません。実装は次の前提に基づいて進める必要があります。

  • node:sqlite を直接使用し、このストレージパスには WAL リセットに対応した Node ランタイム (22.22.3+、24.15+、または 25.9+)を必須とします。
  • 通常の構成ファイルは正確に 1 つだけ維持します。このリファクタリングでは、構成、Plugin マニフェスト、Git ワークスペースを SQLite に移動しないでください。
  • ランタイム互換性ファイルは不要です。従来の JSON および JSONL ファイルは 移行入力としてのみ使用します。ブランチローカルの SQLite サイドカーはリリースされていないため、 インポートせずに削除します。
  • openclaw doctor --fix が従来のファイルからデータベースへの移行を担当します。ランタイムの 起動処理が担当するのは、リリース済み SQLite スキーマバージョン間の限定的なアップグレードのみです。 ファイル時代の状態をインポートしてはなりません。
  • 認証情報の互換性にも同じルールが適用されます。ランタイム認証情報は SQLite に格納します。古い auth-profiles.json、エージェントごとの auth.json、および共有 credentials/oauth.json ファイルは doctor の移行入力として使用し、インポート後に 削除します。
  • 生成されたモデルカタログの状態はデータベースに格納します。ランタイムコードは agents/<agentId>/agent/models.json に書き込んではなりません。既存の models.json ファイルは従来の doctor 入力として使用し、agent_model_catalogs へのインポート後に削除します。
  • ランタイムはトランスクリプトロケーターを移行、正規化、または橋渡ししてはなりません。アクティブな トランスクリプトの識別情報は SQLite 内の {agentId, sessionId} です。ファイルパスは 従来の doctor 入力としてのみ使用し、sqlite-transcript://... は境界ハンドルとして扱うのではなく、 ランタイム、プロトコル、フック、Plugin の各サーフェスから 削除する必要があります。
  • ランタイムで SQLite のトランスクリプトを読み取る際は、古い JSONL エントリ形式の移行を実行したり、 互換性のためにトランスクリプト全体を書き換えたりしません。従来のエントリの正規化は、 明示的な doctor/インポートユーティリティに限定します。doctor は SQLite 行を挿入する前に、 従来の JSONL トランスクリプトファイルを正規化します。現在のランタイム行は、 すでに現行のトランスクリプトスキーマで書き込まれています。軌跡/セッションのエクスポートは それらの行をそのまま読み取り、エクスポート時に従来の移行を実行してはなりません。
  • 従来のトランスクリプト JSONL の解析/移行ヘルパーは doctor 専用です。ランタイムの トランスクリプト形式コードは現行の SQLite トランスクリプトコンテキストのみを構築します。doctor が、 行を挿入する前に古い JSONL エントリのアップグレードを担当します。
  • ランタイムが所有していた古い JSONL トランスクリプトストリーミングヘルパーは削除されました。doctor の インポートコードが従来ファイルの明示的な読み取りを担当し、ランタイムのセッション履歴は SQLite 行を読み取ります。
  • Codex app-server バインディングでは、Codex の Plugin 状態名前空間における正規キーとして OpenClaw の sessionId を使用します。sessionKey は ルーティング/表示用のメタデータであり、永続的なセッション ID を置き換えたり、 トランスクリプトファイルの識別情報を復活させたりしてはなりません。
  • コンテキストエンジンは現行のランタイム契約を直接受け取ります。レジストリは、 sessionKeytranscriptScope、または prompt を削除する再試行シムで エンジンをラップしてはなりません。現行のデータベースファーストのパラメーターを受け入れられないエンジンは、 橋渡しされるのではなく、明確に失敗する必要があります。
  • バックアップ出力は 1 つのアーカイブファイルのままにします。データベースの内容は、 生の稼働中 WAL サイドカーではなく、コンパクトな SQLite スナップショットとして そのアーカイブに含める必要があります。
  • トランスクリプト検索は有用ですが、最初のデータベースファースト化には 必須ではありません。後から FTS を追加できるようにスキーマを設計してください。
  • データベース境界が安定するまでは、ワーカー実行を設定の背後にある 実験的機能のままにします。

コード調査結果

現在のブランチは、すでに概念実証の段階を超えています。共有 データベースが存在し、Node node:sqlite は小規模なランタイムヘルパーを介して接続され、 以前のストアは state/openclaw.sqlite または所有元の openclaw-agent.sqlite データベースに書き込むようになっています。

残作業は SQLite を選択することではありません。新しい境界をクリーンに保ち、 古いファイル中心の世界に似た互換性指向のインターフェースをすべて削除することです。

  • セッションの storePath は、ランタイムの識別情報、テストフィクスチャの形式、または ステータスペイロードのフィールドではなくなりました。ランタイムとブリッジのテストには、 storePath という契約名は含まれなくなり、doctor/移行コードがその従来の用語を担当します。
  • セッションの書き込みは、古いプロセス内 store-writer.ts キューを経由しなくなりました。SQLite のパッチ書き込みはトランザクション外で準備を行い、その後、 明示的な競合検出を備えた短い同期的な検証/適用トランザクションを使用します。
  • 従来のパス検出には依然として有効な移行用途がありますが、ランタイムコードは sessions.json とトランスクリプト JSONL ファイルを潜在的な書き込み先として 扱わないようにする必要があります。
  • エージェント所有のテーブルは、エージェントごとの SQLite データベースに配置されます。グローバル DB は レジストリ/コントロールプレーンの行を保持し、トランスクリプトの識別情報はエージェントごとのトランスクリプト行にある {agentId, sessionId} です。ランタイムコードはトランスクリプトのファイルパスを 永続化したり、トランスクリプトロケーターを移行したりしてはなりません。
  • doctor はすでに複数の従来ファイルをインポートしています。クリーンアップでは、これを doctor が呼び出す単一の明示的な移行実装にし、永続的な 移行レポートを生成します。

実装を妨げる追加のプロダクト上の問題はありません。

現在のコード構成

このブランチには、すでに実用的な共有 SQLite 基盤があります。

  • 現在のランタイム最小要件では、WAL リセットに対して安全な Node ビルドが必要です: 22.22.3+、 24.15+、または 25.9+。package.json、CLI ランタイムガード、インストーラーのデフォルト、 macOS ランタイムロケーター、CI、公開インストールドキュメントのすべてで要件が統一されています。
  • src/state/openclaw-state-db.tsopenclaw.sqlite を開き、WAL、 synchronous=NORMALbusy_timeout=30000foreign_keys=ON を設定し、 src/state/openclaw-state-schema.sql から生成された スキーマモジュールを適用します。
  • Kysely テーブル型とランタイムスキーマモジュールは、コミット済みの .sql ファイルから作成される 使い捨ての SQLite データベースを基に生成されます。ランタイムコードでは、グローバル、エージェントごと、またはプロキシ キャプチャデータベース用にコピー&ペーストしたスキーマ文字列を保持しなくなりました。
  • ランタイムストアは、SQLite の行形状を手作業で重複定義する代わりに、生成された Kysely DB インターフェースから選択行型と挿入行型を導出します。生の SQL は引き続き、スキーマの適用、pragma、およびマイグレーション専用 DDL に限定されます。
  • グローバル SQLite スキーマは引き続き user_version = 1 です。エージェントごとのスキーマ バージョンは 2 です。そのオープナーは、出荷済みバージョン 1 の メモリソースキーを安定した整数 ID にアトミックに移行します。ファイルからデータベースへのインポートは 引き続き doctor コードで行われます。
  • 所有権の境界が正規である箇所では、リレーショナルな所有権が強制されます: ソースマイグレーション行は migration_runs からカスケードし、タスク配信状態は task_runs からカスケードし、トランスクリプト ID 行は トランスクリプトイベントからカスケードします。
  • 現在の共有テーブルには、agent_databasesauth_profile_storesauth_profile_stateplugin_state_entriesplugin_blob_entriesmedia_blobsskill_uploadscapture_sessionscapture_eventscapture_blobssandbox_registry_entriescron_jobscommitmentsdelivery_queue_entriesmodel_capability_cacheworkspace_setup_stateworkspace_path_aliasesworkspace_attestationsworkspace_generated_bootstrap_hashesnative_hook_relay_bridgescurrent_conversation_bindingsplugin_binding_approvalstui_last_sessionsacp_sessionsacp_replay_sessionsacp_replay_eventstask_runstask_delivery_stateflow_runssubagent_runsmigration_runs、および backup_runs が含まれます。
  • Plugin が所有する任意の状態には、ホスト所有の型付きテーブルを使用しません。インストール済みの Plugin は、バージョン管理された JSON ペイロードに plugin_state_entries を、 バイト列に plugin_blob_entries を使用し、名前空間とキーの所有権、TTL クリーンアップ、 バックアップ、Plugin マイグレーション記録を備えます。ホストがクエリ契約を所有する場合は、 plugin_binding_approvals など、ホスト所有の Plugin オーケストレーション状態に 引き続き型付きテーブルを使用できます。
  • Plugin マイグレーションは、ホストスキーマのマイグレーションではなく、Plugin 所有の名前空間に対するデータマイグレーションです。 Plugin はマイグレーションプロバイダーを通じて、自身のバージョン管理された状態および BLOB エントリを 移行でき、ホストは通常のマイグレーション台帳にソースと実行状態を記録します。新しい Plugin のインストールでは、 ホスト自体が新しい Plugin 間契約の所有権を 引き受ける場合を除き、openclaw-state-schema.sql を変更する必要はありません。
  • src/state/openclaw-agent-db.tsagents/<agentId>/agent/openclaw-agent.sqlite を開き、データベースを グローバル DB に登録し、エージェントローカルのセッション、トランスクリプト、VFS、アーティファクト、キャッシュ、 およびメモリインデックスの各テーブルを所有します。共有ランタイムディスカバリーは、各呼び出し箇所で クエリを再実装する代わりに、生成された型付きの agent_databases レジストリを読み取るようになりました。
  • グローバルデータベースとエージェントごとのデータベースは、データベースロール、 スキーマバージョン、タイムスタンプ、およびエージェントデータベースの場合はエージェント ID を含む schema_meta 行を記録します。グローバル DB は引き続き user_version = 1 です。エージェントごとの DB は、範囲を限定した メモリソース ID マイグレーション後にバージョン 2 を使用します。
  • エージェントごとのセッション ID には、session_id をキーとする正規の sessions ルートテーブルが設けられ、 session_keysession_scopeaccount_idprimary_conversation_id、タイムスタンプ、表示フィールド、モデルメタデータ、 ハーネス ID、親および生成元へのリンクがクエリ可能な列として格納されるようになりました。session_routes は、 session_key から現在の session_id への一意のアクティブルートインデックスです。そのため、ホットリードで重複した sessions.session_key 行から 選択させることなく、ルートキーを新しい永続セッションへ移動できます。以前の session_entries.entry_json 互換形状ペイロードは、 永続的な session_id ルートに外部キーで接続されます。これはもはや、 スキーマレベルでのセッションの唯一の表現ではありません。
  • エージェントごとの外部会話 ID もリレーショナルです: conversations は正規化されたプロバイダー、アカウント、会話 ID を格納し、 session_conversations は 1 つの OpenClaw セッションを 1 つ以上の外部会話に 関連付けます。これにより、複数のピアを意図的に 1 つのセッションへマッピングできる shared-main DM セッションを、 session_key に虚偽を記録することなく扱えます。SQLite は自然なプロバイダー ID の 一意性も強制するため、同一の channel/account/kind/peer/thread タプルが 複数の会話 ID に分岐することはありません。 shared-main のダイレクトピアは participant ロールで関連付けられるため、1 つの OpenClaw セッションで複数の外部 DM ピアを表現でき、古いピアを 曖昧な関連行へ格下げする必要もありません。sessions.primary_conversation_id は引き続き 現在の型付き配信ターゲットを指します。閉じたルーティングおよびステータス列は、 TypeScript の union のみに依存せず、SQLite の CHECK 制約で強制されます。 ランタイムのセッションプロジェクションは、型付きセッションおよび会話列を適用する前に、 session_entries.entry_json から互換ルーティングのシャドウを消去するため、古い JSON ペイロードが配信ターゲットを 復活させることはありません。 サブエージェントのアナウンスルーティングでも、同様に型付き SQLite 配信コンテキストが必須となり、 互換用の SessionEntry ルートフィールドにはフォールバックしなくなりました。 Gateway の chat.send による明示的な配信継承は、origin/last* の互換フィールドではなく、 型付き SQLite 配信コンテキストを読み取ります。 tools.effective も同様に、古い last* セッションエントリのシャドウではなく、型付き SQLite 配信およびルーティング行からプロバイダー、アカウント、スレッドのコンテキストを導出します。 システムイベントのプロンプトコンテキストは、origin のシャドウではなく、 型付き配信フィールドから channel/to/account/thread フィールドを再構築します。 共有の deliveryContextFromSession ヘルパーとセッションから会話への マッパーは、SessionEntry.origin を完全に無視するようになりました。ホットルート ID を作成できるのは、 型付き配信フィールドとリレーショナルな会話行だけです。 ランタイムのセッションエントリ正規化では、entry_json を永続化または 投影する前に origin を除去し、受信メタデータは新しいオリジンシャドウを作成する代わりに、 型付き channel/chat フィールドとリレーショナルな会話行を書き込みます。
  • トランスクリプトイベント、トランスクリプトスナップショット、およびトラジェクトリのランタイムイベントは、 正規のエージェントごとの sessions ルートを参照し、セッション削除時にカスケードするようになりました。 トランスクリプト ID および冪等性の行は、引き続き正確なトランスクリプトイベント行からカスケードします。
  • メモリコアのインデックスでは、明示的なエージェントデータベーステーブル memory_index_metamemory_index_sourcesmemory_index_chunks、および memory_embedding_cache を使用し、memory_index_state でリビジョン変更を追跡するようになりました。 オプションの FTS/ベクトル補助インデックスには、汎用的な metafileschunkschunks_fts、または chunks_vec テーブルの代わりに、memory_index_chunks_ftsmemory_index_chunks_vec という名前が付けられます。正規名では、現在の パスおよびソースの行形状と、シリアライズ済み埋め込みの互換性が維持されます。これらのテーブルは 派生検索キャッシュであり、正規のトランスクリプトストレージではありません。メモリワークスペースファイルと設定済みソースから 削除して再構築できます。 出荷済みの汎用名メモリインデックスを開くと、そのメタデータ、ソース、 チャンク、および埋め込みキャッシュが正規テーブルに移行されます。派生 FTS/ベクトル テーブルは正規名で再構築されます。
  • サブエージェント実行の復旧状態は、子、要求元、およびコントローラーのセッションキーに インデックスを付けた、型付き共有 subagent_runs 行に格納されるようになりました。以前の subagents/runs.json ファイルは、Doctor のクリーンアップ入力としてのみ使用されます。その実行エントリは 一時的な復旧状態であるため、Doctor は廃止記録を残し、 インポートせずにファイルを破棄します。SQLite 行のプルーニング後は、ファイル内のエントリが 稼働中か古いかをファイルだけでは証明できないため、運用者はこの境界を越えてアップグレードする前に、 ファイル時代のアクティブな実行が完了するまで待つ必要があります。
  • 現在の会話バインディングは、正規化された会話 ID をキーとする型付き共有 current_conversation_bindings 行に格納されるようになりました。ターゲットのエージェントおよびセッション列、会話種別、ステータス、有効期限、メタデータは、 重複した不透明なバインディングレコードではなく、リレーショナルな列として格納されます。 永続バインディングキーには正規化された会話種別が含まれるため、 direct/group/channel の参照が衝突することはなく、SQLite は無効なバインディングの kind/status 値を拒否します。以前の bindings/current-conversations.json ファイルは、doctor のマイグレーション入力としてのみ使用されます。
  • 配信キューの復旧では、channel、target、 account、session、retry、error、platform-send、および recovery state の型付きキュー列を リプレイ JSON に重ね合わせるようになりました。entry_json はリプレイペイロード、フック、フォーマット用 ペイロードを保持しますが、ホットキューのルーティングおよび状態については型付き列が正となります。
  • TUI の最終セッション復元ポインターは、ハッシュ化された TUI 接続およびセッションスコープをキーとする型付き共有 tui_last_sessions 行に格納されるようになりました。 ランタイムは SQLite のみを読み書きし、各スコープをアトミックに upsert し、 Heartbeat セッションを除外します。openclaw doctor --fix は以前の TUI JSON ファイルを厳密に検証し、 より新しい SQLite 行を保持し、正規の結果を検証したうえで、 変更されていないレガシーファイルをアーカイブとして残さず削除します。
  • Discord コマンドのデプロイハッシュは、共有 Plugin 状態 SQLite ストアに格納されるようになりました。ランタイムは、アプリケーションスコープの正確なキーのみを読み書きします。Doctor は 再構築可能なレガシー discord/command-deploy-cache.json ファイルを インポートせずに削除するため、次回起動時に正規の照合が 1 回実行されます。
  • デフォルトの TTS 設定は、speech-core Plugin 配下をキーとする共有 Plugin 状態 SQLite 行に 格納されるようになりました。以前の settings/tts.json ファイルは、doctor のマイグレーション 入力としてのみ使用されます。ランタイムは TTS 設定の JSON ファイルを読み書きしなくなり、 レガシーパスリゾルバーは doctor マイグレーションモジュールに置かれています。
  • シークレットターゲットのメタデータでは、すべての認証情報ターゲットを設定ファイルであるかのように扱わず、 ストアとして記述するようになりました。openclaw.json は引き続き設定ストアです。 認証プロファイルのターゲットでは、プロバイダー形状の認証情報を JSON ペイロードとして保持する型付き SQLite auth_profile_stores 行を使用します。
  • シークレット監査では、廃止されたエージェントごとの auth.json ファイルをスキャンしなくなりました。Doctor が そのレガシーファイルに関する警告、インポート、および削除を担います。
  • レガシー認証プロファイルのパスヘルパーは、doctor のレガシーコードに置かれるようになりました。コアの認証 プロファイルパスヘルパーは、auth-profiles.json または auth-state.json のランタイムパスではなく、 SQLite 認証ストアの ID と表示場所を公開します。
  • サブエージェント実行の復旧および OpenRouter モデル機能キャッシュのランタイムモジュールでは、 SQLite スナップショットのリーダーおよびライターを、doctor 専用のレガシー JSON インポートヘルパーから分離するようになりました。OpenRouter の機能は、 1 つの不透明なキャッシュ BLOB やプロバイダー固有のホストテーブルではなく、provider_id = "openrouter" 配下の型付き汎用 model_capability_cache 行を使用します。サブエージェント実行の taskName は型付き subagent_runs.task_name 列に格納されます。 payload_json のコピーはリプレイおよびデバッグ用データであり、ホット表示または ルックアップフィールドのソースではありません。
  • src/agents/filesystem/virtual-agent-fs.sqlite.ts は、エージェントデータベースの vfs_entries テーブル上に SQLite VFS を実装します。ディレクトリの読み取り、再帰エクスポート、削除、および名前変更では、 名前空間全体のスキャンや LIKE パスマッチングに依存せず、インデックス付きの (namespace, path) プレフィックス範囲を使用します。
  • src/agents/runtime-worker.entry.ts は、ワーカー向けに実行ごとの SQLite VFS、ツールアーティファクト、 実行アーティファクト、およびスコープ付きキャッシュストアを作成します。
  • ワークスペースのブートストラップ完了状態、アテステーションの最新性、および生成されたブートストラップ ハッシュは、正規ワークスペース ID をキーとする型付き共有 workspace_setup_stateworkspace_path_aliasesworkspace_attestations、および workspace_generated_bootstrap_hashes 行に保存されるようになりました。永続化された字句パスと実パスのエイリアスにより、設定済みのシンボリックリンクが消失した後も、消失したワークスペースに対する 保護が安定して維持されます。参照先が変更されたエイリアスはフェイルクローズします。ランタイムは openclaw-workspace-state.json.openclaw/workspace-state.json、状態ディレクトリの workspace-attestations/*.attested、または同階層の <workspace>.attested サイドカーファイルを読み書きしなくなりました。openclaw doctor --fix はレガシーソースを検証して取得し、 移行レシート付きで SQLite にインポートして正規行を検証し、 その後にのみ取得済みファイルを削除します。
  • 共有スキーマは exec_approvals_config シングルトン行を予約していますが、 ランタイムの切り替えはまだ保留中です。TypeScript と macOS コンパニオンは引き続き 状態スコープの JSON ファイルを使用しており、両者を同時に SQLite へ移行する必要があります。
  • TypeScript のデバイス ID は、型付き device_identities 行を使用するようになり、 Doctor 専用のレガシー JSON インポートはランタイム所有者の外部に維持されます。デバイス認証は、 調整されたスキーマおよびランタイム間移行が行われるまで、引き続きファイルベースです。 device_auth_tokens はその後続対応用に予約されたままです。
  • GitHub Copilot のトークン交換キャッシュは、github-copilot/token-cache/default 配下の共有 SQLite Plugin 状態テーブルを使用します。 これはプロバイダー所有のキャッシュ状態であるため、 意図的にホストスキーマテーブルを追加していません。
  • GitHub Copilot の Compaction は、openclaw-compaction-*.json ワークスペースサイドカーファイルへ書き込まなくなりました。ハーネスは追跡対象の SDK セッションに対して SDK 履歴 Compaction RPC を呼び出し、 OpenClaw は互換性マーカーファイルではなく、永続的なセッションおよびトランスクリプト状態を SQLite に保持します。
  • 共有 Swift ランタイム(OpenClawKit)は、デバイス ID に同じ state/openclaw.sqlite#table/device_identities 形式と行キーを使用します。 TypeScript Doctor は Apple コンテナにアクセスできないため、Apple コンテナのレガシーファイルは Swift の移行 所有者によってインポートされます。Swift のデバイス認証は、調整された認証の後続対応まで 引き続きファイルベースです。
  • Android のデバイス ID とキャッシュ済みデバイス認証は、引き続きアプリローカルのストアにあります。 これらには Android 所有の別個の移行が必要であり、ホスト SQLite の記述は 現在の Android の動作を表していません。
  • Android 通知の最近のパッケージ履歴は、型付き android_notification_recent_packages 行を使用します。ランタイムは古い SharedPreferences CSV キーを 移行も読み取りもしなくなりました。
  • レガシー identity/device.json が存在する場合、SQLite の ID 行が無効な場合、または SQLite の ID ストアを開けない場合、デバイス ID の作成はフェイルクローズします。Doctor が最初にそのファイルをインポートして削除するため、ランタイム 起動時に移行前のペアリング ID が暗黙にローテーションされることはありません。
  • デバイス ID の選択は SQLite の行キーであり、JSON ファイルのロケーターではありません。テスト および Gateway ヘルパーは明示的な ID キーを渡します。廃止された identity/device.json ファイル名を認識するのは、Doctor の移行と フェイルクローズの起動ゲートのみです。
  • セッションリセットの互換性は、Doctor の設定移行に置かれるようになりました。 session.idleMinutessession.reset.idleMinutes に移動され、 session.resetByType.dmsession.resetByType.direct に移動されます。また、 ランタイムのリセットポリシーは正規のリセットキーのみを読み取ります。
  • レガシー設定の互換性は、src/commands/doctor/ 配下に置かれるようになりました。通常の readConfigFileSnapshot() 検証は、Doctor のレガシー検出機能をインポートせず、 レガシー問題に注釈を付けません。runDoctorConfigPreflight() は、Doctor による修復とレポート用にそれらの問題を追加します。 Doctor の設定フローは src/commands/doctor/legacy-config.ts をインポートし、古い OAuth プロファイル ID の修復は src/commands/doctor/legacy/oauth-profile-ids.ts 配下に置かれます。
  • Doctor 以外のコマンドは、レガシー設定の修復を自動実行しません。たとえば、 openclaw update --channel は無効なレガシー設定で失敗し、Doctor の移行コードを暗黙にインポートする代わりに、 Doctor を実行するようユーザーに求めるようになりました。
  • Web Push、APNs、Voice Wake、更新確認、および設定の健全性では、不透明な JSON Blob 全体の代わりに、サブスクリプション、VAPID キー、Node 登録、トリガー行、 ルーティング行、更新通知状態、および設定の健全性エントリ用の型付き共有 SQLite テーブルを使用するようになりました。Web Push と APNs の書き込みでは、影響を受ける 主キー行のみをアップサートし、設定の健全性は設定パスごとに照合します。これらのランタイム モジュールは、Doctor 専用のレガシー JSON インポートヘルパーとは引き続き分離されています。
  • APNs ランタイムは、apns_registrations のみを読み書きします。明示的な openclaw doctor --fix は、廃止された push/apns-registrations.json を厳密にインポートし、既存の正規行を保持し、トランザクションを検証して レシートを記録し、シークレットを含む JSON を削除します。 レシートに基づく再試行ではクリーンアップのみを実行し、 apns_registration_tombstones は最初の修復前の無効化を対象とするため、 古いリレー許可やデバイストークンが復活することはありません。
  • Node ホスト設定は、共有 SQLite データベース内の型付きシングルトン行を使用するようになりました。 古い node.json ファイルまたは中断された取得処理が残っている間、ランタイムはフェイルクローズします。 明示的な openclaw doctor --fix が通常のランタイム使用前にそれを厳密にインポートして削除します。
  • デバイス/Node のペアリング、チャンネルのペアリング、チャンネルの許可リスト、およびブートストラップ状態は、 不透明な JSON Blob 全体ではなく、型付き SQLite 行を使用するようになりました。Plugin バインディングの 承認と Cron ジョブ状態も同じ分割方式に従います。ランタイムモジュールは SQLite ベースの操作と中立的なスナップショットヘルパーを公開し、ペアリング/ブートストラップ および Plugin バインディング承認のスナップショット書き込みでは、テーブルを切り詰める代わりに主キーごとに行を照合します。一方、Doctor は src/commands/doctor/legacy/* モジュールを介して古い JSON ファイルをインポートして削除します。
  • インストール済み Plugin のレコードは、SQLite のインストール済み Plugin インデックスに保存されるようになりました。 ランタイムの設定読み書きでは、古い plugins.installs 作成済み設定データを移行も保持もしなくなりました。Doctor は通常のランタイム使用前に、そのレガシー設定 形式を SQLite にインポートします。
  • QQBot の認証情報復旧スナップショットは、qqbot/credential-backups 配下の SQLite Plugin 状態に保存されるようになりました。 ランタイムは qqbot/data/credential-backup*.json を書き込まなくなりました。QQBot の Doctor コントラクトは、アクティブな状態ディレクトリから それらのレガシーバックアップファイルをインポートしてアーカイブします。
  • Gateway のリロード計画では、内部の installedPluginIndex.installRecords.* 差分名前空間配下にある SQLite のインストール済み Plugin インデックスのスナップショットを比較します。ランタイムの リロード判断では、これらの行を偽の plugins.installs 設定 オブジェクトでラップしなくなりました。
  • Matrix アカウントの認証情報は、SQLite Plugin 状態に保存されるようになりました。ランタイムは その正規ストアのみを読み取ります。Doctor は、アカウントを解決できる場合に、廃止された credentials/matrix/credentials*.json ファイルをインポート、検証、アーカイブします。
  • コアのペアリングおよび Cron ランタイムモジュールは、レガシー JSON パスビルダーを使用しなくなりました。 非推奨のペアリングパス SDK ヘルパーは、移行専用の互換性として残ります。 Doctor の状態移行が、そのファイル読み取りとインポートを所有します。Doctor 所有のレガシー モジュールは、インポートテストおよび移行専用に pending.jsonpaired.jsonbootstrap.json、および cron/jobs.json のソースパスを構築します。レガシー Cron ジョブ形式の正規化と JSONL 履歴のインポートは、 src/commands/doctor/cron/ 配下に置かれます。レガシー SQLite 履歴の最終処理は、状態データベースを開く際に実行されます。
  • src/commands/doctor/legacy/runtime-state.ts は、Node ホスト設定を含むレガシー JSON 状態 ファイルを、Doctor から SQLite にインポートします。新しいレガシーファイル インポーターは src/commands/doctor/legacy/ 配下に置かれます。
  • src/commands/doctor/state-migrations.ts は、レガシーの sessions.json および *.jsonl トランスクリプトを SQLite に直接インポートし、正常に処理されたソースを削除します。 ルートのレガシートランスクリプトを agents/<agentId>/sessions/*.jsonl を介してステージングしたり、インポート前に正規 JSONL ターゲットを 作成したりすることはなくなりました。
  • 状態整合性の Doctor チェックは、レガシーセッションディレクトリを走査したり、 孤立した JSONL の削除を提示したりしなくなりました。レガシートランスクリプトファイルは移行入力 専用であり、移行ステップがインポートとソース削除を所有します。
  • レガシーサンドボックスレジストリのインポートは、 src/commands/doctor/legacy/sandbox-registry.ts 配下に置かれます。アクティブなサンドボックスレジストリの 読み書きは、引き続き SQLite のみを使用します。
  • レガシーセッショントランスクリプトの健全性確認/インポート修復は、 src/commands/doctor/legacy/session-transcript-health.ts 配下に置かれます。ランタイムコマンド モジュールは、JSONL トランスクリプトの解析やアクティブブランチの修復コードを保持しなくなりました。

統合・削除の完了に関する主なポイント:

  • Plugin の状態は共有 state/openclaw.sqlite データベースを使用するようになりました。以前の ブランチローカルな plugin-state/state.sqlite サイドカーインポーターは、その SQLite レイアウトが リリースされなかったため削除されました。プローブおよびテストヘルパーは、Plugin 状態専用の SQLite パスを公開せず、共有 databasePath を報告します。
  • Task および Task Flow のランタイムテーブルは、tasks/runs.sqlitetasks/flows/registry.sqlite ではなく、共有 state/openclaw.sqlite データベースに格納されるようになりました。 以前のサイドカーインポーターは、同じくレイアウトがリリースされなかったことを理由に削除されました。
  • src/config/sessions/store.ts は、受信メタデータ、ルート更新、更新日時の読み取りに storePath を必要としなくなりました。コマンドの永続化、CLI セッションのクリーンアップ、 サブエージェントの深度、認証オーバーライド、トランスクリプトのセッション ID には、 エージェント/セッション行 API が使用されます。書き込みは、楽観的競合リトライを伴う SQLite 行パッチとして適用されます。
  • セッションターゲットの解決では、従来の sessions.json パスではなく、 エージェントごとのデータベースターゲットを公開するようになりました。共有 Gateway、ACP メタデータ、 doctor によるルート修復、および openclaw sessions は、agent_databases と設定済みエージェントを列挙します。
  • Gateway のセッションルーティングは resolveGatewaySessionDatabaseTarget を使用するようになりました。 返されるターゲットには、従来のセッションストアファイルパスではなく、databasePath と SQLite 行キーの候補が含まれます。
  • チャンネルセッションのランタイム型は、更新日時の読み取り、受信メタデータ、 最終ルートの更新用に {agentId, sessionKey} を公開するようになりました。以前の saveSessionStore(storePath, store) 互換型は廃止されました。
  • Plugin ランタイム、拡張 API、Plugin SDK のセッションサーフェスは、 アクティブセッションのストア全体/ファイル互換ヘルパーではなく、SQLite ベースの セッション行ヘルパーを公開するようになりました。ルートライブラリの互換エクスポートは、 従来の内部呼び出し元および移行呼び出し元向けに、Plugin SDK の外部でのみ引き続き利用できます。 以前の resolveLegacySessionStorePath ヘルパーは廃止されました。従来の sessions.json パス構築は、 移行およびテストフィクスチャ内に限定されるようになりました。
  • src/config/sessions/session-entries.sqlite.ts は、正規のセッションエントリをエージェントごとの データベースに保存するようになり、行単位の読み取り、upsert、削除パッチをサポートします。 ランタイムの upsert/パッチ/削除では、大文字と小文字の異なるバリエーションを検索したり、 従来のエイリアスキーを除去したりしなくなり、正規化は doctor が担当します。 スタンドアロンの JSON インポートヘルパーは廃止され、移行時のマージではセッションテーブル全体を 置換せず、より新しい行を upsert します。公開の読み取り/一覧/読み込みヘルパーは、型付きの sessions 行と conversations 行から頻繁に使用されるセッションメタデータを投影します。 entry_json は互換性/デバッグ用のシャドウであり、古い、または無効な状態であっても、 型付きのセッション ID や配信コンテキストは失われません。
  • src/config/sessions/delivery-info.ts は、型付きのエージェント別 sessions + conversations + session_conversations 行から配信コンテキストを解決するようになりました。 session_entries.entry_json からランタイムの配信 ID を再構築しなくなりました。型付き会話行の欠落は、 ランタイムでフォールバックすべき問題ではなく、doctor による移行/修復の問題です。
  • 保存済みセッションのリセット判断では、型付きの sessions.session_scopesessions.chat_typesessions.channel メタデータが優先されるようになりました。sessionKey の解析は、 コマンドターゲット上の明示的なスレッド/トピックサフィックスにのみ残されています。 グループとダイレクトのリセット分類は、キーの形状から判断されなくなりました。
  • セッション一覧/ステータス表示の分類では、型付きチャットメタデータと Gateway セッション種別を使用するようになりました。session_key 内の :group: または :channel: の部分文字列を、永続的なグループ/ダイレクト判定として扱わなくなりました。
  • サイレント返信ポリシーの選択では、明示的な会話タイプまたはサーフェスメタデータのみを 使用するようになりました。session_key の部分文字列からダイレクト/グループポリシーを 推測しなくなりました。
  • セッション表示モデルの解決では、session_key を分割してエージェント ID を 取り出すのではなく、SQLite セッションデータベースターゲットから受け取るようになりました。
  • エージェント間アナウンスのターゲットハイドレーションでは、型付きの sessions.list deliveryContext のみを使用するようになりました。従来の origin、 ミラーされた last* フィールド、または session_key の形状から、 チャンネル/アカウント/スレッドのルーティングを復元しなくなりました。
  • sessions_send のスレッドターゲット拒否では、型付き SQLite ルーティング メタデータを読み取るようになりました。ターゲットキーからスレッドサフィックスを解析して ターゲットを拒否または許可することはなくなりました。
  • グループスコープのツールポリシー検証では、現在または生成されたセッションの 型付き SQLite 会話ルーティングを読み取るようになりました。sessionKey をデコードして得た グループ/チャンネル ID を信頼しなくなりました。呼び出し元から提供されたグループ ID は、 それを保証する型付きセッション行が存在しない場合には破棄されます。
  • チャンネルモデルオーバーライドの照合では、明示的なグループおよび親会話の メタデータを使用するようになりました。parentSessionKey から親会話 ID をデコードしなくなりました。
  • 保存済みモデルオーバーライドの継承には、型付きセッションコンテキストからの 明示的な親セッションキーが必要になりました。sessionKey 内の :thread: または :topic: サフィックスから親オーバーライドを導出しなくなりました。
  • 以前のセッションスレッド情報ラッパーと、読み込み済み Plugin のスレッドパーサーは 廃止されました。config/sessions/thread-info をインポートするランタイムコードはありません。
  • チャンネル会話ヘルパーは、完全なセッションキーを解析するブリッジを 公開しなくなりました。コアは引き続き resolveSessionConversation(...) を通じてプロバイダー所有の 生の会話 ID を正規化しますが、sessionKey からルート情報を再構築することはありません。
  • 完了配信、送信ポリシー、Task メンテナンスでは、session_key の形状から チャットタイプを導出しなくなりました。以前のチャットタイプキーパーサーは削除されました。 これらのパスでは、型付きセッションメタデータ、型付き配信コンテキスト、または明示的な 配信ターゲットの語彙が必要です。
  • セッション一覧/ステータス、診断、承認アカウントのバインド、TUI Heartbeat の フィルタリング、使用量サマリーでは、プロバイダー/アカウント/スレッド/表示ルーティングを得るために SessionEntry.origin を調べることはなくなりました。ランタイムに残っている origin の読み取りは、 セッション以外の概念または現在のターンの配信オブジェクトに限られます。
  • 承認リクエストのネイティブ会話検索では、型付きのエージェント別セッション ルーティング行を読み取るようになりました。sessionKey からチャンネル/グループ/スレッドの 会話 ID を解析しなくなりました。型付きメタデータの欠落は移行/修復の問題です。
  • Gateway のセッション変更/チャット/セッションイベントのペイロードは、 SessionEntry.origin または last* のルートシャドウを返さなくなりました。 クライアントは型付きの channelchatTypedeliveryContext を受け取ります。
  • Heartbeat の配信解決では、型付き SQLite deliveryContext を直接受け取れるようになり、 Heartbeat ランタイムは現在のルーティングを互換性用の session_entries シャドウに依存せず、 エージェントごとのセッション配信行を渡します。
  • Cron の分離エージェント向け配信ターゲット解決でも、互換エントリのペイロードに フォールバックする前に、型付きのエージェント別セッション配信行から現在のルートをハイドレートします。
  • サブエージェントのアナウンス元解決では、型付きリクエスターセッションの 配信コンテキストを loadRequesterSessionEntry に渡し、互換性用の last*/deliveryContext シャドウよりその行を優先するようになりました。
  • 受信セッションメタデータの更新では、最初に型付きのエージェント別配信行に対して マージするようになりました。以前の SessionEntry 配信フィールドは、 型付き会話行が存在しない場合にのみフォールバックとして使用されます。
  • 再起動/更新時の配信抽出では、sessionKey から解析したトピック/スレッド断片よりも、 型付き SQLite 配信 threadId が優先されるようになりました。解析は、 従来のスレッド形状のキーに対するフォールバックとしてのみ使用されます。
  • フックのエージェントコンテキストに含まれるチャンネル ID は、型付き SQLite 会話 ID、 次に明示的なメッセージメタデータを優先するようになりました。sessionKey から プロバイダー/グループ/チャンネルの断片を解析しなくなりました。
  • Gateway chat.send の外部ルート継承では、sessionKey の断片から チャンネル/ダイレクト/グループのスコープを推測せず、型付き SQLite セッションルーティング メタデータを読み取るようになりました。チャンネルスコープのセッションは、型付きセッションの チャンネルとチャットタイプが保存済み配信コンテキストと一致する場合にのみ継承します。 共有 main セッションでは、より厳格な CLI/クライアントメタデータなしのルールが維持されます。
  • 再起動センチネルのウェイクおよび継続ルーティングでは、Heartbeat ウェイクまたは ルーティング済みエージェントターンの継続をキューに入れる前に、型付き SQLite 配信/ルーティング行を 読み取るようになりました。セッションエントリの JSON シャドウから配信コンテキストを 再構築しなくなりました。
  • Gateway tools.effective のコンテキスト解決では、プロバイダー、アカウント、 ターゲット、スレッド、返信モードの入力について、型付き SQLite 配信/ルーティング行を 読み取るようになりました。古い session_entries.entry_json オリジンシャドウから、頻繁に使用される これらのルーティングフィールドを復元しなくなりました。
  • リアルタイム音声コンサルトのルーティングでは、型付きのエージェント別 SQLite セッション行から親/通話の配信を解決するようになりました。埋め込みエージェントメッセージの ルートを選択する際に、互換性用の SessionEntry.deliveryContext シャドウへフォールバックしなくなりました。
  • ACP 生成時の Heartbeat リレーおよび親ストリームのルーティングでは、 型付き SQLite セッション行から親の配信を読み取るようになりました。互換性用セッションエントリの シャドウから親の配信コンテキストを再構築しなくなりました。
  • セッション配信ルートの保持は、型付きチャットメタデータおよび永続化された 配信列に従うようになりました。sessionKey からチャンネルヒント、ダイレクト/main マーカー、 またはスレッド形状を抽出しなくなりました。内部 Web チャットルートが外部ターゲットを継承するのは、 SQLite にそのセッションの型付き/永続化済み配信 ID がすでに存在する場合のみです。
  • 汎用セッション配信抽出では、完全に一致する型付き SQLite セッション配信行のみを 読み取るようになりました。スレッド/トピックサフィックスを解析せず、スレッド形状のキーから ベースセッションキーへフォールバックすることもなくなりました。
  • 返信ディスパッチ、再起動センチネルの復旧、リアルタイム音声コンサルトのルーティングでは、 スレッドルーティングに完全一致する型付き SQLite セッション/会話行を使用するようになりました。 スレッド形状のセッションキーを解析して、スレッド ID またはベースセッションの配信コンテキストを 復元しなくなりました。
  • 埋め込み PI の履歴制限では、プロバイダー、チャットタイプ、ピア ID に、 型付き SQLite セッションルーティング投影(sessions + プライマリ conversations)を 使用するようになりました。sessionKey からプロバイダー、DM、グループ、スレッドの形状を 解析しなくなりました。
  • Cron ツールの配信推論では、明示的な配信、または現在の型付き配信コンテキストのみを 使用するようになりました。agentSessionKey からチャンネル、ピア、アカウント、スレッドの ターゲットをデコードしなくなりました。
  • ランタイムセッション行は、以前の lastProvider ルートエイリアスを 保持しなくなりました。ヘルパーとテストでは、型付きの lastChannel および deliveryContext フィールドを使用します。以前のルートエイリアスまたは永続化された origin シャドウを変換すべき場所は、doctor の移行処理のみです。
  • トランスクリプトイベント、VFS 行、ツールアーティファクト行は、エージェントごとの データベースに書き込まれるようになりました。リリースされなかったグローバルな トランスクリプトファイルマッピングテーブルは廃止され、代わりに doctor が従来のソースパスを 永続的な移行行に記録します。
  • ランタイムのトランスクリプト検索では、JSONL のバイトオフセットを走査したり、 従来のトランスクリプトファイルをプローブしたりしなくなりました。Gateway のチャット/メディア/ 履歴パスは SQLite からトランスクリプト行を読み取ります。セッション JSONL は、ランタイム状態や エクスポート形式ではなく、従来データに対する doctor の入力としてのみ使用されるようになりました。
  • トランスクリプトの親子関係およびブランチ関係には、パスのような agent-db:...transcript_events... ロケーター文字列ではなく、SQLite トランスクリプトヘッダー内の構造化された parentTranscriptScope: {agentId, sessionId} メタデータが使用されます。
  • トランスクリプトマネージャーのコントラクトは、暗黙的に永続化される create(cwd) または continueRecent(cwd) コンストラクターを公開しなくなりました。 永続化トランスクリプトマネージャーは、明示的な {agentId, sessionId} スコープで開かれます。のみ インメモリマネージャーは、テストおよび純粋なトランスクリプト変換向けに引き続きスコープを持ちません。
  • ランタイムのトランスクリプトストア API は、ファイルシステムパスではなく SQLite スコープを解決します。古い resolve...ForPath ヘルパーと未使用の transcriptPath 書き込みオプションは、ランタイムの呼び出し元から削除されました。
  • ランタイムのセッション解決では {agentId, sessionId} を使用するようになり、外部境界向けに sqlite-transcript://<agent>/<session> 文字列を導出してはなりません。 レガシーの絶対 JSONL パスは、doctor の移行入力としてのみ使用されます。
  • ネイティブフックリレーのダイレクトブリッジレコードは、リレー ID をキーとする型付きの共有 native_hook_relay_bridges 行に保存されるようになりました。ランタイムは、これらの短命なブリッジレコード向けに /tmp JSON レジストリや不透明な汎用レコードを書き込まなくなりました。
  • runEmbeddedPiAgent(...) には、トランスクリプトロケーターパラメーターがなくなりました。 準備済みワーカーディスクリプターからもトランスクリプトロケーターが省かれています。ランタイムのセッション状態とキューに入れられたフォローアップ実行は、導出されたトランスクリプトハンドルの代わりに {agentId, sessionId} を保持します。
  • 埋め込み Compaction は、agentIdsessionId から SQLite スコープを受け取るようになりました。 Compaction フック、コンテキストエンジン呼び出し、CLI 委譲、およびプロトコル応答は、導出された sqlite-transcript://... ハンドルを受け取ってはなりません。エクスポート/デバッグコードは行から明示的なユーザー成果物を生成できますが、汎用的なセッション JSONL エクスポートパスを提供したり、ファイル名をランタイムのアイデンティティに戻したりすることはありません。
  • /export-session は SQLite からトランスクリプト行を読み取り、要求されたスタンドアロン HTML ビューのみを書き込みます。埋め込みビューアーは、それらの行からセッション JSONL を再構築したりダウンロードしたりしなくなりました。
  • コンテキストエンジンの委譲では、エージェントのアイデンティティを復元するためにトランスクリプトロケーターを解析しなくなりました。準備済みランタイムコンテキストが、解決済みの agentId を組み込み Compaction アダプターへ渡します。
  • トランスクリプトの書き換えとライブツール結果の切り詰めは、{agentId, sessionId} によってトランスクリプト状態を読み取り、永続化するようになり、トランスクリプト更新イベントのペイロード向けに一時ロケーターを導出しません。
  • トランスクリプト状態ヘルパーのサーフェスには、ロケーターベースの readTranscriptStatereplaceTranscriptStateEvents、または persistTranscriptStateMutation バリアントがなくなりました。ランタイムの呼び出し元は {agentId, sessionId} API を使用する必要があります。doctor インポートは、明示的なファイルパスによってレガシーファイルを読み取り、SQLite 行を書き込みます。ロケーター文字列は移行しません。
  • ランタイムのセッションマネージャー契約は、open(locator)forkFrom(locator)、または setTranscriptLocator(...) を公開しなくなりました。永続化セッションマネージャーは {agentId, sessionId} のみで開きます。リスト/フォークヘルパーは、トランスクリプトマネージャーのファサードではなく、行指向のセッションおよびチェックポイント API に配置されます。
  • Gateway のトランスクリプトリーダー API はスコープ優先です。これらは {agentId, sessionId} を受け取り、誤ってランタイムのアイデンティティになり得る位置引数のトランスクリプトロケーターを受け付けません。アクティブなトランスクリプトロケーターの解析は廃止され、レガシーソースパスは doctor インポートコードによってのみ読み取られます。
  • トランスクリプト更新イベントもスコープ優先です。emitSessionTranscriptUpdate は単独のロケーター文字列を受け付けなくなり、リスナーはハンドルを解析せずに {agentId, sessionId} によってルーティングします。
  • Gateway のセッションメッセージブロードキャストは、トランスクリプトロケーターではなく、エージェント/セッションスコープからセッションキーを解決します。古いトランスクリプトロケーターからセッションキーへのリゾルバー/キャッシュは削除されました。
  • Gateway のセッション履歴 SSE は、エージェント/セッションスコープによってライブ更新をフィルタリングします。ストリームが更新を受信すべきか判断するために、トランスクリプトロケーター候補、realpath、またはファイル形式のトランスクリプトアイデンティティを正規化しなくなりました。
  • セッションライフサイクルフックは、session_end 上でトランスクリプトロケーターを導出または公開しなくなりました。フックの利用側は、sessionIdsessionKey、次のセッション ID、およびエージェントコンテキストを受け取ります。トランスクリプトファイルはライフサイクル契約の一部ではありません。
  • リセットフックもトランスクリプトロケーターを導出または公開しなくなりました。before_reset ペイロードは、復元された SQLite メッセージとリセット理由を保持し、セッションのアイデンティティはフックコンテキストに保持されます。
  • エージェントハーネスのリセットは、トランスクリプトロケーターを受け付けなくなりました。リセットのディスパッチは、sessionId/sessionKey と理由によってスコープされます。
  • エージェント拡張機能のセッション型は、transcriptLocator を公開しなくなりました。拡張機能は、ファイル形式のトランスクリプトアイデンティティにアクセスするのではなく、セッションコンテキストとランタイム API を使用する必要があります。
  • Plugin の Compaction フックは、トランスクリプトロケーターを公開しなくなりました。フックコンテキストにはすでにセッションのアイデンティティが含まれており、トランスクリプトの読み取りはファイル形式のハンドルではなく、SQLite のスコープ対応 API を経由する必要があります。
  • before_agent_finalize フックは、ネイティブフックリレーのペイロードを含め、transcriptPath を公開しなくなりました。終了処理フックはセッションコンテキストのみを使用します。
  • Gateway のリセット応答は、返されるエントリ上にトランスクリプトロケーターを合成しなくなりました。リセットでは SQLite トランスクリプト行を作成し、クリーンなセッションエントリを返し、トランスクリプトへのアクセスはスコープ対応リーダーに委ねます。
  • 埋め込み実行と Compaction の結果は、セッション集計向けにトランスクリプトロケーターを公開しなくなりました。自動 Compaction は、アクティブな sessionId、Compaction カウンター、およびトークンメタデータのみを更新します。
  • 埋め込み試行結果は transcriptLocatorUsed を返さなくなり、コンテキストエンジンの compact() 結果もトランスクリプトロケーターを返さなくなりました。ランタイムの再試行ループが受け付けるのは、後続の sessionId のみです。
  • 配信ミラーのトランスクリプト追記結果は、トランスクリプトロケーターを返さなくなりました。呼び出し元は追記された messageId を受け取り、トランスクリプト更新シグナルは SQLite スコープを使用します。
  • 親セッションのフォークヘルパーは、フォークされた sessionId のみを返します。サブエージェントの準備では、子エージェント/セッションスコープをエンジンへ渡します。
  • CLI ランナーのパラメーターと履歴の再シードは、トランスクリプトロケーターを受け付けなくなりました。CLI の履歴読み取りは、{agentId, sessionId} とセッションキーコンテキストから SQLite トランスクリプトスコープを解決します。
  • CLI と埋め込みランナーのテストフィクスチャは、アクティブなセッションを *.jsonl ファイルと見なしたり、ランタイムパラメーターを介して sqlite-transcript://... 文字列を渡したりする代わりに、セッション ID によって SQLite トランスクリプト行をシードして読み取るようになりました。
  • セッションのツール結果ガードイベントは、インメモリマネージャーに導出済みロケーターがない場合でも、既知のセッションスコープから送出されます。そのテストでは、アクティブな /tmp/*.jsonl トランスクリプトファイルを模擬しなくなりました。
  • BTW および Compaction チェックポイントヘルパーは、SQLite スコープによってトランスクリプト行を読み取り、フォークするようになりました。チェックポイントメタデータにはセッション ID とリーフ/エントリ ID のみが保存され、導出されたロケーターはチェックポイントのペイロードに書き込まれなくなりました。
  • Gateway のトランスクリプトキー検索は、プロトコル境界で SQLite トランスクリプトスコープを使用し、トランスクリプトのファイル名に対して realpath や stat を実行しなくなりました。
  • 自動 Compaction のトランスクリプトローテーションは、SQLite トランスクリプトストアを介して後続のトランスクリプト行を直接書き込みます。セッション行には後続セッションのアイデンティティのみが保持され、永続的な JSONL パスや永続化されたロケーターは保持されません。
  • 埋め込みコンテキストエンジンの Compaction は、SQLite の命名に沿ったトランスクリプトローテーションヘルパーを使用します。ローテーションのテストでは、JSONL の後続パスを構築したり、アクティブなセッションをファイルとしてモデル化したりしなくなりました。
  • 管理対象の送信画像保持は、ファイルシステムの stat 呼び出しではなく、SQLite トランスクリプト統計からトランスクリプトメッセージキャッシュのキーを生成します。
  • ランタイムのセッションロックと、スタンドアロンのレガシー .jsonl.lock doctor レーンは削除されました。
  • Microsoft Teams のランタイムバレルと公開 Plugin SDK は、古いファイルロックヘルパーを再エクスポートしなくなりました。永続的な Plugin 状態パスは SQLite を基盤とします。
  • セッションの経過時間/件数に基づくプルーニングと明示的なセッションクリーンアップは削除されました。doctor がレガシーインポートを所有し、古いセッションは明示的にリセットまたは削除されます。
  • doctor の整合性チェックでは、SQLite セッション行の有効なアクティブトランスクリプトとしてレガシー JSONL ファイルをカウントしなくなりました。アクティブなトランスクリプトの正常性は SQLite のみを基準とし、レガシー JSONL ファイルは移行/孤立データクリーンアップの入力として報告されます。
  • doctor は、agents/<agent>/sessions/ を必須のランタイム状態として扱わなくなりました。そのディレクトリがすでに存在する場合にのみ、レガシーインポートまたは孤立データクリーンアップの入力としてスキャンします。
  • Gateway の sessions.resolve、セッションのパッチ/リセット/コンパクト処理、サブエージェントの生成、高速中止、ACP メタデータ、Heartbeat で分離されたセッション、および TUI のパッチ処理は、通常のランタイム処理の副作用としてレガシーセッションキーを移行またはプルーニングしなくなりました。
  • CLI コマンドのセッション解決は、storePath ではなく所有元の agentId を返すようになり、通常の --to または --session-id の解決中にレガシーのメインセッション行をコピーしなくなりました。レガシーのメイン行の正規化は doctor のみが担当します。
  • ランタイムのサブエージェント深度解決は、sessions.json または JSON5 セッションストアを読み取らなくなりました。エージェント ID によって SQLite の session_entries を読み取り、レガシーの深度/セッションメタデータは doctor のインポートパスを介してのみ取り込めます。
  • 認証プロファイルのセッションオーバーライドは、ファイル形式のセッションストアランタイムを遅延読み込みする代わりに、{agentId, sessionKey} 行の直接 upsert によって永続化されます。
  • 自動返信の詳細出力ゲートとセッション更新ヘルパーは、セッションのアイデンティティによって SQLite セッション行を読み取り/upsert するようになり、永続化された行状態を操作する前にレガシーストアパスを必要としなくなりました。
  • コマンド実行のセッションメタデータヘルパーは、エントリ指向の名前とモジュールパスを使用するようになりました。古い session-store コマンドヘルパーのサーフェスは削除されました。
  • ブートストラップヘッダーのシードと手動 Compaction 境界の強化は、SQLite トランスクリプト行を直接変更するようになりました。ランタイムの呼び出し元は、書き込み可能な .jsonl パスではなく、セッションのアイデンティティを渡します。
  • サイレントなセッションローテーションのリプレイは、SQLite トランスクリプト行から {agentId, sessionId} によって最近のユーザー/アシスタントのターンをコピーします。ソースまたはターゲットのトランスクリプトロケーターは受け付けなくなりました。
  • 新規のランタイムセッション行は、トランスクリプトロケーターを保存しなくなりました。呼び出し元は {agentId, sessionId} を直接使用します。エクスポート/デバッグコマンドは、行を具体化するときに出力ファイル名を選択できます。
  • 新しい永続化トランスクリプトセッションを開始すると、常にスコープによって SQLite 行が開かれるようになりました。セッションマネージャーは、新しいセッションのアイデンティティとして、ファイル時代の以前のトランスクリプトパスやロケーターを再利用しなくなりました。
  • 永続化トランスクリプトセッションは、明示的な openTranscriptSessionManagerForSession({agentId, sessionId}) API を使用します。古い静的な SessionManager.create/openForSession/list/forkFromSession ファサードは削除され、テストやランタイムコードが誤ってファイル時代のセッション検出を再構築できないようになりました。
  • Plugin ランタイムは api.runtime.agent.session.resolveTranscriptLocatorPath を公開しなくなりました。Plugin コードは SQLite 行ヘルパーとスコープ値を使用します。
  • 公開 session-store-runtime SDK サーフェスは、セッション行およびトランスクリプト行のヘルパーのみをエクスポートするようになりました。SQLite のスキーマ/パス/トランザクションに特化したヘルパーは sqlite-runtime に配置され、生のオープン/クローズ/リセットヘルパーはファーストパーティテスト専用としてローカルに留まります。
  • レガシー .jsonl の軌跡/チェックポイントファイル名分類子は、doctor のレガシーセッションファイルモジュールに配置されるようになりました。コアのセッション検証は、通常の SQLite セッション ID を判定するためにファイル成果物ヘルパーをインポートしなくなりました。
  • Active Memory のブロッキングサブエージェント実行は、Plugin 状態配下に一時または永続化された session.jsonl ファイルを作成する代わりに、SQLite トランスクリプト行を使用します。古い transcriptDir オプションは削除されました。
  • 単発のスラッグ生成とシステムエージェントのプランナー実行は、一時的な session.jsonl ファイルを作成する代わりに、SQLite トランスクリプト行を使用します。
  • llm-task ヘルパーの実行と非表示コミットメントの抽出でも SQLite トランスクリプト行を使用するようになったため、これらのモデル専用ヘルパーセッションは 一時的な JSON/JSONL トランスクリプトファイルを作成しなくなりました。
  • TranscriptSessionManager は現在、開かれた SQLite トランスクリプトスコープにすぎません。 ランタイムコードは openTranscriptSessionManagerForSession({agentId, sessionId}) でこれを開きます。作成、分岐、続行、一覧表示、フォークの各フローは、静的なマネージャーファサードではなく、 それぞれを所有する SQLite 行ヘルパーにあります。 Doctor/インポート/デバッグコードは、ランタイムセッションマネージャーの外部で明示的なレガシーソースファイルを処理します。
  • 古くなった SessionManager.newSession() および SessionManager.createBranchedSession() ファサードメソッドは削除されました。新しい セッションとトランスクリプトの子孫は、すでに開かれているマネージャーを別の 永続セッションへ変異させるのではなく、それぞれを所有する SQLite ワークフローによって作成されます。
  • 親トランスクリプトのフォーク判断とフォーク作成は、 storePath または sessionsDir を受け付けなくなりました。保持されたファイルシステムパスメタデータではなく、 {agentId, sessionId} SQLite トランスクリプトスコープを使用します。
  • Memory-host は、何もしないセッションディレクトリのトランスクリプト分類ヘルパーを エクスポートしなくなりました。トランスクリプトのフィルタリングは、エントリ構築時に SQLite 行 メタデータから導出されるようになりました。
  • Memory-host と QMD のセッションエクスポートテストは、SQLite トランスクリプトスコープを使用します。古い agents/<agentId>/sessions/*.jsonl パスが引き続き対象となるのは、テストが Doctor/インポート/エクスポートの互換性を意図的に証明する場合のみです。
  • QA-lab の未加工セッション検査は、agents/qa/sessions/sessions.json を読み取る代わりに、 Gateway 経由で sessions.list を使用するようになりました。MSteams のフィードバックは、 JSONL パスを捏造せずに SQLite トランスクリプトへ直接追記されます。
  • 共有受信チャネルターンは、レガシーの storePath ではなく {agentId, sessionKey} を保持するようになりました。LINE、WhatsApp、Slack、Discord、Telegram、Matrix、Signal、 iMessage、BlueBubbles、Feishu、Google Chat、IRC、Nextcloud Talk、Zalo、 Zalo Personal、QA Channel、Microsoft Teams、Mattermost、Synology Chat、Tlon、 Twitch、QQBot の記録パスは、更新日時メタデータを読み取り、 SQLite ID を通じて受信セッション行を記録するようになりました。
  • トランスクリプトロケーターの永続化は、アクティブなセッション行から削除されました。 resolveSessionTranscriptTargetagentIdsessionId、およびオプションの トピックメタデータを返します。レガシーのトランスクリプトファイル名をインポートするコードは Doctor のみです。
  • ランタイムトランスクリプトヘッダーは、SQLite バージョン 1 から始まります。古い JSONL V1/V2/V3 形式のアップグレードは Doctor のインポートにのみ存在し、行を保存する前に インポートされたヘッダーを現在の SQLite トランスクリプトバージョンへ正規化します。
  • データベース優先ガードは、SessionManager.listAll および SessionManager.forkFromSession を禁止するようになりました。セッション一覧とフォーク/復元ワークフローは、 行ベース/スコープ付き SQLite API の使用を維持する必要があります。
  • このガードは、Doctor/インポートコードの外部でレガシートランスクリプトの JSONL 解析/アクティブブランチ修復ヘルパー名も禁止するため、 ランタイムに第 2 のレガシートランスクリプト移行パスを追加できません。
  • 組み込み PI 実行は、受信したトランスクリプトハンドルを拒否します。ワーカーの起動前と、 試行がトランスクリプト状態に触れる前に、SQLite の {agentId, sessionId} ID を使用します。古い /tmp/*.jsonl 入力で ランタイムの書き込み先を選択することはできません。
  • キャッシュトレース、Anthropic ペイロード、未加工ストリーム、診断タイムラインのレコードは、 型付き SQLite diagnostic_events 行へ書き込まれるようになりました。Gateway の安定性バンドルは、 型付き SQLite diagnostic_stability_bundles 行へ書き込まれるようになりました。古い diagnostics.cacheTrace.filePathOPENCLAW_CACHE_TRACE_FILEOPENCLAW_ANTHROPIC_PAYLOAD_LOG_FILE、および OPENCLAW_DIAGNOSTICS_TIMELINE_PATH JSONL オーバーライドパスは削除され、 通常の安定性キャプチャは logs/stability/*.json ファイルを書き込まなくなりました。
  • Cron の永続化は、保存のたびにジョブテーブル全体を削除して再挿入するのではなく、 SQLite cron_jobs 行を整合させるようになりました。Plugin ターゲットの 書き戻しは一致する Cron 行を直接更新し、ランタイムの Cron 状態を 同じ状態データベーストランザクション内に保持します。
  • Cron ランタイムの呼び出し元は、安定した SQLite Cron ストアキーを使用するようになりました。レガシーの cron.store パスは Doctor のインポート入力に限られます。本番環境の Gateway、タスク メンテナンス、ステータス、実行履歴、Telegram ターゲットの書き戻しパスは resolveCronStoreKey を使用し、キーのパス正規化を行わなくなりました。Cron ステータスは、 古いファイル形式の storePath フィールドではなく storeKey を報告するようになりました。
  • Cron ランタイムの読み込みとスケジューリングは、jobIdschedule.cron、数値の atMs、文字列の真偽値、 sessionTarget の欠落など、永続化されたレガシージョブ形式を正規化しなくなりました。 行を SQLite に挿入する前に、Doctor のレガシーインポートがこれらの修復を担当します。
  • ACP のスポーンは、トランスクリプトの JSONL ファイルパスを解決または永続化しなくなりました。スポーン とスレッドバインドのセットアップは SQLite セッション行を直接永続化し、 セッション ID を保持されるトランスクリプト ID として維持します。
  • ACP セッションメタデータ API は、agentId により SQLite 行を読み取り/一覧表示/アップサートするようになり、 ACP セッションエントリ契約の一部として storePath を公開しなくなりました。
  • セッション使用量の集計と Gateway 使用量の集約は、 {agentId, sessionId} のみでトランスクリプトを解決するようになりました。コスト/使用量キャッシュと検出済みセッションの サマリーは、トランスクリプトロケーター文字列を合成または返却しなくなりました。
  • Gateway のチャット追記、中止時の部分永続化、/sessions.send、および Web チャットメディアのトランスクリプト書き込みは、SQLite トランスクリプト スコープを通じて直接追記されます。Gateway のトランスクリプト注入ヘルパーは、 transcriptLocator パラメーターを受け付けなくなりました。
  • SQLite トランスクリプトの検出は、トランスクリプトスコープと統計のみを一覧表示するようになりました: {agentId, sessionId, updatedAt, eventCount}。使用されていなかった listSqliteSessionTranscriptLocators 互換性ヘルパーと、行ごとの locator フィールドは削除されました。
  • トランスクリプト修復ランタイムは、 repairTranscriptSessionStateIfNeeded({agentId, sessionId}) のみを公開するようになりました。古い ロケーターベースの修復ヘルパーは削除されました。Doctor/デバッグコードは明示的な ソースファイルパスを読み取り、ロケーター文字列を移行することはありません。
  • ACP リプレイ台帳ランタイムは、acp/event-ledger.json の代わりに、 セッションごとのリプレイ行を共有 SQLite 状態データベースへ保存するようになりました。Doctor は レガシーファイルをインポートして削除します。
  • Gateway のトランスクリプトリーダーヘルパーは、古い session-utils.fs モジュール名ではなく、 src/gateway/session-transcript-readers.ts に配置されるようになりました。フォールバック再試行履歴のチェックには、 古いファイルヘルパー面ではなく SQLite トランスクリプトの内容に基づく名前が付けられています。
  • Gateway の注入チャットおよび Compaction ヘルパーは、値をトランスクリプトパスや ソースファイルと呼ぶ代わりに、内部ヘルパー API を通じて SQLite トランスクリプトスコープを渡すようになりました。
  • ブートストラップの続行検出は、hasCompletedBootstrapTranscriptTurn を通じて SQLite トランスクリプト行を チェックするようになり、ファイル形式のヘルパー名を公開しなくなりました。
  • 組み込みランナーのテストは SQLite トランスクリプト ID を使用するようになり、新しい トランスクリプトマネージャーを開く際は常に明示的な sessionId が必要になりました。
  • メモリインデックス作成ヘルパーは、全面的に SQLite トランスクリプト用語を使用するようになりました。 ホストは listSessionTranscriptScopesForAgent および sessionTranscriptKeyForScope をエクスポートし、対象指定同期は sessionTranscripts をキューへ追加し、 公開セッション検索のヒットは不透明な transcript:<agent>:<session> パスを公開し、 内部 DB ソースキーは偽のファイルパスではなく、 source_kind='sessions' 配下の session:<session> になります。
  • 汎用 Plugin SDK の永続的重複排除ヘルパーは、ファイル形式の オプションを公開しなくなりました。呼び出し元は SQLite スコープキーを提供し、永続的な重複排除行は 共有 Plugin 状態に保存されます。
  • Microsoft Teams の SSO トークンは、ロックされた JSON ファイルから SQLite Plugin 状態へ移行しました。Doctor は msteams-sso-tokens.json をインポートし、ペイロードから正規の SSO トークン キーを再構築して、ソースファイルを削除します。委任された OAuth トークンは、 既存の非公開認証情報ファイル境界にとどまります。
  • Matrix の同期キャッシュ状態は、bot-storage.json から SQLite Plugin 状態へ移行しました。Doctor はレガシーの未加工またはラップされた同期ペイロードをインポートし、 ソースファイルを削除します。アクティブな Matrix および QA Lab Matrix アダプタークライアントは、偽の sync-store.json または bot-storage.json パスではなく、SQLite 同期ストアのルート ディレクトリを渡します。
  • Matrix のレガシー暗号化移行ステータスは、 legacy-crypto-migration.json から SQLite Plugin 状態へ移行しました。Doctor は 古いステータスファイルをインポートします。Matrix SDK の IndexedDB スナップショットは、 crypto-idb-snapshot.json から SQLite Plugin BLOB へ移行しました。Matrix のリカバリキーと 認証情報は SQLite Plugin 状態の行です。これらの古い JSON ファイルは、Doctor の 移行入力に限られます。
  • Memory Wiki のアクティビティログは、.openclaw-wiki/log.jsonl の代わりに SQLite Plugin 状態を使用するようになりました。Memory Wiki の移行プロバイダーは古い JSONL ログをインポートします。Wiki の Markdown とユーザー保管庫のコンテンツは、ワークスペースコンテンツとして 引き続きファイルベースです。
  • Memory Wiki は、.openclaw-wiki/state.json または未使用の .openclaw-wiki/locks ディレクトリを作成しなくなりました。古い保管庫にそれらがまだ存在する場合、 移行プロバイダーが廃止済みの Plugin メタデータファイルを削除します。
  • システムエージェントの監査エントリは、audit/crestodian.jsonl の代わりに コアの SQLite Plugin 状態を使用するようになりました。Doctor はレガシーの JSONL 監査ログをインポートし、 インポート成功後に削除します。
  • 設定の書き込み/監視監査エントリは、logs/config-audit.jsonl の代わりに コアの SQLite Plugin 状態を使用するようになりました。Doctor はレガシーの JSONL 監査ログをインポートし、 インポート成功後に削除します。
  • macOS コンパニオンは、openclaw.json の編集中にアプリローカルの logs/config-audit.jsonl または logs/config-health.json サイドカーを書き込まなくなりました。設定 ファイルは引き続きファイルベースで、復旧スナップショットは設定ファイルの隣に保持され、 永続的な設定監査/健全性状態は Gateway の SQLite ストアに属します。
  • システムエージェントのレスキュー保留中承認は、crestodian/rescue-pending/*.json または openclaw/rescue-pending/*.json の代わりに、 コアの SQLite Plugin 状態を使用するようになりました。 これらの短命なセキュリティ機能は一切インポートされません。Doctor は 廃止された両方のディレクトリを破棄するため、アップグレードによって古い書き込みが再有効化されることはありません。
  • Phone Control の一時的なアーム状態は、plugins/phone-control/armed.json の代わりに SQLite Plugin 状態を使用するようになりました。Doctor はレガシーのアーム済み状態 ファイルを phone-control/arm-state 名前空間へインポートし、ファイルを削除します。
  • Doctor は、JSONL トランスクリプトをインプレースで修復したり、バックアップ JSONL ファイルを作成したりしなくなりました。アクティブブランチを SQLite にインポートし、レガシーソースを削除します。
  • セッションメモリフックのトランスクリプト検索は、{agentId, sessionId} スコープのみの SQLite 読み取りを使用します。そのヘルパーは、トランスクリプトロケーター、 レガシーファイル読み取り、ファイル書き換えオプションを受け付けたり導出したりしなくなりました。
  • Codex app-server の会話バインディングは、OpenClaw セッションキーまたは明示的な {agentId, sessionId} スコープをキーとして SQLite Plugin 状態を管理するようになりました。トランスクリプトパスの フォールバックバインディングを保持してはなりません。
  • Codex app-server のミラー履歴読み取りは、SQLite トランスクリプトスコープのみを使用します。 トランスクリプトファイルパスから ID を復元してはなりません。
  • ロール順序付けおよび Compaction のリセットパスは、古いトランスクリプト ファイルのリンクを解除しなくなりました。リセットでは、SQLite セッション行とトランスクリプト ID のみをローテーションします。
  • Gateway のリセットおよびチェックポイント応答は、クリーンなセッション行とセッション ID を返します。クライアント用の SQLite トランスクリプトロケーターを合成しなくなりました。
  • Memory-core の Dreaming は、欠落した JSONL ファイルを調べて セッション行を削除しなくなりました。サブエージェントのクリーンアップは、ファイルシステムの存在確認ではなく セッションランタイム API を通じて行われます。そのトランスクリプト取り込みテストは、 agents/<id>/sessions フィクスチャやロケーターのプレースホルダーを作成する代わりに、SQLite 行を直接シードします。
  • メモリトランスクリプトのインデックス作成では、引用/読み取りヘルパー用の 仮想検索ヒットパスとして transcript:<agentId>:<sessionId> を公開する場合があります。永続的なインデックスソースは リレーショナル形式です(source_kind='sessions'source_key='session:<sessionId>'session_id=<sessionId>) であるため、この値はランタイムトランスクリプトのロケーターではなく、 ファイルシステムパスでもありません。また、セッションランタイム API に渡し戻してはなりません。
  • Gateway doctor のメモリステータスは、memory/.dreams/*.json ではなく、 SQLite の Plugin 状態行から短期想起とフェーズシグナルの件数を読み取ります。CLI と doctor の出力では、そのストレージをパスではなく SQLite ストアとして表示するようになりました。
  • Memory-core ランタイム、CLI ステータス、Gateway doctor メソッド、および Plugin SDK ファサードは、従来の .dreams/session-corpus ファイルを監査またはアーカイブしなくなりました。 これらのファイルは移行入力専用です。doctor はそれらを SQLite にインポートし、 検証後にソースを削除します。アクティブなセッション取り込みの証拠行では、 仮想 SQLite パス memory/session-ingestion/<day>.txt を使用するようになりました。ランタイムは .dreams/session-corpus に状態を書き込んだり、そこから状態を導出したりすることはありません。
  • Memory-core の公開アーティファクトは、SQLite ホストイベントを仮想 JSON アーティファクト memory/events/memory-host-events.json として公開します。従来の .dreams/events.jsonl ソースパスを再利用しなくなりました。
  • サンドボックスのコンテナ/ブラウザレジストリは、型付きのセッション、イメージ、タイムスタンプ、 バックエンド/設定、およびブラウザポート列を持つ共有 sandbox_registry_entries SQLite テーブルを使用するようになりました。doctor は従来のモノリシックおよび シャード化された JSON レジストリファイルをインポートし、正常に処理されたソースを削除します。ランタイムの読み取りでは、 型付き行の列を信頼できる唯一の情報源として使用します。entry_json はリプレイ/デバッグ用の コピーにすぎません。
  • コミットメントは、ストア全体の JSON BLOB ではなく、型付き共有 commitments テーブルを使用するようになりました。ランタイムは、インデックス付きのスコープ、配信ウィンドウ、ローリング 上限、ステータス、および試行クエリと、同期 SQLite トランザクションを使用します。 record_json はリプレイ/デバッグ用のコピーにすぎません。明示的な doctor 修復では、 従来の commitments.json 全体を検証し、より新しい SQLite 行を維持して結果を検証し、 その後にのみ、変更されていないソースを削除します。ランタイムは廃止されたファイルを 読み書きすることはありません。
  • Web Push サブスクリプションと生成された VAPID アイデンティティは、型付き共有 web_push_subscriptions 行と web_push_vapid_keys 行を使用するようになりました。ランタイムでの登録、 有効期限切れのクリーンアップ、および初回使用時のキー生成では、行レベルの SQLite トランザクションを使用します。明示的な Doctor 修復では、廃止された両方の JSON ストアを検証し、 SQLite への書き込み前にそれらを取得し、アトミックにインポートし、 競合する VAPID アイデンティティを拒否して結果を検証し、その後にのみ取得済みソースを 削除します。Doctor はインポート全体を通して状態ディレクトリのメンテナンスロックを保持するため、 古い Gateway が廃止済みファイルを再作成することはできません。登録、 配信、削除、およびキー解決は、Doctor が保留中の従来ソースまたは中断された取得処理を 解決するまでフェイルクローズします。
  • Cron ジョブ定義、スケジュール状態、および実行履歴には、ランタイムの JSON ライターやリーダーが存在しなくなりました。ランタイムは、型付きのスケジュール、 ペイロード、配信、失敗アラート、セッション、ステータス、およびランタイム状態の各列を持つ cron_jobs 行に加え、診断、配信、セッション/実行、モデル、 およびトークン合計に関する Cron 所有の task_runs 詳細を使用します。 job_json はリプレイ/デバッグ用のコピーにすぎません。state_json は、 まだホットクエリフィールドを持たないネストされたランタイム診断を保持し、ランタイムは 型付き列からホット状態フィールドを復元します。doctor は従来の jobs.jsonjobs-state.json、および runs/*.jsonl ファイルをインポートし、 インポート済みソースを削除します。Plugin ターゲットの書き戻しでは、Cron ストア全体を 読み込んで置換するのではなく、一致する cron_jobs 行を更新します。
  • Gateway の起動時、ランタイム投影では従来の notify: true マーカーを 無視します。doctor は、これらのマーカーを明示的な SQLite 配信へ変換している間にのみ、 廃止された生の cron.webhook を読み取り、その後に設定キーを削除します。
  • 送信キューとセッション配信キューは、キューのステータス、エントリ種別、 セッションキー、チャネル、ターゲット、アカウント ID、再試行回数、最終試行/エラー、 復旧状態、およびプラットフォーム送信マーカーを、共有 delivery_queue_entries テーブルの型付き列として保存するようになりました。ランタイム復旧では、 これらのホットフィールドを型付き列から読み取り、再試行/復旧の変更では、 リプレイ JSON を書き直すことなく、それらの列を直接更新します。完全な JSON ペイロードは、 メッセージ本文やその他のコールドリプレイデータ用のリプレイ/デバッグ BLOB としてのみ残ります。
  • 管理対象の送信画像レコードは、型付き共有 managed_outgoing_image_records 行を使用するようになりました。ランタイムは型付き列のみを読み取ります。 JSON 列はリプレイ/デバッグ用のコピーです。元の画像バイトは、管理対象メディアディレクトリ内の 名前付き添付アーティファクトとして保持されます。
  • Discord のモデルピッカー設定、コマンドデプロイハッシュ、およびスレッドバインディングは、 共有 SQLite Plugin 状態を使用するようになりました。従来の JSON インポート計画は、 コア移行コードではなく、Discord Plugin のセットアップ/doctor 移行サーフェスに存在します。
  • Plugin の従来インポート検出器では、 doctor-legacy-state.tsdoctor-state-imports.ts などの doctor 用モジュールを使用します。通常のチャネルランタイム モジュールは、従来の JSON 検出器をインポートしてはなりません。
  • BlueBubbles のキャッチアップカーソルと受信重複排除マーカーは、共有 SQLite Plugin 状態を使用するようになりました。従来の JSON インポート計画は、コア移行コードではなく、 BlueBubbles Plugin のセットアップ/doctor 移行サーフェスに存在します。
  • Telegram の更新オフセット、ステッカーキャッシュ行、送信済みメッセージキャッシュ行、 トピック名キャッシュ行、およびスレッドバインディングは、共有 SQLite Plugin 状態を使用するようになりました。従来の JSON インポート計画は、コア移行コードではなく、 Telegram Plugin のセットアップ/doctor 移行サーフェスに存在します。
  • iMessage のキャッチアップカーソル、返信短縮 ID マッピング、および送信エコー重複排除行は、 共有 SQLite Plugin 状態を使用するようになりました。古い imessage/catchup/*.jsonimessage/reply-cache.jsonl、および imessage/sent-echoes.jsonl ファイルは、 doctor の入力専用です。
  • Feishu のメッセージ重複排除行は、feishu/dedup/*.json ファイルや廃止された独自実装の dedup.* ストアではなく、コアの取得可能な重複排除 (共有 SQLite Plugin 状態内の feishu.dedup.* 名前空間)を使用するようになりました。 リプレイ保護キャッシュはアップグレード後に再構築されるため、従来データのインポートは行いません。
  • Microsoft Teams の会話、投票、保留中のアップロードバッファ、およびフィードバックからの 学習内容は、共有 SQLite Plugin 状態/BLOB テーブルを使用するようになりました。保留中のアップロード パスでは plugin_blob_entries を使用するため、メディアバッファは base64 JSON ではなく SQLite BLOB として保存されます。ランタイムヘルパー名では、*-fs ファイルストア命名ではなく SQLite/状態の命名を使用するようになり、古い storePath シムはこれらのストアから 削除されました。従来の JSON インポート計画は、Microsoft Teams Plugin のセットアップ/doctor 移行サーフェスに存在します。
  • Zalo のホスト型送信メディアは、openclaw-zalo-outbound-media JSON/bin 一時サイドカーではなく、 共有 SQLite plugin_blob_entries を使用するようになりました。
  • 差分ビューアの HTML とメタデータは、meta.jsonviewer.html 一時ファイルではなく、 共有 SQLite plugin_blob_entries を使用するようになりました。ビューア HTML は gzip BLOB として保存され、 URL トークンのハッシュのみが永続化されます。レンダリングされた PNG/PDF 出力は、 チャネル配信で引き続きファイルパスが必要なため、一時的な実体化として保持されます。 その有効期限メタデータは JSON サイドカーを使用せず、SQLite が所有します。
  • Canvas の管理対象ドキュメントは、デフォルトの state/canvas/documents ディレクトリではなく、 共有 SQLite plugin_blob_entries を使用するようになりました。Canvas ホストはこれらの BLOB を 直接配信します。ローカルファイルは、明示的な host.root オペレーターコンテンツの場合、または 下流のメディアリーダーがパスを必要とする場合の一時的な実体化としてのみ作成されます。
  • File Transfer の監査判定は、上限のない audit/file-transfer.jsonl ランタイムログではなく、 共有 SQLite plugin_state_entries を使用するようになりました。doctor は従来の JSONL 監査ファイルを Plugin 状態へインポートし、正常にインポートされた後にソースを削除します。
  • ACPX のプロセスリースと Gateway インスタンスアイデンティティは、共有 SQLite Plugin 状態を使用するようになりました。doctor は従来の gateway-instance-id ファイルを Plugin 状態へ インポートし、ソースを削除します。
  • ACPX が生成するラッパースクリプトと分離された Codex ホームは、永続的な OpenClaw 状態ではなく、 OpenClaw 一時ルート配下の一時的な実体化です。永続的な ACPX ランタイムレコードは、 SQLite のリース行と Gateway インスタンス行です。ランタイム状態がそこへ書き込まれなくなったため、 古い ACPX stateDir 設定サーフェスは削除されました。
  • Gateway のメディア添付ファイルは、共有 media_blobs SQLite テーブルを 正規のバイトストアとして使用するようになりました。チャネルおよびサンドボックスの 互換性サーフェスに返されるローカルパスは、永続的なメディアストアではなく、 データベース行の一時的な実体化です。ランタイムのメディア許可リストには、 従来の $OPENCLAW_STATE_DIR/media ルートや設定ディレクトリの media ルートが含まれなくなりました。 これらのディレクトリは doctor のインポートソース専用です。
  • シェル補完は、$OPENCLAW_STATE_DIR/completions/* キャッシュファイルを 書き込まなくなりました。インストール、doctor、更新、およびリリーススモークの各パスでは、 永続的な補完キャッシュファイルの代わりに、生成された補完出力またはプロファイルの読み込みを使用します。
  • Gateway の Skills アップロードステージングは、共有 skill_uploads 行と skill_upload_chunks 行を使用するようになりました。アップロード中、各チャンクは個別に トランザクション処理され、コミット時に検証済みの単一アーカイブ BLOB へまとめられ、 チャンク行が削除されます。インストーラーが受け取るのは、インストール実行中にのみ存在する 一時的に実体化されたアーカイブパスです。doctor は、廃止された 1 時間保持のファイルシステム ステージングツリーをインポートせずに破棄します。
  • サブエージェントのインライン添付ファイルは、ワークスペースの .openclaw/attachments/* 配下に実体化されなくなりました。生成パスは SQLite VFS シードエントリを準備し、 インライン実行では、それらのエントリをエージェント単位のランタイムスクラッチ名前空間にシードします。 ディスクベースのツールは、添付ファイルパス用にその SQLite スクラッチをオーバーレイします。 古いサブエージェント実行の添付ディレクトリレジストリ列とクリーンアップフックは削除されました。
  • CLI の画像ハイドレーションは、安定した openclaw-cli-images キャッシュファイルを 維持しなくなりました。外部 CLI バックエンドは引き続きファイルパスを受け取りますが、 それらのパスは実行単位の一時的な実体化であり、クリーンアップされます。
  • キャッシュトレース診断、Anthropic ペイロード診断、生のモデルストリーム 診断、診断タイムラインイベント、および Gateway 安定性バンドルは、 logs/*.jsonl または logs/stability/*.json ファイルではなく SQLite 行へ 書き込むようになりました。 ランタイムパスの上書きフラグと環境変数は削除されました。エクスポート/デバッグ コマンドでは、データベース行からファイルを明示的に実体化できます。
  • macOS コンパニオンには、ローリング diagnostics.jsonl ライターが存在しなくなりました。アプリの ログは統合ログへ送られ、永続的な Gateway 診断は引き続き SQLite を基盤とします。
  • macOS のポートガーディアンレコード一覧は、Application Support の JSON ファイルや 不透明なシングルトン BLOB ではなく、型付き共有 SQLite macos_port_guardian_records 行を使用するようになりました。すべての macOS アプリプロファイルは、 マシンローカルのポートを協調管理するため、同じホストグローバルのネイティブ データベースを使用します。古い JSON 書き込み対応のアプリコピーが実行中である間は、 すべての台帳操作がブロックされます。移行では、ソースをスナップショット化し、後で再検証するためだけに、 古い台帳の安定したファイルロックプロトコルへ参加します。そのロックを保持せずに、 ライブコマンドとプロセス開始情報から従来の各行を解決し、その後、信頼できる SQLite 行を再読み取りして、 計画を適用し、すべてのレシートを検証してソースを削除します。削除の再試行では、 欠落した行について計画を再作成するため、廃止された古いレシートが復活することはありません。 SSH の生成後に古いライターを停止させたままにしないよう、ロックは 短時間のみ保持されます。切り替えは意図的に一方向です。定常状態のランタイムは JSON を 読み取り、投影、または書き込むことはなく、JSON 専用ビルドへロールバックしても、 より新しい SQLite レシートは保持されません。
  • Gateway のシングルトンロックは、一時ディレクトリのロックファイルではなく、 gateway_locks スコープ配下の型付き共有 SQLite state_leases 行を使用するようになりました。 Fly と OAuth のトラブルシューティングドキュメントでは、古いファイルロックのクリーンアップではなく、 SQLite のリース/認証更新ロックを参照するようになりました。
  • Gateway 再起動センチネル状態は、restart-sentinel.json の代わりに型付き共有 SQLite gateway_restart_sentinel 行を使用するようになりました。ランタイムは、 型付き列からセンチネルの種類、ステータス、ルーティング、メッセージ、継続情報、統計を 読み取ります。これらの列が信頼できる情報源であり、payload_json は リプレイ/デバッグ用のシャドウにすぎません。ランタイムの読み取り、書き込み、消去パスは SQLite のみを使用します。 1 つの限定的な状態移行モジュールが起動時および Doctor 実行時に動作し、 通常の再起動復旧前に、検証済みの旧形式の更新後センチネルをインポートして 型付き行を検証し、ソースファイルを削除します。定常状態のランタイムモジュールは、 レガシーファイルの読み取り、書き込み、クリーンアップを行いません。
  • Gateway の再起動意図およびスーパーバイザーハンドオフ状態は、 gateway-restart-intent.jsongateway-supervisor-restart-handoff.json サイドカーの代わりに、型付き共有 SQLite gateway_restart_intent および gateway_restart_handoff 行を使用するようになりました。
  • Gateway のシングルトン調整は、gateway.<hash>.lock ファイルを書き込む代わりに、 gateway_locks 配下の型付き state_leases 行を使用するようになりました。リース行が ロック所有者、有効期限、Heartbeat、デバッグペイロードを保持し、SQLite が アトミックな取得/解放境界を担います。廃止されたファイルロックディレクトリオプションは 削除され、テストでは SQLite の行 ID を直接使用します。
  • cron/runs/*.jsonl ファイルを走査していた、参照されていない旧 Cron 使用状況レポートヘルパーは 削除されました。Cron 実行履歴レポートは、Cron が所有する task_runs 行を読み取ります。
  • メインセッションの再起動復旧は、agents/*/sessions ディレクトリを走査する代わりに、SQLite agent_databases レジストリを通じて 候補エージェントを検出するようになりました。
  • Gemini のセッション破損復旧は、SQLite セッション行のみを削除するようになりました。 レガシー storePath ゲートは不要になり、導出された トランスクリプト JSONL パスのリンク解除も試行しません。
  • パスオーバーライド処理は、リテラルの undefined/null 環境 値を未設定として扱うようになり、テストやシェルのハンドオフ中に誤ってリポジトリルートへ undefined/state/*.sqlite データベースが作成されることを防ぎます。
  • 設定健全性フィンガープリントは、logs/config-health.json の代わりに型付き共有 SQLite config_health_entries 行を使用するようになり、通常の設定ファイルが 認証情報以外の唯一の設定ドキュメントとして維持されます。macOS コンパニオンは プロセスローカルな健全性状態のみを保持し、旧 JSON サイドカーを再作成しません。
  • 認証プロファイルのランタイムは、認証情報 JSON ファイルをインポートまたは書き込まなくなりました。 正規の認証情報ストアは SQLite です。auth-profiles.json、エージェントごとの auth.json、共有 credentials/oauth.json は Doctor の移行入力であり、 インポート後に削除されます。
  • 認証プロファイルの保存/状態テストは、型付き SQLite 認証テーブルを直接検証するようになり、 レガシー認証プロファイルファイル名は Doctor の移行入力にのみ使用します。
  • openclaw secrets apply は、設定ファイル、環境ファイル、SQLite 認証プロファイルストアのみを消去します。廃止されたエージェントごとの auth.json を編集する互換性ロジックは保持しなくなりました。このファイルのインポートと削除は Doctor が担います。
  • Hermes のシークレット移行は、インポートされた API キープロファイルを SQLite 認証プロファイルストアへ直接配置するよう計画し、適用します。中間ターゲットとして auth-profiles.json を書き込んだり検証したりすることはなくなりました。
  • ユーザー向け認証ドキュメントでは、 auth-profiles.json の確認やコピーを案内する代わりに、 state/openclaw.sqlite#table/auth_profile_stores/<agentDir> を説明するようになりました。レガシー OAuth/認証 JSON 名は、Doctor のインポート入力としてのみ引き続き記載されます。
  • MCP OAuth セッションは、共有 state/openclaw.sqlite 内のバージョン管理された mcp_oauth_stores 行を使用するようになりました。SDK が所有するトークン、クライアント登録、検出 オブジェクトは、依存関係の拡張フィールドを維持するため、検証済みの単一 JSON ペイロードのままです。 一方、すべての読み取り/変更/書き込みは、1 つの短い Kysely トランザクション内でコミットされます。1 つの共有 SQLite リースが更新、ログイン、ログアウトを直列化します。 組み込み MCP トランスポートが、そのリース外で MCP SDK に更新させることはなくなりました。 Doctor はソースレシート付きで廃止済み mcp-oauth/*.json ストアを排他的にインポートして削除し、ランタイムにはファイルフォールバックがありません。
  • コアの状態パスヘルパーは、廃止済み credentials/oauth.json ファイルを公開しなくなりました。レガシーファイル名は、Doctor の認証インポートパス内に限定されています。
  • インストール、セキュリティ、オンボーディング、モデル認証、SecretRef の各ドキュメントでは、 エージェントごとの認証プロファイル JSON ファイルの代わりに、SQLite 認証プロファイル行と状態全体のバックアップ/移行を 説明するようになりました。
  • PI モデル検出は、正規の認証情報をメモリ内の pi-coding-agent 認証ストレージへ渡すようになりました。検出中にエージェントごとの auth.json を作成、消去、書き込みすることはなくなりました。
  • Voice Wake のトリガーおよびルーティング設定は、settings/voicewake.jsonsettings/voicewake-routing.json、 または不透明な汎用行の代わりに、型付き共有 SQLite テーブルを使用するようになりました。Doctor は レガシー JSON ファイルをインポートし、移行成功後に削除します。
  • 更新確認状態は、update-check.json または不透明な汎用 BLOB の代わりに、 型付き共有 update_check_state 行を使用するようになりました。Doctor は レガシー JSON ファイルをインポートし、移行成功後に削除します。
  • 設定健全性状態は、logs/config-health.json または不透明な汎用 BLOB の代わりに、 型付き共有 config_health_entries 行を使用するようになりました。Doctor は レガシー JSON ファイルをインポートし、移行成功後に削除します。
  • Plugin の会話バインディング承認は、不透明な共有 SQLite 状態または plugin-binding-approvals.json の代わりに、型付き plugin_binding_approvals 行を使用するようになりました。レガシーファイルは Doctor の移行入力です。
  • 汎用の現在会話バインディングは、bindings/current-conversations.json を 書き換える代わりに、型付き current_conversation_bindings 行を保存するようになりました。 Doctor はレガシー JSON ファイルをインポートし、移行成功後に削除します。
  • Memory Wiki のインポート元同期台帳は、.openclaw-wiki/source-sync.json を書き換える代わりに、 Vault/ソースキーごとに 1 つの SQLite Plugin 状態行を保存するようになりました。 移行プロバイダーがレガシー JSON 台帳をインポートして削除します。
  • Memory Wiki の ChatGPT インポート実行レコードは、.openclaw-wiki/import-runs/*.json を書き込む代わりに、 Vault/実行 ID ごとに 1 つの SQLite Plugin 状態行を保存するようになりました。 ロールバックスナップショットは、インポート実行スナップショットのアーカイブが BLOB ストレージへ移行されるまで、明示的な Vault ファイルのままです。
  • Memory Wiki のコンパイル済みダイジェストは、.openclaw-wiki/cache/agent-digest.json および .openclaw-wiki/cache/claims.jsonl を書き込む代わりに、圧縮された SQLite Plugin BLOB 行を 保存するようになりました。キャッシュは再構築可能なため、Doctor は 古いキャッシュファイルをインポートせずに削除します。
  • ClawHub のスキルインストール追跡は、ランタイムで .clawhub/lock.json および .clawhub/origin.json サイドカーを読み書きする代わりに、ワークスペース/スキルごとに 1 つの SQLite Plugin 状態行を保存するようになりました。ランタイムコードは、ファイル形状の ロックファイル/オリジン抽象化ではなく、追跡対象インストール状態オブジェクトを使用します。Doctor は、 設定されたエージェントワークスペースからレガシーサイドカーをインポートし、正常なインポート後に 削除します。
  • インストール済み Plugin インデックスは、plugins/installs.json の代わりに、 型付き共有 SQLite installed_plugin_index シングルトン行を読み書きするようになりました。 レガシー JSON ファイルは Doctor の移行入力にすぎず、インポート後に削除されます。
  • レガシー plugins/installs.json パスヘルパーは、Doctor のレガシーコード内に 移動しました。ランタイムの Plugin インデックスモジュールが公開するのは、JSON ファイルパスではなく、 SQLite ベースの永続化オプションのみです。
  • Gateway 再起動センチネル、再起動意図、スーパーバイザーハンドオフ状態は、汎用の 不透明な BLOB の代わりに、型付き共有 SQLite 行(gateway_restart_sentinelgateway_restart_intentgateway_restart_handoff)を使用するようになりました。ランタイムの再起動コードには、 ファイル形状のセンチネル/意図/ハンドオフ契約がありません。
  • Matrix の同期キャッシュ、ストレージメタデータ、スレッドバインディング、受信重複排除マーカー、 起動検証クールダウン状態、SDK IndexedDB 暗号化スナップショット、 認証情報、復旧キーは、共有 SQLite Plugin 状態/BLOB テーブルを使用するようになりました。ランタイムパス構造体は storage-meta.json メタデータ パスを公開しなくなりました。このファイル名はレガシー移行入力としてのみ使用されます。これらのレガシー JSON インポート 計画は、Matrix Plugin のセットアップ/Doctor 移行サーフェスにあります。受信 重複排除マーカーは、コアの取得可能な重複排除(共有状態 DB 内の matrix.inbound-dedupe.* 名前空間)を使用します。Matrix の Doctor 状態移行は、廃止されたルートごとの inbound-dedupe 行と inbound-dedupe.json を一度だけインポートし、 その後ランタイムは取得可能な重複排除ストアのみを読み取ります。
  • Matrix の起動処理は、レガシー Matrix ファイル状態の走査、報告、完了を 行わなくなりました。Matrix ファイルの検出、レガシー暗号化スナップショットの作成、ルームキー 復元移行状態、インポート、ソース削除は、すべて Doctor が担います。
  • Matrix のランタイム移行バレルは削除されました。レガシー状態/暗号化の検出および 変更ヘルパーは、ランタイム API サーフェスの一部ではなく、Matrix Doctor によって直接インポートされます。
  • Matrix 移行スナップショットの再利用マーカーは、matrix/migration-snapshot.json の代わりに SQLite Plugin 状態へ保存されるようになりました。Doctor はサイドカー状態ファイルを書き込まずに、 同じ検証済み移行前アーカイブを引き続き再利用できます。
  • Nostr のバスカーソルおよびプロファイル公開状態は、共有 SQLite Plugin 状態を使用するようになりました。これらのレガシー JSON インポート計画は、Nostr Plugin のセットアップ/Doctor 移行サーフェスにあります。
  • Active Memory のセッショントグルは、session-toggles.json の代わりに 共有 SQLite Plugin 状態を使用するようになりました。メモリを再度オンにすると、JSON オブジェクトを書き換える代わりに 行を削除します。
  • Skill Workshop の提案およびレビューカウンターは、ワークスペースごとの skill-workshop/<workspace>.json ストアの代わりに、共有 SQLite Plugin 状態を使用するようになりました。各 提案は skill-workshop/proposals 配下の個別行であり、レビュー カウンターは skill-workshop/reviews 配下の個別行です。
  • Skill Workshop のレビュアーサブエージェント実行は、skill-workshop/<sessionId>.json サイドカーセッション パスを作成する代わりに、ランタイムのセッショントランスクリプトリゾルバーを使用するようになりました。
  • ACPX プロセスリースは、ファイル全体の process-leases.json レジストリの代わりに、 acpx/process-leases 配下の共有 SQLite Plugin 状態を使用するようになりました。 各リースは個別の行として保存され、ランタイムで JSON を書き換えるパスを設けずに、 起動時の古いプロセス回収を維持します。
  • ACPX ラッパースクリプトおよび分離された Codex ホームは、 OpenClaw の一時ルート内に生成されます。必要に応じて再作成され、 バックアップまたは移行の入力にはなりません。
  • サブエージェント実行レジストリの永続化は、型付き共有 subagent_runs 行を使用します。 旧 subagents/runs.json パスは、Doctor のクリーンアップ入力としてのみ使用されるようになりました。Doctor は 状態メンテナンスロックの下でこれを取得し、破棄の決定を SQLite に記録して、 一時的な実行状態をインポートせずに削除します。ランタイムの JSON リーダー、ライター、キャッシュ、フォールバックは一切残っていません。この廃止境界では、ファイルのみに存在する 実行中処理のバージョン間復旧を意図的にサポートしません。 ランタイムテストでは、レジストリ動作を検証するために無効または空の runs.json フィクスチャを 作成しなくなり、SQLite 行を直接シードして読み取ります。
  • バックアップは、アーカイブ前に状態ディレクトリをステージングし、データベース以外のファイルをコピーし、 オンラインバックアップとオフライン VACUUM を使用してデータベースのスナップショットを作成し、稼働中の WAL/SHM サイドカーを除外して、 スナップショットメタデータをアーカイブマニフェストに記録し、完了したバックアップ実行を アーカイブマニフェストとともに SQLite に記録します。openclaw backup create は書き込まれたアーカイブをデフォルトで検証し、--no-verify は 明示的な高速パスです。
  • openclaw backup restore は展開前にアーカイブを検証し、 検証ツールの正規化済みマニフェストを再利用して、検証済みマニフェストアセットを記録された ソースパスへ復元します。書き込みには --yes が必要で、復元計画には --dry-run を サポートします。
  • 旧バックアップの揮発性パスフィルターは削除されました。アーカイブ作成前に SQLite スナップショットをステージングするため、バックアップではレガシーセッションまたは Cron の JSON/JSONL ファイル向けの ライブ tar 除外リストが不要になりました。
  • 通常のセットアップおよびオンボーディング用ワークスペースの準備では、 agents/<agentId>/sessions/ ディレクトリが作成されなくなりました。作成されるのは設定とワークスペースのみです。 SQLite のセッション行とトランスクリプト行は、エージェントごとのデータベース内に 必要に応じて作成されます。
  • セキュリティ権限の修復対象は、sessions.json およびトランスクリプトの JSONL ファイルではなく、グローバルおよびエージェントごとの SQLite データベースと WAL/SHM サイドカーになりました。
  • サンドボックスレジストリのランタイム名は、アクティブストアにレガシー JSON レジストリの用語を引き継ぐのではなく、SQLite レジストリの種類を直接表すようになりました。
  • openclaw reset --scope config+creds+sessions は、レガシーの sessions/ ディレクトリだけでなく、エージェントごとの openclaw-agent.sqlite データベースと WAL/SHM サイドカーも削除します。
  • Gateway の集約セッションヘルパーでは、エントリ指向の名前を使用するようになりました。 loadCombinedSessionEntriesForGateway{ databasePath, entries } を返します。 以前の複合ストアの命名はランタイムの呼び出し元から削除されました。
  • Docker MCP チャンネルのシード処理では、sessions.json と JSONL トランスクリプトを作成する代わりに、メインセッション行とトランスクリプトイベントを エージェントごとの SQLite データベースへ書き込むようになりました。
  • 同梱の session-memory フックは、{agentId, sessionId} に基づいて SQLite から前回のセッションコンテキストを解決するようになりました。トランスクリプトのパスや workspace/sessions ディレクトリの走査、保存、合成は行われなくなりました。
  • 同梱の command-logger フックは、logs/commands.log に追記する代わりに、 共有 SQLite の command_log_entries テーブルへコマンド監査行を書き込むようになりました。
  • チャンネルペアリングの許可リストがランタイムで公開するのは、SQLite ベースの読み書きヘルパーのみになりました。非推奨の Plugin SDK パスリゾルバーは 移行互換性のために残されています。ファイルリーダーは doctor の状態移行コードにのみ存在します。
  • migration_runs は、レガシー状態の移行実行をステータス、 タイムスタンプ、JSON レポートとともに記録します。
  • migration_sources は、インポートされた各レガシーファイルのソースについて、ハッシュ、サイズ、 レコード数、対象テーブル、実行 ID、ステータス、ソース削除状態を記録します。
  • backup_runs は、バックアップアーカイブのパス、ステータス、JSON マニフェストを記録します。
  • グローバルスキーマには、未使用の agents レジストリテーブルは保持されません。ランタイムに 実際のエージェントレコード所有者が存在するようになるまでは、エージェントデータベースの検出が正規の agent_databases レジストリです。
  • 生成されたモデルカタログ設定は、エージェントディレクトリをキーとする型付きグローバル SQLite agent_model_catalogs 行に保存されます。ランタイムの呼び出し元は ensureOpenClawModelCatalog を使用します。ランタイムコードには models.json 互換 API はありません。実装は SQLite に書き込み、 models.json ファイルを作成せずに、保存されたペイロードから組み込み PI レジストリを ハイドレートします。
  • オプションの memory.qmd.sessions エクスポートは、エージェントごとのデータベースから 正規のトランスクリプト行を読み取り、明示的な QMD 入力アーティファクトとして、サニタイズ済みの Markdown を QMD ホーム配下に実体化します。したがって、QMD セッションコレクションとアーティファクトの ID マッピングは、設定された外部ツールブリッジの一部であり続けます。これらは第 2 の正規トランスクリプトストアではありません。
  • QMD 自身の index.sqlite、YAML コレクション設定、モデルのダウンロードは、 引き続き ~/.openclaw/agents/<agentId>/qmd 配下の外部ツールアーティファクトであり、 plugin_blob_entries にはミラーリングされません。OpenClaw が所有する QMD の調整は データベース優先です。共有 state_leases は埋め込み処理をグローバルに直列化し、エージェントごとの state_leases はコレクション、更新、埋め込みの書き込み処理を直列化します。ランタイムは QMD ロックサイドカーを作成しません。
  • オプションの memory-lancedb Plugin は、 暗黙的な OpenClaw 管理ストアとして ~/.openclaw/memory/lancedb を作成しなくなりました。これは 外部の LanceDB バックエンドであり、オペレーターが明示的な dbPath を設定するまで無効のままです。
  • check:database-first-legacy-stores は、レガシーストア名と書き込み系ファイルシステム API を 組み合わせる新しいランタイムソースを失敗させます。また、廃止されたトランスクリプトブリッジマーカー transcriptLocator または sqlite-transcript://... を再導入するランタイムソースも失敗させます。 移行、doctor、インポート、明示的な非セッションエクスポートのコードは引き続き許可されます。 sessionFilestorePath、旧 SessionManager ファイル時代の ファサードなど、より広範なレガシー契約名には現在も所有者が存在するため、 必須の事前チェックにできるようになるまでに、個別の移行ガード作業が必要です。このガードは現在、 ランタイムの cache/*.json ストア、汎用 thread-bindings.json サイドカー、Cron の状態および実行ログ JSON、設定健全性 JSON、 再起動およびロックサイドカー、Voice Wake 設定、Plugin バインディング承認、 インストール済み Plugin インデックス JSON、File Transfer 監査 JSONL、Memory Wiki アクティビティ ログ、旧同梱 command-logger テキストログ、pi-mono の生ストリーム JSONL 診断設定も対象とします。また、互換性コードを src/commands/doctor/ 配下に限定するため、 旧ルートレベルの doctor レガシーモジュール名も禁止します。Android のデバッグハンドラーも、 camera_debug.log または debug_logs.txt キャッシュファイルを一時配置する代わりに、 logcat またはメモリ内出力を使用します。

対象スキーマの構成

スキーマは明示的に保ちます。ホスト所有のランタイム状態には型付きテーブルを使用します。Plugin 所有の 不透明な状態には plugin_state_entries / plugin_blob_entries を使用し、 汎用ホスト kv テーブルは使用しません。

グローバルデータベース:

text
state_leases(scope, lease_key, owner, expires_at, heartbeat_at, payload_json, created_at, updated_at)exec_approvals_config(config_key, raw_json, socket_path, has_socket_token, default_security, default_ask, default_ask_fallback, auto_allow_skills, agent_count, allowlist_count, updated_at_ms)schema_meta(meta_key, role, schema_version, agent_id, app_version, created_at, updated_at)agent_databases(agent_id, path, schema_version, last_seen_at, size_bytes)task_runs(...)task_delivery_state(...)flow_runs(...)subagent_runs(run_id, child_session_key, requester_session_key, controller_session_key, created_at, ended_at, cleanup_handled, payload_json)current_conversation_bindings(binding_key, binding_id, target_agent_id, target_session_id, target_session_key, channel, account_id, conversation_kind, parent_conversation_id, conversation_id, target_kind, status, bound_at, expires_at, metadata_json, updated_at)plugin_binding_approvals(plugin_root, channel, account_id, plugin_id, plugin_name, approved_at)tui_last_sessions(scope_key, session_key, updated_at)plugin_state_entries(plugin_id, namespace, entry_key, value_json, created_at, expires_at)plugin_blob_entries(plugin_id, namespace, entry_key, metadata_json, blob, created_at, expires_at)media_blobs(subdir, id, content_type, size_bytes, blob, created_at, updated_at)skill_uploads(upload_id, kind, slug, force, size_bytes, sha256, actual_sha256, received_bytes, archive_blob, created_at, expires_at, committed, committed_at, idempotency_key_hash)skill_upload_chunks(upload_id, byte_offset, size_bytes, chunk_blob)web_push_subscriptions(endpoint_hash, subscription_id, endpoint, p256dh, auth, created_at_ms, updated_at_ms)web_push_vapid_keys(key_id, public_key, private_key, subject, updated_at_ms)apns_registrations(node_id, transport, token, relay_handle, send_grant, installation_id, relay_origin, topic, environment, distribution, token_debug_suffix, updated_at_ms)apns_registration_tombstones(node_id, deleted_at_ms)node_host_config(config_key, version, node_id, token, display_name, gateway_host, gateway_port, gateway_tls, gateway_tls_fingerprint, gateway_context_path, updated_at_ms)device_identities(identity_key, device_id, public_key_pem, private_key_pem, created_at_ms, updated_at_ms)device_auth_tokens(device_id, role, token, scopes_json, updated_at_ms)macos_port_guardian_records(pid, port, command, mode, timestamp)workspace_setup_state(workspace_key, workspace_path, version, bootstrap_seeded_at, setup_completed_at, updated_at)workspace_path_aliases(alias_key, alias_path, workspace_key, workspace_path, updated_at_ms)workspace_attestations(workspace_key, attested_at_ms, updated_at_ms)workspace_generated_bootstrap_hashes(workspace_key, filename, sha256)native_hook_relay_bridges(relay_id, pid, hostname, port, token, expires_at_ms, updated_at_ms)model_capability_cache(provider_id, model_id, name, input_text, input_image, reasoning, supports_tools, context_window, max_tokens, cost_input, cost_output, cost_cache_read, cost_cache_write, updated_at_ms)agent_model_catalogs(catalog_key, agent_dir, raw_json, updated_at)managed_outgoing_image_records(attachment_id, session_key, agent_id, message_id, created_at, updated_at, retention_class, alt, original_media_id, original_media_subdir, original_content_type, original_width, original_height, original_size_bytes, original_filename, record_json, cleanup_pending)gateway_restart_sentinel(sentinel_key, version, kind, status, ts, session_key, thread_id, delivery_channel, delivery_to, delivery_account_id, message, continuation_json, doctor_hint, stats_json, payload_json, updated_at_ms)channel_pairing_requests(channel_key, account_id, request_id, code, created_at, last_seen_at, meta_json)channel_pairing_allow_entries(channel_key, account_id, entry, sort_order, updated_at)voicewake_triggers(config_key, position, trigger, updated_at_ms)voicewake_routing_config(config_key, version, default_target_mode, default_target_agent_id, default_target_session_key, updated_at_ms)voicewake_routing_routes(config_key, position, trigger, target_mode, target_agent_id, target_session_key, updated_at_ms)update_check_state(state_key, last_checked_at, last_notified_version, last_notified_tag, last_available_version, last_available_tag, auto_install_id, auto_first_seen_version, auto_first_seen_tag, auto_first_seen_at, auto_last_attempt_version, auto_last_attempt_at, auto_last_success_version, auto_last_success_at, updated_at_ms)config_health_entries(config_path, last_known_good_json, last_promoted_good_json, last_observed_suspicious_signature, updated_at_ms)sandbox_registry_entries(registry_kind, container_name, session_key, backend_id, runtime_label, image, created_at_ms, last_used_at_ms, config_label_kind, config_hash, cdp_port, no_vnc_port, entry_json, updated_at)cron_jobs(store_key, job_id, name, description, enabled, delete_after_run, created_at_ms, agent_id, session_key, schedule_kind, schedule_expr, schedule_tz, every_ms, anchor_ms, at, stagger_ms, session_target, wake_mode, payload_kind, payload_message, payload_model, payload_fallbacks_json, payload_thinking, payload_timeout_seconds, payload_allow_unsafe_external_content, payload_external_content_source_json, payload_light_context, payload_tools_allow_json, delivery_mode, delivery_channel, delivery_to, delivery_thread_id, delivery_account_id, delivery_best_effort, failure_delivery_mode, failure_delivery_channel, failure_delivery_to, failure_delivery_account_id, failure_alert_disabled, failure_alert_after, failure_alert_channel, failure_alert_to, failure_alert_cooldown_ms, failure_alert_include_skipped, failure_alert_mode, failure_alert_account_id, next_run_at_ms, running_at_ms, last_run_at_ms, last_run_status, last_error, last_duration_ms, consecutive_errors, consecutive_skipped, schedule_error_count, last_delivery_status, last_delivery_error, last_delivered, last_failure_alert_at_ms, job_json, state_json, runtime_updated_at_ms, schedule_identity, sort_order, updated_at)delivery_queue_entries(queue_name, id, status, entry_kind, session_key, channel, target, account_id, retry_count, last_attempt_at, last_error, recovery_state, platform_send_started_at, entry_json, enqueued_at, updated_at, failed_at)commitments(id, agent_id, session_key, channel, account_id, recipient_id, thread_id, sender_id, kind, sensitivity, source, status, reason, suggested_text, dedupe_key, confidence, due_earliest_ms, due_latest_ms, due_timezone, source_message_id, source_run_id, created_at_ms, updated_at_ms, attempts, last_attempt_at_ms, sent_at_ms, dismissed_at_ms, snoozed_until_ms, expired_at_ms, record_json)migration_runs(id, started_at, finished_at, status, report_json)migration_sources(source_key, migration_kind, source_path, target_table, source_sha256, source_size_bytes, source_record_count, last_run_id, status, imported_at, removed_source, report_json)backup_runs(id, created_at, archive_path, status, manifest_json)

エージェントデータベース:

text
schema_meta(meta_key, role, schema_version, agent_id, app_version, created_at, updated_at)sessions(session_id, session_key, session_scope, created_at, updated_at, started_at, ended_at, status, chat_type, channel, account_id, primary_conversation_id, model_provider, model, agent_harness_id, parent_session_key, spawned_by, display_name)conversations(conversation_id, channel, account_id, kind, peer_id, parent_conversation_id, thread_id, native_channel_id, native_direct_user_id, label, metadata_json, created_at, updated_at)session_conversations(session_id, conversation_id, role, first_seen_at, last_seen_at)session_routes(session_key, session_id, updated_at)session_entries(session_id, session_key, entry_json, updated_at)transcript_events(session_id, seq, event_json, created_at)transcript_event_identities(session_id, event_id, seq, event_type, has_parent, parent_id, message_idempotency_key, created_at)transcript_snapshots(session_id, snapshot_id, reason, event_count, created_at, metadata_json)vfs_entries(namespace, path, kind, content_blob, metadata_json, updated_at)tool_artifacts(run_id, artifact_id, kind, metadata_json, blob, created_at)run_artifacts(run_id, path, kind, metadata_json, blob, created_at)trajectory_runtime_events(session_id, run_id, seq, event_json, created_at)memory_index_meta(key, value)memory_index_sources(id, path, source, hash, mtime, size)memory_index_chunks(id, path, source, start_line, end_line, hash, model, text, embedding, updated_at)memory_embedding_cache(provider, model, provider_key, hash, embedding, dims, updated_at)memory_index_state(id, revision)cache_entries(scope, key, value_json, blob, expires_at, updated_at)

memory_index_sources.id は安定した整数の主キーであり、(path, source) は一意のままです。

将来の検索機能では、正規イベントテーブルを変更せずに FTS テーブルを追加できます。

text
transcript_events_fts(session_id, seq, text)vfs_entries_fts(namespace, path, text)

大きな値には JSON 文字列エンコーディングではなく、blob カラムを使用する必要があります。 プレーンな SQLite ツールで確認可能な状態を維持する必要がある小さな構造化データには、 value_json を使用します。

agent_databases はこのブランチの正規レジストリです。実際のエージェントレコード所有者が存在するまでは、 agents テーブルを追加しないでください。エージェント設定は引き続き openclaw.json に保持します。

Doctor の移行構成

Doctor は、報告可能で再実行しても安全な、明示的な移行ステップを 1 つ呼び出す必要があります。

bash
openclaw doctor --fix

openclaw doctor --fix は通常の設定事前チェック後に状態移行の実装を呼び出し、 インポート前に検証済みバックアップを作成します。ランタイム起動と openclaw migrate は、従来の OpenClaw 状態ファイルをインポートしてはなりません。

移行の特性:

  • 1 回の移行処理で従来のファイルソースをすべて検出し、何かを変更する前に 計画を生成します。
  • Doctor は従来のファイルをインポートする前に、検証済みの移行前バックアップアーカイブを 作成します。
  • インポートは冪等であり、ソースパス、mtime、サイズ、ハッシュ、および対象 テーブルをキーとします。
  • 正常に処理されたソースファイルは、対象データベースのコミット後に削除または アーカイブされます。
  • インポートに失敗した場合、ソースは変更せず、 migration_runs に警告を記録します。
  • 移行が存在するようになった後、ランタイムコードは SQLite のみを読み取ります。
  • ダウングレードまたはランタイムファイルへのエクスポート経路は不要です。

移行対象一覧

以下をグローバルデータベースに移動します。

  • タスクレジストリのランタイム書き込みは共有データベースを使用するようになり、未リリースの tasks/runs.sqlite サイドカーインポーターは削除されました。スナップショット保存ではタスク id によって upsert し、存在しないタスク/配信行のみを削除します。
  • Task Flow のランタイム書き込みは共有データベースを使用するようになり、未リリースの tasks/flows/registry.sqlite サイドカーインポーターは削除されました。スナップショット保存では フロー id によって upsert し、存在しないフロー行のみを削除します。
  • Plugin 状態のランタイム書き込みは共有データベースを使用するようになり、未リリースの plugin-state/state.sqlite サイドカーインポーターは削除されました。
  • 組み込みメモリ検索では memory/<agentId>.sqlite がデフォルトではなくなりました。その インデックステーブルは所有元のエージェントデータベースに配置され、明示的な memorySearch.store.path サイドカーのオプトインは doctor の設定 移行へ移されました。
  • 組み込みメモリの再インデックスは、エージェントデータベース内のメモリ所有テーブルのみをリセットします。 同じデータベースがセッション、トランスクリプト、VFS 行、アーティファクト、ランタイムキャッシュも 所有しているため、SQLite ファイル全体を置き換えてはなりません。
  • モノリシックおよびシャーディングされた JSON からのサンドボックスコンテナ/ブラウザレジストリ。ランタイム 書き込みは共有データベースを使用するようになりました。レガシー JSON のインポートは維持されます。
  • Cron ジョブ定義、スケジュール状態、実行履歴は共有 SQLite を使用するようになりました。 doctor はレガシーの jobs.jsonjobs-state.json、および cron/runs/*.jsonl ファイルをインポートして削除します
  • デバイスのアイデンティティ/認証、プッシュ、更新チェック、コミットメント、OpenRouter モデル キャッシュ、インストール済み Plugin インデックス、およびアプリサーバーのバインディング
  • デバイス/Node のペアリングおよびブートストラップレコードは、型付き SQLite テーブルを使用するようになりました
  • デバイスペア通知のサブスクライバーと配信済みリクエストのマーカーは、 device-pair-notify.json の代わりに共有 SQLite Plugin 状態テーブルを使用するようになりました。
  • 音声通話の通話レコードは、calls.jsonl の代わりに voice-call / calls 名前空間配下の共有 SQLite Plugin 状態テーブルを 使用するようになりました。Plugin CLI は SQLite に保存された通話履歴を追尾し、要約します。
  • QQBot Gateway セッション、既知ユーザーレコード、ref-index 引用キャッシュは、 session-*.jsonknown-users.json、および ref-index.jsonl の代わりに、 qqbot 名前空間(gateway-sessionsknown-usersref-index)配下の SQLite Plugin 状態を使用するようになりました。 これらのレガシーファイルはキャッシュであり、移行されません。
  • Discord のモデル選択設定、コマンドデプロイハッシュ、スレッドバインディングは、 model-picker-preferences.jsoncommand-deploy-cache.json、および thread-bindings.json の代わりに、discord 名前空間 (model-picker-preferencescommand-deploy-hashesthread-bindings) 配下の SQLite Plugin 状態を使用するようになりました。Discord の doctor/セットアップ移行は レガシーファイルをインポートして削除します。
  • BlueBubbles のキャッチアップカーソルと受信重複排除マーカーは、 bluebubbles/catchup/*.json および bluebubbles/inbound-dedupe/*.json の代わりに、bluebubbles 名前空間(catchup-cursorsinbound-dedupe) 配下の SQLite Plugin 状態を使用するようになりました。BlueBubbles の doctor/セットアップ移行は レガシーファイルをインポートして削除します。
  • Telegram の更新オフセット、ステッカーキャッシュエントリ、返信チェーンメッセージキャッシュ エントリ、送信済みメッセージキャッシュエントリ、トピック名キャッシュエントリ、およびスレッド バインディングは、update-offset-*.jsonsticker-cache.json*.telegram-messages.json*.telegram-sent-messages.json*.telegram-topic-names.json、および thread-bindings-*.json の代わりに、telegram 名前空間 (update-offsetssticker-cachemessage-cachesent-messagestopic-namesthread-bindings)配下の SQLite Plugin 状態を使用するようになりました。 Telegram の doctor/セットアップ移行はレガシーファイルをインポートして 削除します。
  • iMessage のキャッチアップカーソル、返信短縮 id マッピング、送信エコー重複排除行は、 imessage/catchup/*.jsonimessage/reply-cache.jsonl、および imessage/sent-echoes.jsonl の代わりに、 imessage 名前空間(catchup-cursorsreply-cachesent-echoes)配下の SQLite Plugin 状態を使用するようになりました。 iMessage の doctor/セットアップ移行はレガシーファイルをインポートして削除します。
  • Microsoft Teams の会話、投票、SSO トークン、およびフィードバック学習は、 msteams-conversations.jsonmsteams-polls.jsonmsteams-sso-tokens.json、および *.learnings.json の代わりに、SQLite Plugin 状態名前空間(conversationspollssso-tokensfeedback-learnings)を使用するようになりました。 Microsoft Teams の doctor/セットアップ移行はレガシーファイルをインポートしてアーカイブします。 保留中のアップロードは短命な SQLite キャッシュであり、古い JSON キャッシュファイルは 移行されません。
  • Matrix の同期キャッシュ、ストレージメタデータ、スレッドバインディング、受信重複排除マーカー、 起動時検証のクールダウン状態、認証情報、リカバリーキー、および SDK の IndexedDB 暗号化スナップショットは、bot-storage.jsonstorage-meta.jsonthread-bindings.jsoninbound-dedupe.jsonstartup-verification.jsoncredentials.jsonrecovery-key.json、および crypto-idb-snapshot.json の代わりに、 matrix 配下の SQLite Plugin 状態/blob 名前空間 (sync-storestorage-metathread-bindings、 コアの取得可能な重複排除を介する matrix.inbound-dedupe.*startup-verificationcredentialsrecovery-keyidb-snapshots) を使用するようになりました。Matrix の doctor/セットアップ移行は、アカウントスコープの Matrix ストレージルートから、これらのレガシーファイル(および廃止されたルートごとの inbound-dedupe SQLite 行)をインポートして削除します。
  • Nostr バスカーソルとプロファイル公開状態は、bus-state-*.json および profile-state-*.json の代わりに、nostr 名前空間 (bus-stateprofile-state)配下の SQLite Plugin 状態を使用するようになりました。 Nostr の doctor/セットアップ移行はレガシーファイルをインポートして削除します。
  • Active Memory のセッショントグルは、session-toggles.json の代わりに active-memory/session-toggles 配下の SQLite Plugin 状態を使用するようになりました。
  • Skill Workshop の提案キューとレビューカウンターは、ワークスペースごとの skill-workshop/<workspace>.json ファイルの代わりに、skill-workshop/proposals および skill-workshop/reviews 配下の SQLite Plugin 状態を使用するようになりました。
  • 送信配信キューとセッション配信キューは、永続的な delivery-queue/*.jsondelivery-queue/failed/*.json、および session-delivery-queue/*.json ファイルの代わりに、個別のキュー名 (outbound-deliverysession-delivery)を使用してグローバル SQLite delivery_queue_entries テーブルを共有するようになりました。doctor のレガシー状態ステップは 保留中および失敗した行をインポートし、古い配信済みマーカーを削除し、インポート後に古い JSON ファイルを削除します。ホットルーティングおよび再試行フィールドは型付き列です。 JSON ペイロードは再生/デバッグ専用としてのみ保持されます。
  • ACPX プロセスリースは、process-leases.json の代わりに acpx/process-leases 配下の SQLite Plugin 状態を使用するようになりました。
  • バックアップおよび移行実行メタデータ

これらをエージェントデータベースへ移動します。

  • エージェントセッションルートおよび互換形状のセッションエントリペイロード。ランタイム書き込みについては 完了済みです。ホットセッションメタデータは sessions でクエリ可能であり、 レガシー形状の完全な SessionEntry ペイロードは session_entries に残ります。
  • エージェントトランスクリプトイベント。ランタイム書き込みについては完了済みです。
  • Compaction チェックポイントおよびトランスクリプトスナップショット。ランタイム書き込みについては完了済みです。 チェックポイントのトランスクリプトコピーは SQLite トランスクリプト行であり、チェックポイント メタデータは transcript_snapshots に記録されます。Gateway のチェックポイントヘルパーでは、 これらの値をソースファイルではなくトランスクリプトスナップショットと呼ぶようになりました。
  • エージェント VFS のスクラッチ/ワークスペース名前空間。ランタイム VFS 書き込みについては完了済みです。
  • サブエージェントの添付ペイロード。ランタイム書き込みについては完了済みです。これらは SQLite VFS シードエントリであり、永続的なワークスペースファイルにはなりません。
  • ツールアーティファクト。ランタイム書き込みについては完了済みです。
  • 実行アーティファクト。エージェントごとの run_artifacts テーブルを介したワーカーランタイム書き込みについては完了済みです。
  • エージェントローカルのランタイムキャッシュ。エージェントごとの cache_entries テーブルを介した ワーカーランタイムスコープのキャッシュ書き込みについては完了済みです。Gateway 全体のモデルキャッシュは、 エージェント固有になるまではグローバルデータベースに残ります。
  • ACP 親ストリームログ。ランタイム書き込みについては完了済みです。
  • ACP 再生台帳セッション。acp_replay_sessions および acp_replay_events を介したランタイム書き込みについては完了済みです。レガシーの acp/event-ledger.json は doctor の入力としてのみ残ります。
  • ACP セッションメタデータ。acp_sessions を介したランタイム書き込みについては完了済みです。 sessions.json 内のレガシー entry.acp ブロックは、doctor の移行入力としてのみ使用されます。
  • 明示的なエクスポートファイルではない場合の軌跡サイドカー。ランタイム書き込みについては完了済みです。 軌跡キャプチャはエージェントデータベースの trajectory_runtime_events 行を書き込み、 実行スコープのアーティファクトを SQLite にミラーリングします。レガシーサイドカーは doctor の インポート入力としてのみ使用されます。エクスポートでは新しい JSONL サポートバンドル出力を 実体化できますが、ランタイムでは古い軌跡/トランスクリプトサイドカーを読み取ったり移行したりしません。 ランタイム軌跡キャプチャは SQLite スコープを公開します。JSONL パスヘルパーは エクスポート/デバッグサポートに分離され、ランタイムモジュールから再エクスポートされません。 組み込みランナーの軌跡メタデータは、トランスクリプトロケーターを永続化する代わりに {agentId, sessionId, sessionKey} アイデンティティを記録します。

以下は当面ファイルベースのまま維持します。

  • openclaw.json
  • プロバイダーまたは CLI の認証情報ファイル
  • Plugin/パッケージマニフェスト
  • ディスクモードが選択されている場合のユーザーワークスペースおよび Git リポジトリ
  • 特定のログサーフェスを移動する場合を除き、オペレーターによる追尾を目的としたログ

移行計画

フェーズ 0: 境界を固定する

さらに行を移動する前に、永続状態の境界を明確にします。

  • グローバルデータベースに migration_runs テーブルを追加します。 レガシー状態移行の実行レポートについては完了済みです。
  • ファイルからデータベースへのインポート用に、doctor が所有する単一の状態移行サービスを追加します。 完了済みです。openclaw doctor --fix はレガシー状態移行の実装を使用します。
  • plan を読み取り専用にし、apply でバックアップの作成、インポート、検証を行った後、 古いファイルを削除または隔離するようにします。 完了済みです。doctor は検証済みの移行前バックアップを作成し、そのバックアップパスを migration_runs に渡して、インポーター/削除パスを再利用します。
  • 静的禁止ルールを追加し、移行コードとテストではレガシー状態ファイルのシード/読み取りを 引き続き許可しつつ、新しいランタイムコードがそれらを書き込めないようにします。 現在移行済みのレガシーストアについては完了済みです。このガードは、禁止されたランタイム トランスクリプトロケーター契約についてネストされたテストもスキャンします。

フェーズ 1: グローバル制御プレーンを完了する

共有の調整状態を state/openclaw.sqlite に保持します。

  • エージェントおよびエージェントデータベースレジストリ
  • タスクおよび Task Flow 台帳
  • Plugin 状態
  • サンドボックスコンテナ/ブラウザレジストリ
  • Cron/スケジューラーの実行履歴
  • ペアリング、デバイス、プッシュ、更新チェック、TUI、OpenRouter/モデルキャッシュ、およびその他の 小規模な Gateway スコープのランタイム状態
  • バックアップおよび移行メタデータ
  • Gateway メディア添付のバイトデータ。ランタイム書き込みについては完了済みです。直接ファイルパスは、 チャネル送信元およびサンドボックスステージングとの互換性を確保するための一時的な実体化です。 ランタイム許可リストはレガシーの状態/設定メディアルートではなく、SQLite の実体化パスを受け入れます。 doctor はレガシーメディアファイルを media_blobs にインポートし、行の書き込みに成功した後で ソースファイルを削除します。
  • デバッグプロキシのキャプチャセッション、イベント、およびペイロード blob。完了済みです。キャプチャは 共有状態 DB に保存され、共有状態 DB のブートストラップ、スキーマ、WAL、および busy-timeout 設定を介して開かれます。ペイロードのバイトデータは capture_blobs.data で gzip 圧縮されます。デバッグプロキシランタイム専用のサイドカー DB オーバーライド、 blob ディレクトリ、またはプロキシキャプチャ専用の生成スキーマ/codegen ターゲットはありません。 doctor/起動時移行は、アクティブなレガシー DB/blob 環境 オーバーライドを含む、リリース済みの debug-proxy/capture.sqlite 行と参照先ペイロード blob をインポートし、 CA 証明書を維持したまま、それらのソースをアーカイブします。

このフェーズでは、これらのサブシステムから、重複するサイドカーのオープナー、権限ヘルパー、WAL セットアップ、ファイルシステムのプルーニング、互換性維持用ライターも削除します。

フェーズ 2:エージェント単位のデータベースを導入する

エージェントごとに 1 つのデータベースを作成し、グローバル DB から登録します。

text
~/.openclaw/state/openclaw.sqlite~/.openclaw/agents/<agentId>/agent/openclaw-agent.sqlite

グローバルの agent_databases 行には、パス、スキーマバージョン、最終確認 タイムスタンプ、基本的なサイズおよび整合性メタデータを格納します。ランタイムコードは、 ファイルパスを直接導出する代わりに、レジストリへエージェント DB を問い合わせます。

エージェント DB が所有するもの:

  • sessions は正規のセッションルートであり、session_entries はそのルートに 紐付けられた互換形式のペイロードテーブル、session_routes は一意のアクティブな session_key ルックアップ
  • conversationssession_conversations は、セッションに紐付けられた正規化済みのプロバイダー ルーティング ID
  • transcript_events
  • トランスクリプトのスナップショットと Compaction チェックポイント。ランタイム書き込みについては完了。
  • vfs_entries
  • tool_artifacts と実行アーティファクト
  • エージェントローカルのランタイム/キャッシュ行。ワーカースコープのキャッシュについては完了。
  • ACP 親ストリームイベント
  • 明示的なエクスポートアーティファクトでない場合の軌跡ランタイムイベント

フェーズ 3:セッションストア API を置き換える

ランタイムについては完了。ファイル形式のセッションストアサーフェスは、アクティブな ランタイム契約ではありません。

  • ランタイムは loadSessionStore(storePath) を呼び出さず、storePath を セッション ID として扱わなくなりました。
  • ランタイムの行操作は getSessionEntryupsertSessionEntrypatchSessionEntrydeleteSessionEntrylistSessionEntries です。
  • ストア全体の再書き込みヘルパー、ファイルライター、キューテスト、エイリアスのプルーニング、 およびレガシーキー削除パラメータは、ランタイムから削除されました。
  • 非推奨のルートパッケージ互換エクスポートは、2026-10-12 まで doctor 専用の sessions.json インポーターへ委譲します。Plugin SDK の互換読み取りでは、 正規の SQLite 行を引き続き投影します。
  • sessions.json の解析は、doctor の移行/インポートコードと doctor テストにのみ残ります。
  • ランタイムのライフサイクルフォールバックは、JSONL の先頭行ではなく、 SQLite のトランスクリプトヘッダーを読み取ります。

ファイルロックのパラメータ、ファイルメンテナンスとしての プルーニング/切り詰めに関する用語、ストアパスによる ID、または JSON 永続化だけを 検証するテストを再導入するものは、引き続き削除してください。

フェーズ 4:トランスクリプト、ACP ストリーム、軌跡、VFS を移行する

すべてのエージェントデータストリームをデータベースネイティブにします。

  • トランスクリプトの追記書き込みは、セッションヘッダーを保証し、 メッセージの冪等性を確認し、親の末尾を選択し、transcript_events に挿入して、 クエリ可能な ID メタデータを transcript_event_identities に記録する、1 つの SQLite トランザクションを介して行います。トランスクリプトメッセージの直接追記と、 通常の永続化された TranscriptSessionManager の追記については完了しています。明示的なブランチ 操作では、明示的な親の選択を維持し、ファイルロケーターを導出せずに SQLite 行へ引き続き書き込みます。
  • ACP 親ストリームログは、.acp-stream.jsonl ファイルではなく行になります。完了。
  • ACP のスポーンセットアップでは、トランスクリプトの JSONL パスを永続化しなくなりました。完了。
  • ランタイムの軌跡キャプチャは、イベント行/アーティファクトを直接書き込みます。明示的な サポート/エクスポートコマンドでは、エクスポート形式としてサポートバンドルの JSONL アーティファクトを引き続き生成できますが、セッションエクスポートでセッション JSONL を再作成することはありません。完了。
  • ディスクワークスペースは、ディスクモードとして構成されている場合、ディスク上に残ります。
  • VFS スクラッチおよび実験的な VFS 専用ワークスペースモードでは、エージェント DB を使用します。

移行では古い JSONL ファイルを一度だけインポートし、件数/ハッシュを migration_runs に記録し、整合性チェック後にインポート済みファイルを削除します。

フェーズ 5:バックアップ、復元、Vacuum、検証

バックアップは 1 つのアーカイブファイルのままとします。

  • すべてのグローバルおよびエージェントデータベースをチェックポイントします。
  • SQLite オンラインバックアップの後にオフラインの VACUUM を実行して、各 DB のスナップショットを作成します。
  • 圧縮された DB スナップショット、設定、外部認証情報、および要求された ワークスペースエクスポートをアーカイブします。
  • 生の稼働中の *.sqlite-wal および *.sqlite-shm ファイルは除外します。
  • 各 DB スナップショットを開いて PRAGMA integrity_check を実行することで検証します。 openclaw backup create はデフォルトでこのアーカイブ検証を行います。 --no-verify がスキップするのは書き込み後のアーカイブ処理だけであり、スナップショット 作成時の整合性チェックではありません。
  • 復元では、スナップショットを対象パスへコピーして戻します。復元されたグローバル DB は バージョン 1 を使用し、復元されたエージェント単位の DB はバージョン 2 を使用します。バージョン 1 のスナップショットは、 開かれたときにアトミックにアップグレードされます。

フェーズ 6:ワーカーランタイム

データベース分割の導入中は、ワーカーモードを実験的なものとして維持します。

  • ワーカーは、エージェント ID、実行 ID、ファイルシステムモード、DB レジストリ ID を受け取ります。
  • 各ワーカーは独自の SQLite 接続を開きます。
  • 親は、チャネル配信、承認、設定、キャンセル権限を保持します。
  • アクティブな実行ごとに 1 つのワーカーから開始し、ライフサイクルと DB 接続の所有権が安定してからのみプーリングを追加します。

フェーズ 7:旧世界を削除する

ランタイムのセッション管理については完了。旧方式は、明示的な doctor 入力またはサポート/エクスポート出力としてのみ許可されます。

  • ランタイムでは、sessions.json、トランスクリプト JSONL、サンドボックスレジストリ JSON、タスク サイドカー SQLite、またはプラグイン状態サイドカー SQLite への書き込みを行いません。
  • JSON/セッションファイルのプルーニング、ファイルトランスクリプトの切り詰め、セッションファイルロック、 またはロック形式のセッションテストはありません。
  • 古いセッションファイルを最新に保つことを目的としたランタイム互換エクスポートはありません。
  • 明示的なサポートエクスポートは、ユーザーが要求するアーカイブ/実体化 形式のままであり、ファイル名をランタイムの ID に戻してはなりません。

バックアップと復元

バックアップは 1 つのアーカイブファイルにするべきですが、データベースのキャプチャは SQLite ネイティブにするべきです。

  1. オンラインバックアップが前進できるよう、書き込みトランザクションを限定的に保ちます。
  2. キャプチャ前に、稼働中のすべてのグローバルおよびエージェントデータベースを検証します。
  3. SQLite オンラインバックアップを使用して各データベースを一時バックアップ ディレクトリへキャプチャし、稼働中の接続を閉じてから、プライベートコピーに対して VACUUM を実行します。 所有者定義の SQLite 機能を必要とするプラグインスキーマは、 所有者が安全なスナップショット契約を提供するまでフェイルクローズします。
  4. データベーススナップショット、設定ファイル、認証情報ディレクトリ、選択した ワークスペース、およびマニフェストをアーカイブします。
  5. 各 SQLite スナップショットのファイル形式を検証してから、正規の OpenClaw データベースを開き、PRAGMA integrity_check とロール検証を実行します。専用の プラグインスキーマは、所有者が検証機能を提供しない限り不透明なままです。 openclaw backup create はこれをデフォルトで行います。--no-verify は、 書き込み後のアーカイブ処理を意図的にスキップする場合にのみ使用します。

主要なバックアップ形式として、生の稼働中の *.sqlite*.sqlite-wal*.sqlite-shm のコピーに 依存しないでください。アーカイブマニフェストには、データベースロール、 エージェント ID、スキーマバージョン、ソースパス、スナップショットパス、バイトサイズ、整合性 ステータスを記録する必要があります。

復元では、アーカイブスナップショットからグローバルデータベースとエージェントデータベースのファイルを 再構築する必要があります。グローバルスキーマはバージョン 1 のままです。エージェント単位のバージョン 1 スナップショットには、バージョン 2 への限定的なランタイムアップグレードを適用します。ファイルからデータベースへのインポートを 所有するのは引き続き doctor のみです。復元コマンドは最初にアーカイブを検証し、その後、 検証済みの展開済みペイロードから各マニフェストアセットを置き換えます。

ランタイムのリファクタリング計画

  1. データベースレジストリ API を追加する。

    • グローバル DB とエージェント単位の DB のパスを解決する。
    • グローバルスキーマを user_version = 1 のまま維持する。エージェント単位の DB ではバージョン 2 を使用し、 リリース済みバージョン 1 のメモリソース形式から 1 回のアトミックな移行を行う。
    • テスト、バックアップ、doctor で使用するクローズ/チェックポイント/整合性ヘルパーを追加する。
  2. サイドカー SQLite ストアを統合する。

    • プラグイン状態テーブルをグローバルデータベースへ移動する。ランタイム 書き込みについては完了。未リリースのレガシーサイドカーインポーターは削除済み。
    • タスクレジストリテーブルをグローバルデータベースへ移動する。ランタイム 書き込みについては完了。未リリースのレガシーサイドカーインポーターは削除済み。
    • Task Flow テーブルをグローバルデータベースへ移動する。ランタイム書き込みについては完了。 未リリースのレガシーサイドカーインポーターは削除済み。
    • 組み込みメモリ検索テーブルを各エージェントデータベースへ移動する。完了。明示的な カスタム memorySearch.store.path は、doctor の設定移行によって削除されるようになりました。 完全な再インデックスはメモリテーブルのみを対象としてインプレースで実行されます。古いファイル全体の スワップパスとサイドカーインデックスのスワップヘルパーは削除済みです。
    • これらのサブシステムから、重複するデータベースオープナー、WAL セットアップ、権限ヘルパー、 およびクローズパスを削除する。
  3. エージェント所有のテーブルをエージェント単位のデータベースへ移動する。

    • グローバルデータベースレジストリを介して、必要に応じてエージェント DB を作成する。完了。
    • ランタイムセッションエントリ、トランスクリプトイベント、VFS 行、ツール アーティファクトをエージェント DB へ移動する。完了。
    • ブランチローカルの共有 DB セッションエントリ、トランスクリプトイベント、 VFS 行、ツールアーティファクトは移行しない。そのレイアウトはリリースされていません。 doctor にはレガシーファイルからデータベースへのインポートだけを残す。
  4. セッションストア API を置き換える。

    • ランタイム ID としての storePath を削除する。ランタイムについては完了しており、 check:database-first-legacy-stores によって保護されています。セッションメタデータ、ルート更新、 コマンド永続化、CLI セッションのクリーンアップ、Feishu の推論プレビュー、 トランスクリプト状態の永続化、サブエージェントの深度、認証プロファイルのセッション オーバーライド、親フォークロジック、QA-lab の検査は、正規の エージェント/セッションキーからデータベースを解決するようになりました。 Gateway/TUI/UI/macOS のセッション一覧レスポンスは、レガシーな path ではなく databasePath を公開するようになりました。macOS のデバッグサーフェスは、session.store 設定へ書き込む代わりに、 エージェント単位のデータベースを読み取り専用状態として表示します。 /status、チャット駆動の軌跡エクスポート、CLI 依存関係プロキシは、 レガシーストアパスを伝播しなくなりました。トランスクリプト使用量のフォールバックは、 エージェント/セッション ID によって SQLite を読み取ります。ランタイムおよびブリッジテストでは storePath を公開しなくなり、そのレガシーフィールド名は doctor/移行入力が所有します。 Gateway の統合セッション読み込みには、テンプレート化されていない session.store 値用の特別なランタイム分岐がなくなり、 エージェント単位の SQLite 行を集約します。 レガシーなセッションロック用 doctor レーンと、その .jsonl.lock クリーンアップヘルパーは 削除されました。現在は SQLite がセッションの同時実行境界です。 ホットなランタイム呼び出し箇所では、resolveSessionRowEntry のような行指向のヘルパー名を使用します。 古い resolveSessionStoreEntry 互換エイリアスは、ランタイムおよび Plugin SDK のエクスポートから削除されました。
  • { agentId, sessionKey } の行操作を使用する。 完了: getSessionEntryupsertSessionEntrydeleteSessionEntrypatchSessionEntry、および listSessionEntries は、セッションストアのパスを必要としない SQLite ファーストの API になった。ステータス概要、ローカルエージェントのステータス、ヘルス、 および openclaw sessions 一覧コマンドは、エージェントごとの行を直接読み取り、 sessions.json パスの代わりにエージェントごとの SQLite データベースパスを表示するようになった。
  • ストア全体の削除/挿入を upsertSessionEntrydeleteSessionEntrylistSessionEntries、および SQL クリーンアップクエリに置き換える。 ランタイムについて完了: ホットパスは行 API と競合時に再試行する行パッチを使用するようになった。 残っているストア全体のインポート/置換ヘルパーは、移行インポートコードと SQLite バックエンドテストに限定されている。
    • store-writer.ts とライターキューのテストを削除する。完了。
    • セッション行の upsert/パッチから、ランタイムのレガシーキー削除と エイリアス削除パラメーターを削除する。完了。
  1. ランタイムの JSON レジストリ動作を削除する。
    • サンドボックスレジストリの読み書きを SQLite のみにする。完了。
    • モノリシックおよびシャーディングされた JSON は移行ステップからのみインポートする。完了。
    • シャーディングされたレジストリのロックと JSON 書き込みを削除する。完了。
  • レジストリの行の形状がホットパスの運用状態のままである場合、汎用の 不透明な JSON として保存するのではなく、型付きレジストリテーブルを 1 つ維持する。完了。
  1. ファイルロック形式のセッション変更を削除する。

    • ランタイムのロック作成とランタイムロック API について完了。
    • 独立したレガシー .jsonl.lock doctor クリーンアップレーンは削除された。
    • 状態整合性には、孤立したトランスクリプトファイルを削除する個別の パスがなくなった。doctor 移行がレガシー JSONL ソースのインポート/削除を一か所で行う。
    • Gateway のシングルトン調整は、gateway_locks 配下の型付き SQLite state_leases 行を使用し、ファイルロックディレクトリの境界を公開しなくなった。
    • 汎用 Plugin SDK の重複排除永続化は、ファイルロックや JSON ファイルを使用しなくなり、共有 SQLite プラグイン状態行へ書き込む。完了。
    • QMD の調整は、埋め込みには共有 SQLite リースを使用し、すべての コレクション/更新/埋め込みライターにはエージェントごとの SQLite リースを使用する。 ランタイムは qmd/embed.lock.lock または agents/<agentId>/qmd-write.lock.lock を作成しなくなった。 Doctor は、確実に古い廃止済みサイドカーのみを削除する。完了。
  2. ワーカーをデータベース対応にする。

    • ワーカーは各自の SQLite 接続を開く。
    • 親が配信、チャンネルコールバック、および設定を所有する。
    • ワーカーはライブハンドルではなく、エージェント ID、実行 ID、ファイルシステムモード、 および DB レジストリ ID を受け取る。
    • vfs-only は実験的機能のままで、エージェントデータベースを ストレージルートとして使用する。
    • まず、アクティブな実行ごとに 1 ワーカーを維持する。DB 接続の ライフタイムとキャンセル動作が十分に安定するまで、プーリングは後回しにできる。
  3. バックアップ統合。

    • オンラインバックアップに続いてオフラインの VACUUM を行い、 グローバル、エージェント、およびプラグインのデータベースをスナップショットするよう バックアップを対応させる。状態アセット配下で検出された *.sqlite ファイルについて完了。 利用できない所有者機能を必要とするプラグインスキーマはフェイルクローズする。
    • 正規 SQLite の整合性とスキーマ ID に対するバックアップ検証、 および専用プラグインスナップショットに対する汎用ファイル形状検証を追加する。 バックアップ作成とデフォルトのアーカイブ検証について完了。
    • バックアップ実行のメタデータを SQLite に記録する。アーカイブパス、 ステータス、およびマニフェスト JSON を持つ共有 backup_runs テーブルによって完了。
    • 検証済みアーカイブスナップショットからの復元を追加する。完了: openclaw backup restore は展開前に検証し、検証ツールの正規化済みマニフェストを使用し、 --dry-run をサポートし、記録済みのソースパスを置換する前に --yes を必要とする。
    • VFS/ワークスペースのエクスポートは要求された場合にのみ含める。 セッション内部を JSON または JSONL としてエクスポートしない。
  4. 廃止されたテストとコードを削除する。既知のランタイムセッションサーフェスについて完了。

  • sessions.json またはトランスクリプト JSONL ファイルがランタイムで 作成されることを表明するテストを削除する。コアセッションストア、チャット、Gateway の トランスクリプトイベント、プレビュー、ライフサイクル、コマンドのセッションエントリ更新、 自動返信のリセット/トレース、memory-core の Dreaming フィクスチャ、承認対象のルーティング、 セッショントランスクリプト修復、セキュリティ権限修復、軌跡エクスポート、およびセッション エクスポートについて完了。 Active Memory のトランスクリプトテストは、SQLite スコープを表明し、一時的または 永続的な JSONL ファイルが作成されないことを表明するようになった。 ランタイムが JSONL トランスクリプトを切り詰めなくなったため、古い Heartbeat の トランスクリプト削除リグレッションは削除された。 エージェントのセッション一覧ツールテストは、レガシー sessions.json パスを Gateway のレスポンス形状としてモデル化しなくなった。アプリ/UI/macOS テストでは databasePath を使用する。 /status のトランスクリプト使用量テストは、JSONL ファイルを書き込む代わりに、 SQLite のトランスクリプト行を直接シードするようになった。 Gateway のセッションライフサイクルテストは、SQLite のトランスクリプトシードヘルパーを 直接使用するようになった。古い単一行セッションファイルのフィクスチャ形状は、リセットと 削除のカバレッジからなくなった。 sessions.delete は、ファイル時代の archived: [] フィールドを返さなくなった。 削除は行変更の結果のみを報告する。古い deleteTranscript オプションもなくなった。 セッションを削除すると、正規の sessions ルートが削除され、SQLite が セッション所有のトランスクリプト、スナップショット、および軌跡の行をカスケード削除するため、 呼び出し元がトランスクリプトの孤立データを残したり、クリーンアップ分岐を忘れたりすることはない。 コンテキストエンジンの軌跡キャプチャテストは、session.trajectory.jsonl を読み取る代わりに、 分離されたエージェントデータベースから trajectory_runtime_events 行を読み取るようになった。 Docker MCP チャンネルのシードスクリプトは、SQLite 行を直接シードするようになった。 sessions.json への直接書き込みは doctor フィクスチャに限定される。 Tool Search Gateway E2E は、agents/<agentId>/sessions/*.jsonl ファイルをスキャンする代わりに、 SQLite のトランスクリプト行からツール呼び出しの証拠を読み取る。 Memory-core のホストイベントとセッションコーパスのスクラッチ行は、共有 SQLite プラグイン状態に格納されるようになった。events.jsonlsession-corpus/*.txt は、 レガシー doctor 移行の入力専用である。アクティブな行は .dreams/session-corpus ではなく、 memory/session-ingestion/ 仮想パスを使用する。ランタイムがそのコーパスのファイルアーカイブ修復を 所有しなくなったため、古い memory-core の Dreaming 修復モジュールとその CLI/Gateway テストは削除された。Memory-core のブリッジ/公開アーティファクトテストは .dreams/events.jsonl を公開しなくなり、SQLite ベースの仮想 JSON アーティファクト名を使用する。 公開 SDK/Codex のテストドキュメントは、セッションファイルではなく SQLite セッション状態と記載するようになり、チャンネルターンの例は storePath 引数を公開しなくなった。 Matrix の同期状態は、SQLite プラグイン状態ストアを直接使用するようになった。アクティブな クライアント/ランタイム契約は bot-storage.json パスではなくアカウントストレージルートを渡し、 doctor はソースを削除する前にレガシー bot-storage.json を SQLite にインポートする。 QA Lab の Matrix 再起動/破壊的シナリオは、偽の bot-storage.json ファイルを作成または 削除する代わりに SQLite 同期行を直接変更するようになり、E2EE 基盤は偽の sync-store.json パスではなく同期ストアルートを渡す。 Matrix のストレージルート選択は、レガシーの同期/スレッド JSON ファイルによって ルートをスコアリングしなくなり、永続的なルートメタデータと実際の暗号化状態を使用する。 ランタイムの SQLite セッションバックエンドテストスイートは、 sessions.json を捏造しなくなった。レガシーソースのフィクスチャは、それらを インポートする doctor テストに置かれるようになった。 Gateway のセッションテストは、createSessionStoreDir ヘルパーや未使用の一時セッションストア パス設定を公開しなくなった。フィクスチャディレクトリは明示され、行の直接設定には SQLite セッション行の命名を使用する。 doctor 専用の JSON5 セッションストアパーサーのカバレッジは、インフラテストから doctor 移行テストに移されたため、ランタイムテストスイートはレガシーセッションファイルの 解析を所有しなくなった。 Microsoft Teams ランタイムの SSO/保留中アップロードテストは、JSON サイドカーの フィクスチャやパーサーを持たなくなった。レガシー SSO トークンの解析は、プラグイン移行 モジュールにのみ存在する。Telegram テストは偽の /tmp/*.json ストアパスを シードしなくなり、SQLite ベースのメッセージキャッシュを直接リセットする。汎用の OpenClaw テスト状態ヘルパーは、レガシー auth-profiles.json ライターを公開しなくなり、 doctor の認証移行テストがそのフィクスチャをローカルで所有する。 TUI の最終セッションポインター、実行承認、Active Memory の切り替え、Matrix の重複排除/ 起動検証、Memory Wiki のソース同期、現在の会話のバインディング、オンボーディング認証、 Hermes のシークレットインポートに関するランタイムテストは、古いサイドカーファイルを 作成したり、古いファイル名が存在しないことを表明したりしなくなった。これらは SQLite 行と 公開ストア API を通じて動作を証明する。レガシーソースのファイル名が存在するのは、 doctor/移行テストのみである。 デバイス/Node のペアリング、チャンネルの allowFrom、再起動インテント、再起動ハンドオフ、 セッション配信キューエントリ、設定のヘルス、iMessage キャッシュ、Cron ジョブ、 PI トランスクリプトヘッダー、サブエージェントレジストリ、および管理対象画像添付に関する ランタイムテストも、無視されることや存在しないことを証明するためだけに、廃止された JSON/JSONL ファイルを作成しなくなった。 PI のオーバーフロー回復には、SessionManager による書き換え/切り詰めのフォールバックが なくなった。ツール結果の切り詰めとコンテキストエンジンのトランスクリプト書き換えは、 SQLite のトランスクリプト行を変更し、その後データベースからアクティブなプロンプト状態を 更新する。永続化された SessionManager のメッセージ追加は、親の選択と冪等性のために、 アトミックな SQLite トランスクリプト追加ヘルパーへ委譲する。通常のメタデータ/カスタム エントリの追加も、SQLite 内で現在の親を選択するため、古いマネージャーインスタンスが SQLite 導入前の親チェーン競合を復活させることはない。 ターン途中の事前チェックと sessions_yield に対する合成 PI テールのクリーンアップは、 SQLite のトランスクリプト状態を直接トリミングするようになった。古い SessionManager の テール削除ブリッジとそのテストは削除された。 Compaction チェックポイントのキャプチャも SQLite のみからスナップショットする。 呼び出し元は、代替トランスクリプトソースとしてライブ SessionManager を渡さなくなった。

  • レガシーファイルをシードするテストは、移行専用としてのみ維持する。

  • アクティブなランタイムサーフェスでは、JSON ファイルによる証明を SQL 行による証明に置き換えた。

  • ランタイムによるレガシーセッション/キャッシュ JSON パスへの書き込みを 静的に禁止する。リポジトリガードについて完了。

  1. 移行レポートを監査可能にする。
    • 開始/終了タイムスタンプ、ソースパス、ソースハッシュ、件数、警告、 およびバックアップパスを含む移行実行を SQLite に記録する。 完了: レガシー状態の移行実行は、ソースパス/テーブルのインベントリ、ソースファイルの SHA-256、サイズ、レコード件数、警告、およびバックアップパスを含む migration_runs レポートを永続化するようになった。 完了: レガシー状態の移行実行は、ソース単位の監査と将来のスキップ/バックフィル判断のために、 migration_sources 行も永続化する。
    • 適用を冪等にする。部分的なインポート後に再実行した場合、すでに インポート済みのソースをスキップするか、安定キーでマージする必要がある。 完了: セッションインデックス、トランスクリプト、配信キュー、プラグイン状態、タスク台帳、 およびエージェント所有のグローバル SQLite 行は、安定キーまたは upsert/置換セマンティクスを 通じてインポートされるため、再実行しても永続行を重複させずにマージされる。
    • インポートに失敗した場合は、元のソースファイルをそのまま残す必要がある。 完了: 失敗したトランスクリプトインポートは、検出されたパスに元の JSONL ソースを 残すようになり、migration_sources は次回の doctor 実行に備えて、ソースを removed_source=0 付きの warning として記録する。

パフォーマンス規則

  • スレッド/プロセスごとに 1 つの接続で問題ありません。ワーカー間でハンドルを共有しないでください。
  • WAL、foreign_keys=ON、5s の busy タイムアウト、短い BEGIN IMMEDIATE 書き込みトランザクションを使用してください。SQLite の単一の busy 待機に加えて、同期的なロック再試行を重ねないでください。
  • 明示的なミューテックス/バックプレッシャーのセマンティクスを持つ非同期トランザクション API が追加されるまでは、書き込みトランザクションヘルパーを同期的に保ってください。
  • 親への配信の書き込みは小さく、トランザクション内に収めてください。
  • ストア全体の再書き込みを避け、行単位の upsert/delete を使用してください。
  • ホットコードを移行する前に、エージェント別一覧、セッション別一覧、更新日時、実行 ID、有効期限の各パスにインデックスを追加してください。
  • 大きなアーティファクト、メディア、ベクトルは、base64 や数値配列 JSON ではなく、BLOB またはチャンク化した BLOB 行として保存してください。
  • 不透明な Plugin 状態エントリは小さく、スコープを限定してください。
  • ファイルシステムの刈り込みではなく、TTL/有効期限用の SQL クリーンアップを追加してください。 データベース所有のランタイムストアについては完了済みです。メディア、Plugin 状態、Plugin BLOB、 永続的重複排除、エージェントキャッシュは、すべて SQLite の行を通じて期限切れになります。残る ファイルシステムのクリーンアップは、一時的な実体化または明示的な 削除コマンドに限定されます。

静的禁止事項

レガシー状態パスへの新たなランタイム書き込みを失敗させるリポジトリチェックを追加します。

  • sessions.json
  • *.trajectory.jsonl(実体化されたサポートバンドル出力を除く)
  • .acp-stream.jsonl
  • acp/event-ledger.json
  • cache/*.json ランタイムキャッシュファイル
  • agents/<agentId>/agent/auth.json
  • agents/<agentId>/agent/models.json
  • credentials/oauth.json
  • github-copilot.token.json
  • openrouter-models.json
  • auth-profiles.json
  • auth-state.json
  • exec-approvals.json
  • openclaw-workspace-state.json
  • workspace-state.json
  • workspace-attestations/*.attested
  • 同階層の <workspace>.attested
  • Matrix の credentials*.jsonrecovery-key.json
  • cron/runs/*.jsonl
  • cron/jobs.json
  • jobs-state.json
  • device-pair-notify.json
  • devices/pending.json / devices/paired.json / devices/bootstrap.json (2026.7 に廃止: ランタイムストアは共有状態 DB 内の device_pairing_* / device_bootstrap_tokens。ペアリング済みレコードは Gateway 起動時にインポートされ、一時的な保留/bootstrap 行は破棄されます)
  • nodes/pending.json / nodes/paired.json(2026.7 に廃止: Gateway 起動時にペアリング済みデバイスレコードへ統合)
  • identity/device.json
  • identity/device-auth.json(廃止済み。Doctor のみが device_auth_tokens にインポート)
  • push/web-push-subscriptions.json(廃止済み。Doctor のみが web_push_subscriptions にインポート)
  • push/vapid-keys.json(廃止済み。Doctor のみが web_push_vapid_keys にインポート)
  • push/apns-registrations.json(廃止済み。Doctor のみが apns_registrations にインポート)
  • process-leases.json
  • gateway-instance-id
  • session-toggles.json
  • Memory-core .dreams/events.jsonl
  • Memory-core .dreams/session-corpus/
  • Memory-core .dreams/daily-ingestion.json
  • Memory-core .dreams/session-ingestion.json
  • Memory-core .dreams/short-term-recall.json
  • Memory-core .dreams/phase-signals.json
  • Memory-core .dreams/short-term-promotion.lock
  • Skill Workshop skill-workshop/<workspace>.json
  • Skill Workshop skill-workshop/skill-workshop-review-*.json
  • Nostr bus-state-*.json
  • Nostr profile-state-*.json
  • calls.jsonl
  • known-users.json
  • ref-index.jsonl
  • QQBot session-*.json
  • BlueBubbles bluebubbles/catchup/*.json
  • BlueBubbles bluebubbles/inbound-dedupe/*.json
  • Telegram update-offset-*.json
  • Telegram sticker-cache.json
  • Telegram *.telegram-messages.json
  • Telegram *.telegram-sent-messages.json
  • Telegram *.telegram-topic-names.json
  • Telegram thread-bindings-*.json
  • iMessage catchup/*.json
  • iMessage reply-cache.jsonl
  • iMessage sent-echoes.jsonl
  • Microsoft Teams msteams-conversations.json
  • Microsoft Teams msteams-polls.json
  • Microsoft Teams msteams-sso-tokens.json
  • Microsoft Teams *.learnings.json
  • Matrix bot-storage.json
  • Matrix sync-store.json
  • Matrix thread-bindings.json
  • Matrix inbound-dedupe.json
  • Matrix startup-verification.json
  • Matrix storage-meta.json
  • Matrix crypto-idb-snapshot.json
  • Discord model-picker-preferences.json
  • Discord command-deploy-cache.json
  • サンドボックスレジストリのシャード JSON ファイル
  • plugin-state/state.sqlite
  • アドホックな openclaw-state.sqlite ランタイムサイドカー
  • tasks/runs.sqlite
  • tasks/flows/registry.sqlite
  • bindings/current-conversations.json
  • restart-sentinel.json
  • gateway-restart-intent.json
  • gateway-supervisor-restart-handoff.json
  • gateway.<hash>.lock
  • qmd/embed.lock.lock
  • agents/<agentId>/qmd-write.lock.lock
  • commands.log
  • config-health.json
  • port-guard.json
  • settings/voicewake.json
  • settings/voicewake-routing.json
  • plugin-binding-approvals.json
  • plugins/installs.json
  • audit/file-transfer.jsonl
  • audit/crestodian.jsonl
  • crestodian/rescue-pending/*.json
  • openclaw/rescue-pending/*.json
  • plugins/phone-control/armed.json
  • Memory Wiki .openclaw-wiki/log.jsonl
  • Memory Wiki .openclaw-wiki/state.json
  • Memory Wiki .openclaw-wiki/locks/
  • Memory Wiki .openclaw-wiki/source-sync.json
  • Memory Wiki .openclaw-wiki/import-runs/*.json
  • Memory Wiki .openclaw-wiki/cache/agent-digest.json
  • Memory Wiki .openclaw-wiki/cache/claims.jsonl
  • ClawHub .clawhub/lock.json
  • ClawHub .clawhub/origin.json
  • ブラウザプロファイルの装飾 .openclaw-profile-decorated
  • SessionManager.open(...) ファイルベースのセッションオープナー
  • SessionManager.listAll(...)TranscriptSessionManager.listAll(...) トランスクリプト一覧ファサード
  • SessionManager.forkFromSession(...)TranscriptSessionManager.forkFromSession(...) トランスクリプトフォークファサード
  • SessionManager.newSession(...)TranscriptSessionManager.newSession(...) 可変セッション置換ファサード
  • SessionManager.createBranchedSession(...)TranscriptSessionManager.createBranchedSession(...) ブランチセッションファサード

この禁止事項では、テストによるレガシーフィクスチャの作成と、移行コードによる レガシーファイルソースの読み取り/インポート/削除を許可する必要があります。未リリースの SQLite サイドカーは禁止されたままとし、 Doctor のインポート許可の対象にはしません。

完了基準

  • ランタイムデータとキャッシュの書き込み先は、グローバルまたはエージェントの SQLite データベースです。
  • ランタイムは、セッションインデックス、トランスクリプト JSONL、サンドボックスレジストリ JSON、タスクサイドカー SQLite、Plugin 状態サイドカー SQLite に書き込まなくなっています。未リリースのタスク および Plugin 状態サイドカー SQLite インポーターは削除されています。
  • レガシーファイルのインポートは Doctor のみが行います。
  • バックアップは、コンパクトな SQLite スナップショットと整合性証明を含む 1 つのアーカイブを生成します。
  • エージェントワーカーは、ディスク、VFS スクラッチ、または実験的な VFS のみのストレージで実行できます。
  • 設定ファイルと明示的な認証情報ファイルのみが、永続的な非データベース制御ファイルとして想定されます。
  • リポジトリチェックにより、レガシーなランタイムファイルストアの再導入を防止します。
Was this useful?
On this page

On this page