はじめに
パス 3 SQLite セッションアーティファクトファミリー
パス 3 SQLite セッションアーティファクトファミリー
このメモでは clawdbot-d63.2 のスコープを定めます。一方、clawdbot-d63.1 は
src/config/sessions/session-accessor.sqlite.ts 内の重複するリセット/削除アーカイブヘルパーを担当します。
この作業中、実装ファイルには未コミットの変更があったため、このアーティファクトでは
並行作業中のワーカーと競合しないよう、正確な契約とパッチ箇所を記録します。
正式なファミリー
SQLite への切り替え後、アクティブなセッショントランスクリプトは SQLite の行です。セッションの アーカイブファミリーは次のとおりです。
- エントリの現在の
sessionIdに対応するtranscript_events、transcript_event_identities、およびsessionsの行。 entry.compactionCheckpoints[*].preCompaction.sessionIdが参照するすべてのsessionIdに対応する、 同じ SQLite トランスクリプト行セット。entry.compactionCheckpoints[*].postCompaction.sessionIdが参照するすべてのsessionIdに対応する、 同じ SQLite トランスクリプト行セット。entry.usageFamilySessionIds内のすべてのsessionIdに対応する、 同じ SQLite トランスクリプト行セット。
残っているどの session_entries 行からも、また残っているどのエントリの Compaction または
使用量ファミリーのメタデータからも参照されなくなった行のみをアーカイブします。これにより、
最後の有効な参照がなくなるまで、チェックポイントの分岐/復元および使用量ロールアップの状態が
保持されます。
切り替え後の非ファミリーアーティファクト
生成されたトピックトランスクリプトファイルのバリアントとトラジェクトリサイドカーは、アクティブな SQLite ランタイム状態ではありません。これらはレガシーファイルアーティファクトです。
<sessionId>-topic-<thread>.jsonlなどのトピックバリアントは、ファイルベースの トランスクリプト形式にのみ存在します。SQLite では、トピックごとの JSONL ファイルの代わりに、 正規のセッション ID とsession_routes/エントリ配信メタデータを使用します。.trajectory.jsonlや.trajectory-path.jsonなどのトラジェクトリサイドカーは、 実際の JSONLsessionFileパスに基づいて命名されます。SQLite のsessionFile値はsqlite:<agentId>:<sessionId>:<storePath>マーカーであり、サイドカーファイルを 指定するものではありません。- アーカイブ層のリーダーは、引き続きレガシーのアーカイブ済み JSONL ファイルを 読み取る必要がありますが、ランタイム保持処理では、アクティブなセッションディレクトリを スキャンしたり、SQLite セッションの JSONL トランスクリプトファイルを再度開いたりしてはなりません。
Doctor インポートは、レガシーのプライマリ JSONL ファイルと、それらに隣接するトラジェクトリサイドカーの 移行を引き続き担当します。ランタイムの SQLite 保持処理に、2 つ目のインポーターや ファイルフォールバックを追加してはなりません。
パッチ箇所
並行するパスを追加するのではなく、clawdbot-d63.1 によって導入された SQLite アーカイブヘルパーを
拡張します。
-
deleteSqliteSessionStateIfUnreferencedの近くにローカルコレクターを追加します。collectSqliteSessionArtifactFamily(entry: SessionEntry): Set<string>entry.sessionId、チェックポイント前後のセッション ID、およびusageFamilySessionIdsを含めます。- 空文字列を除外し、決定論的に重複を排除します。
-
削除後のストア用の参照コレクターを追加します。
readReferencedSqliteSessionArtifactFamilyIds(database): Set<string>- 現在の
session_entriesを反復処理し、各entry_jsonを解析して、 残っているすべてのエントリから同じファミリー ID を収集します。
-
現在、削除された 1 つの
sessionIdをアーカイブしている リセット/削除/メンテナンスの呼び出し元を変更し、削除されたエントリの完全なファミリーを渡します。 -
ファミリー ID ごとに、呼び出し元の理由(
resetまたはdeleted)を指定して SQLite トランスクリプト行をアーカイブし、そのファミリー ID が 削除後の参照セットに存在しない場合にのみsessions行を削除します。 -
トランスクリプトイベントの削除は、既存の SQLite セッション行クリーンアップパスに 集約したままにします。アクティブな JSONL の読み取りを追加してはなりません。
対象を絞ったテスト
src/config/sessions/session-accessor.conformance.test.ts、または clawdbot-d63.1 のコミット後に
並行するライフサイクルテストへ、SQLite 専用テストを追加します。
- Compaction 前のトランスクリプトを持つエントリを削除すると、現在のセッションと Compaction 前のセッションの両方がアーカイブされ、その後、両方の SQLite 行セットが削除されます。
- Compaction 前のセッションを共有する 2 つのエントリのうち一方を削除しても、 最後に参照しているエントリが削除されるまでは、共有されている事前セッションは 一切アーカイブされません。
usageFamilySessionIdsを持つエントリを削除すると、他のエントリがその使用量ファミリーを 参照していない場合、先行セッションの SQLite トランスクリプト行がアーカイブされます。- SQLite マーカーを持つトピック形式のセッションキーによって、生成された トピック JSONL の読み取りやサイドカーの検索が行われることはありません。
対象を絞った検証では、次を使用します。
node scripts/run-vitest.mjs src/config/sessions/session-accessor.conformance.test.tsこの Codex ワークツリーでは、広範な pnpm ゲートは Crabbox/Testbox 上で実行します。