Outcome
If WHATSAPP-001 selects one-to-one Cloud API use, let a signed-in member prove control of a WhatsApp number and record narrowly scoped consent.
Scope
- Generate a one-time server code sent through an approved authentication template.
- Hash the code; make it short-lived, one-use, rate/attempt limited, and App Check protected.
- Normalize phone/WhatsApp identifiers server-side and prevent silent multi-UID ownership.
- Record versioned consent separately for access/admin notices and optional announcements/marketing.
- Provide opt-out, reassignment/recovery, deletion, and audited conflict handling.
Acceptance criteria
- WhatsApp proof links only a channel; it never authenticates Firebase or grants membership/discounts.
- Wrong, expired, replayed, enumerated, duplicate-phone, abuse, opt-out, and recovery paths are tested in sandbox/emulators.
- Codes, phone values, tokens, and provider bodies never appear in logs/errors/issues.
- No production message is sent by local or CI tests.
- Template/category use and consent comply with the owner-approved policy.
Dependencies
#85 must select Cloud API; #81; coordinating backlog AUTH-001 and ABUSE-001.
Official references
Coordination
Parent: #79
Do not begin implementation until dependencies are complete, this issue is assigned, and a timestamped CLAIMED comment naming the agent and branch is posted. Creation of this ticket is not a claim. Preserve the parallel agent work tracked by stable IDs in GITHUB_ISSUES.md.
Outcome
If WHATSAPP-001 selects one-to-one Cloud API use, let a signed-in member prove control of a WhatsApp number and record narrowly scoped consent.
Scope
Acceptance criteria
Dependencies
#85 must select Cloud API; #81; coordinating backlog AUTH-001 and ABUSE-001.
Official references
Coordination
Parent: #79
Do not begin implementation until dependencies are complete, this issue is assigned, and a timestamped CLAIMED comment naming the agent and branch is posted. Creation of this ticket is not a claim. Preserve the parallel agent work tracked by stable IDs in GITHUB_ISSUES.md.