yoi/tickets/session-grouping-introduce.md
Hare 35c15923db
ticket: 永続化整理を 8 個に分割
persistence-semantics と pod-persistent-state を実装可能な粒度に分割。
Storage 層 (Phase 1) を entry-hash-abolish / segment-rename /
session-grouping-introduce / live-fork-marker に、Pod 単位永続化
(Phase 2) を pod-state-backend / pod-state-write-points /
pod-name-resume / spawned-registry-persist に切り出した。
2026-05-20 04:07:44 +09:00

2.8 KiB
Raw Blame History

session-store: SessionSegment 群の grouping導入

背景

segment-rename で物理 append-only 単位を Segment に揃えた。続けて、ユーザー視点の「同じ会話の家系」を表す Session を導入する。

Session は fork tree 全体を 1 つにまとめる grouping で、compaction / fork は同 Session 内に新 Segment を生やす操作になる。これにより:

  • Session 数が fork で爆発せず、WHERE session_id = ? だけで fork tree 全体が取れる。
  • resume の指定は (SessionId, SegmentId) の組で行える。
  • pod-persistent-state 側で Pod ↔ Session の対応関係を扱いやすくなる。

要件

  • SessionId 型を session-store に追加。Segment は parent_session_id を持つ。
  • Segment 生成パスでの session_id 決定:
    • new session: 新 SessionId を発行
    • compaction: 元 Segment と同 SessionId を継承
    • fork (live auto / 過去 fork いずれも): 元 Segment と同 SessionId を継承
  • SessionOrigin を以下のいずれかに整理:
    • compacted_from { segment_id, at_turn_index }
    • forked_from { segment_id, at_turn_index }
    • どちらも同 Session 内 segment への参照であることを型レベルで保証。
  • restore API を (SessionId, SegmentId) を取る形に。SegmentId のみを取る既存経路は内部で SessionId を解決する shim を一段噛ませる。
  • FsStore layout に Session 単位の index を追加Session → Segment 列挙が WHERE session_id = ? 相当で引けること)。形式は <data_dir>/sessions/<session_id>/<segment_id>.jsonl または別ファイル index、実装時に決定。
  • Session 内の leaf Segment 列挙 API を提供pod-name resume 等から使う)。

完了条件

  • SessionId 型と Session 単位 metadata の永続表現が決まり、FsStore で読み書きできる。
  • compaction / fork が同 Session 内 Segment 増分として記録される。
  • (SessionId, SegmentId) での restore が動作し、leaf 以外を指定した read-only restore も実装上は可能。
  • 既存 session を Session 単位に grouping する migration 戦略が決まっている(プロジェクト方針として後方互換は作らないため、既存 sessions ディレクトリは破棄して良いかどうかをここで明示)。
  • cargo check --workspace および全テストが通る。

範囲外

  • live auto-fork の marker 形式(別チケット live-fork-marker)。
  • Pod 単位 metadataPhase 2 一連のチケット)。
  • TUI からの Session/Segment 選択 UI。
  • DB backend 実装。

関連

  • tickets/segment-rename.md (前提)
  • tickets/live-fork-marker.md
  • tickets/pod-state-backend.md
  • crates/session-store/