From 92ffdd4a67ee1ba14cfbba9d6547bf340ae23303 Mon Sep 17 00:00:00 2001
From: Dave Liu <7david12liu@gmail.com>
Date: Tue, 13 Oct 2026 12:23:37 -0700
Subject: [PATCH 1/2] feat(staging): prepare private fictional race member
screen
---
.github/lint-baseline.json | 13 +-
GITHUB_ISSUES.md | 2 +
IMPLEMENTATION_PLAN.md | 2 +
OFFICER_START_HERE.md | 2 +
OPERATIONS_RUNBOOK.md | 2 +
SECURITY.md | 2 +
STRIPE_COMMERCE_DESIGN.md | 2 +
SYSTEM_DESIGN.md | 2 +
docs/officers/EVENTS_SHOP_MEMBERS.md | 2 +
docs/officers/README.md | 2 +
docs/officers/STAGING_COMMUNITY.md | 31 ++
docs/officers/SYSTEM_MAPS.md | 16 +
src/App.jsx | 2 +
src/pages/community/Community.tsx | 2 +
src/pages/community/FictionalRaces.test.tsx | 466 ++++++++++++++++++
src/pages/community/FictionalRaces.tsx | 426 ++++++++++++++++
.../community/fictionalRaceService.test.ts | 312 ++++++++++++
.../community/fictionalRaceService.ts | 251 ++++++++++
.../testSupport/fictionalRaceFixtures.ts | 98 ++++
19 files changed, 1631 insertions(+), 4 deletions(-)
create mode 100644 src/pages/community/FictionalRaces.test.tsx
create mode 100644 src/pages/community/FictionalRaces.tsx
create mode 100644 src/services/community/fictionalRaceService.test.ts
create mode 100644 src/services/community/fictionalRaceService.ts
create mode 100644 src/services/community/testSupport/fictionalRaceFixtures.ts
diff --git a/.github/lint-baseline.json b/.github/lint-baseline.json
index f11a093..56e4ff3 100644
--- a/.github/lint-baseline.json
+++ b/.github/lint-baseline.json
@@ -10,12 +10,12 @@
"targets": [
"src"
],
- "scannedFileCount": 126,
+ "scannedFileCount": 131,
"scannedFilesByExtension": {
".js": 12,
".jsx": 35,
- ".ts": 45,
- ".tsx": 34
+ ".ts": 48,
+ ".tsx": 36
},
"errorCount": 113,
"warningCount": 6,
@@ -31,7 +31,7 @@
".ts": 0,
".tsx": 6
},
- "fingerprint": "sha256:4edc2ab0b2f1376f47775011308236333cdd8e676b4cc325a1f55691fe000be6",
+ "fingerprint": "sha256:5ba90c83db63c37a2a3cf738e5d923ba77d172937d79153896e5a2eea3133878",
"scannedFiles": [
"src/App.jsx",
"src/App.test.jsx",
@@ -83,6 +83,8 @@
"src/pages/community/Community.tsx",
"src/pages/community/CommunityAdmin.test.tsx",
"src/pages/community/CommunityAdmin.tsx",
+ "src/pages/community/FictionalRaces.test.tsx",
+ "src/pages/community/FictionalRaces.tsx",
"src/pages/contact/Contact.jsx",
"src/pages/events/EventCalendar.tsx",
"src/pages/events/EventDetail.tsx",
@@ -128,6 +130,9 @@
"src/services/analytics/analytics.ts",
"src/services/community/communityService.test.ts",
"src/services/community/communityService.ts",
+ "src/services/community/fictionalRaceService.test.ts",
+ "src/services/community/fictionalRaceService.ts",
+ "src/services/community/testSupport/fictionalRaceFixtures.ts",
"src/services/events/adminService.ts",
"src/services/events/eventsService.ts",
"src/services/firebase/FirebaseResources.test.ts",
diff --git a/GITHUB_ISSUES.md b/GITHUB_ISSUES.md
index 5949f0b..1bc539d 100644
--- a/GITHUB_ISSUES.md
+++ b/GITHUB_ISSUES.md
@@ -1,5 +1,7 @@
# GitHub Issue Backlog: Secure Commerce Program
+**RACE-SIM-001C / #731 — CLIENT SOURCE PREPARED, OPEN:** closed staging request/status/ack parsing and `/community/races` screen cover synthetic signup, cancellation/full credit return, private offer/recipient waiver acceptance/revoke, exact retry and context/stale-state clearing. No migration, money/provider action, dependency/service/workflow/IAM/Rules allowance. Officer impact: planned supervised fictional screen, NOT AVAILABLE YET. Officer documentation: STAGING_COMMUNITY, entrypoints, EVENTS_SHOP_MEMBERS and SYSTEM_MAPS. Deployment evidence: local doubles/full checks only at this milestone; genuine native security, exact backend-first Function/Hosting release, actual screens and fenced cleanup remain required. #732's backend source is merged; neither source milestone closes #731 or the full backend goal.
+
**RACE-SIM-001C1 / #732 — SOURCE / DEMO ONLY:** child of open #731. Exact race-prefixed native-context routing, explicit same-project SDK app, current disposable authority/metadata, closed twenty-race manifest and consistent private read-only status. No broad query/Auth roster, other UID/contact/waiver/history/count/capacity/financial total projection; exact incoming offer only and uniform missing/unrelated denial. Fresh post-read time; original credit/index/retry and lost-recipient owner recovery preserved. Deterministic archive includes all necessary relative imports. Officer impact: race screens remain NOT AVAILABLE YET. Officer documentation: staging guide, entrypoints, Events-Shop-Members, maps and root status. Deployment evidence: none from this child; source/double/native-wrapper tests with mocked verifiers and actual demo SDK proof are not genuine hosted identity/App Check/deployment/UI. No production/payment/service/IAM/dependency/workflow/Rules-allowance/migration change. #731 retains typed client/screen, exact backend-first release, genuine security/UI/mobile/failure proof and exact owned hosted cleanup; the full backend goal stays open.
**COMMUNITY-DUES-002 / #719 — STAGING VERIFIED 2026-10-12:** one immutable fictional receipt links deliberately to one owner-marked disposable pending account and activates its unchanged current test term. Separate v3 capability, recent native TOTP/App Check, authoritative verified/enabled Auth, exact guards, atomic uniqueness and permission-first replay; no real policy/data/money, Auth claim, IAM/service/schedule/dependency/production change. Officer impact: supervised screen-only linking and cancellation/original-expiry verification. Officer documentation: STAGING_COMMUNITY, entrypoints, ACCESS_CONTINUITY, EVENTS_SHOP_MEMBERS, glossary and maps. Deployment evidence: PR720 merged b6a8fd57d9add466da73df1d33b69e131e3fecbd after six exact PR/main jobs and every step passed. Native communityActions version 4 and staging Hosting match that source; the downloaded 91,793-byte archive matches SHA-256 47f11b8bec7f5ae58281c9029a015e9cc751a04e5ad3eafe3234441fa3a963db. Forty-four hosted cases (32 denial cases), atomic races, immutable retries, actual officer/member UI, offline retry, phone-size DOM layout, cancellation and natural expiry passed. Six disposable users and 47 exact owned documents were removed; native absence and late profiles were verified. Both capabilities were disabled first; browser sign-out, Apps-on-device OFF, normal networking/viewport, closed tab/receiver and memory disposal complete the test handoff. Profiles v2/v1/2843388, App Check/MFA and the six-permission min0/max2 runtime remain unchanged. The release command reported its existing generic post-deploy failure; independent native checks qualified the result without repeating deployment or bypassing a guard. Reporting cause remains unqualified. Production/runmprc.com and real payments were untouched. #716 remains historical recording-only proof; broad #115/#81 and real launch are separate.
diff --git a/IMPLEMENTATION_PLAN.md b/IMPLEMENTATION_PLAN.md
index 6b03c6a..f81ab79 100644
--- a/IMPLEMENTATION_PLAN.md
+++ b/IMPLEMENTATION_PLAN.md
@@ -1,5 +1,7 @@
# MPRC Secure Commerce Implementation Plan
+**#731 client milestone — SOURCE PREPARED:** strict staging client and minimal member screen now have local positive/negative/context/failure/retry/expiry tests. Review and merge this source independently of deployment. Next verify all six exact current-main jobs/every step, deploy/read back the changed backend archive first, then publish staging Hosting and finish genuine security/actual UI/mobile/failure/expiry/owned cleanup. No new service/dependency/workflow/IAM or production/payment work; #731 and the broader backend goal remain open until native acceptance.
+
**#731 review split / #732 — SOURCE / DEMO ONLY:** first review exact callable routing, explicit SDK realm, private bounded read-only status and deterministic archive independently. Current source/double, native-wrapper-with-mocked-verifiers and actual demo transaction/metadata tests qualify only that child. Then #731 adds strict client parsing, context fences and minimal fictional member screens; exact green-main backend archive must deploy/verify before staging Hosting. Genuine native Auth/App Check denials, actual UI/retry/expiry/recipient-loss/mobile proof and exact owned hosted cleanup are still required. No production, real payments, new service/dependency/workflow/IAM, backfill or broader goal completion is implied; earlier #727/#729 nonintegration notes are historical.
**#729 progression — SOURCE / DEMO ONLY:** implement fictional entry creation, unique enrollment and atomic transitions/immutable retries before screens. Bounded native Auth metadata, expiring disposable authority and exact SDK realm checks are tested with real demo transactions; existing Rules deny the nine namespaces. Continue with platform-verified caller/App Check, minimal status/RPC/client contracts and exact backend-first staging release/UI/owned cleanup. No current deployed import, new workflow/service/IAM, financial or production action; #727/#729 are dependencies, not full backend completion.
diff --git a/OFFICER_START_HERE.md b/OFFICER_START_HERE.md
index c49ced8..443d229 100644
--- a/OFFICER_START_HERE.md
+++ b/OFFICER_START_HERE.md
@@ -1,5 +1,7 @@
# MPRC Website: Officer Start Here
+**#731 fictional race screen — SOURCE PREPARED, NOT AVAILABLE YET:** the [planned review](./docs/officers/STAGING_COMMUNITY.md#fictional-race-member-screen--731-source-prepared) covers signup, fictional credit return and private recipient-accepted bib transfer. Local screen tests are not hosted proof. Dave/platform specialist must verify staging release, security, real screens and cleanup first; production and real payments remain untouched.
+
**Fictional race boundary — #732, SOURCE / DEMO ONLY:** safe backend routing and private test status are prepared, but there is no new deployed race screen yet. Use the [source review](./docs/officers/STAGING_COMMUNITY.md#fictional-race-boundary--732-source-only) to ask for proof. #731 still needs actual staging release, disposable screens and cleanup. Do not use legacy refund/substitute controls or real member/payment details.
**Member status — #724, STAGING VERIFIED 2026-10-13:** the member page separates event availability from stored signup history and hides old status after a failed read. Actual screens, exact retry, natural test-term expiry and disposable cleanup passed. Use the [screen-only review](./docs/officers/STAGING_COMMUNITY.md#current-member-status--724-staging-verified) with fresh specialist-supplied fictional fixtures. Production and real payments remain unavailable.
diff --git a/OPERATIONS_RUNBOOK.md b/OPERATIONS_RUNBOOK.md
index 6db9ba0..661522a 100644
--- a/OPERATIONS_RUNBOOK.md
+++ b/OPERATIONS_RUNBOOK.md
@@ -1,5 +1,7 @@
# MPRC Platform Operations Runbook
+**#731 member screen — SOURCE PREPARED, NOT AVAILABLE YET:** use the [planned no-terminal review](./docs/officers/STAGING_COMMUNITY.md#fictional-race-member-screen--731-source-prepared) only after the specialist supplies native release/security/UI/cleanup proof and fresh private fixtures. Keep the same fixed staging target and resource limits; no new polling, scheduler or financial provider. Account/permission/config supply, backend-first deployment/readback and fenced cleanup/rollback remain specialist-only. Existing v5/Hosting485be670 are historical deployed proof, not race-screen proof; production and real payments stay untouched.
+
**#732 source boundary — NOT DEPLOYED:** race routes/status are now connected in source and included in the prepared archive, not the existing staging v5 runtime or website. `communityConfig/fictionalRaces` must be an exact fictional manifest with no more than twenty IDs; missing/corrupt configuration denies rather than discovering entries. Current caller marker/own-entry permission and verified/enabled Auth are required for status too. Own history and privately supplied named offers only; no officer queries a roster, edits records or enters real details. Status uses consistent reads and fresh time, adds no write/poll or scheduled cleanup. #731's specialist must supply fixtures, exact green reviewed release, genuine security/UI proof and identity/update-time-fenced cleanup before the screen becomes available. Source rollback is a reviewed revert; there is no cloud change from this child to undo. Keep the existing exact staging/rollback proof and six-permission/min0/max2/256MB/30s scope. Historical #727/#729 archive-exclusion notes describe older milestones; production and real payments remain untouched.
**#729 fictional persistence — SOURCE / DEMO ONLY:** no current service release is needed: new files remain outside the deployed entrypoint/archive. Local tests use only explicitly selected loopback Auth/Firestore demo SDKs; caller context is synthetic, not genuine native token/App Check proof. Nine server-only namespaces hold fictional event/policy/entry/enrollment/target/permission/command/audit/rate state. A specialist supplies current expiring markers and own-entry permissions for actors and relevant verified/enabled disposable mutation targets; receipts never override caller revocation/expiry, missing indexes or corrupt state. Read-only acknowledgement and owner withdrawal do not require continued recipient access. No member/officer edits a record, enters real payment data or uses a legacy substitute/refund control. Keep real policy/provider money and production untouched. Future callable/client integration and exact hosted security/UI/cleanup evidence remain unavailable. Local cleanup removes only task-owned demo Auth UIDs and test namespaces, verifies absence and shuts down emulators before removing owned idle logs; no retention/backfill/hosted cleanup decision is made here.
diff --git a/SECURITY.md b/SECURITY.md
index 4b9551b..cf5c83b 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -1,5 +1,7 @@
# MPRC Security, Privacy, and Risk Plan
+**#731 client — SOURCE PREPARED, NOT DEPLOYED:** closed plain-object/array parsing rejects extra fields, accessors, coercions, malformed bounds and mismatched request acknowledgements before display. UI/transport bind the same verified disposable SDK account/app/default tenant; observed session epochs fence even same-UID renewals. No token extraction/logging, direct database access or runner directory. Failed/uncertain reads and known deadlines remove old controls; exact saved retries never cross account/session/provider changes. These local tests use SDK/service doubles, not genuine hosted Auth/App Check proof; server authority, native release and hosted acceptance remain required.
+
**#732 race routing/status — SOURCE / DEMO ONLY:** clone bounded closed input before inspecting its action; only six exact race-prefixed routes enter the existing native callable wrapper. Platform-verified UID/claims and App Check are required, never browser flags. Status also requires current exact expiring marker/own-entry permission, default-tenant recent verified password context and enabled/verified native caller metadata. A consistent read-only transaction reads at most twenty configured races, caller indexes and necessary exact entry/index records, not a query/roster or broad Auth lookup. Only own state and an exactly named offer to the caller are projected; no other UID/contact/waiver/count/capacity/total is returned. Missing/unrelated incoming IDs share one fixed denial. Fresh post-read time prevents slow reads extending access/availability. SDK/config/state errors are redacted; status writes nothing. The archive now includes these source helpers, with no Rules allowance or runtime permission expansion. Historical #727/#729 integration limits are superseded in source only: native HTTP tests mock verifiers, demo caller context remains synthetic, no deployed native token/App Check/UI qualification exists yet, and Auth metadata is still not locked by a Firestore transaction.
**#729 fictional server transactions — SOURCE / DEMO ONLY:** strict account-bound commands, closed record/config/grant schemas, exact staging/demo app/realm, unsupported-tenant denial, current expiring marker/own-entry permission and bounded read-only verified/enabled Auth metadata checks precede both mutation and receipt replay. Original/current runner enrollment indexes must match; orphans and corrupt receipts deny. Server controls fictitious cents, bib, deadlines, counts, waiver and revisions; unknown price/role/profile fields reject before Auth lookup. Atomic fingerprinted receipt/audit/rate plus entry/index/count state resolves retries/races; no mutable audit array or request/token/profile logging. Browser reads/lists/creates/updates/deletes remain denied, even for admins, by unchanged Rules. These source/demo tests supply no native callable token-signature or App Check proof and no instantaneous Auth/Firestore distributed revocation guarantee. No deployed integration, IAM/service/dependency or real financial/production change; genuine platform binding and hosted denial/UI/cleanup proof remain required.
diff --git a/STRIPE_COMMERCE_DESIGN.md b/STRIPE_COMMERCE_DESIGN.md
index 88270ee..ba28b8d 100644
--- a/STRIPE_COMMERCE_DESIGN.md
+++ b/STRIPE_COMMERCE_DESIGN.md
@@ -1,5 +1,7 @@
# Stripe, Race Registration, and Merchandise Design
+**#731 member screen — SOURCE PREPARED, NOT DEPLOYED:** UI labels all amounts and returns fictional credit, never paid/refunded money. It accepts no client price, deadline, finance role or runner profile; transfer keeps the original credit owner. No provider SDK, Checkout, payment/refund object or real rule is added. Hosted staging release/UI/security/cleanup remain open; finance/MFA/provider reconciliation and production gates are unchanged.
+
**#732 boundary — SOURCE / DEMO ONLY:** exact staging race RPC routing and minimal own-entry status now exist in source, without any Checkout, PaymentIntent, Refund, provider state or real-money action. Simulated credits are explicitly fictional integer cents. No client price/deadline/recipient profile or finance-role bypass; original credit/waiver/bib and immutable retry behavior remain #729's rules. Native HTTP tests use verifier doubles; real local Auth metadata/Firestore tests are not hosted identity/App Check proof. #731 still owns client and genuine hosted acceptance. This child does not deploy, establish real club rules, replace finance permission/recent MFA/provider reconciliation, or close real refund/transfer launch blockers. Earlier #727/#729 nonintegration statements are historical milestone boundaries.
**#729 simulation persistence — SOURCE / DEMO ONLY:** server-configured fictional entry creation and atomic simulated credit return/bib transfer use separate records and never Stripe/payment state. No client amount, discount, refund total, arbitrary runner profile or offer deadline is accepted. Original fictitious credit remains immutable; transferred runners cannot redirect it. Same-command receipts replay without writes after renewed authority/identity/state checks; lost-acknowledgement recovery and native demo final-seat/competing transitions are tested. Read-only Auth metadata is the only external dependency of the transaction, not a provider money action. Default-tenant verified password context here is for member-owned fictional credits only; it does not replace finance capability/recent MFA, provider truth, refund operation/reconciliation or real policy gates. No live callable/client/deployment from this child.
diff --git a/SYSTEM_DESIGN.md b/SYSTEM_DESIGN.md
index c9ca8a6..ddd0357 100644
--- a/SYSTEM_DESIGN.md
+++ b/SYSTEM_DESIGN.md
@@ -1,5 +1,7 @@
# MPRC Platform System Design
+**#731 member screen — SOURCE PREPARED, NOT DEPLOYED:** a separate `/community/races` route/link uses the same staging service, exact bounded DTOs and server-supplied entry IDs/revisions. Same Auth/Functions app, verified disposable caller, default tenant and session/provider generation fences prevent late cross-context display/retry. Failed reads hide old controls; saved commands retry exactly; acceptance rereads own status without the consumed offer. Conservative deadline timers clear status without polling. No migration, runtime/Rules/IAM/service/dependency change or money action; genuine native security, backend-first release, actual screens and fenced cleanup remain open.
+
**#732 fictional race boundary — SOURCE / DEMO ONLY:** #731 is split for review: this child connects exact race-prefixed routes to the existing callable source and adds read-only `race_status`. Firebase supplies verified caller/App Check context; recent default-tenant password claims, live expiring disposable marker/own-entry permission and current native caller metadata remain mandatory. The explicitly selected app/project has no production fallback. A closed `communityConfig/fictionalRaces` manifest lists at most twenty exact event IDs. One read-only transaction projects validated event policy, own enrollment/entry and only an exactly named incoming offer. It returns no other UID/contact/waiver/history, capacity/count or financial total; missing/unrelated offer IDs deny identically. Fresh time after reads fences access/window/offer expiry; owner status/revoke survives recipient loss. Additive configuration, unchanged browser denial and complete deterministic archive only; no migration, new service/dependency/workflow/IAM or cloud deployment. Historical #727/#729 paragraphs describe their source milestones, not the new connected source. Client screens, genuine hosted security, exact backend-first deployment and cleanup remain #731 gates; #724's deployed service/website are unchanged by this child.
**#729 fictional race transactions — SOURCE / DEMO ONLY:** an unconnected server service uses an explicitly same-project SDK app in staging with commerce disabled, or loopback Auth/Firestore under a demo project. Exact expiring disposable markers and per-account `manageOwnEntry` permission precede at most three native Auth metadata reads; verified/enabled accounts and a recent default-tenant password context are required. Browser flags/admin roles grant nothing. A server-only fictional policy supplies amount/window/waiver; deterministic entry/bib and unique per-event enrollment prevent duplicate seats and two bibs for one recipient. Event/entry/index plus immutable fingerprinted request receipt, append audit and rate update commit atomically. Current authority/identity/index/state checks precede even old receipt replay; replay is read-only, never current eligibility or payment proof. Time is sampled after all reads before writes. Original fictional credit/bib/waiver are preserved. One simulation enrollment per account/event, with no rejoin after cancellation/transfer, is a technical test rule only. Local real SDK transaction/race tests and existing Rules denials qualify source, not native token verification/App Check or hosted callable/UI. No current entrypoint/client/archive integration, migration, IAM/service/dependency/workflow, provider-money or production action. Auth metadata is not transactionally locked with Firestore; its check is admission evidence, not instant cross-service revocation.
diff --git a/docs/officers/EVENTS_SHOP_MEMBERS.md b/docs/officers/EVENTS_SHOP_MEMBERS.md
index ef29841..a1aa5ac 100644
--- a/docs/officers/EVENTS_SHOP_MEMBERS.md
+++ b/docs/officers/EVENTS_SHOP_MEMBERS.md
@@ -1,5 +1,7 @@
# Events, Shop, Members, and Money
+**#731 member screen — SOURCE PREPARED, NOT AVAILABLE YET:** the [planned screen review](./STAGING_COMMUNITY.md#fictional-race-member-screen--731-source-prepared) covers fictional signup, credit return and privately named bib offers/acceptance/revocation. Native staging release/security/screens/cleanup still require the specialist; local service doubles do not prove hosted behavior. No real refund, payment, club policy or production change is available.
+
**#732 race boundary — SOURCE / DEMO ONLY:** [read the short handoff](./STAGING_COMMUNITY.md#fictional-race-boundary--732-source-only) before any review. Backend source now includes exact fictional race actions and own-entry status, but no new deployed screen or genuine hosted proof. #731 must finish that release and cleanup. No real refund, payment, policy, runner directory or record-edit procedure is available. Earlier #727/#729 paragraphs are historical milestone limits.
**#719 fictional linking — STAGING VERIFIED 2026-10-12:** the [supervised screen procedure](./STAGING_COMMUNITY.md#link-a-fictional-receipt--719) deliberately connects an immutable fictional receipt to one specialist-marked disposable pending account. Real screens verified activation, cancellation through the unchanged original term and inactive status after natural expiry. Old test fixtures are removed; ask the specialist for fresh private setup. No real policy/payment/claim/renewal/refund/production launch is supplied. Stop on an uncertain ID/revision or changed term and contact Dave privately.
diff --git a/docs/officers/README.md b/docs/officers/README.md
index 72e5031..5674434 100644
--- a/docs/officers/README.md
+++ b/docs/officers/README.md
@@ -1,5 +1,7 @@
# Officer Website Handbook
+[#731's fictional race screen](./STAGING_COMMUNITY.md#fictional-race-member-screen--731-source-prepared) is source prepared, **NOT AVAILABLE YET**. A separate dated native release/security/screen/cleanup receipt is required before the planned review. No real payment, policy or production change is supplied.
+
[#732's fictional race backend review](./STAGING_COMMUNITY.md#fictional-race-boundary--732-source-only) is SOURCE / DEMO ONLY. No new race screen or cloud release is supplied by that child. #731 retains genuine staging security, screen, release and cleanup requirements; only the specialist supplies fixtures/provider proof. Production and real payments remain unavailable.
[#724 member status](./STAGING_COMMUNITY.md#current-member-status--724-staging-verified) passed native staging release, actual availability/cancellation/failure/retry screens, natural test-term expiry and exact owned cleanup on 2026-10-13. Fresh specialist-supplied fictional fixtures are required. No production or real payment behavior is included.
diff --git a/docs/officers/STAGING_COMMUNITY.md b/docs/officers/STAGING_COMMUNITY.md
index c60f559..62b2b18 100644
--- a/docs/officers/STAGING_COMMUNITY.md
+++ b/docs/officers/STAGING_COMMUNITY.md
@@ -27,6 +27,37 @@
## What the actions mean
+## Fictional race member screen — #731 source prepared
+
+**Status:** SOURCE PREPARED, **NOT AVAILABLE YET**. The staging-only `/community/races` screen has signup, simulated credit return, private bib offers, acceptance and revocation in source. Local screen tests use service doubles, not genuine hosted identities or attestation. The #732 section describes the earlier backend milestone. No race release or hosted cleanup proof is claimed here.
+
+**Purpose:** review the intended test flow without mistaking fictional credit for money. **Approver/escalation:** Dave, sole staging owner; no backup is appointed. **Prerequisites:** Dave/platform specialist must first supply dated native security, exact backend-first Function/Hosting release, disposable screen and fenced cleanup evidence. Fresh verified disposable accounts, expiring permissions and private test IDs are separate prerequisites. Until then, do not try these steps on a website.
+
+Planned supervised screen review — **NOT AVAILABLE YET**:
+
+1. Open only the supplied staging `/community/races` link.
+2. Confirm **Staging test only** and fictional credit, not money.
+3. Sign in as the supplied verified disposable account.
+4. Accept the synthetic test waiver and select **Join fictional race** once.
+5. Confirm your enrollment and private test entry ID.
+6. For cancellation, select **Cancel and simulate full credit return**.
+7. Confirm a cancelled entry and fictional credit return, not a bank refund.
+8. For a separate transfer test, enter the supplied **Private disposable recipient ID**.
+9. Select **Offer fictional bib transfer**.
+10. Supply the exact test entry ID privately to the test recipient.
+11. Sign out, then sign in as that disposable recipient.
+12. Enter the **Private incoming test entry ID** and select **Check named offer**.
+13. Accept the recipient's synthetic waiver and select **Accept fictional bib transfer** once.
+14. Confirm your own entry appears and the incoming offer disappears.
+15. For a separate withdrawal test, the original runner selects **Revoke fictional offer** before cancellation.
+16. If uncertain, use **Retry saved action** or refresh; do not start another action.
+17. If a named offer is unavailable, select **Show only my entries**, not another guessed ID.
+18. Sign out and ask for the exact disposable cleanup receipt.
+
+**Expected result:** only your own entry or an exactly named offer to you is shown. Transfer preserves the bib and original credit owner; it creates no second place. One enrollment ever and one transfer are test limits, not club policy. Old controls disappear after a failed read or known deadline. An exact saved action may be retried only within the same account/session; fresh successful status restores controls. No polling, email, directory, card or provider payment is added.
+
+**Stop:** production, real person/payment information, missing permission, uncertain private ID, stale controls, real-money claims, or requests for secrets/record edits. **Success proof:** #731 must separately record source/full checks, merge, native Auth/App Check/security/archive/resource/unchanged profiles, Hosting marker, actual failure/retry/expiry/privacy/mobile screens, and fenced cleanup. This source review was read as an officer without a terminal; hosted steps are not qualified yet. **Undo:** sign out; Dave/specialist handles reviewed staging rollback or fixture cleanup. Setup, provider verification, permission revocation, cleanup and rollback remain specialist-only. Never post passwords, tokens, codes or member records to an issue or AI tool.
+
## Fictional race boundary — #732 source only
**Status:** SOURCE / DEMO ONLY, not deployed. #732 separates the backend review from #731's future screen and hosted acceptance. The source now routes exact fictional race actions through the existing authenticated service and prepares its complete release archive. A new private status read lists only configured fake races, the caller's own entry and an incoming offer named by its exact privately supplied test ID. It reveals no other account ID, contact detail, waiver, runner list, count, capacity or money total. It changes no record. Historical #727/#729 nonintegration statements below describe their earlier source milestones.
diff --git a/docs/officers/SYSTEM_MAPS.md b/docs/officers/SYSTEM_MAPS.md
index 5edff19..f1adf4c 100644
--- a/docs/officers/SYSTEM_MAPS.md
+++ b/docs/officers/SYSTEM_MAPS.md
@@ -2,6 +2,22 @@
These diagrams show where pages, information, and deployments go. Each diagram includes a one-sentence text version.
+## Fictional race member screen — #731 source prepared, not deployed
+
+```mermaid
+flowchart LR
+ Account["Same verified disposable staging session"] --> Screen["Private race screen; no runner directory"]
+ Screen --> Read["Strict bounded status or exact saved command"]
+ Read --> Server["Existing native Auth/App Check and server authority"]
+ Server --> Fresh["Fresh own status; acceptance consumes incoming offer"]
+ Fresh --> Screen
+ Change["Account/session change, failed read or known deadline"] --> Hide["Clear old controls; never reuse another context's action"]
+ Hide --> Screen
+ Gate["Exact native release, hosted UI/security and cleanup still required"] -.-> Screen
+```
+
+Text alternative: the source-only staging screen submits bounded private reads and exact saved commands through the existing server boundary, rereads own status after acceptance, and clears old controls on uncertainty or context changes; native release, hosted behavior and cleanup remain unverified.
+
## Fictional race boundary — #732 source and demo only
```mermaid
diff --git a/src/App.jsx b/src/App.jsx
index a1b4cdc..94dd1dd 100644
--- a/src/App.jsx
+++ b/src/App.jsx
@@ -31,6 +31,7 @@ import Terms from './pages/legal/Terms';
import Privacy from './pages/legal/Privacy';
import Community from './pages/community/Community';
import CommunityAdmin from './pages/community/CommunityAdmin';
+import FictionalRaces from './pages/community/FictionalRaces';
import { COMMUNITY_ENABLED } from './services/community/communityService';
// Admin pages are lazy-loaded so public visitors don't download the admin JS bundle.
@@ -90,6 +91,7 @@ function App() {
} />
{COMMUNITY_ENABLED && } />}
{COMMUNITY_ENABLED && } />}
+ {COMMUNITY_ENABLED && } />}
} />
} />
} />
diff --git a/src/pages/community/Community.tsx b/src/pages/community/Community.tsx
index 78fe06b..80fd7b3 100644
--- a/src/pages/community/Community.tsx
+++ b/src/pages/community/Community.tsx
@@ -123,6 +123,8 @@ export default function Community() {
Events
{' · '}
Officer tools (staging)
+ {' · '}
+ Fictional races (staging)
Staging test only. Made-up accounts and fictional credits, not money. No real race entry, payment or refund. Test rules: one enrollment ever and one transfer.
+ {event.entry.isOriginalCreditOwner ? 'The original fictional credit belongs to you.' : 'Any fictional credit return stays with the original owner, not the new runner.'}
+
+ {event.entry.offerExpiresAtMs !== null && (
+
+ Offer deadline:
+ {' '}
+ {new Date(event.entry.offerExpiresAtMs).toLocaleString()}
+ . Revoke the offer before cancelling.
+