f0ea4469a4
Fixes the spillover leak where a qualified member promoting their own link had joins land back on themselves (bonus reward) instead of qualifying their team. - /api/public/member now returns joinTarget: unqualified member -> self; qualified -> next-to-qualify in their leg (reuses rotation-aligned nextInLine); whole leg qualified -> global rotation sponsor; else -> spillover (prior behavior) - /join page: the Join button, "join under" header, sponsor-ID copy, and the submitted sponsorId all follow joinTarget; a note explains "invited by #X, joining to help #Y qualify" so the new member knows their real sponsor - Member's SHARE link is unchanged (/join/<id>); resolution happens when a visitor opens it, so it self-corrects even for links already in the wild Dry-run verified: /join/27 -> #34, /join/34 -> #34 (self), /join/21 -> #34. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>