← Cockpit Wireframes
게스트 → 회원 — 심사 흐름
Approved — build queue
Venue Finder · 코트 찾기
ArchiveStrip Map · 세션 스트립 전체 시나리오Headers · 헤더 아이콘Compaction — 일정 · 코트 · 스코어카드Compaction — 클럽 상세 · 홈Compaction — 기록 · 프로필Live anchor — 진행 중 밴드Density · 카드 밀도토스트 — 리디자인 제안위저드 내비게이션 — 결정 보드드래프트 복원 — 무음 복원클럽 조 편성 — 모델 결정 보드Session Detail — Redesign · 일정Venue Detail — Redesign · 테니스장Profile Detail — Redesign · 프로필Tournament Detail — Redesign · 대항전Applicant Detail — Redesign · 가입 심사Canvas Migration — 회비 · 멤버 · 규칙Record Detail — Redesign · 기록Venue Filters · 코트 필터 재구성
For owner review — open: club-wide 심사함 read model · nominate/vouch notification signals · guest-fee settlement via session_payments
Interactive kit · grounded in code

게스트 → 회원 — 심사 흐름

Recommended pathOne club-wide 심사함 on the flat canvas, with candidate notifications and guest-fee settlement
1One club-wide 심사함 reads across club_join_request, per-session guest_applications, and club_guests.proposed — no more checking three separate places.
2nominate_for_membership and membership_recommendations gain signals_emit calls to notify the candidate; decide_join_request keeps its existing join_request_decided signal.
3The guest fee rides the existing session_payments hold row — clubs.default_guest_fee seeds the hold amount at RSVP, no new payments table.
4The review detail becomes the GUEST PROFILE page — participation tracking (attendance strip with first/last visit, visit history rows) and the qualification checklist for admittance; identity only in the hero. Members keep the member profile page.
5The guest roster and the pending-application state redraw flat (FlColumn, FlListRow, FlStatStrip).
Owner's word needed → guest-fee settlement authority — session host or canManageDues (canon/payments.md), confirm
낯선 사람Stranger
게스트guest_applications approved, or club_guests invited (00481)
참석 확정RSVP confirmed
가입 신청 / 지명 / 전환 제안apply_to_club, nominate_for_membership, propose_guest_conversion
총무 결정decide_join_request, confirm_guest_conversion
회원Member
(a) 심사함
심사함
2가입 신청
3게스트 신청
1전환 제안
가입 신청club_join_request
정하늘참석 3회
추천 2명본인 신청
강민서참석 2회
지명
게스트 신청guest_applications, per-session
토 9/12 양재
오세훈게스트
대기 1
일 9/13 잠실
윤아름게스트
대기 1
전환 제안club_guests.proposed
강지민방문 4회
한도 초과
One club-wide inbox for join requests, per-session guest applications, and conversion shortlists — today these are three separate places to check.
(b) 게스트 프로필
게스트 프로필
🙂
정하늘
🥈NTRP 3.0–3.5🌱
3회참석
0회노쇼
7/12첫 참석
9/3최근 참석
가입 자격3/4
방문 한도
3 / 4회
추천한 멤버
2명
노쇼
0회
매너 태그
4개 · 1개 더·
참석 이력3회
9/3
실내 A코트복식 친선
참석
8/16
양재 시민의숲복식 친선
참석
7/12
양재 시민의숲복식 친선
참석
매너 태그
🙏 매너 3🎯 집중 1
추천한 멤버2명
이서연, 박도윤
신청 메시지
토요 모임에 네 번 나갔는데 분위기가 정말 좋았어요. 정식으로 함께하고 싶습니다!
거절
승인
One evidence dossier — attendance, manner tags, recommenders, the applicant's own message — backs a single 총무 approve/reject decision; there is no auto-accept threshold. Now (2026-09-17): 거절 confirms first, naming the applicant, before deciding.
(c) 게스트 명단
게스트 설정
게스트 허용
켜짐ON
방문 한도
4회
게스트 참가비
₩10,000
게스트 명단4명
게스트 초대
강지민방문 5회
가입 제안한도 초과
오세훈방문 3회
★4.81순위
윤아름방문 1회
★3.52순위
신동혁방문 0회
3순위
The settings roster's 4 Cards collapse onto the canvas; the tinted row flags the one guest already shortlisted for membership.
(d) 후보자 알림
알림
새 소식
🔔
지명됐어요총무가 회원으로 지명했어요
NEW
🔔
가입 승인됐어요회원 3명의 추천으로 결정됐어요
NEW
🔔
게스트 우선 신청 열림토요 모임이 30분 먼저 열렸어요
The candidate's own feed — NEW marks the two signals this board adds; the priority-open signal (00481) already ships.
(e) 신청 중
강남 테니스 클럽
내 신청
신청일
9월 3일
상태
검토 중
신청 검토 중
총무가 승인하면 알려드릴게요
join_cta_band's pending state blocks a second application until 총무 decides — decide_join_request stays the one acceptance authority.
Gaps closed by this board
심사함 read model — one club-wide list joins club_join_request + club_guests(status=proposed) + per-session guest_applications, replacing the admin opening each session in turn.
nominate_for_membership and membership_recommendations gain signals_emit calls to the candidate — today neither RPC notifies anyone (join_request_decided, 00328, is the only signal that already exists on this path).
Guest-fee settlement rides the existing session_payments hold row — clubs.default_guest_fee seeds the hold amount at RSVP time, no new payments table.
guest_applications (per-session) and club_guests (standing roster) both project into the one 심사함 above instead of two disconnected surfaces.
Spec (grounding, anatomy)

Guest-to-member review path, redrawn on the flat canvas after the club-detail spacing/divider/canvas laws (2026-09-06). The priority/waitlist backbone already shipped (00481); this board settles the admission side — one club-wide 심사함 joining club_join_request (00213/00545), club_guests.proposed (00481), and per-session guest_applications (00017), plus the two candidate-facing notifications (nominate, vouch) that fire nowhere today. Real screens: /clubs/[clubId]/join-review/[userId] (join-review-detail-screen.tsx), the members screen 가입 심사 block (join-review-row.tsx, members-list-header.tsx), the club settings 게스트 명단 (club-guests-section.tsx), the 게스트 지명 search modal (nominate-guest-modal.tsx), and the public club profile pending CTA (join-cta-band.tsx).

grounded in 12 source file(s)
supabase/migrations/00481_guest_roster_backbone.sqlsupabase/migrations/00415_club_join_review_pipeline.sqlsupabase/migrations/00213_club_join_policy.sqlsupabase/migrations/00545_club_join_request_rls_recursion_fix.sqlsupabase/migrations/00328_audit_batch20_notify_join_decision.sqlpackages/features/clubs/src/join-review-detail-screen.tsxpackages/features/clubs/src/club-members/join-review-row.tsxpackages/features/clubs/src/club-members/members-list-header.tsxpackages/features/clubs/src/settings/club-guests-section.tsxpackages/features/clubs/src/members/nominate-guest-modal.tsxpackages/features/clubs/src/public-club-profile/join-cta-band.tsxpackages/app/src/domain/rules/guest-roster.rules.ts