yoi/tickets/entry-hash-abolish.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

43 lines
3.0 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: Entry hash chain の廃止
## 背景
session-store の各 entry は SHA-256 hash chain (`prev_hash` → `hash`) で連結されており、`HashedEntry` として JSONL に 1 行ずつ書かれる。実際に効いている用途は以下の 2 つだけ:
1. `ensure_head_or_fork` (`crates/pod/src/pod.rs:1591`) — store 末尾と Pod 保持の `head_hash` を比較して auto-fork。**末尾識別子があれば良い**。
2. `fork_at(source_id, at_hash)` (`crates/session-store/src/session.rs:425`) — 過去 entry からの fork。`pod-session-fork` の入口仕様は turn 番号であり、entry hash は内部 pointer に過ぎず turn boundary (TurnEnd entry の index) で代替可能。
宣伝されている改竄検知 (tamper-evident chain) は walk して verify するルートがコード上に存在せず、削除しても regression にならない。
write 経路は既に sync 化済み (`6e5b148`)。前提足場は揃っている。
## 要件
- `HashedEntry` 廃止、JSONL は 1 行 1 `LogEntry`
- `compute_hash` / `build_chain` / `EntryHash` の撤去(外部に公開している場合は呼び出し元を含めて)。
- `SessionOrigin.at_hash``at_turn_index` (TurnEnd entry 由来の turn 番号) に置換。
- `ensure_head_or_fork` の検知ロジックを末尾 seq 比較ベースに置換。形式は実装時に決めるterminal marker entry / 末尾 seq の何れか)。
- **`session_head` mutex の撤去**。hash chain が無くなる結果として "head_hash を直前 entry から取得して次へ渡す" という serialize 必須の依存が消える。1 行 < `PIPE_BUF` (Linux 4KB) の `O_APPEND` write は kernel が atomic に直列化するため user space で mutex 不要。
- 既存 JSONL の読み込み互換は不要(プロジェクト方針として後方互換性は作らない)。
## 完了条件
- `HashedEntry` / `prev_hash` / `compute_hash` / `build_chain` / `EntryHash` がコードベースから消えている。
- `SessionOrigin``at_turn_index` を保持し、`fork_at` も同 API になっている。
- `session_head` mutex への参照が無く、`SessionLogWriter` 系は writer ハンドルを `Arc` で持つだけになっている。
- `cargo check --workspace` および `cargo test -p session-store -p pod` が通る。
- 既存 session を新規再生成して JSONL が 1 行 1 `LogEntry` になっていることを目視確認できる。
## 範囲外
- `SessionId``SegmentId` のリネーム(別チケット `segment-rename`)。
-`SessionId` (Segment 群の grouping) 導入(別チケット `session-grouping-introduce`)。
- live auto-fork の marker 形式の最終決定(別チケット `live-fork-marker`、ここでは末尾 seq 比較相当の最小実装で繋ぐ)。
## 関連
- `crates/session-store/src/session_log.rs`
- `crates/session-store/src/session.rs`
- `crates/pod/src/pod.rs:1591` `ensure_head_or_fork` 経路
- `tickets/segment-rename.md` (後続)