Outcome
The public /shop page must show one fixed, plain retry message when its product catalog cannot load. It must never inspect, render, or log a rejected Firestore, SDK, provider, or exception value to an anonymous visitor.
Fixed public message:
We could not load the shop right now. Please try again later.
Current defect
src/pages/shop/Shop.tsx catches the rejected catalog request and renders err.message directly. The route is public, so a crawler or anonymous visitor can receive provider diagnostics, project identifiers, paths, or other private detail.
Invariant
- do not capture or inspect the rejection
- stop the loading state and show exactly one accessible fixed result
- do not emit the rejection through browser console output
- preserve the existing empty-catalog and successful product projections
- make no Firebase/provider call in tests and use no real visitor, member, product, or order data
Exact scope
src/pages/shop/Shop.tsx
- only the catalog rejection hunk and error paragraph accessibility attributes
src/App.test.jsx
- additive Shop imports/mocks, service-locator mock control, and one focused actual-Shop describe
docs/officers/EVENTS_SHOP_MEMBERS.md
- separately named
Public Shop catalog failure privacy — SOURCE ONLY, NOT LIVE section only
Everything else is excluded, including shop service/product/checkout/Functions/Rules/root docs/lint/workflows/packages/provider/deploy/data paths and all #249/#246 commerce paths.
Acceptance
Safety and deployment truth
Tests use only made-up values and mocks. Do not contact Firebase, Stripe, or another provider; inspect a real account/order/catalog; change provider configuration; or use production data. Source, tests, merge, preview, and green CI do not prove the website, Firebase, provider, or live behavior changed.
Outcome
The public
/shoppage must show one fixed, plain retry message when its product catalog cannot load. It must never inspect, render, or log a rejected Firestore, SDK, provider, or exception value to an anonymous visitor.Fixed public message:
We could not load the shop right now. Please try again later.Current defect
src/pages/shop/Shop.tsxcatches the rejected catalog request and renderserr.messagedirectly. The route is public, so a crawler or anonymous visitor can receive provider diagnostics, project identifiers, paths, or other private detail.Invariant
Exact scope
src/pages/shop/Shop.tsxsrc/App.test.jsxdocs/officers/EVENTS_SHOP_MEMBERS.mdPublic Shop catalog failure privacy — SOURCE ONLY, NOT LIVEsection onlyEverything else is excluded, including shop service/product/checkout/Functions/Rules/root docs/lint/workflows/packages/provider/deploy/data paths and all #249/#246 commerce paths.
Acceptance
messagegetter is never accessed.Safety and deployment truth
Tests use only made-up values and mocks. Do not contact Firebase, Stripe, or another provider; inspect a real account/order/catalog; change provider configuration; or use production data. Source, tests, merge, preview, and green CI do not prove the website, Firebase, provider, or live behavior changed.