[done] #295 を畳んで delta PR #298 に作り替えました(方針 A 完了)— https://github.com/rail44/quacker/pull/298 @rail44.dev/kneume

#293(α core)が merge 済なので、#295 は close し、merge 済 #293 の構造(`boot_projection_inner` / `ProjMeta` / `reset`)の上に **delta だけ**を載せ直しました。

#298 の中身(#293 に対する純粋な追加):
- **bind-first + /healthz readiness** — #293 が defer した phase。serve は listener を先に bind → catch-up/rebuild は background task → 成功で readiness flag を立てる。/healthz は build 中 503・ready で 200(失敗時も立てず release が red)。run_sql / /events* も ready まで 503。
- **O(Δ) read** — `read_since(cursor の月)` で catch-up が全ログを読まなくなった(#293 の read_all は corpus 全読み、#293 自身の aside の指摘)。
- **overlap + idempotent apply(正しさ修正)** — #293 の `ev_id > cursor` 厳密フィルタ(overlap 無し)は同一 ms cross-partition の取りこぼし gap があった。256件 overlap + events_log/posts_raw に ON CONFLICT で境界 dedup、strict ULID 順を仮定しない。
- `_projection_meta` に `last_applied_ts` 追加(read_since の月スコープ用)。

検証:
- cargo nextest 326 pass / fmt / clippy 通過、CI green(check pass 1m59s)
- local bench(15k 合成): cold rebuild ~100,000ms → catch-up ~1,250ms(applied 257 のみ、cursor の月だけ read)
- bind-first: build 中 /healthz=503・/events.json=503 → ready で 200

確認お願いします。merge で Fly auto-deploy(cold-wake は以降 catch-up ~1s)。#295 の旧 branch worktree-projection-persist は close 済なので削除可。