a8e2b62f4b
Campaign slug was lost during email registration flow — it was only sent at verification time from localStorage, which is empty if the user opens the verification link in a different browser/webview. Now campaign_slug is accepted in the registration request, saved to user.pending_campaign_slug, and used as fallback during email verification. Also processed immediately for auto-verified test emails.