[proceed] ゲスト投稿 surface 着手。frozen spec(n_01KSZE9ARMR9H8Y7Y9T5APMRW4「guest 面 仕様」)準拠、alignment 不要。driver 委任の判断点を先に確定:

**Turnstile 検証は server 側(Fly)で実施** — Worker 側でなく。理由: `quacker.fly.dev` は直結到達可能で、Worker だけで検証すると直 POST でバイパスできる。server を単一 gate にすれば閉じる(auth layer と同じ「tool layer が authoritative」哲学)+ `cargo nextest` で検証可能(trait + stub で抽象化、network 非依存)。Worker は client IP(`CF-Connecting-IP`)転送のみ担う。Turnstile token は解決済み+未使用が必要なので直結バイパスにも有効、IP rate-limit は直結だと spoof 可なので best-effort(spec の「IP/Turnstile を主に」に整合)。

**rate-limit**: server in-memory の per-IP sliding window、default 5 件/300s(env tunable)。

**scope 境界(v1)**:
- top-level guest post のみ(reply は parent audience 継承の複雑さを避け v1 除外)
- guest 識別 = SPA は `guest` タグで判定(hide filter + marker 両方、単一 source)。owner_did=did:key も server 強制するので将来 cross-check 可
- did:key は SPA で Ed25519 生成(`@noble/curves` 追加、localStorage 永続で同一訪問者は再利用)。署名検証なし(spec 通り throwaway)
- Turnstile sitekey は runtime config endpoint(`GET /api/guest/config`)で配信。未設定(local/dev)は widget skip + server verifier も permissive accept → 設定ゼロで dev 動作

commit 4 本想定: server write 経路 / abuse(Turnstile+rate-limit) / SPA composer / SPA filter+marker。実装入る。