Repository navigation
OAUTH-001B9 — Refuse stale Strava disconnect cleanup - #609
Conversation
✅ Deploy Preview for luminous-fox-7c393f ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
|
SELF-REVIEW GO on exact remote head No issue remains in the reviewed scope:
Independent exact-head runtime/security, test/fake, and backup-officer reviews each returned GO. PR CI run 30736839293 passed all five jobs. No Firebase deploy, Strava provider action, production data operation, or live verification occurred. |
|
POST-MERGE GO: merged as exact release SHA |
Outcome
A disconnect that pauses for Strava can no longer erase a newer reconnect. The Function records the original secret document version, then transactionally deletes the local secret/connection pair only when the secret is still that version or is already absent.
Officer impact: None now. This is protected Function source only and is not deployed. If a stale cleanup is refused after a future release, members keep the newer connection and receive the existing fixed unknown-result instruction.
Officer documentation: None —
docs/officers/EVENTS_SHOP_MEMBERS.mdalready tells a no-terminal backup officer to preserve the connected view, refresh, stop, and escalate after every unconfirmed disconnect result. This change adds no officer action, screen, wording, permission, data-flow, account-ownership, or deployment-topology change, so no Mermaid update is required.Deployment evidence: Source changed and local tests passed. This PR has not been merged or published. The website and
runmprc.comare not affected; Firebase was not deployed; no Strava provider setting or production data was changed; no real token, account, revocation, or live behavior was used or verified.Invariant and transitions
No schema or migration is required.
Trustworthy RED
On exact base
24ec0e5789c0ff26cba49371d298aea5c0cdf3ce, the test-only paused-revoke regression committed replacement pair B while revoke A was pending. The old blind batch cleanup then deleted B and fulfilled{ ok: true }; the assertion required fixed rejection and byte-preserving B.Test-only binary diff SHA-256:
1d8477963d87cc555147f7ac961ddf29ffcf696846714b14be254cd41177fe03Reviewed implementation binary diff SHA-256:
645fd89eb771011c634ee37677471a7b1fe59ba7b46d04415fbac77e1d6f005cReviewed head:
0baf701e6dad16f5d5a6f842001c2c3216921d88Verification
Node.js 20 and Java 21 were used where applicable.
git diff --check: passedA first diagnostic Functions run accidentally inherited Node 22 and reproduced 12 known Stripe projection runtime incompatibility failures. The exact isolated suite passed 25/25 under required Node 20, and the exact full Functions suite then passed under Node 20.
Self-review
Independent runtime/security, test/fake, and backup-officer reviews all returned GO with no edits.
Residual risk and exclusions
Provider calls remain unserialized. Provider/local and lost-acknowledgement reconciliation remain open. A trusted connection-only writer that does not also version the secret remains outside this fence. Malformed secrets can still be removed locally without provider revocation. Client confirmation admission, protected Firebase deployment, runtime IAM/encryption, outside-provider state, and live behavior are not proven here.
Closes #608.
Parent #88 remains open.