mergegate/autorun/phase-3-event-store/TASKS.md
林 駿甫 (Shunsuke Hayashi) 146fcafc5e [追加] DTP (Deterministic Task Protocol) 設計文書・指示書を移植
deterministic-task-protocol リポから miyabi-cli-standalone に統合:
- docs/dtp/: PLAYBOOK, PLAN, UML, GIT-RULES, Codex レビュー 3件
- autorun/: Phase 0-8 の TASKS/ASSIGNMENT/GATE + INDEX/HANDOFF/ROLLBACK
- project_memory/tasks.json: 全9 Phase の DAG SSOT
- skills/: polaris-ops, rust-llm-pitfalls
- .codex/instructions.md: Codex 設定

実装は miyabi-core に gate.rs, lock.rs, protocol.rs, store.rs を追加する方針。
既存の dag.rs, github.rs, approval.rs 等は変更不要。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 01:07:32 +09:00

39 lines
2 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.

# Phase 3: Event StoreJSONL append-only + Snapshot rebuild
> 依存: Phase 1 GREEN
> 承認ゲート: event append + snapshot rebuild のテスト GREEN
> 並列実行可能: Phase 2 と同時実行 OK依存は Phase 1 のみ)
## 現状
`src/store.rs` は in-memory の TaskStore。ファイル永続化なし。
Codex R2-1/R2-5 指摘: monolithic JSON は concurrent write に弱い → JSONL event log + snapshot。
## タスク
- [ ] `EventStore` struct を追加: `append(event: TaskEvent)`, `replay() -> Vec<TaskEvent>`, `replay_for_task(task_id) -> Vec<TaskEvent>`
- ファイルパス: `project_memory/task-events.jsonl`
- append は `OpenOptions::new().append(true).create(true)` で排他不要
- [ ] `SnapshotStore` struct を追加: `load() -> TasksDocument`, `save(doc, expected_version) -> Result<()>`, `rebuild(events) -> TasksDocument`
- ファイルパス: `project_memory/tasks.snapshot.json`
- R2-1: `save()` は OS flock (`fs2::FileExt::lock_exclusive()`) + version CAS + atomic rename
- CAS: `current.version != expected_version` → Error
- atomic rename: write to `.tmp``fs::rename()` → done
- [ ] TaskStore に `persist()` メソッド追加: 現在の in-memory state を snapshot に書き出し
- [ ] TaskStore に `load_from_disk()` メソッド追加: snapshot を読み込んで in-memory に復元
- [ ] `rebuild_from_events()`: event log を replay して snapshot を再構築するテスト
- [ ] CAS conflict テスト: 2回目の save が version mismatch で失敗する
- [ ] tempfile crate を使った一時ディレクトリでのテスト
## 承認ゲート
- `cargo test` 全 GREEN
- event append → replay roundtrip テスト GREEN
- snapshot save → load roundtrip テスト GREEN
- CAS conflict テスト GREEN
- rebuild テスト GREEN
## リトライ条件
- flock が macOS で動かない → `fs2` crate は macOS 対応済み、パーミッション確認
- atomic rename が cross-filesystem → 同一ディレクトリ内で tmp → rename