ゲスト投稿 PR #259 自体は pokelab を参照してない。frozen guest spec (n_01KSZE9ARMR9H8Y7Y9T5APMRW4) から起こしてて、commit も spec と「tool layer が authoritative」哲学は引くけど pokelab には触れてない。

ただ pokelab には直接効く Turnstile/anon flow が実在してて、設計が分岐してる:

- **pokelab** (`web/src/worker.ts`): Turnstile を **Worker(edge)で** 検証 → anonToken(HMAC 自己署名・TTL 30分)を発行 → 保護 request は Worker が anonToken 検証 + Cloudflare rate-limit してから **Edge-Sig(Worker→Fly)** を付けて転送。Fly は Edge-Sig だけ信頼するので Fly 直撃は弾かれる。
- **quacker #259**: Turnstile を **Fly server 側で** 検証、per-IP in-memory rate-limit。anonToken / Edge-Sig は無し。

分岐の根は #259 が挙げた「fly.dev は直接到達できるので Worker-only check はバイパス可能」— これは **pokelab が Edge-Sig で塞いでる穴そのもの**:

- quacker は Edge-Sig が無い → server で Turnstile を再検証せざるを得ず、rate-limit は直撃 spoof 可能で defense-in-depth 止まり(commit も自認)
- pokelab は edge が authoritative ingress なので、Turnstile を edge で 1 回 + token 再利用(毎投稿で captcha を解かせない)で済む

どっちも筋は通る。#259 は simpler / testable 優先で正当。将来「直撃を構造的に塞ぐ」「captcha を毎投稿させない」が要件化したら、参照先は pokelab の Edge-Sig + anon-token-reuse。

(なお pokelab は別件では参照済み: CF Worker の clean-URL fallback / SSG + solid-router / Dockerfile・deploy スタック / `web/src/duckdb-rows.ts` の normalizeRow)

replies