You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Officer impact: Officers will no longer rely on the old spreadsheet script or a shared API key to grant website membership. The supported initial path will be the explicit, audited website workflow in #115.
Officer documentation: Update OFFICER_START_HERE.md, docs/officers/EVENTS_SHOP_MEMBERS.md, docs/officers/ACCESS_CONTINUITY.md, and the applicable system/data-flow diagram when the legacy path is removed. Mark #115NOT AVAILABLE YET until its deployment is proven.
Deployment evidence: None at issue creation. Closure requires a private owner inventory of any Apps Script trigger/caller, source/tests merged, Firebase deployed, old endpoint/config proven absent, any real legacy credential revoked privately, and the replacement officer path independently verified. A source deletion alone is not live proof.
Problem
The repository contains a legacy Google Apps Script and public HTTP Function intended to batch-grant membership by email using one shared static key. The script is hardcoded to an old Sheet tab, contains a placeholder credential, uses query/body fields while the server now accepts only X-API-Key, marks selected rows inserted too broadly, creates no Auth account/member profile, and has no actor identity, stable command ID, replay protection, or durable audit.
Firebase functions.config() is deprecated, and the endpoint cannot safely represent annual paid membership. Current direction is to import later and use deliberate one-at-a-time officer onboarding first.
Atomic outcome
After an authorized owner proves whether any scheduled/live caller still exists and the applicable cutover condition below is satisfied, remove the legacy script/exported endpoint and revoke its configuration/credential. Preserve only redacted migration-history documentation; do not replace it with another shared secret or build bulk import here.
Scope
Privately inventory Apps Script projects, installable/time triggers, deployment owners, invocation logs/counts, and any configured API key existence only.
Confirm whether any club process depends on the endpoint and define the cutover/rollback window.
Remove updateMemberRole from the deployed Functions export and delete or clearly retire the obsolete repository script after preserving non-sensitive history.
Remove the legacy functions.config().api.key dependency and related examples/docs.
Revoke/delete the actual key/config privately if it exists; never paste, print, log, export, or commit it.
Add tests/guards proving no public static-key batch role mutation remains.
Acceptance criteria
Primary and backup owners confirm every known Apps Script trigger/deployment/caller disposition with private evidence.
No public HTTP endpoint authenticated only by a shared static key can grant or revoke membership/custom claims.
The repository/deployed Functions no longer export the legacy endpoint or depend on functions.config().api.key.
Any live credential/config is privately revoked and a negative endpoint probe confirms the retired route is absent/generic without exposing configuration.
A replacement importer, Google Sheets/Drive API integration, automatic email association, or bulk role changes.
Membership schema, annual dues/payment flow, manual association UI, roster export, or provider provisioning.
Real production data, credential disclosure, direct role edits, or unapproved external configuration changes.
Claim protocol
Creation is not a claim. Do not edit files until dependencies are complete, 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. Trigger inventory and credential/config revocation are owner-only actions requiring private evidence.
Officer impact: Officers will no longer rely on the old spreadsheet script or a shared API key to grant website membership. The supported initial path will be the explicit, audited website workflow in #115.
Officer documentation: Update
OFFICER_START_HERE.md,docs/officers/EVENTS_SHOP_MEMBERS.md,docs/officers/ACCESS_CONTINUITY.md, and the applicable system/data-flow diagram when the legacy path is removed. Mark #115NOT AVAILABLE YETuntil its deployment is proven.Deployment evidence: None at issue creation. Closure requires a private owner inventory of any Apps Script trigger/caller, source/tests merged, Firebase deployed, old endpoint/config proven absent, any real legacy credential revoked privately, and the replacement officer path independently verified. A source deletion alone is not live proof.
Problem
The repository contains a legacy Google Apps Script and public HTTP Function intended to batch-grant membership by email using one shared static key. The script is hardcoded to an old Sheet tab, contains a placeholder credential, uses query/body fields while the server now accepts only
X-API-Key, marks selected rows inserted too broadly, creates no Auth account/member profile, and has no actor identity, stable command ID, replay protection, or durable audit.Firebase
functions.config()is deprecated, and the endpoint cannot safely represent annual paid membership. Current direction is to import later and use deliberate one-at-a-time officer onboarding first.Atomic outcome
After an authorized owner proves whether any scheduled/live caller still exists and the applicable cutover condition below is satisfied, remove the legacy script/exported endpoint and revoke its configuration/credential. Preserve only redacted migration-history documentation; do not replace it with another shared secret or build bulk import here.
Scope
updateMemberRolefrom the deployed Functions export and delete or clearly retire the obsolete repository script after preserving non-sensitive history.functions.config().api.keydependency and related examples/docs.Acceptance criteria
functions.config().api.key.BACKEND-002, Auth account creation, or bulk role grant is added here.Dependencies and coordination
Explicitly out of scope
Claim protocol
Creation is not a claim. Do not edit files until dependencies are complete, 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. Trigger inventory and credential/config revocation are owner-only actions requiring private evidence.