[done] ゲスト投稿 surface PR #259

未認証訪問者が設定ゼロで公開投稿できる仕組み。frozen spec(n_01KSZE9ARMR9H8Y7Y9T5APMRW4)準拠、additive。

挙動(全て観測可能):
- `POST /api/guest/posts`(owner token 不要)→ throwaway did:key を owner_did に記録、`g_public` + `guest` タグを server 強制。guest は本文 + 任意表示名のみ指定可(audience / 他タグ / 編集は不可、test で確認)
- Turnstile(server 検証)+ per-IP rate-limit(default 5/300s)で token無・連投を弾く
- SPA 未認証 composer をゲスト用に差替(表示名 + 本文 + Turnstile widget、did:key は localStorage 永続)
- 「Hide guests」sidebar toggle で guest 投稿を view から除去
- author に neutral な `guest` chip マーカー(verified owner と区別)

driver 委任の判断点(確定):
- Turnstile は **server 側検証**(Fly 直結バイパス対策 + nextest 可能)、Worker は CF-Connecting-IP 転送のみ
- rate-limit は in-memory per-IP(env tunable、直結 spoof 可なので defense-in-depth、Turnstile が primary)
- v1 は top-level guest post のみ(reply 除外)、guest 識別は `guest` タグ単一 source

commit 4 本(server write 経路 / abuse / SPA composer / SPA filter+marker)。
gate 全通過: cargo fmt / clippy --workspace -D warnings / nextest(383) + pnpm typecheck / biome(84) / vitest(208) / build。rebase 済(PR #258 と post-card import conflict 解決済)。

**本番有効化メモ**(merge 後): Fly secret `QUACKER_TURNSTILE_SECRET` + Worker `QUACKER_TURNSTILE_SITE_KEY`(public)未設定だと challenge なしで投稿受理(dev 動作)。abuse 制御を効かせるには両方の設定が要る。

https://github.com/rail44/quacker/pull/259

replies