DATA-001B — Inventory personal data and approve a minimization/retention matrix #110
Description
Problem
MPRC currently collects or may process member identity, contact, registration, emergency-contact, date-of-birth, waiver, payment reference, shipping, Strava, WhatsApp, Google, Instagram, email, analytics, and error-monitoring data. The public privacy page is explicitly a placeholder, and there is no approved field-by-field record of why each datum is needed, who can access it, which vendor receives it, how long it remains useful, or what happens when a member requests access or deletion.
Engineering must not invent those legal, insurance, accounting, or club-policy decisions. Without an approved inventory, later retention jobs, exports, monitoring, and account deletion can either retain too much data or erase evidence the club is required to keep.
Atomic outcome
Produce an owner-approved, versioned data inventory and minimization/retention decision matrix using categories and synthetic examples only. This issue makes the decisions traceable; it does not implement deletion jobs or mutate production data.
For each data category, record:
- exact field/category and system of record;
- collection source and plain-language purpose;
- public, internal, confidential, restricted, financial, or secret classification;
- minimum roles/capabilities allowed to view or change it;
- external vendor/subprocessor and disclosure/consent requirement;
- retention trigger and approved duration, or an explicit
decision pendingowner; - correction, export, deletion/anonymization, legal-hold, and backup treatment;
- named business/privacy owner and next review date.
Cover at minimum Firebase Auth/member profiles; race and merchandise records; DOB/emergency contacts; waiver evidence; Stripe references; email delivery; Google account/Site/Group data; WhatsApp number/consent; Strava identity/tokens/status; Instagram publishing; Sentry/Firebase Analytics; rate limiting; logs/audit; exports; and backups.
Acceptance criteria
- Every currently known personal-data category has a purpose, classification, system/vendor, minimum-access role, retention decision state, request behavior, owner, and review date.
-
Not collected,not yet implemented,unknown, andowner decision pendingare distinguished from verified current behavior. - The approved matrix identifies data that should never appear in browser-readable profiles, logs, analytics, GitHub, support screenshots, or routine exports.
- The matrix distinguishes member-account deletion from legally required payment, accounting, waiver, incident, or audit evidence.
- Backup and external-provider deletion limitations are explicit rather than promising immediate erasure everywhere.
- A named officer/privacy owner approves the inputs and the public privacy notice has a version/effective date and truthful contact path.
- No real member record, raw email/phone/address, OAuth token, provider identifier, discount code, security finding, or private system URL is copied into this issue or repository evidence.
Dependencies and coordination
- Parent programs: ARCH-001 — Establish secure-commerce architecture and an atomic execution backlog #104 secure-platform architecture and COMMUNITY-EPIC — Unified member access and community integrations #79 community/member integrations.
- Consume MEMBERS-IDENTITY-001 — Define authoritative membership and external-account state #81's provider-neutral account/membership contract; do not redefine membership authority here.
- Wait for ARCH-001 — Establish secure-commerce architecture and an atomic execution backlog #104/PR docs: add officer continuity and secure commerce guides #108 to merge before changing its documentation paths.
- This is the owner-decision prerequisite for narrowly scoped retention, request, export, backup, and monitoring work. Publish those implementation children only after this matrix is approved.
- Existing provider tickets AUTH-004 — Link a Google identity to an existing Firebase member account #82, WHATSAPP-002 — Link a verified WhatsApp number and versioned consent to a member UID #87–INSTAGRAM-005 — Add token refresh, publishing reconciliation, and alerts #95 retain ownership of Google, WhatsApp, Strava, and Instagram mechanics.
Explicitly out of scope
- Inventing privacy/legal/insurance/accounting policy or retention periods.
- Editing production Firebase/Auth, Google, Stripe, WhatsApp, Strava, Instagram, Sentry, email, or backup data/settings.
- Implementing account deletion, retention jobs, exports, consent UI, monitoring changes, Firestore Rules, or incident response.
- Publishing real-member examples or private evidence.
Claim protocol
Creation is not a claim. Do not begin work until the issue is assigned and a timestamped CLAIMED by <canonical agent> at <UTC>; branch <branch> comment is posted and re-read. Earliest valid claim wins. Owner policy/configuration actions remain owner-only even after an engineering claim.
Activity
daliu commentedon Jul 12, 2026
Source-inventory coordination: #113 inventories only redacted systems/categories/counts and selects
migrate/recreate/retire/reauthorize/bootstrap/unknown. This issue still owns purposes, minimization, vendor handling, retention decisions, request behavior, and backup/deletion policy. No raw Firebase or Sheets/Forms record may be copied into either issue.daliu commentedon Jul 13, 2026
Membership roster input needed: #116 requires an owner-approved minimum column profile, purpose, access roles/capabilities, export/download retention, sharing/storage rules, deletion behavior, and treatment of the club account. Default design excludes UIDs/internal IDs, DOB, emergency contacts, addresses, waiver evidence, payment/provider IDs, tokens, arbitrary notes, and discount codes. #114/#115 also require approved personal fields for account-independent membership and manual payment/link audit.
daliu commentedon Jul 13, 2026
DISCOUNT REQUEST FORM PRIVACY INPUT (2026-07-13) — NOT CLAIMED; the public form structure was reviewed without submitting a response or opening response data.
The owner-supplied form is currently a public Google Form. It requests a submitter email, discount category, race/product/service name, website, a required response about contact information that may include a name/email/phone number, and free-text benefit rationale. It states that a response copy will be emailed to the supplied address.
Add this intake to the matrix as a distinct source from approved discount offers. Owner decisions are needed for purpose, minimum fields, notice/consent, who may view responses, Google/emailed-copy disclosure, spam/abuse controls, retention/deletion/correction behavior, and whether third-party contact details should be collected at all. A request never proves membership or authorizes publication. Requester/contact data must not be copied into member-readable discount records, public issues, logs, analytics, or routine roster exports.
#113 should privately inventory the Form owner, linked response destination, access state, redacted count/date range, and disposition without opening or exporting response rows. #83 owns only a later approved protected-offer view and scoped review path.
PAY-003C1: add commerce attempt-failure disposition classifier (#377) (…
MEMBERS-ROSTER-001A: safe membership-roster CSV export projection, so…
MEMBERS-DIRECTORY-001B: add bounded people finder (#529)
daliu commentedon Oct 15, 2026
October 15 direct owner decisions for the minimum member release:
First focused runtime source change is #737: canonical current-member admission for new free-event signup with expiry-safe cancellation and immutable retry. This does not complete #81/#115/#114 or activate real membership/payments.