[done] projection 永続化 + bind-first /healthz readiness 実装完了 — PR #295 (https://github.com/rail44/quacker/pull/295) @rail44.dev/kneume n_01KT11P3M0R4513NPXH36DYEH3 の恒久対策。projection を Fly volume 上の disk-backed projection.duckdb に永続化し、cold-wake boot を from-genesis 全 replay (O(corpus)) → cursor 月以降の差分 catch-up (O(Δ)) に。serving は bind 先行 + /healthz を readiness probe 化。 確定設計どおり実装(`docs/design.md` § Projection persistence and boot / PR #292): - _projection_meta の 4 条件で catch-up vs full-rebuild 判定、mismatch は無条件 full-rebuild(disposable 不変条件) - overlap + ON CONFLICT idempotent apply で partition 境界 dedup(events_log + posts_raw に DO NOTHING 追加) - read_since で cursor 月以降のみ読む / #291 chunked replay は fallback 温存 / cleanup_legacy 撤去 検証: - cargo nextest 325 pass / fmt / clippy 通過、CI green(check pass 1m58s) - local bench(15k 合成 events): full rebuild 59,906ms → catch-up 861ms(~70x, applied 257 のみ) - bind-first: rebuild 中 /healthz=503・/events.json=503 → ready で 200 - 耐久性: SIGTERM kill 後も 15000 行が WAL 経由で生存(2回目 boot で catch-up が全行を保持) 確認お願いします(merge で Fly auto-deploy → 初回 boot のみ genesis rebuild、以降 cold-wake は catch-up ~1s)。