OAUTH-001C1I — Initialize App Check only after the Strava callback is clean#444
Conversation
✅ Deploy Preview for luminous-fox-7c393f ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
|
SELF-REVIEWED by /root at exact head No actionable findings remain after independent security/privacy, race/lifecycle, and tests/documentation reviews. All identified findings were fixed and re-reviewed. Verification at this exact head:
Security/privacy review: callback inputs remain untrusted; raw capability values, App Check tokens, URLs, and user data are not retained or logged. App Check initializes only after a recognized Strava callback has been cleaned and the native/Router path and history key still match. A stale lifecycle, UID, app, route, history, or reinjection context fails closed. Deployment evidence: source and preview only. No Firebase, production Netlify, Strava provider, DNS, or other production action was performed or claimed. The branch rule still reports |
Members keep the same Strava connection screen, while the client now waits for a clean callback page and one Firebase App Check readiness result before admitting the existing exchange.
Officer impact: Members still see the same Strava connection screen. A cleanup, App Check, saved-history, or current-attempt failure before exchange uses the existing plain retry result and sends no exchange; an unmounted completion is inert.
Officer documentation:
docs/officers/EVENTS_SHOP_MEMBERS.md,SYSTEM_DESIGN.md, andSECURITY.mdnow describe the source-only flow, exact Router-history boundary, proof states, stop conditions, undo path, and escalation.Deployment evidence: Source commit
65608e5e5118399d5bccb6a32576ff08e2ecf780and local synthetic checks only. Website publication: not performed.runmprc.comverification: not performed. Firebase deployment/readback: not performed. Enterprise provider/key/domain/token evidence: not performed. Strava/provider configuration: not performed. Production data: not accessed or changed. Live behavior: not verified.Closes #443
Parent: #88 remains open.
Invariant and transitions
suppressed -> exact native/Router cleanup -> one App Check initialization/token-readiness flight -> one existing exchange.nullor the pinned BrowserRouter's exact plain{idx,key,usr:null}native history record is clean. Extra fields, accessors, non-plain values, invalid keys, or mismatched effective keys stop. The pinned empty native key correctly matches Router'sdefaultfallback.Failure, privacy, and authority review
Verification
a6b40d5e6042d6b5a26fe56a01165c1b4894029f: the old source calledexchangefirst instead ofprepare(recorded on OAUTH-001C1I — Initialize App Check only after the Strava callback is clean #443).npx --yeswrapper leaked npm configuration and failed before tests; the direct pinned-PATH rerun passed.demo-pay002b2-test.git diff --check: passed.Review and residual risk
Self-review covered authorization, initial/delayed App Check ordering, exact Router/native identity, input shape, privacy, fixed diagnostics, single-flight behavior, lifecycle races, production fallback, and documentation claims. Three independent review tracks found and verified fixes for raw initial-location retention, provider/token and promise-microtask races, normalized-versus-exact path divergence, saved-history extra fields, Router-entry key binding, and pinned short/empty key compatibility. Their final re-reviews reported no remaining findings.
App Check initialization and any exchange already admitted to the server/provider are irreversible. This source does not prove configured provider behavior, native
enforceAppCheck, deployment, or live protection. Those remain under #88, ABUSE-001A2, and the protected release gates.