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>
1.8 KiB
1.8 KiB
Phase 4: File Lock Manager(lease + heartbeat)
依存: Phase 3 GREEN(EventStore が必要) 承認ゲート: lease lifecycle + stale detection + concurrent acquire テスト GREEN
現状
src/lock.rs に FileLockManager が実装済み(acquire/release/has_conflict/release_expired)。
TTL ベースの固定期限。Codex R1-5/R2-2 指摘の heartbeat/lease が未実装。
タスク
- TaskLock に
last_heartbeat: DateTime<Utc>フィールド追加(Phase 1 で追加済みのはず) is_expired()を heartbeat ベースに変更:now - last_heartbeat > lease_duration + 2 * heartbeat_intervalrenew_lease(task_id, agent, node)メソッド追加:last_heartbeatを更新 + event 記録acquire_lock()を atomic 化(R2-2):snapshot_store.lock_exclusive()で OS flock 取得- snapshot 再読込
has_conflict()再チェック- stale lock の自動解放
- lock 書き込み + event 記録
- OS flock 解放
LeaseConfigstruct:lease_duration_sec: 300,heartbeat_interval_sec: 60,stale_after_missed: 2- テスト: lease 獲得 → heartbeat → 解放の lifecycle
- テスト: heartbeat なしで stale 検出 → 自動解放
- テスト: 同一ファイルに 2 タスクが acquire → 2つ目が LockError::Conflict
- テスト: stale lock 解放後に新タスクが acquire 成功
- proptest: ランダムなファイルセットで acquire/release を繰り返して不変条件検証
承認ゲート
cargo test全 GREEN- lease lifecycle テスト GREEN
- stale detection テスト GREEN
- conflict テスト GREEN
- proptest GREEN
リトライ条件
- heartbeat interval の計算が off-by-one → Duration の比較を
>=で統一 - OS flock のデッドロック →
try_lock_exclusive()+ timeout fallback