Backend:
- Migration 007 deduplicates existing users by name (case-insensitive,
keeping oldest) and adds a unique index on (event_id, LOWER(display_name))
- find_by_event_and_name is now case-insensitive (LOWER comparison)
- join endpoint checks name availability before creating; returns 409
Conflict with code "conflict" when the name is taken
Frontend (join page):
- On 409, switches to a name-taken view showing an amber warning with
name-choice tips, a PIN input that runs the recover flow inline, and
an "Anderen Namen wählen" button that returns to the name input
Test guide: added Steps 8 (rate-limit auto-retry) and 9 (name uniqueness)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>