Alpha Readiness Gap Map: App + Admin + Merchant โ
Date: 2026-08-03 For: December 2026 invite-only Soft Alpha (small invited group, 1-2 San Diego venues, scheduled "lantern evenings," heavy monitoring). Alpha goals: validate the last-ten-feet meeting mechanic + measure whether people felt safe and comfortable, across everyone present rather than any single group. Source: three parallel read-only code audits (user app, admin portal, merchant portal), 2026-08-03. Verified by reading code, NOT by runtime execution, so some items are deploy/data questions, not code questions (flagged in Caveats).
Headline โ
| Surface | State | One-line |
|---|---|---|
User app (apps/web) | Strong | The core loop is code-complete end to end. Remaining items are operational + one copy bug, not missing features. |
Admin portal (apps/admin/src/admin) | Mostly strong | Invites, user management, moderation, and live monitoring are genuinely wired. Gaps are on the supply side (adding venues, offer review). |
Merchant portal (apps/admin/src/merchant) | Works only with a human in the loop | A merchant can go end to end ONLY if an admin manually bridges the middle. The application โ approval โ account seam is not wired in software. |
The theme: the app that invited users touch is in good shape. The heavy-hitter work is on the supply/operations side (admin + merchant): getting venues in, wiring the merchant onboarding seam, and the offer flow.
Ranked heavy-hitter backlog โ
Tier 1 - Build these (alpha-gating) โ
Live status (2026-08-04): all Tier-1 on branch
feat/admin-venue-creation(draft PR #788). #1 DONE (issue #786, specdocs/planning/specs/2026-08-04-admin-venue-creation-design.md): server-side admin-gated create/edit on venues-api (not in-portal OSM import, not client-rule loosening). #3 DONE (issue #789): lantern TTL = 2h (operator); copy + AGENTS.md aligned (server constant was already 2h; the 48h is doc-cleanup, and the separate location-history feature stays 48h). #2 DONE (issue #790): admin merchant-application review queue + human-in-the-loop approve (list/status endpoints on auth-api; Review prefills the proven CreateMerchantForm, which provisions + marks approved; reject; WIP label dropped). All Tier-1 build items landed this session.
Venue creation / seeding from the admin portal. Converged across ALL THREE audits. There is no admin UI to create or edit a net-new venue; venues only enter the
venuescollection via OSM import that lives in the web app / CLI, not the portal (components/venues/AdminVenuePicker.jsxis pick-only,config/ConfigVenue.jsxis import-config-only,services/api/venues/src/routes/import.jshas no portal trigger). Without a venue: no lanterns can be lit, and merchants have nothing to associate an offer with. Fix: a minimal "Add / edit venue" admin form, or a reliable admin-triggered import for the 1-2 alpha venues. This de-risks the whole supply side.Merchant onboarding seam: application-review โ provision. The self-serve application (
POST /merchants/applyโmerchant_applicationsdoc, works) is read-only to everything but the Firestore console; NO admin UI lists or approves it (apps/admin/src/admin/merchants/). Account creation is a separate, hand-retyped "Create Merchant" form still labelled "๐ง Work in Progress" (CreateMerchantForm.jsx:82), and the underlyingcreateMerchantUseractually works. Plus a merchant can't self-associate a venue, so every offer create 400sVENUE_NOT_ASSOCIATEDuntil an admin links a venue (admin-only endpoint,services/api/auth/src/index.js:168). Fix: an admin "merchant applications" view that approves โ provisions the account viacreateMerchantUserAND associates a venue; drop the stale WIP label. (Survivable manually for 1-2 merchants, but this is the biggest merchant gap.)Lantern TTL copy defect (2h vs 48h). Server TTL is 2h (
services/api/lanterns/src/services/lantern.service.js:27) but the UI tells users "48 hours" in three places (LightLanternForm.jsx:369,375,LightLanternModal.jsx:297), and AGENTS.md's collections note also says 48h. Quick, but users are told the wrong thing about how long their lantern lasts. Fix: decide the intended duration (2h fits a "who's here right now" evening), then align copy + the constant + docs.
Tier 2 - Verify / operational (mostly not "build") โ
Live two-account E2E of the full app loop. Every endpoint (auth key-directory, sever, push functions) was verified by READING code, not runtime. The block-sever E2E harness on this branch (
test/144-block-sever-e2e, PR #778) already runs signup โ light โ wave โ accept โ message โ block+save-copy green on deployed dev; extend/confirm it covers push delivery to close the code-vs-runtime gap.Pre-warm the alpha venue data in dev Firestore before the first lantern evening, so no user hits a slow/failing cold OSM import on first visit (
apps/web/src/lib/venueService.js:369-466). Tied to Tier-1 #1.iOS PWA push verification (#722). Push code is correct for Android/desktop Chrome; iOS Safari needs the PWA installed to home screen and there's no iPhone on the team. If any invited user is on iPhone, verify via a borrowed device / BrowserStack, or set expectations.
Tier 3 - Decisions / policy (may need little or no code) โ
Offer moderation gate (or explicit decision not to have one). Flagged by both admin + merchant audits: a merchant "Publish" flips an offer straight to
activeand it surfaces to nearby users with no independent review (services/api/merchants/src/routes/offers.js). Fine if alpha merchants are trusted; otherwise add a pending โ approve state. At minimum, decide and document.Monitoring auto-refresh. The venue-activity dashboard shows real live data (active lanterns/waves/connections now) but is manual-Refresh only (
analytics/VenueActivityDashboard.jsx). Add a 15-30s poll so the team can watch a lantern evening without clicking.Live venue discovery (decision). Venue lantern discovery is a one-shot refetch, not
onSnapshot(deliberate, for pin de-identification), so a lantern lit while someone is already viewing the venue appears only after reopen/foreground (screens/dashboard/Dashboard.jsx). Decide if acceptable for a synchronized evening or add a light poll / pull-to-refresh.
Defer (not alpha-gating at 1-2 venues) โ
- Per-lantern / per-wave live moderation (moderation acts on users; ban the user).
- Merchant Photos tab uploader (stub; hero imagery via
heroPhotoUrl). - Merchant self-service venue linking (admin does it during onboarding).
- Self-serve merchant-application review beyond Tier-1 #2 (admin-creates covers 1-2 merchants).
Per-surface status (from the audits) โ
User app (apps/web): core loop code-complete โ
Signup+login (invite-gated), onboarding/profile, location+venue, lighting, see+wave, accept+real OS push, E2EE chat (Olm/Megolm), block/report (#144/#776): all WORK, wired to real Cloud Run + Firestore + FCM, no stubs or off-flags on the invited-user path. Risks: venue pre-warm (op), iOS push (device), TTL copy (bug), non-live discovery (UX), runtime-unverified (verification).
Admin portal (apps/admin/src/admin): ops wired, supply thin โ
WORKS: invite generation, user management (list/detail/ban/role/delete), moderation (live report cases, enforcement, appeals, manual ban), monitoring/analytics (live active-lanterns/waves/connections, manual-refresh). PARTIAL/MISSING: venue create (no portal path: Tier-1 #1), offer approval gate (none), merchant-application review (none; admin creates directly). Note: admin/feature-tracker/ is a GitHub-issues viewer, NOT a readiness manifest.
Merchant portal (apps/admin/src/merchant): end-to-end only with an admin bridging โ
WORKS: signup/application (MerchantSignup โ merchant_applications), merchant login + portal (real role:'merchant' auth, createMerchantUser + set-password link, MerchantShell routing), offer authoring UI + POST /offers. BROKEN/BLOCKED SEAMS: applicationโaccount handoff (Tier-1 #2), venue self-association (offers hard-blocked), no offer moderation, Photos stub, stale WIP label.
Caveats โ
- All three audits are read-only (code, not runtime). Server endpoint behavior was confirmed to exist with correct client contracts, but not exercised live.
- Open deploy/data questions (not code): do the 1-2 San Diego alpha venues already exist in the dev
venuescollection? Are analytics-api + BigQuery healthy on dev? Is the push Cloud Function currently deployed and running onlantern-app-dev? These need a quick live/gcloud check, not a code change.