3.1 KiB
3.1 KiB
session-store: Entry hash chain の廃止
背景
session-store の各 entry は SHA-256 hash chain (prev_hash → hash) で連結されており、HashedEntry として JSONL に 1 行ずつ書かれる。実際に効いている用途は以下の 2 つだけ:
ensure_head_or_fork(crates/pod/src/pod.rs:1591) — store 末尾と Pod 保持のhead_hashを比較して auto-fork。末尾識別子があれば良い。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 行 1LogEntry。compute_hash/build_chain/EntryHashの撤去(外部に公開している場合は呼び出し元を含めて)。SessionOrigin.at_hash→at_turn_index(TurnEnd entry 由来の turn 番号) に置換。ensure_head_or_forkの検知ロジックを末尾 seq 比較ベースに置換。形式は実装時に決める(terminal marker entry / 末尾 seq の何れか)。session_headmutex の撤去。hash chain が無くなる結果として "head_hash を直前 entry から取得して次へ渡す" という serialize 必須の依存が消える。1 行 <PIPE_BUF(Linux 4KB) のO_APPENDwrite は kernel が atomic に直列化するため user space で mutex 不要。- 既存 JSONL の読み込み互換は不要(プロジェクト方針として後方互換性は作らない)。
完了条件
HashedEntry/prev_hash/compute_hash/build_chain/EntryHashがコードベースから消えている。SessionOriginがat_turn_indexを保持し、fork_atも同 API になっている。session_headmutex への参照が無く、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.rscrates/session-store/src/session.rscrates/pod/src/pod.rs:1591ensure_head_or_fork経路tickets/segment-rename.md(後続)
Review
- 状態: Approve
- レビュー詳細: ./entry-hash-abolish.review.md
- 日付: 2026-05-20