Build Log · August 13, 2026

MedinaCHF Member Management Round 1 + Mobile Nav Fix

Leadership can now manually add a member, send a real Clerk invitation, and see onboarding status — plus a mobile usability fix for the Leadership nav's hidden tabs.

  • MedinaCHF
  • Feature
  • Auth
  • Mobile UX
new server actions
6

new server actions

adversarial audits run
2

adversarial audits run

real bugs found + fixed pre-deploy
4

real bugs found + fixed pre-deploy

production deploys
2

production deploys

Timeline

  1. Start

    Charge received

    Leadership Manual Member Add + Onboarding, Round 1 — tightly scoped, no spreadsheet import or onboarding wizard yet

  2. Orient

    Surveyed existing architecture

    Explore agent traced families/adults/clerkUserId linkage, the application-accept invite pipeline, and confirmed the Clerk webhook was unregistered and application-only

  3. Build

    Manual add + invite + detail page

    createMemberManually, sendMemberInvitation, updateMemberBasicInfo, archiveMember, reactivateMember, deleteMember; clickable Current Members cards; new Member Detail page

  4. Fix

    Rewrote Clerk webhook

    Switched from applications.parentEmail lookup to adults.email lookup so manually-added members (no application row) actually activate

  5. Audit 1

    Independent adversarial audit

    Found deleteMember checked only 4 of 19 real familyId-referencing tables, and invitation duplicate-detection guessed at Clerk's error shape via message substring

  6. Mid-session

    Mobile nav scroll-cue request added

    Zeb flagged Leadership nav tabs (Group Insights, Admin) hidden off-screen on mobile with no scroll affordance

  7. Audit 2

    Second independent audit

    Verified both fixes, found one more real bug: tier-2 nav row went stale when tapping a tier-1 tab without navigating

  8. Deploy

    Shipped + verified live routes

    commit 1803e4f7, redeployed after Zeb added CLERK_WEBHOOK_SIGNING_SECRET to Vercel

  9. Design

    Bulk-load design conversation (not built)

    Walked through creating real Clerk accounts directly (skipPasswordRequirement) instead of per-family invitations, confirmed schema already supports every field named (kids, ages, interests, last name) with zero new columns needed

What shipped

  • lib/actions/member-management.ts — createMemberManually, sendMemberInvitation, updateMemberBasicInfo, archiveMember, reactivateMember, deleteMember (products/medinaCHF/)

  • Rewrote app/api/webhooks/clerk/route.ts to key off adults.email instead of applications.parentEmail (products/medinaCHF/)

  • components/coordinator/AddMemberButton.tsx — inline + Add Member form (products/medinaCHF/)

  • app/coordinator/members/[id]/page.tsx + components/coordinator/MemberDetailPanel.tsx — new Member/Family Detail view (products/medinaCHF/)

  • components/coordinator/CurrentMembersSearch.tsx — cards now clickable, onboarding status badge added (products/medinaCHF/)

  • components/coordinator/ScrollableTabRow.tsx — reusable horizontal-scroll fade + auto-scroll-into-view wrapper (products/medinaCHF/)

  • components/coordinator/CoordinatorNav.tsx — both nav tiers wrapped in ScrollableTabRow (products/medinaCHF/)

“why would we need signup with we just load all of the emails and create clerk IDs for everyone”
— Zeb, reframing the bulk-load design from 'invitation email per family' to 'create the Clerk account directly, they just log in'