ghostguild-org/app/components
Jennie Robinson Faber 208638e374 feat(launch): security and correctness fixes for 2026-05-01 launch
Day-of-launch deep-dive audit and remediation. 11 issues fixed across
security, correctness, and reliability. Tests: 698 → 758 passing
(+60), 0 failing, 2 skipped.

CRITICAL (security)

Fix #1 — HELCIM_API_TOKEN removed from runtimeConfig.public; dead
useHelcim.js deleted. Production token MUST BE ROTATED post-deploy
(was previously exposed in window.__NUXT__ payload).

Fix #2 — /api/helcim/customer gated with origin check + per-IP/email
rate limit + magic-link email verification (replaces unauthenticated
setAuthCookie). Adds payment-bridge token for paid-tier signup so
users can complete Helcim checkout before email verify. New utils:
server/utils/{magicLink,rateLimit}.js. UX: signup success copy now
prompts user to check email.

Fix #3 — /api/events/[id]/payment deleted (dead code with unauth
member-spoof bypass — processHelcimPayment was a permanent stub).
Removes processHelcimPayment export and eventPaymentSchema.

Fix #4 — /api/helcim/initialize-payment re-derives ticket amount
server-side via calculateTicketPrice and calculateSeriesTicketPrice.
Adds new series_ticket metadata type (was being shoved through
event_ticket with seriesId in metadata.eventId).

Fix #5 — /api/helcim/customer upgrades existing status:guest members
in place rather than rejecting with 409. Lowercases email at lookup;
preserves _id so prior event registrations stay linked.

HIGH (correctness / reliability)

Fix #6 — Daily reconciliation cron via Netlify scheduled function
(@daily). New: netlify.toml, netlify/functions/reconcile-payments.mjs,
server/api/internal/reconcile-payments.post.js. Shared-secret auth
via NUXT_RECONCILE_TOKEN env var. Inline 3-retry exponential backoff
on Helcim transactions API.

Fix #7 — validateBeforeSave: false on event subdoc saves (waitlist
endpoints) to dodge legacy location validators.

Fix #8 — /api/series/[id]/tickets/purchase always upserts a guest
Member when caller is unauthenticated, mirrors event-ticket flow
byte-for-byte. SeriesPassPurchase.vue adds guest-account hint and
client auth refresh on signedIn:true response.

Fix #9 — /api/members/cancel-subscription leaves status active per
ratified bylaws (was pending_payment). Adds lastCancelledAt audit
field on Member model. Indirectly fixes false-positive
detectStuckPendingPayment admin alert for cancelled members.

Fix #10 — /api/auth/verify uses validateBody with strict() Zod schema
(verifyMagicLinkSchema, max 2000 chars).

Fix #11 — 8 vitest cases for cancel-subscription handler (was
uncovered).

Specs and audit at docs/superpowers/specs/2026-04-25-fix-*.md and
docs/superpowers/plans/2026-04-25-launch-readiness-fixes.md.
LAUNCH_READINESS.md updated with new test count, 3 deploy-time
tasks (rotate Helcim token, set NUXT_RECONCILE_TOKEN, verify
Netlify scheduled function), and Fixed-2026-04-25 fix log.
2026-04-25 18:42:36 +01:00
..
admin feat(admin): add restore dismissed alerts flow 2026-04-08 12:22:35 +01:00
AppNavigation.vue Copy and layout improvements. 2026-04-16 21:11:05 +01:00
BoardPostCard.vue refactor(board): atomic delete + query limit + composable cleanup 2026-04-15 12:47:53 +01:00
BoardPostForm.vue feat(board): inline delete confirmation + a11y polish 2026-04-14 22:15:50 +01:00
CircleBadge.vue feat: add zine-direction shared components 2026-04-02 21:16:00 +01:00
CirclePicker.vue fix(a11y): raise circle description contrast to WCAG AA 2026-04-19 17:23:19 +01:00
ColorModeToggle.vue UI/UX tweaks and improvements. 2026-04-05 12:28:41 +01:00
ColumnsLayout.vue Member/Ecology revamp. 2026-04-14 09:25:09 +01:00
CooperativeTagSelector.vue fix(board): address review feedback on components 2026-04-14 17:08:52 +01:00
CraftTagSelector.vue Add CraftTagSelector, CooperativeTagSelector, and TagSuggestModal components 2026-04-05 16:23:22 +01:00
DashedBox.vue feat: add zine-direction shared components 2026-04-02 21:16:00 +01:00
DevLoginPanel.vue Accessibility fixes. 2026-04-05 16:03:10 +01:00
EventSeriesBadge.vue Migrate design system from ethereal/cool to warm/craft/guild theme 2026-02-24 20:01:11 +00:00
EventSeriesTicketCard.vue chore(visual): Phase 4 audit polish on event/series surface 2026-04-25 18:41:04 +01:00
EventsMiniSidebar.vue UX/UI improvements. 2026-04-05 13:26:51 +01:00
EventTicketCard.vue chore(visual): Phase 4 audit polish on event/series surface 2026-04-25 18:41:04 +01:00
EventTicketPurchase.vue chore(visual): Phase 4 audit polish on event/series surface 2026-04-25 18:41:04 +01:00
FilterBar.vue feat: add zine-direction shared components 2026-04-02 21:16:00 +01:00
ImageUpload.vue Readying for design 2026-03-04 18:24:20 +00:00
LoginModal.vue Huge bunch of UI/UX improvements and tweaks! 2026-04-06 16:17:12 +01:00
MemberStatusBanner.vue UI/UX tweaks and improvements. 2026-04-05 12:28:41 +01:00
MemberStatusIndicator.vue Many an update! 2025-12-01 15:26:42 +00:00
NaturalDateInput.vue feat: reskin admin pages to zine design system 2026-04-03 10:56:01 +01:00
OnboardingWidget.vue feat(member): account/profile polish + tier upgrade flow 2026-04-14 20:35:37 +01:00
PageHeader.vue feat(layout): add PageShell, ColumnsLayout, PageSection primitives 2026-04-08 15:51:38 +01:00
PageSection.vue feat(layout): add PageShell, ColumnsLayout, PageSection primitives 2026-04-08 15:51:38 +01:00
PageShell.vue feat(layout): add PageShell, ColumnsLayout, PageSection primitives 2026-04-08 15:51:38 +01:00
ParchmentInset.vue Design token updates. 2026-04-11 23:24:38 +01:00
SeriesPassPurchase.vue feat(launch): security and correctness fixes for 2026-05-01 launch 2026-04-25 18:42:36 +01:00
SignupFlowOverlay.vue feat(launch): security and correctness fixes for 2026-05-01 launch 2026-04-25 18:42:36 +01:00
TagSuggestModal.vue fix: correct POST body field name and state enum values in tag components 2026-04-05 16:25:10 +01:00
TierPicker.vue fix(ui): disambiguate annual tier labels 2026-04-18 22:06:38 +01:00
TopStrip.vue Updates 2026-04-15 17:45:09 +01:00