-- Per-IP flood ceiling for /join, and the `admin_login_rate_enabled` toggle that -- every prior migration forgot to seed. -- -- Rationale: /join was throttled at 5 requests per 60s keyed on the client IP. At a -- venue every guest is behind one NAT, so the whole party shared a single bucket — -- 12 guests scanning the QR code within a few seconds meant 5 got in and 7 were -- turned away. The handler now keys the real anti-spam bucket per (ip, name), the -- same shape as `recover:{ip}:{name}`, and keeps only a loose per-IP ceiling to bound -- raw volume. 60/min comfortably covers a whole wedding arriving at once while still -- capping a flood from a single source. -- -- `admin_login_rate_enabled` is read by auth::handlers::admin_login with a code -- default of `true`, but no migration ever inserted it, so it was invisible to the -- admin config UI and to the e2e reseed. Seed it explicitly. INSERT INTO config (key, value) VALUES ('join_ip_rate_per_min', '60'), ('admin_login_rate_enabled', 'true') ON CONFLICT (key) DO NOTHING;