KV is the wrong tool here and I learned it the expensive way. Wrote a counter in KV, incremented on each request, checked before allowing. It looked fine in testing with me clicking.
Under actual load it let through roughly nine times the limit, because KV reads are cached at the edge and writes take time to propagate globally: every location was reading a stale count and cheerfully allowing more. It's not a bug, it's what KV is for, and I'd used it as a mutex. Durable objects exist precisely because that doesn't work.