Clean supabase-js session baseline — not the app shell.
…
Signup order: last/phone/email/password/lodge → Sign up → Phone SMS OTP → Match (GL ID + last + lodge) → email → ACTIVE. Missing GL → Secretary hold.
Cloudflare Turnstile — required for Sign up only (not Sign in).
Opened from recovery link (PASSWORD_RECOVERY). Stock updateUser({ password }).
Order: click SEND SMS code first, then enter the newest 6-digit code from that send and VERIFY. Codes from Twilio Verified Caller ID setup (or any SMS before SEND) are not app codes. Sets phone_verified_at (Gate B). Required before Match auto-approve and before email→ACTIVE. Does not change account_status by itself.
Shown when account_status is PENDING_EMAIL_CONFIRMATION. Calls Edge email-confirmation SEND / VERIFY (6-digit). Needs Resend configured on the function.
ACTIVE signed-in self-service. 1) Start via RPC start_email_change → 2) SEND code to new email → 3) VERIFY via Edge change-email.
Lost-email: …
Owner 2-click proof: Lookup email/GL → select row → reason + SUSPEND (or ACTIVE). Status flips: Owner only. Lookup also works for DA (lost-email later). Do not status-flip yourself.
Checking entitlement…
Owner or District Admin. New email must differ from current. 1) Start → 2) SEND → 3) VERIFY (Edge lost-email-recovery).
Gate B: finish Phone SMS OTP first. Match key = GL ID + last name typed here + lodge (uses this field, not signup profile name). No surname dropdown. Empty/wrong GL → Unmatched hold (SECRETARY_REVIEW) — contact lodge Secretary; no auto-ACTIVE. Good match → PENDING_EMAIL_CONFIRMATION → email → ACTIVE. Secretary email notify = not live yet (design only).