Skip to content

OBS-001A4 — Prove signup failure logs stay free of member data #146

Closed

Description

@daliu

Officer impact: None — this adds regression proof for an existing fixed signup failure message and changes no member or officer task.

Officer documentation: None — no procedure, navigation, permission, collected field, deployment duty, or external account changes.

Deployment evidence: Closure must record source/tests/merge separately from website publication, exact runmprc.com, Firebase deployment, outside-provider configuration, and live behavior. This test-only outcome must not claim any production change.

Problem

Parent #111 requires synthetic canary proof for every covered monitoring/log sink. Merged #118 source ignores the caught signup error, emits one fixed failure phrase, and returns a generic error, but its tests exercise only successful signup create/preserve behavior. No test makes profile creation fail and inspects the signup Function's console arguments.

Invariant

The Auth signup trigger must never log a user, email, phone, token, provider response, request/body value, or caught error. Success emits no console message. Failure emits exactly the existing fixed phrase and returns only the existing generic internal error. A diagnostic test must not contact Firebase or any outside provider.

Atomic outcome

Add focused hostile-canary regression coverage for the merged signup log boundary. Make the mocked profile transaction reject with synthetic private values, invoke the exported trigger, inspect every console argument, and prove the result remains generic. Also prove a successful invocation emits no error log.

Exact implementation boundary

  • functions/ensureMemberProfile.test.js only

Excluded and immutable: functions/signup.js, functions/memberProfile.js, every other runtime file, frontend/Sentry/Analytics diagnostics, Stripe/webhooks, Strava/OAuth, Firestore Rules, root documents, officer guides, provider consoles, production data, and public/sitemap.xml.

Acceptance criteria

  • A mocked profile-transaction failure contains synthetic email, phone/token, provider-response, request-body, and URL/capability canaries.
  • onSignUp failure calls console.error exactly once with only Member profile setup failed during account creation.
  • Serialized console arguments and the returned error code/message contain none of the canaries or caught-error details.
  • The returned error remains the existing generic internal / Failed to create member record response.
  • A successful signup invocation produces no console.error call.
  • Focused and complete Functions tests plus lint/diff checks pass on Node 20 using mocks only.
  • Closure explicitly states that a source test and merge do not prove website publication, runmprc.com, Firebase deployment, provider configuration, or production behavior.

Dependencies and coordination

Claim protocol

Creation is not a claim. Before editing, assign the issue, add status:in-progress, post CLAIMED by <canonical agent> at <UTC>; branch <branch>, and re-read comments. Earliest valid claim wins.

