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
- adversarial audits run
- 2
- real bugs found + fixed pre-deploy
- 4
- production deploys
- 2
new server actions
adversarial audits run
real bugs found + fixed pre-deploy
production deploys
Timeline
Start
Charge received
Leadership Manual Member Add + Onboarding, Round 1 — tightly scoped, no spreadsheet import or onboarding wizard yet
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
Build
Manual add + invite + detail page
createMemberManually, sendMemberInvitation, updateMemberBasicInfo, archiveMember, reactivateMember, deleteMember; clickable Current Members cards; new Member Detail page
Fix
Rewrote Clerk webhook
Switched from applications.parentEmail lookup to adults.email lookup so manually-added members (no application row) actually activate
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
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
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
Deploy
Shipped + verified live routes
commit 1803e4f7, redeployed after Zeb added CLERK_WEBHOOK_SIGNING_SECRET to Vercel
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”