yoi/tickets/live-fork-marker.md
Hare 1a9bb30824 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

41 lines
2.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# session-store: live auto-fork の marker 形式確定
## 背景
`entry-hash-abolish``ensure_head_or_fork` は末尾 seq 比較ベースに置換されたが、最小実装で繋いだだけで marker 形式の本決定は保留している。
live auto-forkconcurrent writer 検知)と過去 forkUI から turn 選択)は性質が違う:
- **live auto-fork**: 元 Segment の末尾に terminal marker (例: `Forked { to: SegmentId }`) を append する CoW semantics。以降の writer は marker を見て新 Segment に自動移動。
- **過去 fork**: 元 Segment は無変更で、replay して新 Segment を生やすだけ。
両者を同じ marker で扱うと、過去 fork から更に過去で fork した場合に元 Segment への marker 位置解釈が複雑化して破綻する。**過去 fork は元 Segment に触れない方針を固定**した上で、live auto-fork 側の marker 形式を確定する。
## 要件
- live auto-fork 検知の形式を以下のどちらかに確定して実装:
- (a) **terminal marker entry**: 元 Segment 末尾に `Forked { to: SegmentId }` 等の LogEntry を 1 行 append する
- (b) **末尾 seq 比較**: 元 Segment に書き込みは行わず、writer の保持する末尾 seq と store の末尾 seq の差分のみで検知する
- 選択基準:
- (a) は読み手側が fork チェーンを log だけから辿れる利点。書き手競合時に 1 write 増えるコスト。
- (b) は元 Segment が完全 immutable で、過去 fork との semantics 統一が綺麗。fork 関係を引くには別の metadata index が要る。
- 過去 fork 側は引き続き元 Segment を touch しないことを invariant として明文化。
- `pod.rs``ensure_head_or_fork` を確定後の形式に合わせて書き直す。
## 完了条件
- live auto-fork の marker 形式が決まり、実装に反映されている。
- 過去 fork からの nested 過去 fork が正しく動くtest で確認)。
- 並行 writer による live auto-fork が正しく検知され、新 Segment に分岐するtest で確認)。
## 範囲外
- 過去 fork の物理コピー方式(既に `fork_at``SessionStart` seed 1 回書き込みの方針で固定)。
- Fork tree の可視化 UI。
## 関連
- `tickets/entry-hash-abolish.md` (前提)
- `tickets/session-grouping-introduce.md` (前提、Session 単位の lineage と整合)
- `tickets/pod-session-fork.md`