Activity

  1. added
    priority:P1High-priority follow-up
    type:securitySecurity or privacy boundary
    area:firebaseFirebase services and data
    size:SSmall focused issue
    status:proposedDesigned but dependencies or decisions remain
    area:privacyPersonal data, consent, minimization, retention, and privacy operations
    status:in-progressClaimed and actively being implemented
    and removed
    status:proposedDesigned but dependencies or decisions remain
    on Jul 13, 2026
  2. self-assigned this
    on Jul 13, 2026
  3. daliu commented on Jul 13, 2026

    @daliu
    ContributorAuthor

    CLAIMED by Codex agent /root at 2026-07-13T11:18:06Z; branch codex/issue-146-signup-log-test; exact base f2caaae3b3f25adfd4fc552008871408f18e5931.

    Ownership is test-only: functions/ensureMemberProfile.test.js. No runtime or documentation file is claimed. functions/signup.js, functions/memberProfile.js, #145's frontend/Auth-mail paths, Sentry, Analytics, frontend diagnostics, Stripe/webhooks, Strava/OAuth, Rules, providers, production data, and public/sitemap.xml are immutable/excluded.

    The pre-claim audit found no open PR and no other open issue naming the test path. Tests will use only the existing Firebase mocks and synthetic canaries. Any newer overlapping claim is a stop-and-coordinate condition.

  4. daliu commented on Jul 13, 2026

    @daliu
    ContributorAuthor

    Implementation complete; claim retained for exact-head review.

    • Draft PR: test: prove signup logs redact private data #147
    • Exact pushed head: e14fbf86b0efef830a528d86912dc532b4721789
    • Base: f2caaae3b3f25adfd4fc552008871408f18e5931
    • Diff SHA-256: 2ec3c40d2d4b3f77911ada9750e7731ad77e8811ee3d984a7970df3d9427745f
    • Exact diff: 63 test-only lines in functions/ensureMemberProfile.test.js; no runtime or documentation change.
    • Pre-change check confirmed the hostile signup-console regression was absent.
    • Node 20 local proof: focused 20/20; complete Functions 160 passed / 1 existing emulator-only test skipped; Functions lint and diff check passed.

    The test first proves success emits no error log. It then passes a hostile synthetic Auth user plus caught provider failure containing UID/name/email/phone/token/provider/request/URL canaries, and proves exactly one fixed console argument plus the existing generic returned error. Hosted CI and two independent exact-head reviews are running.

    No website, runmprc.com, Firebase deployment, provider configuration, production record, real account, or live behavior was changed or tested.

  5. daliu commented on Jul 13, 2026

    @daliu
    ContributorAuthor

    REVIEW BLOCKER RESOLVED — claim retained.

    • Exact final head: 329b58808b8e09d0f284c2f6b7369920aa6afdc6
    • Base: f2caaae3b3f25adfd4fc552008871408f18e5931
    • Diff SHA-256: e3a40a405ffaa79d1cffdbfd336e27edeae20e986f8e2ea4f24fc16abce14ff6

    The first test version inspected only console.error. The final test spies debug, error, info, log, and warn; all five must be silent after success, failure permits exactly one one-argument fixed error call, every other level must remain empty, all captured calls are included in the canary scan, and every spy is restored in finally.

    Node 20 final local proof remains focused 20/20, complete Functions 160 passed / 1 existing emulator-only skip, Functions lint, and diff check. Fresh exact-head reviews and hosted CI are running. No runtime/documentation/provider/production scope changed.

  6. daliu commented on Jul 13, 2026

    @daliu
    ContributorAuthor

    Completed in PR #147 and merged to main as 8d250073d8911d42031fa694c8c0e784911461b0.

    Acceptance evidence:

    • Exact reviewed source head: 329b58808b8e09d0f284c2f6b7369920aa6afdc6
    • Exact base: f2caaae3b3f25adfd4fc552008871408f18e5931
    • Diff SHA-256: e3a40a405ffaa79d1cffdbfd336e27edeae20e986f8e2ea4f24fc16abce14ff6
    • Exact scope: one mocked test file, functions/ensureMemberProfile.test.js; signup/member-profile runtime is unchanged.
    • One independent review found the first test watched only console.error. The corrected exact head spies debug, error, info, log, and warn; both independent exact-head re-reviews approved it.
    • Node 20 local evidence: focused 20/20; complete Functions 160 passed / 1 existing emulator-only skip; Functions lint and diff check passed.
    • Exact-head hosted CI 29246004213 passed frontend, Functions, and Firestore Rules.
    • Exact-merge post-merge CI 29246166838 passed frontend, Functions, and Firestore Rules.

    Deployment truth:

    • Source changed: test proof only; runtime code is byte-for-byte unchanged.
    • Tests passed: yes, locally and in exact-head plus exact-merge hosted CI.
    • Code merged: yes, exact merge 8d250073d8911d42031fa694c8c0e784911461b0.
    • Website published: no. Production Git-triggered publication remains paused by CI-001B2 — Make releases protected, backend-first, and fail-closed #135; the Netlify PR preview is review evidence only.
    • runmprc.com verified: no exact revision was checked live.
    • Firebase deployed: not required and not performed; no Function or Rules runtime changed.
    • Outside provider configured: no Firebase, Sentry, Analytics, email, or other provider setting was inspected or changed.
    • Production behavior verified: no; no real account, email, member record, provider call, or production traffic was used.

    Officer impact: None — member and officer tasks/screens are unchanged.

    Officer documentation: None — no officer procedure, navigation, permission, collected field, deployment duty, or external account changed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:firebaseFirebase services and dataarea:privacyPersonal data, consent, minimization, retention, and privacy operationspriority:P1High-priority follow-upsize:SSmall focused issuetype:securitySecurity or privacy boundary

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions