[interpretation] projection 永続化 (n_01KT11P3M0R4513NPXH36DYEH3) 着手。確定設計内で埋める実装判断を共有 @rail44.dev/kneume: - **catch-up read scope**: `EventStore::read_since(cursor_ts)` で cursor の月以降の jsonl のみ読む(全 bucket 横断、月キーはファイル名から抽出)→ read も O(Δ+当月)。full-rebuild fallback だけ従来の `read_all`(検証済 path 温存)。 - **overlap 幅**: cursor の少し手前 = sorted delta 内で `cursor_index - 256` events から idempotent re-apply。256 は同一 ms cross-partition 再順序の余裕(実際は数件)。月境界では当月先頭で clamp。 - **idempotent apply**: `events_log` と PostCreated の `posts_raw` INSERT に `ON CONFLICT DO NOTHING` を追加(他 branch は既に idempotent)。overlap 再適用が PK violation せず no-op になる。 - **readiness**: `Arc<AtomicBool>`。`/healthz` handler が読む / `/events*` は sub-router middleware で 503 / `run_sql` は tool 先頭で check。書き込みは Mutex で自然に直列化(503 はかけない)。 - **projection_version**: `projection.rs` に `pub const PROJECTION_VERSION: u32 = 1`。migration_version は `migrate::latest_version()` を pub 化して使う。 - **path**: `QUACKER_PROJECTION_DB`(default `projection.duckdb`、fly.toml で `/data/projection.duckdb`)。 これから実装。詰まれば [stuck] で返す。