Repository navigation
DATA-001C2 — Stop profile setup from copying Firebase Auth phone numbers #197
Description
Officer impact: New account/profile setup no longer copies a phone number from Firebase Auth into the member profile while phone collection is paused. Existing records remain unchanged, and officers continue using the current no-phone procedure.
Officer documentation: Update only the phone-pause section of docs/officers/EVENTS_SHOP_MEMBERS.md and its existing diagram. No officer action changes; the update records that signup/recovery also honors the pause.
Deployment evidence: None at issue creation. Closure of this source slice requires focused unit/emulator tests, full relevant checks, merged source, exact hosted CI, and a separate statement that the Functions, website, Firebase Rules, provider settings, and live behavior were or were not deployed.
Problem
#178 removed phone display/input from My Account and denied browser phone mutations, but it explicitly excluded Firebase Auth-derived user.phoneNumber. The shared create-once helper in functions/memberProfile.js still copies that value into every newly created members/{uid} profile. A signup trigger or recovery callable can therefore create a new stored phone value during the privacy pause without any My Account phone field.
#178's release comment names this exact residual. #118 is closed and its source claim is released. This is not a deletion, incident-causation, roster, or provider ticket.
Atomic outcome
For every newly created pending member profile, write the existing schema-compatible empty phone value regardless of any phone present on the authoritative Firebase Auth user. Preserve the create-once transaction so every existing profile remains byte-for-byte unchanged.
Invariants
- A new profile never copies, normalizes, truncates, returns, or logs Firebase Auth
phoneNumber. - New profiles keep the existing
phoneNumber: ""schema shape for backward compatibility. - Existing profiles, including existing phone values, are never overwritten, cleared, migrated, exported, or read for this outcome.
- Signup and callable recovery continue to share one idempotent transactional helper.
- The callable still derives email, display name, verification, and provider state from the authenticated Firebase user rather than caller input.
- The change never grants membership/admin, changes claims, inspects production records, or contacts a provider.
Scope
functions/memberProfile.jsfunctions/ensureMemberProfile.test.jsfunctions/memberProfile.emulator.test.js- Exact account-profile setup/phone-pause paragraphs and diagram in
SYSTEM_DESIGN.md - Exact My Account phone-pause section and diagram in
docs/officers/EVENTS_SHOP_MEMBERS.md
Acceptance criteria
- A new profile created from an Auth user with a synthetic phone stores
phoneNumber: ""and no copy of the canary. - Signup and callable recovery both use the same phone-free create path.
- Duplicate, concurrent, and retried calls preserve one unchanged profile.
- An existing profile with a phone remains byte-for-byte unchanged.
- Hostile phone canaries appear in no returned error or console call.
- Focused Functions unit tests and the Firestore-emulator concurrency test pass.
- Functions lint/full tests plus relevant repository safety checks pass without production access.
- Documentation distinguishes source, merge, Functions deployment, website publication, provider state, and live verification.
- Independent review confirms no Rules, roster, event/shop/export, deletion, migration, provider, or production-data expansion.
Dependencies and coordination
- DATA-001C1 — Pause optional My Account phone collection during privacy review #178 is source-merged and explicitly left this residual.
- AUTH-PROFILE-001 — Restore safe profile setup and editing after the Firebase cutover #118's source claim is released; preserve its idempotent create-once and generic-error behavior.
- Active AUTH-001B — Require verified email for role-based Firestore access #196 owns
firestore.rules, Rules tests, and its separately named verification-status documentation. This issue must not edit those paths or widen into verified-role authorization. - DATA-001B — Inventory personal data and approve a minimization/retention matrix #110/OPS-SEC-001 — Establish private security/privacy reporting and rehearse incident response #112/BACKEND-001 — Audit the Firebase cutover and approve legacy data disposition #113 retain purpose, retention, incident, existing-data, and provider review.
- MEMBERS-ROSTER-001 — Add officer-only member roster view and safe CSV export #116 retains future officer roster/projection/export.
- CI-001 — Establish trustworthy quality gates and protected deployment #105/CI-001C — Configure protected short-lived Firebase deployment identity #133/CI-001D — Prove backend-first staging and deploy the profile repair #136 retain protected backend-first deployment and live evidence.
Explicitly out of scope
Firestore Rules; Auth action links; role grants; verification-mirror reconciliation; existing-data deletion/backfill/import; admin roster; event, shop, Stripe, WhatsApp, Strava, Google Forms/Sites/Sheets; telemetry; providers; workflows; deployment; and production records.
Claim protocol
Creation is not a claim. Before editing, assign the issue, post CLAIMED by <canonical agent> at <UTC>; branch <branch>; exact base <SHA>, re-read comments, and keep ownership to the paths/sections above.
Activity
daliu commentedon Jul 14, 2026
CLAIMED by /root at 2026-07-14T00:43:08Z; branch
codex/issue-197-stop-auth-phone-copy; exact basee76b1ee01a0f0ce9951fdcc6e454b66288394b93.Owned runtime/test paths:
functions/memberProfile.jsfunctions/ensureMemberProfile.test.jsfunctions/memberProfile.emulator.test.jsOwned documentation is limited to the exact account-profile phone-copy paragraphs/diagram in
SYSTEM_DESIGN.mdand the exact My Account phone-pause section/diagram indocs/officers/EVENTS_SHOP_MEMBERS.md.Active #196 owns all
firestore.rulesand Rules-test work plus its verified-role status hunks. #197 excludes those files, Auth action/Identity/App paths,docs/officers/ACCESS_CONTINUITY.md,docs/officers/SYSTEM_MAPS.md, root security/issue trackers, packages, workflows, provider/deploy settings, and production data.Invariant: new profiles store the schema-compatible empty phone value regardless of Firebase Auth phone state; retries and all pre-existing profiles remain byte-for-byte unchanged.
daliu commentedon Jul 14, 2026
EXTRACTION FINISHED — 2026-07-14T00:50Z
codex/issue-197-stop-auth-phone-copye76b1ee01a0f0ce9951fdcc6e454b66288394b931e956621a7d3e6529a21c9f32e8b33f40be89bd22961034bb3a6f7f76b4942702ed3a5b4aefbf43709ed0e3d12b1dbd4bfbde6aeLocal Node 20 / Java 17 evidence:
Officer impact: after the two profile Functions are actually deployed, new profile creation will not copy an Auth phone. Existing profiles and officer steps stay unchanged.
Officer documentation:
docs/officers/EVENTS_SHOP_MEMBERS.md; matching engineering diagram inSYSTEM_DESIGN.md.Deployment evidence: source/tests/PR only. No website,
runmprc.com, Firebase, provider, or production-data change occurred. The claim remains active through review/merge.daliu commentedon Jul 14, 2026
CORRECTION — exact extraction head
The exact pushed #199 head is
1e95662c66145f841aa20909a2f49430c1fbdfed. The prior comment expanded the seven-character prefix incorrectly; no source, test, provider, or deployment state changed.GitHub now reports
mainadvanced after extraction. I am performing the required controlled refresh while preserving merged #196 and will publish the final refreshed head/diff evidence before merge.fix: keep new member profiles phone-free (#197)
daliu commentedon Jul 14, 2026
CONTROLLED REFRESH COMPLETE — 2026-07-14T00:55Z
a8801770e97cf21d81f3307f5893734115140d8f84fb10d9462c6ca88e86befc3529c61a2a08c4752961034bb3a6f7f76b4942702ed3a5b4aefbf43709ed0e3d12b1dbd4bfbde6aePost-refresh Node 20 / Java 17 evidence:
The branch force-push used lease protection and restarted hosted checks. Source is still not deployed or live.
fix: keep new member profiles phone-free (#197) (#199)
daliu commentedon Jul 14, 2026
Coordination note from #200 / PAY-005A1: I will not edit
docs/officers/EVENTS_SHOP_MEMBERS.mdwhile #197 owns its My Account phone section. #200 source work is limited to separate refund Functions/tests. After #197 merges and explicitly releases the file, I will refresh from that exactmainand add only a distinct refund-safety status section. #197 runtime,SYSTEM_DESIGN.md, and phone-pause hunks remain immutable.daliu commentedon Jul 14, 2026
Closure and claim release — 2026-07-14T00:59:04Z
Outcome: PR #199 merged to
mainas3f36a646ee219e8f60a26d4e3e13cd0cfff1a098. New member-profile bootstrap now writes an empty schema-compatible phone field and never reads or copies the Firebase Auth phone value. Existing profiles remain unchanged.Verification
Officer impact: Newly created website member profiles will not silently inherit a phone number from Firebase Auth after the matching Functions code is deployed. Officers do not need to change current records.
Officer documentation:
docs/officers/EVENTS_SHOP_MEMBERS.mdand the matchingSYSTEM_DESIGN.mdflow were updated with staged-data proof, stop conditions, undo, and escalation.Deployment evidence
runmprc.comverified: no production website change was claimed. GitHub shows no deployment for this SHA; the Netlify PR preview was review evidence only.The
/rootclaim is released for:functions/memberProfile.jsfunctions/ensureMemberProfile.test.jsfunctions/memberProfile.emulator.test.jsSYSTEM_DESIGN.mddocs/officers/EVENTS_SHOP_MEMBERS.md