Audit 5 — navigation parity (2026-11-01)
Status: Reference · Date: 2026-11-01 · The tables behind owner-review-52-audits-2026-11-01.md § 3. Read-only, at HEAD 191e628bd.
Read-only audit. Repo ~/Dev/twomore-v2 at HEAD 191e628bd, working tree clean. Inputs: docs/workflows/page-links.json (329 links), docs/workflows/page-levels.json (82 pages), docs/architecture/page-code-map.md, packages/app/src/navigation/routes.ts (+ venue-owner-claim-routes.ts), docs/design/owner-review-52-synthesis-2026-10-31.md § 3, and the appRouter/routes.* calls under packages/features/*/src, packages/app/src/presentation, apps/mobile/app, apps/web.
Method: for each drawn link I resolved from/to to routes (page-levels), took the screen serving from (page-code-map), walked its relative-import closure (screen, sections, hooks, shared rows in the same feature) and the shared packages/app components it renders (PersonRow, PlayerIdentityChip/Card, DmThreadRow, VenueFinder, ClubCard, MatchHistoryRow, SessionCompactRow, LeaderboardPodium, SettingsRow, whose default presses are known), and read the pushing line. Evidence is file:line of the push. built means the pair of pages is reachable; when the drawn control is not the one that exists the row says [control differs] and the JSON carries controlDiffers: true. No test was run, nothing was executed in the app: this is a reading of the source.
Summary
| Class (drawn but not built, 329 links) | Count |
|---|---|
| built | 152 |
| built via another route | 38 |
| not built | 102 |
| from is new | 16 |
| to is new | 20 |
| unsure | 1 |
Of the 152 built, 27 are [control differs] (the pair opens, through another control than the one drawn: a header icon for a FAB, a CTA band for a MenuSheet, a footer row for a Shelf-head door, the default tap on a person row for a Sheet). 25 of the built are kind tab (24 tab-bar links, 1 in-screen pill, link 73).
By kind: band 38, door 115, fab 16, header 6, link 11, menu 33, push 6, row 77, switcher 2, tab 25.
- Built but not drawn: 52 rows in the second table (12 dropped on purpose by review 52 § 3, 5 moved on purpose by the boards to another page or control, 4 not a page pair or a landing contradiction, 31 unsure: a missing link or a path the boards did not mention).
- Route helpers no page claims: 22 listed in the third table (4 have no caller at all:
ranking,matchHistory,createPost,notificationsAt). - Owed pages: none of the five has a route, a helper or a screen of its own (details after the third table).
Findings worth reading first
- The club 관리 gear sheet is built as a routed screen. Every L2-01 -> L3-03/07/10/11/25/27/28/29 and L4-20 link runs through
/clubs/[clubId]/admin(club-detail-screen.tsx:523->club-detail/admin-tab.tsx), a screen no page claims. 신고 관리 (L3-28) is reachable only from the snapshot strip there, and only while the open-report count is non-zero (admin-snapshot-cells.ts:84). Statusbuilt via another route. - L2-04 is served by the wrong screen for navigation.
/venues/[id](VenueDetailScreen, the route page-levels gives L2-04) has no navigation but back; every picker, list and signal opens/directory-venues/[id](routes.directoryVenue, 10 callers), which holds all of L2-04's outgoing links (create session, 정보 수정 제안, 소유권 신청, 제안 내역). Review 52 § 3 retires the directory screen into L2-04; until then, of the 22 links into and out of L2-04, 13 arebuilt via another route, 6not built, 3built. - Three routes are claimed by two pages each, against review 52 § 3's "82 pages, 0 shared routes":
/(tabs)/(sessions)(L1-03, L1-03c),/clubs/[clubId]/dues(L3-11, L4-14),/messages(L3-14, L3-15). Links between those pairs (73, 183, 184, 197) cannot be a push today; 197 is an in-screen tab, 183 and 184 have nothing to open. - The L4-10 claim looks wrong. page-levels gives L4-10 (멤버 초대) the route
/messages/add-members(the DM add-members screen), but page-links opens it from club pages (L2-01 130, L3-11 182, L3-25 218, L3-03 317). The app's only opener is the DM thread (dm-thread/participants-modal.tsx:158), which the boards do not draw. Those four links arenot builton the reading that no club-side invite page exists; if L4-10 is meant to be the club invite page, it has no route yet. - Member and person rows are mostly inert. 15 of the 29 links into L2-06 (공개 프로필) are
not built; eight of them (103, 104, 208, 209, 213, 238, 240, 251) rest on an explicitonPress={null}: club member rows (club-members/member-row.tsx:114), the 순위 stats modal, add-friend results, the blocked list, attendance and applicant rows, the DM member list. The 13builtones ride the default PersonRow / PlayerIdentityChip tap (person-row.tsx:155). - Not-found doors are
돌아가기.NotFoundStatehas one action,appRouter.back()(not-found-state.tsx:39); the five drawn not-found doors (133, 153, 241, 249, 253) and L0-06's (18) arenot built. /profile/practiceis stale in page-code-map. The route file went with commit51c6060c4(the practice log leaves the product); the map andpage-inventory.json(commit29466be87) still list it among the 85 routes and the 20 unclaimed. Today: 84 route files, 19 unclaimed.
Table 1: drawn but not built (all 329 links)
| # | From | To | Via | Kind | Status | Evidence |
|---|---|---|---|---|---|---|
| 0 | L0-01 시작 | L0-02 이메일 로그인 | the entry band's ghost 이메일로 로그인 | band | from is new | no route (page-levels route null); sign-in today is LoginScreen inside AuthGate (apps/mobile/app/_layout.tsx:226), email+password only |
| 1 | L0-01 시작 | L0-03 이메일 가입 | interim only: the entry band's ball 이메일로 가입 | band | from is new | no route (page-levels route null); sign-in today is LoginScreen inside AuthGate (apps/mobile/app/_layout.tsx:226), email+password only |
| 2 | L0-01 시작 | L0-04 온보딩 | a provider button, for a new account (after the provider's own page) | band | from is new | no route (page-levels route null); sign-in today is LoginScreen inside AuthGate (apps/mobile/app/_layout.tsx:226), email+password only |
| 3 | L0-01 시작 | L1-01 홈 | a provider button, for a known account (after the provider's own page; or the signed-out deep link's destination) | band | from is new | no route (page-levels route null); sign-in today is LoginScreen inside AuthGate (apps/mobile/app/_layout.tsx:226), email+password only |
| 4 | L0-01 시작 | L3-44 이용약관 | the entry band's links row: 이용약관 | band | from is new | no route (page-levels route null); sign-in today is LoginScreen inside AuthGate (apps/mobile/app/_layout.tsx:226), email+password only |
| 5 | L0-01 시작 | L3-45 개인정보 처리방침 | the entry band's links row: 개인정보 처리방침 | band | from is new | no route (page-levels route null); sign-in today is LoginScreen inside AuthGate (apps/mobile/app/_layout.tsx:226), email+password only |
| 6 | L0-02 이메일 로그인 | L1-01 홈 | the band's 로그인 (replace; or the signed-out deep link's destination) | band | from is new | no route (page-levels route null); sign-in today is LoginScreen inside AuthGate (apps/mobile/app/_layout.tsx:226), email+password only; a successful signInWithEmail just swaps AuthGate to the app stack |
| 7 | L0-03 이메일 가입 | L0-04 온보딩 | the mailed link (the mail app, then the app) continues to 본인인증 | link | from is new | no 이메일 가입 screen or mailed-link flow in the app (LoginScreen only signs in) |
| 8 | L0-03 이메일 가입 | L1-01 홈 | the mail for an address that already has an account: 로그인하기, a one-tap sign-in link (the mail app, then the app) | link | from is new | no 이메일 가입 screen or mailed sign-in link in the app |
| 9 | L0-04 온보딩 | L0-01 시작 | step 1, an existing account: the band 카카오로 로그인하고 연결 | band | not built | packages/features/onboarding/src/onboarding-wizard-screen.tsx has no 카카오 connect band (screen exists inside AuthGate, no route) |
| 10 | L0-04 온보딩 | L0-01 시작 | step 1, the under-14 stop's 로그아웃 (and the exit Dialog's) | door | built | packages/features/onboarding/src/onboarding-wizard-screen.tsx:156-170 logout confirm -> signOut() -> AuthGate shows LoginScreen |
| 11 | L0-04 온보딩 | L1-01 홈 | step 3: 건너뛰기 in the header | header | built | [control differs] packages/features/onboarding/src/onboarding-wizard-screen.tsx:284 appRouter.replace(postOnboardingDestination), default routes.home (packages/app/src/navigation/onboarding-intent.ts:26); no step-3 header 건너뛰기 |
| 12 | L0-04 온보딩 | L1-02 클럽 | step 3: the Cell 클럽에 가입할래요 | door | built | [control differs] destination routes.discoverClubs for intent club_member (packages/app/src/navigation/onboarding-intent.ts:27), chosen by entry intent, not a step-3 Cell |
| 13 | L0-04 온보딩 | L1-03 경기 | step 3: the Cell 매치로 칠래요 (경기 › 매치 찾기) | door | not built | no intent maps to 경기 › 매치 찾기 (packages/app/src/navigation/onboarding-intent.ts:26-32: home, discoverClubs, createClub, createSession, joinClub) |
| 14 | L0-04 온보딩 | L3-43 문의하기 | the own-name-phone stop’s band 문의하기 (on the Danal fallback channel) | band | not built | no routes.legalContact push in packages/features/onboarding/src/* |
| 15 | L0-04 온보딩 | L3-44 이용약관 | step 2: 보기 › on the 서비스 이용약관 consent row | door | built | packages/features/onboarding/src/onboarding-step-consent.tsx:109 appRouter.push(policyUrl); policyUrl 'twomore://legal/terms' (packages/app/src/config/legal/policy-versions.ts:23) = /legal/terms (hard-coded scheme string, not a routes helper) |
| 16 | L0-04 온보딩 | L3-45 개인정보 처리방침 | step 2: 보기 › on the 개인정보 처리방침 consent row | door | built | packages/features/onboarding/src/onboarding-step-consent.tsx:109; 'twomore://legal/privacy' (policy-versions.ts:24) = /legal/privacy |
| 17 | L0-04 온보딩 | L4-02 클럽 만들기 | step 3: the Cell 클럽을 만들래요 | door | built | [control differs] destination routes.createClub for intent club_admin (packages/app/src/navigation/onboarding-intent.ts:29), chosen by entry intent, not a step-3 Cell |
| 18 | L0-06 공유 링크 | L1-01 홈 | the not-found state's 홈으로 가기 | door | not built | apps/mobile/app/s/[sessionId].tsx: the not-found state is a bare EmptyState with no action |
| 19 | L0-06 공유 링크 | L1-03 경기 | the closed Notice's action 매치 찾기 (경기 › 매치 찾기) | door | not built | no closed-session Notice in apps/mobile/app/s/[sessionId].tsx (preview shows date/time/venue only) |
| 20 | L0-06 공유 링크 | L2-01 클럽 홈 | a member opening /lb (replace; the club's 기록 pane) | link | built via another route | apps/mobile/app/lb/[clubId].tsx:37 Redirect to routes.club(id,{tab:'records'}); served by /lb, not /s |
| 21 | L0-06 공유 링크 | L2-02 일정 상세 | a member opening /s (replace) | link | built | apps/mobile/app/s/[sessionId].tsx:93-96 Redirect to routes.clubSession for a viewer who can read the session |
| 22 | L0-06 공유 링크 | L2-03 매치 미리보기 | the band 참석 신청하기 (a non-member's /s) | band | not built | apps/mobile/app/s/[sessionId].tsx renders PublicSessionSharePreview (FactList only); no 참석 신청하기 band, no routes.sessionPreview |
| 23 | L0-06 공유 링크 | L2-04 장소 상세 | the 주소 Cell on a non-member’s /s (장소 상세 · 디렉터리) | door | not built | PublicSessionSharePreview (apps/mobile/app/s/[sessionId].tsx:36-50) shows the location as a plain FactList row, no door |
| 24 | L0-06 공유 링크 | L2-06 공개 프로필 | a member opening /p (replace) | link | built via another route | apps/mobile/app/p/[userId].tsx:37-38 Redirect to routes.profileDetail; served by /p |
| 25 | L0-07 웹 공유 페이지 | L0-01 시작 | the /join-club band 로그인하기 (/login, the code and returnTo kept) | band | built via another route | L0-07 has no route; the /join-club page is L4-04's JoinClubScreen: packages/features/clubs/src/join-club-screen.tsx:114-118 push(routes.loginReturnTo(routes.joinClub({clubId,code}))); web /login exists (apps/web/app/login/page.tsx), mobile has no /login route |
| 26 | L0-07 웹 공유 페이지 | L2-01 클럽 홈 | the /join-club club row | row | not built | packages/features/clubs/src/join-club-screen.tsx shows the origin club only as context title/hint (:132-133), no club row |
| 27 | L1-01 홈 | L1-02 클럽 | first run: the 할 일 card 클럽 찾기 (클럽 at 클럽 찾기) | door | built | packages/features/home/src/cards/home-club-discovery-card.tsx:23 routes.discoverClubs (zero-club card, gated in shared/home-recommendations-section.tsx) |
| 28 | L1-01 홈 | L1-02 클럽 | the tab bar › 클럽 | tab | built | apps/mobile/app/(tabs)/_layout.tsx:116-148 (Tabs.Screen for (home), (clubs), (sessions), (records), (profile)) |
| 29 | L1-01 홈 | L1-03 경기 | first run: the 할 일 card 매치 찾기 (경기 at 매치 찾기) | door | built | packages/features/home/src/cards/home-nearby-pickups-card.tsx:105 and packages/features/home/src/views/home-today-view.tsx:454 routes.activityPickups (/activity?tab=pickup_finder redirects to the 경기 tab) |
| 30 | L1-01 홈 | L1-03 경기 | the Block's door 매치 찾기 › when nothing is ahead (경기 at 매치 찾기) | door | built | [control differs] packages/features/home/src/views/home-today-view.tsx:454 (discovery Pressable); not the Block's door |
| 31 | L1-01 홈 | L1-03 경기 | the tab bar › 경기 | tab | built | apps/mobile/app/(tabs)/_layout.tsx:116-148 (Tabs.Screen for (home), (clubs), (sessions), (records), (profile)) |
| 32 | L1-01 홈 | L1-04 기록 | the tab bar › 기록 | tab | built | apps/mobile/app/(tabs)/_layout.tsx:116-148 (Tabs.Screen for (home), (clubs), (sessions), (records), (profile)) |
| 33 | L1-01 홈 | L1-05 프로필 | the tab bar › 프로필 | tab | built | apps/mobile/app/(tabs)/_layout.tsx:116-148 (Tabs.Screen for (home), (clubs), (sessions), (records), (profile)) |
| 34 | L1-01 홈 | L2-01 클럽 홈 | the 할 일 Feed item 회비 납부 (a member’s own dues: 클럽 홈 at 회비) | door | not built | no routes.club/routes.clubDues in packages/features/home/src; home has no 회비 납부 item |
| 35 | L1-01 홈 | L2-02 일정 상세 | a Feed item: a club session, a 대회 or a 경기 결과 | row | built | packages/features/home/src/shared/home-pane-row.ts:239 routes.clubSession(session.clubId, session.id) |
| 36 | L1-01 홈 | L2-02 일정 상세 | the Block (the next game) and its door 일정 보기 › | door | built | [control differs] packages/features/home/src/cards/live-session-stack.tsx:127,136 and packages/features/home/src/shared/home-pane-row.ts:239 routes.clubSession; the card tap, no 일정 보기 › door |
| 37 | L1-01 홈 | L2-02 일정 상세 | the Block's door 입금하기 › while a fee is due (that session's 일정 상세) | door | not built | no routes.sessionPayments in packages/features/home/src |
| 38 | L1-01 홈 | L2-02 일정 상세 | the 할 일 Feed item 참가비 입금 (that session's 일정 상세) | door | not built | no routes.sessionPayments in packages/features/home/src |
| 39 | L1-01 홈 | L2-03 매치 미리보기 | a Feed item: a 매치 | row | built | packages/features/home/src/cards/home-nearby-pickups-card.tsx:51 routes.sessionPreview(pickup.id) |
| 40 | L1-01 홈 | L3-11 회비 관리 | the 할 일 Feed item 회비 미납 (an official) | door | not built | no routes.clubDues in packages/features/home/src |
| 41 | L1-01 홈 | L3-13 알림 | the header 알림 icon | header | built | packages/features/home/src/cards/notification-bell.tsx:53 routes.notifications |
| 42 | L1-01 홈 | L3-14 메시지 | the header 메시지 icon | header | not built | no 메시지 icon in the home header (packages/features/home/src/home-feed-screen.tsx renders NotificationBell only); the inbox opens from the 프로필 header (packages/features/profile/src/profile-screen.tsx:236) and the web nav (apps/web/components/app-nav.tsx:295) |
| 43 | L1-01 홈 | L3-23 앨범 | a Feed item: a 사진 upload (앨범) | row | not built | no routes.clubAlbum in packages/features/home/src |
| 44 | L1-01 홈 | L3-25 멤버 관리 | the 할 일 Feed item 가입 신청 (멤버 관리 at 가입 신청) | door | not built | no routes.clubMembers/joinReview in packages/features/home/src |
| 45 | L1-01 홈 | L3-35 참석자 관리 | the 할 일 Feed item 입금 확인 (one session's 참석자 관리) | door | not built | no routes.sessionParticipants in packages/features/home/src |
| 46 | L1-01 홈 | L3-38 스코어카드 | the 할 일 Feed item 점수 입력 | door | built | [control differs] packages/features/home/src/cards/home-disputed-alert-banner.tsx:89 routes.scorecard(firstMatch.sessionId): a disputed-score banner, not a 점수 입력 할 일 item |
| 47 | L1-01 홈 | L3-41 게시글 | a Feed item: a 공지, 자유 or 경기후기 post | row | not built | no routes.clubPost in packages/features/home/src (the home feed shows sessions, not posts) |
| 48 | L1-01 홈 | L4-01 일정 만들기 | the FAB 매치 (a member) or 일정 (an officer of one club) | fab | not built | no routes.createSession in packages/features/home/src; create entry is on 경기 (packages/features/activity/src/activity-screen.tsx:535) and the web nav (apps/web/components/app-nav.tsx:209) |
| 49 | L1-01 홈 | L4-01 일정 만들기 | the FAB 일정 (an officer of several clubs) › the club picker | fab | not built | same: no FAB or club picker on home |
| 50 | L1-01 홈 | L4-04 초대 코드로 가입 | first run: the 할 일 card 초대 코드로 가입 | door | not built | no routes.joinClub in packages/features/home/src |
| 51 | L1-02 클럽 | L1-01 홈 | the tab bar › 홈 | tab | built | apps/mobile/app/(tabs)/_layout.tsx:116-148 (Tabs.Screen for (home), (clubs), (sessions), (records), (profile)) |
| 52 | L1-02 클럽 | L1-03 경기 | the tab bar › 경기 | tab | built | apps/mobile/app/(tabs)/_layout.tsx:116-148 (Tabs.Screen for (home), (clubs), (sessions), (records), (profile)) |
| 53 | L1-02 클럽 | L1-04 기록 | the tab bar › 기록 | tab | built | apps/mobile/app/(tabs)/_layout.tsx:116-148 (Tabs.Screen for (home), (clubs), (sessions), (records), (profile)) |
| 54 | L1-02 클럽 | L1-05 프로필 | the tab bar › 프로필 | tab | built | apps/mobile/app/(tabs)/_layout.tsx:116-148 (Tabs.Screen for (home), (clubs), (sessions), (records), (profile)) |
| 55 | L1-02 클럽 | L2-01 클럽 홈 | a 내 클럽 or 게스트 클럽 row | row | built | packages/features/clubs/src/shared/club-card.tsx:235 routes.club for a member row; archived/guest rows are the same ClubCard |
| 56 | L1-02 클럽 | L2-01 클럽 홈 | a 신청 중 row | row | built via another route | packages/features/clubs/src/shared/club-card.tsx:235 sends a non-member row to routes.clubPreview (/clubs/[clubId]/preview, PublicClubProfileScreen); whether a 신청 중 row is isMember=false is unsure |
| 57 | L1-02 클럽 | L2-01 클럽 홈 | a 클럽 찾기 row (a non-member sees 클럽 홈) | row | built via another route | packages/features/clubs/src/shared/club-card.tsx:235 routes.clubPreview for a non-member (/clubs/[clubId]/preview) |
| 58 | L1-02 클럽 | L2-01 클럽 홈 | a header-search result row (클럽 찾기) | row | built via another route | search results are the same ClubCard (packages/features/clubs/src/club-list-screen.tsx:79-130); non-member -> routes.clubPreview |
| 59 | L1-02 클럽 | L4-02 클럽 만들기 | the FAB 클럽 › MenuSheet 클럽 만들기 | fab | built | [control differs] packages/features/clubs/src/club-list-screen.tsx:486 header Plus icon and :506 empty-state band -> routes.createClub; no FAB MenuSheet |
| 60 | L1-02 클럽 | L4-04 초대 코드로 가입 | the FAB 클럽 › MenuSheet 초대 코드로 가입 | fab | built | [control differs] packages/features/clubs/src/shared/club-join-header-action.tsx:13 header action and packages/features/clubs/src/club-list-screen.tsx:395 empty-state secondary -> routes.joinClub(); no FAB MenuSheet |
| 61 | L1-02 클럽 | L4-20 클럽 설정 | a 보관한 클럽 row (the recovery view) | row | built | packages/features/clubs/src/shared/archived-club-row.tsx:15 routes.clubSettings |
| 62 | L1-03 경기 | L1-01 홈 | the tab bar › 홈 | tab | built | apps/mobile/app/(tabs)/_layout.tsx:116-148 (Tabs.Screen for (home), (clubs), (sessions), (records), (profile)) |
| 63 | L1-03 경기 | L1-02 클럽 | the tab bar › 클럽 | tab | built | apps/mobile/app/(tabs)/_layout.tsx:116-148 (Tabs.Screen for (home), (clubs), (sessions), (records), (profile)) |
| 64 | L1-03 경기 | L1-04 기록 | the tab bar › 기록 | tab | built | apps/mobile/app/(tabs)/_layout.tsx:116-148 (Tabs.Screen for (home), (clubs), (sessions), (records), (profile)) |
| 65 | L1-03 경기 | L1-05 프로필 | the tab bar › 프로필 | tab | built | apps/mobile/app/(tabs)/_layout.tsx:116-148 (Tabs.Screen for (home), (clubs), (sessions), (records), (profile)) |
| 66 | L1-03 경기 | L2-02 일정 상세 | an 예정 row (저장됨 too) | row | built | packages/app/src/presentation/hooks/use-club-session-card-row.tsx:36 routes.clubSession via packages/features/activity/src/activity-screen.tsx:135,231 |
| 67 | L1-03 경기 | L2-03 매치 미리보기 | a header-search result row (일정, 매치) | row | not built | packages/features/activity/src/activity-screen.tsx has no header search; the 테니스장 tab and 매치 찾기 pane have their own filters. The pair is reached by the 매치 찾기 row (link 68) |
| 68 | L1-03 경기 | L2-03 매치 미리보기 | a 매치 찾기 row | row | built | packages/features/activity/src/activity-screen.tsx:353 routes.sessionPreview(item.id) |
| 69 | L1-03 경기 | L2-04 장소 상세 | a header-search result row (테니스장) | row | built via another route | VenueFinder rows push routes.directoryVenue (packages/app/src/presentation/components/sessions/venue-finder.tsx:287,409) = /directory-venues/[id], not /venues/[id]; the 경기 tab's 테니스장 pane has its own search, no header search |
| 70 | L1-03 경기 | L4-01 일정 만들기 | the FAB 매치 | fab | built | [control differs] packages/features/activity/src/activity-screen.tsx:535 routes.createSession(PICKUP_CLUB_SENTINEL) in the 매치 찾기 pane's bottom CTA band (not a FAB) |
| 71 | L1-03c 경기 · 테니스장 | L1-01 홈 | the Tab bar | tab | built | apps/mobile/app/(tabs)/_layout.tsx:116-148 (Tabs.Screen for (home), (clubs), (sessions), (records), (profile)) |
| 72 | L1-03c 경기 · 테니스장 | L1-02 클럽 | the Tab bar | tab | built | apps/mobile/app/(tabs)/_layout.tsx:116-148 (Tabs.Screen for (home), (clubs), (sessions), (records), (profile)) |
| 73 | L1-03c 경기 · 테니스장 | L1-03 경기 | the Tabs 예정 and 매치 찾기 | tab | built | [control differs] L1-03c and L1-03 share /(tabs)/(sessions); the 예정 / 매치 찾기 pills are the in-screen tabs of packages/features/activity/src/activity-screen.tsx:470-500 (activeTab state), not a route push |
| 74 | L1-03c 경기 · 테니스장 | L1-04 기록 | the Tab bar | tab | built | apps/mobile/app/(tabs)/_layout.tsx:116-148 (Tabs.Screen for (home), (clubs), (sessions), (records), (profile)) |
| 75 | L1-03c 경기 · 테니스장 | L1-05 프로필 | the Tab bar | tab | built | apps/mobile/app/(tabs)/_layout.tsx:116-148 (Tabs.Screen for (home), (clubs), (sessions), (records), (profile)) |
| 76 | L1-03c 경기 · 테니스장 | L2-04 장소 상세 | a venue Feed item | row | built via another route | venue-finder.tsx:287,409 routes.directoryVenue (/directory-venues/[id]) |
| 77 | L1-03c 경기 · 테니스장 | L4-07 장소 정보 제안 | the Feed-end door 목록에 없는 테니스장 추가, and the same door in the Search takeover | door | built | packages/app/src/presentation/components/sessions/venue-finder/venue-finder-contribution-row.tsx:37 routes.newVenueContribution() in venue-finder-browse-list.tsx |
| 78 | L1-04 기록 | L1-01 홈 | the tab bar › 홈 | tab | built | apps/mobile/app/(tabs)/_layout.tsx:116-148 (Tabs.Screen for (home), (clubs), (sessions), (records), (profile)) |
| 79 | L1-04 기록 | L1-02 클럽 | the tab bar › 클럽 | tab | built | apps/mobile/app/(tabs)/_layout.tsx:116-148 (Tabs.Screen for (home), (clubs), (sessions), (records), (profile)) |
| 80 | L1-04 기록 | L1-03 경기 | first run: the Empty state's 매치 찾기 (경기 at 매치 찾기) | door | built | packages/features/records/src/records-screen.tsx:359 routes.activityPickups (zero-match EmptyState action) |
| 81 | L1-04 기록 | L1-03 경기 | the tab bar › 경기 | tab | built | apps/mobile/app/(tabs)/_layout.tsx:116-148 (Tabs.Screen for (home), (clubs), (sessions), (records), (profile)) |
| 82 | L1-04 기록 | L1-05 프로필 | the tab bar › 프로필 | tab | built | apps/mobile/app/(tabs)/_layout.tsx:116-148 (Tabs.Screen for (home), (clubs), (sessions), (records), (profile)) |
| 83 | L1-04 기록 | L2-02 일정 상세 | a match card in the 경기 기록 Shelf (its session's 일정 상세) | row | not built | packages/features/records/src/records-screen.tsx has no match list (its 경기 기록 link goes to /records/history, :411); no routes.clubSession |
| 84 | L1-04 기록 | L2-06 공개 프로필 | a face in the 순위, 최고의 파트너 or 천적 Shelf | row | not built | packages/features/records/src/cards/top-partners-card.tsx has no onPress/routes |
| 85 | L1-04 기록 | L3-05 하루 기록 | a day on the activity grid | row | not built | packages/features/records/src/cards/activity-heatmap-card.tsx has no onPress/routes; routes.recordDay is only pushed from packages/features/records/src/record-detail-screen.tsx:192 |
| 86 | L1-04 기록 | L3-06 선수별 전적 | the 최고의 파트너 Shelf head's door 선수별 전적 › | door | built | [control differs] packages/features/records/src/records-screen.tsx:405 routes.analysisRivals from a footer ListRow, not a Shelf-head door |
| 87 | L1-04 기록 | L3-17 순위표 | the 순위 Shelf head's door 순위표 › | door | built | [control differs] packages/features/records/src/records-screen.tsx:417 routes.recordsLeaderboard from a footer ListRow, not a Shelf-head door |
| 88 | L1-05 프로필 | L3-08 테니스 여정 | the closing Cell 테니스 여정 (owner review 52: the match notes and the season's story) | door | to is new | no /profile/journey route file or helper |
| 89 | L1-05 프로필 | L1-01 홈 | the tab bar › 홈 | tab | built | apps/mobile/app/(tabs)/_layout.tsx:116-148 (Tabs.Screen for (home), (clubs), (sessions), (records), (profile)) |
| 90 | L1-05 프로필 | L1-02 클럽 | the tab bar › 클럽 | tab | built | apps/mobile/app/(tabs)/_layout.tsx:116-148 (Tabs.Screen for (home), (clubs), (sessions), (records), (profile)) |
| 91 | L1-05 프로필 | L1-03 경기 | the tab bar › 경기 | tab | built | apps/mobile/app/(tabs)/_layout.tsx:116-148 (Tabs.Screen for (home), (clubs), (sessions), (records), (profile)) |
| 92 | L1-05 프로필 | L1-04 기록 | the tab bar › 기록 | tab | built | apps/mobile/app/(tabs)/_layout.tsx:116-148 (Tabs.Screen for (home), (clubs), (sessions), (records), (profile)) |
| 93 | L1-05 프로필 | L2-06 공개 프로필 | a face in the 친구 pile | row | not built | packages/features/profile/src/friends-summary-card.tsx:127 pushes routes.profileFriends for the whole pile; no per-face profile push |
| 94 | L1-05 프로필 | L3-01 신뢰 기록 | the identity Block's Door pill 신뢰 72점 | door | to is new | no /profile/trust route file or helper |
| 95 | L1-05 프로필 | L3-09 업적 | a badge on the 업적 Shelf | row | not built | packages/features/profile/src/achievements-preview-section.tsx has only the head link (:127); tiles carry no onPress |
| 96 | L1-05 프로필 | L3-09 업적 | the 업적 head's 전체 보기 › | door | built | packages/features/profile/src/achievements-preview-section.tsx:127 routes.achievements (own profile only) |
| 97 | L1-05 프로필 | L3-18 친구 목록 | the 친구 head's 전체 보기 › | door | built | packages/features/profile/src/friends-summary-card.tsx:102 (count>0) |
| 98 | L1-05 프로필 | L3-19 친구 찾기 | the empty 친구's action 친구 찾기 | door | built | packages/features/profile/src/friends-summary-card.tsx:116 routes.profileFriendsAdd (empty state) |
| 99 | L1-05 프로필 | L4-15 설정 | the header 설정 icon | header | built | packages/features/profile/src/profile-screen.tsx:255 and packages/features/profile/src/profile-menu-card.tsx:46 routes.settings |
| 100 | L2-01 클럽 홈 | L2-02 일정 상세 | a Feed item: a club session, a 대회 or a 경기 결과 | row | built | packages/features/clubs/src/club-detail/home-tab.tsx:159, packages/features/clubs/src/club-detail/home/use-home-tab-data.tsx:412, packages/features/clubs/src/club-detail/home/auto-match-row.tsx:29 routes.clubSession; sessions pane rows via SessionCompactRow |
| 101 | L2-01 클럽 홈 | L2-03 매치 미리보기 | a non-member's session item (매치 미리보기) | row | not built | a non-member is replaced to routes.clubPreview (packages/features/clubs/src/club-detail-screen.tsx:178); the preview's guest sessions push routes.clubSession (packages/features/clubs/src/public-club-profile/guest-sessions-section.tsx:66), not sessionPreview |
| 102 | L2-01 클럽 홈 | L2-04 장소 상세 | the 홈 코트 Cell at the top of the 홈 pane | row | not built | no routes.venue in the club-detail closure (packages/features/clubs/src/club-detail-screen.tsx and club-detail/*) |
| 103 | L2-01 클럽 홈 | L2-06 공개 프로필 | a 멤버 row (an official's too) | row | not built | member rows are PersonRow onPress={null}: packages/features/clubs/src/club-members/member-row.tsx:114 (shared by club-detail/members-pane.tsx) |
| 104 | L2-01 클럽 홈 | L2-06 공개 프로필 | a 순위 row's Sheet › 공개 프로필 (and the named 베스트 파트너 and 천적) | menu | not built | the 순위 row opens MemberStatsModal (packages/features/clubs/src/club-detail/ranking-tab.tsx:437) whose PersonRow/PlayerIdentityChip are onPress={null} (member-stats-modal.tsx:238, member-stats-rows.tsx:103,170) |
| 105 | L2-01 클럽 홈 | L3-03 성장 분석 | the header 관리 gear (an official) › the 관리 sheet › 성장 분석 | menu | built via another route | gear 관리 -> routes.clubAdmin (packages/features/clubs/src/club-detail-screen.tsx:523) -> packages/features/clubs/src/club-detail/admin-tab.tsx:153 routes.clubAnalytics (row tagged 준비 중 when not entitled) |
| 106 | L2-01 클럽 홈 | L3-06 선수별 전적 | a 순위 row's Sheet › 나와의 전적 | menu | not built | no routes.analysisRivals in the club-detail closure |
| 107 | L2-01 클럽 홈 | L3-06 선수별 전적 | the 기록 pane's closing Cell 선수별 전적 | door | not built | packages/features/clubs/src/club-detail/records-pane.tsx has no routes |
| 108 | L2-01 클럽 홈 | L3-07 출석 현황 | the header 관리 gear (an official) › the 관리 sheet › 출석 현황 | menu | built via another route | /clubs/[clubId]/admin -> packages/features/clubs/src/club-detail/admin-tab.tsx:90 routes.clubAttendance |
| 109 | L2-01 클럽 홈 | L3-10 클럽 대항전 | the header 관리 gear (an official) › the 관리 sheet › 클럽 대항전 | menu | built via another route | /clubs/[clubId]/admin -> packages/features/clubs/src/club-detail/admin-tab.tsx:126 routes.clubChallenges |
| 110 | L2-01 클럽 홈 | L3-11 회비 관리 | the header 관리 gear (an official) › the 관리 sheet › 회비 관리 | menu | built via another route | /clubs/[clubId]/admin -> packages/features/clubs/src/club-detail/admin-tab.tsx:99 routes.clubDues |
| 111 | L2-01 클럽 홈 | L3-11 회비 관리 | the 회비 pane's closing Cell 회비 관리 with its count (an official) | door | not built | packages/features/clubs/src/club-detail/dues-pane.tsx has no routes; routes.clubDues is only pushed from the admin screen |
| 112 | L2-01 클럽 홈 | L3-16 참가비 내역 | the 회비 pane's closing Cell 참가비 내역 | door | to is new | no /profile/fees route file or helper |
| 113 | L2-01 클럽 홈 | L3-23 앨범 | a Feed item: a 사진 upload (앨범) | row | built | packages/features/clubs/src/club-detail/home/auto-media-row.tsx:57 routes.clubAlbum |
| 114 | L2-01 클럽 홈 | L3-23 앨범 | the MediaBand (the album) | row | built | packages/features/clubs/src/club-detail/club-place-header.tsx:82 routes.clubAlbum (onOpenAlbum) |
| 115 | L2-01 클럽 홈 | L3-24 복식 파트너 추천 | the 베스트 파트너 head's door 복식 파트너 추천 › | door | built | [control differs] packages/features/clubs/src/club-detail/members-pane.tsx:232 routes.clubPartners from a ListRow in the 멤버 pane, not a 베스트 파트너 head door |
| 116 | L2-01 클럽 홈 | L3-25 멤버 관리 | the header 관리 gear (an official) › the 관리 sheet › 멤버 관리 | menu | built via another route | /clubs/[clubId]/admin -> packages/features/clubs/src/club-detail/admin-tab.tsx:80 routes.clubMembers |
| 117 | L2-01 클럽 홈 | L3-25 멤버 관리 | the 멤버 pane's closing Cell 멤버 관리 (an official) | door | built | [control differs] packages/features/clubs/src/club-detail/club-place-header.tsx:91 routes.clubMembers via the header member count (any member), not an official's closing Cell |
| 118 | L2-01 클럽 홈 | L3-25 멤버 관리 | the 멤버 pane's Task Cell 가입 신청 (멤버 관리 at 가입 신청; an official) | door | not built | routes.joinReview is pushed from packages/features/clubs/src/club-members/members-list-header.tsx:170 (L3-25), not from the 멤버 pane |
| 119 | L2-01 클럽 홈 | L3-27 일정 관리 | the header 관리 gear (an official) › the 관리 sheet › 일정 관리 | menu | built via another route | /clubs/[clubId]/admin -> packages/features/clubs/src/club-detail/admin-tab.tsx:108 routes.clubSessions |
| 120 | L2-01 클럽 홈 | L3-28 신고 관리 | the header 관리 gear (an official) › the 관리 sheet › 신고 관리 | menu | built via another route | only the admin screen's snapshot strip: packages/features/clubs/src/club-detail/admin-snapshot-cells.ts:84 routes.clubReports (shown when the open-report count is non-zero) |
| 121 | L2-01 클럽 홈 | L3-29 테니스장 관리 | the header 관리 gear (an official) › the 관리 sheet › 테니스장 관리 | menu | built via another route | /clubs/[clubId]/admin -> packages/features/clubs/src/club-detail/admin-tab.tsx:117 routes.clubVenues |
| 122 | L2-01 클럽 홈 | L3-41 게시글 | a Feed item: a 공지, 자유 or 경기후기 post | row | built | packages/features/clubs/src/shared/post-row.tsx:371 routes.clubPost (PostFeedRow used by club-detail/home-tab.tsx:46) |
| 123 | L2-01 클럽 홈 | L3-42 DM 스레드 | a 채팅 row | row | built | packages/features/clubs/src/club-detail/chat-pane.tsx uses DmThreadRow whose default press is routes.dmThread (packages/app/src/presentation/components/dm/dm-thread-row.tsx:131) |
| 124 | L2-01 클럽 홈 | L4-01 일정 만들기 | the FAB 만들기 (an official) › the MenuSheet 일정 만들기 | fab | built | [control differs] packages/features/clubs/src/club-detail-screen.tsx:555 routes.createSession in a BottomCtaBand on the 일정 pane (canManageSchedule); no FAB / MenuSheet |
| 125 | L2-01 클럽 홈 | L4-01 일정 만들기 | the empty 회비 pane's setup step 첫 일정 만들기 (an official) | door | not built | packages/features/clubs/src/club-detail/dues-pane.tsx has no routes |
| 126 | L2-01 클럽 홈 | L4-03 행사 만들기 | the FAB 만들기 (an official) › the MenuSheet 행사 만들기 | fab | to is new | no /clubs/[clubId]/events/new route file or helper |
| 127 | L2-01 클럽 홈 | L4-04 초대 코드로 가입 | a non-member's join band 초대 코드로 가입 (an invite-only club) | band | built via another route | a non-member is replaced to /clubs/[clubId]/preview (packages/features/clubs/src/club-detail-screen.tsx:178), whose join band pushes routes.joinClub({clubId}) (packages/features/clubs/src/public-club-profile-screen.tsx:224) |
| 128 | L2-01 클럽 홈 | L4-05 글쓰기 | the FAB 글 (a member) | fab | built | [control differs] packages/features/clubs/src/club-detail-screen.tsx:543 routes.clubBoardCreate in a BottomCtaBand on the 홈 pane; no FAB |
| 129 | L2-01 클럽 홈 | L4-05 글쓰기 | the FAB 만들기 (an official) › the MenuSheet 글쓰기 | fab | built | [control differs] same band (packages/features/clubs/src/club-detail-screen.tsx:543) and the mission card packages/features/clubs/src/club-detail/home/use-home-tab-data.tsx:366; no FAB MenuSheet |
| 130 | L2-01 클럽 홈 | L4-10 멤버 초대 | the empty 회비 pane's setup step 멤버 초대 (an official) | door | not built | no 멤버 초대 setup step in packages/features/clubs/src/club-detail/dues-pane.tsx; routes.dmAddMembers is pushed only from the DM thread (packages/features/messaging/src/dm-thread/participants-modal.tsx:158) |
| 131 | L2-01 클럽 홈 | L4-14 회비 설정 | the empty 회비 pane's setup step 회비 설정 (an official) | door | not built | packages/features/clubs/src/club-detail/dues-pane.tsx has no routes |
| 132 | L2-01 클럽 홈 | L4-20 클럽 설정 | the header 관리 gear (an official) › the 관리 sheet › 클럽 설정 | menu | built via another route | /clubs/[clubId]/admin -> packages/features/clubs/src/club-detail/admin-tab.tsx:165 routes.clubSettings (canManageClub) |
| 133 | L2-02 일정 상세 | L1-03 경기 | the not-found state’s 경기 보기 | door | not built | packages/features/sessions/src/session-detail-screen.tsx:242 NotFoundState: its only action is 돌아가기 = appRouter.back() (packages/app/src/presentation/components/not-found-state.tsx:39) |
| 134 | L2-02 일정 상세 | L2-01 클럽 홈 | the 클럽 Cell of the 정보 group (a club’s session) | row | not built | no routes.club in the session-detail closure (packages/features/sessions/src/session-detail-screen.tsx and session-detail/*) |
| 135 | L2-02 일정 상세 | L2-04 장소 상세 | the band’s 장소 보기 pill, the map and the title | band | built | packages/features/sessions/src/session-detail/sections/session-hero-section.tsx:92 routes.venue(session.courtVenueId) = /venues/[id] |
| 136 | L2-02 일정 상세 | L2-06 공개 프로필 | the 호스트 Cell of the 정보 group | row | built | [control differs] packages/features/sessions/src/session-detail/sections/participation-section.tsx:152-196 roster PersonRow (host-badged row) with the default tap routes.userProfile (packages/app/src/presentation/components/person-row.tsx:155); no 정보-group 호스트 Cell |
| 137 | L2-02 일정 상세 | L3-35 참석자 관리 | the band 정산하기 (the host, completed) | band | built via another route | packages/features/sessions/src/session-detail/actions/primary-action.tsx:395 routes.sessionPayments (/sessions/[id]/payments, a screen no page claims), label 정산 for a completed paid session |
| 138 | L2-02 일정 상세 | L3-35 참석자 관리 | the gear’s 관리 sheet › 참석자 관리 and 참가비 관리 | menu | built | packages/features/sessions/src/session-detail/actions/host-menu-actions.ts:56 routes.sessionParticipants (참석자 관리); no separate 참가비 관리 row |
| 139 | L2-02 일정 상세 | L3-35 참석자 관리 | the host’s Notice 입금 확인 3건 | door | not built | packages/features/sessions/src/session-detail/sections/session-alerts-section.tsx has no 입금 확인 Notice (refund banners only: refund-banners.tsx:64 -> sessionPayments) |
| 140 | L2-02 일정 상세 | L3-35 참석자 관리 | the 참석 head’s 전체 보기 › and the roster | door | built | packages/features/sessions/src/session-detail/sections/participation-section.tsx:121 routes.sessionParticipants (goToParticipants, the 외 N명 row) |
| 141 | L2-02 일정 상세 | L3-36 참석 확인 | the gear’s 관리 sheet › 참석 확인 | menu | built | packages/features/sessions/src/session-detail/actions/host-menu-actions.ts:84 routes.sessionAttendance |
| 142 | L2-02 일정 상세 | L3-37 호스트 관리 | the gear’s 관리 sheet › 호스트 관리 | menu | built | packages/features/sessions/src/session-detail/actions/host-menu-actions.ts:76 routes.sessionHostDashboard |
| 143 | L2-02 일정 상세 | L3-37 호스트 관리 | the host’s Notice 신청 N건 | door | built | packages/features/sessions/src/session-detail/sections/session-alerts-section.tsx:70 routes.sessionHostDashboard (pending applicants banner) |
| 144 | L2-02 일정 상세 | L3-38 스코어카드 | the Notice 입력하기 (scores to enter) | door | not built | no scores-to-enter Notice in packages/features/sessions/src/session-detail/* |
| 145 | L2-02 일정 상세 | L3-38 스코어카드 | the band 실시간 스코어카드 보기 (a participant, in progress) | band | built | packages/features/sessions/src/session-detail/actions/primary-action.tsx:381 routes.scorecard (confirmed participant, in_progress) |
| 146 | L2-02 일정 상세 | L3-38 스코어카드 | the 경기 head’s 전체 보기 › and a 경기 row | door | built | [control differs] packages/features/sessions/src/session-matchups-card.tsx:213 routes.scorecard (card tap) |
| 147 | L2-02 일정 상세 | L3-39 스코어카드 운영 | the band 스코어카드 보기 (the host, in progress) | band | built | packages/features/sessions/src/session-detail/actions/primary-action.tsx:365 routes.matchBoard (host, in_progress); also host-menu-actions.ts:102 |
| 148 | L2-02 일정 상세 | L3-47 대진 짜기 | the band 대진 짜기 (the host, closed, or open on game day, with no draw yet) | band | to is new | no /sessions/[sessionId]/draw route file or helper |
| 149 | L2-02 일정 상세 | L3-47 대진 짜기 | the gear’s 관리 sheet › 대진 짜기 (an open, closed or live session) | menu | to is new | no /sessions/[sessionId]/draw route file or helper |
| 150 | L2-02 일정 상세 | L3-39 스코어카드 운영 | the host’s Notice 확인하기 (scores to settle) | door | not built | no scores-to-settle Notice in packages/features/sessions/src/session-detail/* |
| 151 | L2-02 일정 상세 | L4-06 경기 규칙 | the gear’s 관리 sheet › 경기 규칙 | menu | built | packages/features/sessions/src/session-detail/actions/host-menu-actions.ts:65 routes.sessionMatchRules |
| 152 | L2-03 매치 미리보기 | L0-01 시작 | the band 로그인하고 신청하기 (signed out) | band | built | packages/features/sessions/src/public-pickup-preview-screen.tsx:294 appRouter.push(routes.login); /login exists on web (apps/web/app/login/page.tsx) but mobile has no /login route file (the AuthGate shows LoginScreen) |
| 153 | L2-03 매치 미리보기 | L1-03 경기 | the not-found state’s 매치 찾기 | door | not built | the preview screen has no not-found door (packages/features/sessions/src/public-pickup-preview-screen.tsx) |
| 154 | L2-03 매치 미리보기 | L1-03 경기 | the 같은 장소 매치 Cell (매치 찾기 filtered to the venue) | door | not built | no 같은 장소 매치 Cell in packages/features/sessions/src/public-pickup-preview-screen.tsx |
| 155 | L2-03 매치 미리보기 | L2-01 클럽 홈 | the 클럽 Cell of the 정보 group (a club’s public session) | row | not built | no routes.club in packages/features/sessions/src/public-pickup-preview-screen.tsx |
| 156 | L2-03 매치 미리보기 | L2-04 장소 상세 | the band’s 장소 보기 pill, the map and the title | band | built | packages/features/sessions/src/session-detail/sections/session-hero-section.tsx:92 routes.venue (SessionHeroSection reused by the preview, public-pickup-preview-screen.tsx:114,520) |
| 157 | L2-03 매치 미리보기 | L2-06 공개 프로필 | the 호스트 Cell of the 정보 group | row | built | [control differs] packages/features/sessions/src/pickup-host-card.tsx uses PlayerIdentityCard whose default press is routes.profileDetail (packages/app/src/presentation/components/player-identity-card.tsx:122) |
| 158 | L2-04 장소 상세 | L2-01 클럽 홈 | a 홈 코트로 쓰는 클럽 card | row | not built | packages/features/sessions/src/venue-detail-screen.tsx (the /venues/[id] screen) imports only appRouter for back; no routes.club |
| 159 | L2-04 장소 상세 | L2-02 일정 상세 | a 다음 일정 card (a session of the club or a 매치 you are in) | row | not built | packages/features/sessions/src/venue-detail-screen.tsx has no session cards or routes |
| 160 | L2-04 장소 상세 | L2-03 매치 미리보기 | a 다음 일정 card (an open 매치 you are not in) | row | not built | packages/features/sessions/src/venue-detail-screen.tsx has no session cards or routes |
| 161 | L2-04 장소 상세 | L4-01 일정 만들기 | the band 이 테니스장에서 일정 만들기 (from a club) or 매치 만들기 (from the directory) | band | built via another route | /directory-venues/[id]: packages/features/sessions/src/directory-venue-detail/use-directory-venue-detail.ts:437 routes.createSession(PICKUP_CLUB_SENTINEL, {venue presets}); the /venues/[id] screen has none |
| 162 | L2-04 장소 상세 | L4-07 장소 정보 제안 | the header ⋯ › 정보 수정 제안 | menu | built via another route | /directory-venues/[id]: packages/features/sessions/src/directory-venue-detail/directory-venue-detail-screen.tsx:206 and use-directory-venue-detail.ts:401,447,465 routes.newVenueContribution |
| 163 | L2-04 장소 상세 | L4-08 소유권 신청 | the header ⋯ › 소유권 신청 | menu | built via another route | /directory-venues/[id]: packages/features/sessions/src/directory-venue-detail/directory-venue-detail-screen.tsx:291 routes.newVenueOwnerClaim |
| 164 | L2-06 공개 프로필 | L2-01 클럽 홈 | the club in the hero’s facts (several: a Sheet of the clubs, each row) | row | built | packages/features/profile/src/public-profile-screen.tsx:489 routes.club(club.id) |
| 165 | L2-06 공개 프로필 | L3-42 DM 스레드 | the band 메시지 보내기 (friends) | band | built | packages/features/profile/src/public-profile-screen.tsx:129 routes.dmThread (after initiating the thread) |
| 166 | L2-06 공개 프로필 | L3-42 DM 스레드 | the header ⋯ › 메시지 보내기 (not friends: a message request) | menu | built | packages/features/profile/src/public-profile-screen.tsx:129 (same push; whether the not-friends case is a message request is the server's) |
| 167 | L3-01 신뢰 기록 | L1-03 경기 | the day-one state’s 일정 찾기 | door | from is new | no /profile/trust screen |
| 168 | L3-01 신뢰 기록 | L2-02 일정 상세 | a record’s Sheet › 일정 보기 | menu | from is new | no /profile/trust screen |
| 169 | L3-01 신뢰 기록 | L3-43 문의하기 | the Cell 기록 문의 | door | from is new | no /profile/trust screen |
| 170 | L3-03 성장 분석 | L3-23 앨범 | the Cell 승인 대기 사진 | door | not built | packages/features/clubs/src/club-analytics-screen.tsx has no routes |
| 171 | L3-03 성장 분석 | L3-25 멤버 관리 | the Cell 대기 신청 (멤버 관리 at 가입 신청) | door | not built | packages/features/clubs/src/club-analytics-screen.tsx has no routes |
| 172 | L3-03 성장 분석 | L4-20 클럽 설정 | the Cell 클럽 설정 | door | not built | packages/features/clubs/src/club-analytics-screen.tsx has no routes |
| 173 | L3-04 기간 기록 | L3-05 하루 기록 | a calendar day of 활동 | row | built | packages/features/records/src/record-detail-screen.tsx:192 routes.recordDay(day.date, scope) |
| 174 | L3-05 하루 기록 | L3-04 기간 기록 | the quiet day’s and the invalid date’s 기간 기록 | door | not built | packages/features/records/src/record-detail/record-day-detail-screen.tsx has no routes (back only: apps/mobile/app/records/day.tsx:26-31) |
| 175 | L3-06 선수별 전적 | L2-06 공개 프로필 | a person row (주요 선수, 모든 선수) and the person’s row of 나와의 전적 | row | built | packages/features/records/src/head-to-head-screen.tsx:171 PersonRow with default tap routes.userProfile |
| 176 | L3-07 출석 현황 | L3-01 신뢰 기록 | a member row (신뢰 기록, the officials' view) | row | to is new | no /profile/trust route file or helper |
| 177 | L3-07 출석 현황 | L3-25 멤버 관리 | the door Cell 멤버 관리 | door | not built | packages/features/clubs/src/club-attendance-screen.tsx has no routes |
| 178 | L3-10 클럽 대항전 | L1-02 클럽 | the empty state's 클럽 찾기 (the 클럽 찾기 pane) | door | not built | packages/features/clubs/src/club-challenges-screen.tsx has no routes |
| 179 | L3-10 클럽 대항전 | L2-01 클럽 홈 | a 대항전 row (the club it names; a 받은 신청 row too) | row | not built | packages/features/clubs/src/club-challenges-screen.tsx has no routes |
| 180 | L3-11 회비 관리 | L3-01 신뢰 기록 | a 미납 or 완납 row's Sheet › the name row (신뢰 기록, the officials' view) | menu | to is new | no /profile/trust route file or helper |
| 181 | L3-11 회비 관리 | L4-01 일정 만들기 | the no-plan setup step 첫 일정 만들기 | door | not built | packages/features/clubs/src/club-dues-screen.tsx and club-dues/* have no routes |
| 182 | L3-11 회비 관리 | L4-10 멤버 초대 | the no-plan setup step 멤버 초대 | door | not built | packages/features/clubs/src/club-dues-screen.tsx and club-dues/* have no routes |
| 183 | L3-11 회비 관리 | L4-14 회비 설정 | the header ⋯ › 회비 설정 | menu | not built | L3-11 and L4-14 both claim /clubs/[clubId]/dues (ClubDuesScreen); no separate page, no header ⋯ door (no routes in club-dues/*) |
| 184 | L3-11 회비 관리 | L4-14 회비 설정 | the no-plan setup step 회비 설정 | door | not built | same screen for both pages; no routes in club-dues/* |
| 185 | L3-13 알림 | L2-01 클럽 홈 | a 회비 row (opens 클럽 홈 at 회비) | row | not built | packages/app/src/presentation/utils/signal-routes.ts:95-96 a 'dues' signal opens routes.clubDues (L3-11), not 클럽 홈 at 회비 |
| 186 | L3-13 알림 | L2-02 일정 상세 | a 일정 row (new, cancelled, 최소 인원, 참석, 참가비 마감) | row | built | signal-routes.ts:105 routes.clubSession (session/rsvp signals), pushed at packages/features/home/src/notification-center/use-notification-center.ts:159 |
| 187 | L3-13 알림 | L2-04 장소 상세 | a 장소 정보 수정 반영 row | row | built via another route | signal-routes.ts:92 routes.directoryVenue (venue_correction_approved/rejected) = /directory-venues/[id] |
| 188 | L3-13 알림 | L2-06 공개 프로필 | a 친구 요청 or 친구가 됐어요 row | row | not built | no friend-request/accepted signal in signal-routes.ts or domain/entities/signal.entity.ts |
| 189 | L3-13 알림 | L3-01 신뢰 기록 | a 신뢰 점수 row (a deduction, at its record) | row | to is new | no /profile/trust route; signal-routes.ts:143,155 trust/system signals open routes.profile |
| 190 | L3-13 알림 | L3-01 신뢰 기록 | a 사유 인정 요청 row (신뢰 기록, the officials' view, at the request) | row | to is new | no /profile/trust route; no 사유 인정 request mapping in signal-routes.ts |
| 191 | L3-13 알림 | L3-25 멤버 관리 | a 가입 신청 row (멤버 관리 at 가입 신청) | row | built via another route | signal-routes.ts:118-120 club_join_request_received opens routes.joinReview (L3-32) with an actor, routes.clubMembers (L3-25, no 가입 신청 anchor) without |
| 192 | L3-13 알림 | L3-28 신고 관리 | a 신고 row | row | not built | no report/moderation mapping in signal-routes.ts (routes.clubReports appears only in admin attention: presentation/utils/club-admin-attention.ts:249) |
| 193 | L3-13 알림 | L3-35 참석자 관리 | a 입금 알림 row (a session fee) | row | built via another route | signal-routes.ts:62-63 routes.sessionPayments for session_payment_submitted / host_refund_unsettled (/sessions/[id]/payments, a screen no page claims) |
| 194 | L3-13 알림 | L3-39 스코어카드 운영 | a 대진표 row | row | built | signal-routes.ts:100 routes.matchBoard (matchup signal with clubId+sessionId) |
| 195 | L3-13 알림 | L3-41 게시글 | a 공지 or 댓글 row | row | built | signal-routes.ts:110 routes.clubPost (social signal with clubId+postId) |
| 196 | L3-13 알림 | L4-18 알림 설정 | the header's gear (알림 설정) | header | built | packages/features/home/src/notification-center/use-notification-center.ts:220 openSettings -> routes.signalPreferences |
| 197 | L3-14 메시지 | L3-15 메시지 요청 | the door row 메시지 요청 | door | built | [control differs] packages/features/messaging/src/dm-inbox-screen.tsx:152-180 요청 is a tab inside the same /messages screen (L3-14 and L3-15 share the route); no door row |
| 198 | L3-14 메시지 | L3-42 DM 스레드 | a thread row | row | built | DmThreadRow default press routes.dmThread (dm-thread-row.tsx:131) via useDmThreadRowRenderer (packages/features/messaging/src/dm-inbox-screen.tsx:65) |
| 199 | L3-14 메시지 | L4-09 단톡방 만들기 | the FAB 단톡방 | fab | built | packages/features/messaging/src/dm-inbox-screen.tsx:187 routes.dmCreateGroup() (handleNewGroup, :199) |
| 200 | L3-15 메시지 요청 | L2-06 공개 프로필 | a request row (the requester's profile) | row | not built | the 요청 tab rows are DmThreadRow with isRequest (packages/features/messaging/src/dm-inbox-screen.tsx:108) and open the thread, not a profile |
| 201 | L3-16 참가비 내역 | L2-02 일정 상세 | a fee row | row | from is new | no /profile/fees screen |
| 202 | L3-17 순위표 | L1-02 클럽 | the no-club state’s 클럽 찾기 | door | not built | no routes.discoverClubs in packages/features/records/src/records-leaderboard-screen.tsx or leaderboard-*-tab.tsx |
| 203 | L3-17 순위표 | L2-06 공개 프로필 | a Podium column and a ranking row | row | built | packages/app/src/presentation/components/leaderboard-podium.tsx:84 routes.profileDetail; rows via LeaderboardRow identity press (packages/features/records/src/leaderboard-rank-row.tsx:60) |
| 204 | L3-17 순위표 | L3-19 친구 찾기 | the no-friends state’s 친구 찾기 | door | not built | the no-friends 친구 찾기 action is on 기록 (packages/features/records/src/records-screen.tsx:298), not on the leaderboard screen |
| 205 | L3-17 순위표 | L4-11 프로필 수정 | the no-region state’s 지역 설정 | door | built | packages/features/records/src/leaderboard-region-tab.tsx:133 routes.editProfile (no-region action) |
| 206 | L3-18 친구 목록 | L2-06 공개 프로필 | a request row and a friend row | row | built | packages/features/profile/src/friends-screen.tsx:148 FriendRow PersonRow default tap -> profile; the request rows are onPress={null} (:80,:120) |
| 207 | L3-18 친구 목록 | L3-19 친구 찾기 | the FAB 친구 | fab | built | packages/features/profile/src/friends-screen.tsx:288 routes.profileFriendsAdd |
| 208 | L3-19 친구 찾기 | L2-06 공개 프로필 | a result row | row | not built | packages/features/profile/src/add-friend-screen.tsx:87 result row PersonRow onPress= |
| 209 | L3-20 차단한 사용자 | L2-06 공개 프로필 | a blocked person’s row | row | not built | packages/features/profile/src/settings-blocked-users-screen.tsx:89 PersonRow onPress= |
| 210 | L3-23 앨범 | L2-02 일정 상세 | a group head's door 일정 상세 | door | not built | packages/features/clubs/src/club-album-screen.tsx has no routes |
| 211 | L3-23 앨범 | L3-41 게시글 | a group head's door 게시글 | door | not built | packages/features/clubs/src/club-album-screen.tsx has no routes |
| 212 | L3-24 복식 파트너 추천 | L2-06 공개 프로필 | a row's Sheet › the person row (공개 프로필) | menu | built | [control differs] packages/features/clubs/src/partner-suggester-screen.tsx:261 routes.userProfile on the row tap; no row Sheet |
| 213 | L3-25 멤버 관리 | L2-06 공개 프로필 | a member row's Sheet › the name row (공개 프로필) | menu | not built | member rows are PersonRow onPress={null} (packages/features/clubs/src/club-members/member-row.tsx:114); the kebab actions (shared/use-member-kebab-actions.ts) have no profile item |
| 214 | L3-25 멤버 관리 | L2-06 공개 프로필 | the viewer's own row | row | not built | same member-row.tsx:114 for the viewer's own row |
| 215 | L3-25 멤버 관리 | L3-01 신뢰 기록 | a member row's Sheet › 멤버 기록 (신뢰 기록, the officials' view) | menu | to is new | no /profile/trust route file or helper |
| 216 | L3-25 멤버 관리 | L3-07 출석 현황 | the header ⋯ › 출석 현황 | menu | not built | no routes.clubAttendance in packages/features/clubs/src/club-members-screen.tsx or club-members/* |
| 217 | L3-25 멤버 관리 | L4-09 단톡방 만들기 | the header ⋯ › 클럽 단톡방 만들기 | menu | built | packages/features/clubs/src/club-members-screen.tsx:242 routes.dmCreateGroup({userIds,title}) |
| 218 | L3-25 멤버 관리 | L4-10 멤버 초대 | the FAB 초대 | fab | not built | no push from packages/features/clubs/src/club-members-screen.tsx to the L4-10 route (/messages/add-members is reached only from packages/features/messaging/src/dm-thread/participants-modal.tsx:158) |
| 219 | L3-27 일정 관리 | L2-02 일정 상세 | a session row | row | built | packages/features/clubs/src/club-sessions-screen.tsx via useClubSessionCardRow -> routes.clubSession (use-club-session-card-row.tsx:36) |
| 220 | L3-27 일정 관리 | L4-01 일정 만들기 | the FAB 일정 | fab | built | packages/features/clubs/src/club-sessions-screen.tsx:327 routes.createSession(clubId) |
| 221 | L3-28 신고 관리 | L2-06 공개 프로필 | a report's Sheet › the reported person's name row (공개 프로필) | menu | built | [control differs] packages/features/clubs/src/club-reports-screen.tsx:98 PersonRow userId={report.reportedId} with the default tap -> profile; no Sheet |
| 222 | L3-29 테니스장 관리 | L2-04 장소 상세 | a venue row (its header ⋯ holds the club's commands) | row | built | packages/features/clubs/src/club-venues-screen.tsx:238 routes.venue(item.id) = /venues/[id] |
| 223 | L3-29 테니스장 관리 | L4-07 장소 정보 제안 | the FAB 테니스장 › the finder's 없는 장소 추가 | fab | built | [control differs] packages/features/clubs/src/club-venues-screen.tsx:321 routes.newVenueContribution() from the screen's add action, not the finder's row |
| 224 | L3-30 장소 정보 제안 내역 | L3-31 소유권 신청 내역 | the Feed-end door 소유권 신청 내역 | door | built | packages/features/sessions/src/venue-contributions/list-screen.tsx:71 routes.venueOwnerClaims({venueId}); the Feed-end door is an ActionButton in the list header |
| 225 | L3-30 장소 정보 제안 내역 | L3-33 제안 상세 | a receipt row | row | built | packages/features/sessions/src/venue-contributions/contribution-row.tsx:15 routes.venueContribution(receipt.id) |
| 226 | L3-30 장소 정보 제안 내역 | L4-07 장소 정보 제안 | the FAB 테니스장 (spoken 없는 테니스장 추가) | fab | built | packages/features/sessions/src/venue-contributions/list-screen.tsx:110 routes.newVenueContribution() |
| 227 | L3-31 소유권 신청 내역 | L3-34 장소 소유권 | a receipt row | row | built | packages/features/sessions/src/venue-owner-claims/list-screen.tsx:65 routes.venueOwnerClaim(item.id) |
| 228 | L3-31 소유권 신청 내역 | L4-08 소유권 신청 | the FAB 소유권 신청 | fab | built | packages/features/sessions/src/venue-owner-claims/list-screen.tsx:132 routes.newVenueOwnerClaim({venueId}) |
| 229 | L3-32 가입 심사 | L2-06 공개 프로필 | the applicant’s row, a 함께 친 멤버 row and a 추천 row | row | not built | packages/features/clubs/src/join-review-detail-screen.tsx has no routes |
| 230 | L3-32 가입 심사 | L3-25 멤버 관리 | the already-decided state’s 신청 목록 (멤버 관리 at 가입 신청) | door | not built | packages/features/clubs/src/join-review-detail-screen.tsx has no routes |
| 231 | L3-33 제안 상세 | L2-04 장소 상세 | the venue’s MediaRow | row | built via another route | packages/features/sessions/src/venue-contributions/detail-screen.tsx:148,162 routes.directoryVenue (/directory-venues/[id]) |
| 232 | L3-33 제안 상세 | L4-07 장소 정보 제안 | the band 정보 보완하기 and 다시 보내기 | band | built | packages/features/sessions/src/venue-contributions/receipt-actions.tsx:167 routes.newVenueContribution({supersedesId,...}) |
| 233 | L3-34 장소 소유권 | L2-04 장소 상세 | the venue’s MediaRow | row | built via another route | packages/features/sessions/src/venue-owner-claims/receipt-details.tsx:26 routes.directoryVenue (/directory-venues/[id]) |
| 234 | L3-34 장소 소유권 | L4-08 소유권 신청 | the band 정보 보완하기 and 다시 신청하기 | band | built | packages/features/sessions/src/venue-owner-claims/claim-actions.tsx:286 routes.newVenueOwnerClaim({supersedesId}) |
| 235 | L3-35 참석자 관리 | L2-06 공개 프로필 | a 미납, 참석 확정 or 예비 row's Sheet › the name row (공개 프로필) | menu | built | [control differs] packages/features/sessions/src/components/participant-row.tsx:191 PersonRow default tap -> profile only for a viewer with no admit/remove action; a manager's row is onPress= |
| 236 | L3-35 참석자 관리 | L2-06 공개 프로필 | a 신청 row, or a member's view row | row | built | packages/features/sessions/src/components/participant-row.tsx:191 (member's view row: default tap -> profile) |
| 237 | L3-35 참석자 관리 | L3-36 참석 확인 | the switcher › 참석 확인 | switcher | not built | packages/features/sessions/src/participants-screen.tsx and packages/features/sessions/src/session-attendance-screen.tsx are separate screens with no switcher and no routes between them |
| 238 | L3-36 참석 확인 | L2-06 공개 프로필 | a player's Sheet › the name row (공개 프로필) | menu | not built | packages/features/sessions/src/components/participant-row.tsx:93,285 PersonRow onPress={null} on the attendance rows |
| 239 | L3-36 참석 확인 | L3-35 참석자 관리 | the switcher › 참석자 | switcher | not built | no switcher (see link 237) |
| 240 | L3-37 호스트 관리 | L2-06 공개 프로필 | an applicant row | row | not built | packages/features/sessions/src/pickup-host-dashboard-screen.tsx:104 PersonRow onPress= |
| 241 | L3-38 스코어카드 | L1-03 경기 | the not-found state’s 경기 보기 | door | not built | packages/features/sessions/src/spectator-scorecard-screen.tsx:457 NotFoundState: 돌아가기 = appRouter.back() |
| 242 | L3-38 스코어카드 | L2-06 공개 프로필 | a player’s name on a row, a Podium name, a standings row and a name in a group table | row | built | packages/features/sessions/src/scorecard/live-tab/live-match-row.tsx:142, packages/features/sessions/src/scorecard/use-player-profile-reopen.ts:26, packages/features/sessions/src/scorecard/score-edit-sheet.tsx:275 routes.profileDetail; standings via PlayerIdentityChip/LeaderboardPodium defaults |
| 243 | L3-39 스코어카드 운영 | L3-35 참석자 관리 | the warning Notice’s action 참석자 관리 (unpaid players) | door | built via another route | packages/features/sessions/src/unsettled-pool-notice.tsx:39 routes.sessionPayments (/sessions/[id]/payments, a screen no page claims), shown by packages/features/sessions/src/match-board-screen.tsx |
| 244 | L3-39 스코어카드 운영 | L4-06 경기 규칙 | the header ⋯ › 경기 규칙 | menu | not built | no routes.sessionMatchRules in packages/features/sessions/src/match-board-screen.tsx or match-board/* |
| 245 | L3-39 스코어카드 운영 | L3-47 대진 짜기 | the band N라운드 대진 짜기 (a round settled, none next) and the empty state’s 대진 짜기 | band | to is new | no /sessions/[sessionId]/draw route file or helper |
| 246 | L3-39 스코어카드 운영 | L3-47 대진 짜기 | the header ⋯ › 라운드 추가 and 대진 다시 짜기 (before round 1) | menu | to is new | no /sessions/[sessionId]/draw route file or helper |
| 247 | L3-47 대진 짜기 | L3-39 스코어카드 운영 | 저장 (replace: the draw is committed, the Toast 경기 배정이 완료됐어요) | band | from is new | no 대진 짜기 screen |
| 248 | L3-47 대진 짜기 | L3-35 참석자 관리 | the Notice’s action 참석자 관리 (unpaid players are left out of the draw) | door | from is new | no 대진 짜기 screen |
| 249 | L3-41 게시글 | L2-01 클럽 홈 | the not-found state’s 클럽으로 | door | not built | packages/features/clubs/src/post-detail-screen.tsx:250 NotFoundState: 돌아가기 = appRouter.back() |
| 250 | L3-41 게시글 | L2-06 공개 프로필 | the author and a commenter | row | built | packages/features/clubs/src/post-detail/comment-row.tsx:102 commenter PersonRow default tap -> profile; the post author's PersonRow is onPress={null} (packages/features/clubs/src/shared/post-row.tsx:437) so only the commenter half is built |
| 251 | L3-42 DM 스레드 | L2-06 공개 프로필 | the header ⋯ › 멤버 보기 (a group), each member row | menu | not built | packages/features/messaging/src/dm-thread/participants-modal.tsx:129 member rows are PersonRow onPress={null}; the modal's only push is dmAddMembers (:158) |
| 252 | L3-42 DM 스레드 | L2-06 공개 프로필 | the header’s name (a one-to-one thread) | header | built | [control differs] packages/features/messaging/src/dm-thread/use-dm-message-renderer.tsx:79 routes.profileDetail(senderId) on a message avatar; packages/features/messaging/src/dm-thread/thread-info-header.tsx has no press |
| 253 | L3-42 DM 스레드 | L3-14 메시지 | the not-found state’s 메시지로 | door | not built | packages/features/messaging/src/dm-thread-screen.tsx:299 NotFoundState: 돌아가기 = appRouter.back() |
| 254 | L4-01 일정 만들기 | L2-02 일정 상세 | the band 일정 만들기 (a club session; replace) | band | built | packages/features/sessions/src/create-session/use-submit-session.ts:257 appRouter.replace(routes.clubSession(clubId, result.id)) |
| 255 | L4-01 일정 만들기 | L3-37 호스트 관리 | the band 일정 만들기 (a pickup; replace to 호스트 관리) | band | built | packages/features/sessions/src/create-session/use-submit-session.ts:246 appRouter.replace(routes.sessionHostDashboard(result.id)) |
| 256 | L4-01 일정 만들기 | L4-06 경기 규칙 | the 경기 규칙 value Cell of the review page | door | not built | no routes.sessionMatchRules in packages/features/sessions/src/create-session/* or create-session-*.tsx |
| 257 | L4-01 일정 만들기 | L4-07 장소 정보 제안 | the row 테니스장 추가 of the 테니스장 Search takeover when nothing is found | door | unsure | the 테니스장 step opens VenueSearchTakeover (packages/features/sessions/src/create-session/step2/create-session-step2.tsx:296); whether its empty result shows VenueFinderContributionRow (packages/app/src/presentation/components/sessions/venue-finder/venue-finder-contribution-row.tsx:37) was not traced |
| 258 | L4-02 클럽 만들기 | L2-01 클럽 홈 | the band 클럽 만들기 on step 10 (replace) | band | built | packages/features/clubs/src/create-club/screen/use-club-submit.ts:228 appRouter.replace(routes.club(progress.clubId)) |
| 259 | L4-04 초대 코드로 가입 | L0-01 시작 | the band 로그인하기 (returnTo and the code kept) | band | built | packages/features/clubs/src/join-club-screen.tsx:114-118 push(routes.loginReturnTo(routes.joinClub({clubId,code}))); web only, mobile has no /login route file |
| 260 | L4-04 초대 코드로 가입 | L2-01 클럽 홈 | the band 가입하기 (replace) | band | built | packages/features/clubs/src/join-club-screen.tsx:70 appRouter.replace(routes.club(targetClubId)) |
| 261 | L4-04 초대 코드로 가입 | L2-01 클럽 홈 | the club's row | row | not built | packages/features/clubs/src/join-club-screen.tsx has no club row |
| 262 | L4-05 글쓰기 | L3-41 게시글 | the band 올리기 (replace) | band | built | packages/features/clubs/src/post-create-screen.tsx:207 appRouter.replace(routes.clubPost(...)) |
| 263 | L4-07 장소 정보 제안 | L0-01 시작 | the signed-out wall's 로그인 | door | not built | no routes.login in packages/features/sessions/src/venue-contributions/* |
| 264 | L4-07 장소 정보 제안 | L2-04 장소 상세 | the venue's row | row | built via another route | packages/features/sessions/src/venue-contributions/lifecycle-editor.tsx:110 routes.directoryVenue (/directory-venues/[id]) |
| 265 | L4-07 장소 정보 제안 | L3-33 제안 상세 | the band 제안 보내기 (replace) | band | built | packages/features/sessions/src/venue-contributions/contribution-editor.tsx:54 appRouter.replace(routes.venueContribution(receipt.id)) |
| 266 | L4-07 장소 정보 제안 | L3-33 제안 상세 | the replacement Notice's action 제안 상세 | door | built | packages/features/sessions/src/venue-contributions/contribution-editor.tsx:116 routes.venueContribution(lastReceipt.id) |
| 267 | L4-08 소유권 신청 | L0-01 시작 | the signed-out wall's 로그인 | door | not built | no routes.login in packages/features/sessions/src/venue-owner-claims/* |
| 268 | L4-08 소유권 신청 | L2-04 장소 상세 | the venue's row | row | built via another route | packages/features/sessions/src/venue-owner-claims/application-editor.tsx:139 routes.directoryVenue (/directory-venues/[id]) |
| 269 | L4-08 소유권 신청 | L3-34 장소 소유권 | the band 신청하기 (replace) | band | built | packages/features/sessions/src/venue-owner-claims/application-editor.tsx:93 appRouter.replace(routes.venueOwnerClaim(result.id)) |
| 270 | L4-08 소유권 신청 | L3-34 장소 소유권 | the blocked state's one door Cell 장소 소유권 | door | built | packages/features/sessions/src/venue-owner-claims/application-editor.tsx:169,178 routes.venueOwnerClaim(...) |
| 271 | L4-09 단톡방 만들기 | L3-19 친구 찾기 | the zero-candidates state's 친구 찾기 | door | built | packages/features/messaging/src/dm-create-group-screen.tsx:163 routes.profileFriendsAdd |
| 272 | L4-09 단톡방 만들기 | L3-42 DM 스레드 | the band 단톡방 만들기 (replace) | band | built | packages/features/messaging/src/dm-create-group-screen.tsx:124 appRouter.replace(routes.dmThread(threadId)) |
| 273 | L4-10 멤버 초대 | L3-19 친구 찾기 | the nobody-to-invite state's 친구 찾기 | door | built | packages/features/messaging/src/dm-add-members-screen.tsx:104 routes.profileFriendsAdd |
| 274 | L4-10 멤버 초대 | L3-42 DM 스레드 | the band 2명 초대하기 (pops back to the thread) | band | built | packages/features/messaging/src/dm-add-members-screen.tsx:73 onSuccess appRouter.back() |
| 275 | L4-11 프로필 수정 | L4-15 설정 | the band 저장 (pops back, with the Toast 프로필을 저장했어요) | band | built | packages/features/profile/src/edit-profile-screen.tsx:284 appRouter.back() |
| 276 | L4-12 비밀번호 변경 | L4-15 설정 | the band 변경하기 (pops back, with the Toast 비밀번호가 변경됐어요) | band | built | packages/features/profile/src/change-password-screen.tsx:91 appRouter.back() |
| 277 | L4-13 회원 탈퇴 | L0-01 시작 | the band 탈퇴하기 (the mutation, then sign out) | band | built | packages/app/src/presentation/hooks/mutations/use-delete-account.ts:30 auth.signOut() -> AuthGate |
| 278 | L4-13 회원 탈퇴 | L4-20 클럽 설정 | a club row of the blocked page (at 대표 권한 넘기기) | door | not built | packages/features/profile/src/delete-account-screen.tsx has no routes (no blocked-by-club page) |
| 279 | L4-15 설정 | L0-01 시작 | the danger zone's Cell 로그아웃 (a Dialog, then sign out) | door | built | packages/features/profile/src/settings/destructive-section.tsx:15 onSignOut -> packages/features/profile/src/settings-screen.tsx:157-164 confirm then signOut() |
| 280 | L4-15 설정 | L3-20 차단한 사용자 | the 프라이버시 Cell 차단한 사용자 | door | built | packages/features/profile/src/settings/privacy-section.tsx:20 routes.settingsBlockedUsers |
| 281 | L4-15 설정 | L3-22 공지사항 | the 지원 Cell 공지사항 | door | built | packages/features/profile/src/settings/support-section.tsx:19 routes.legalNotices |
| 282 | L4-15 설정 | L3-43 문의하기 | the 지원 Cell 문의하기 | door | built | packages/features/profile/src/settings/support-section.tsx:23 routes.legalContact |
| 283 | L4-15 설정 | L3-44 이용약관 | the 지원 Cell 이용약관 | door | built | packages/features/profile/src/settings/support-section.tsx:27 routes.legalTerms |
| 284 | L4-15 설정 | L3-45 개인정보 처리방침 | the 지원 Cell 개인정보 처리방침 | door | built | packages/features/profile/src/settings/support-section.tsx:31 routes.legalPrivacy |
| 285 | L4-15 설정 | L4-11 프로필 수정 | the 계정 Cell 프로필 수정 | door | built | packages/features/profile/src/settings/account-section.tsx:18 routes.editProfile |
| 286 | L4-15 설정 | L4-12 비밀번호 변경 | the 계정 Cell 비밀번호 변경 | door | built | packages/features/profile/src/settings/account-section.tsx:19 routes.changePassword |
| 287 | L4-15 설정 | L4-13 회원 탈퇴 | the danger zone's Cell 회원 탈퇴 (the page's last group; the one door; destructive) | door | built | packages/features/profile/src/settings/destructive-section.tsx:16 routes.deleteAccount |
| 288 | L4-15 설정 | L4-16 연결된 계정 | the 계정 Cell 연결된 계정 | door | to is new | no /settings/accounts route file or helper |
| 289 | L4-15 설정 | L4-17 공개 범위 설정 | the 프라이버시 Cell 공개 범위 설정 | door | built | packages/features/profile/src/settings/privacy-section.tsx:18 routes.settingsPrivacy |
| 290 | L4-15 설정 | L4-18 알림 설정 | the 알림 Cell 알림 설정 | door | built | packages/features/profile/src/settings/notifications-section.tsx:47 routes.signalPreferences |
| 291 | L4-15 설정 | L4-19 동의 관리 | the 프라이버시 Cell 동의 관리 | door | built | packages/features/profile/src/settings/privacy-section.tsx:19 routes.consentManagement |
| 292 | L4-19 동의 관리 | L3-21 동의 이력 | the door Cell 동의 이력 | door | built | packages/features/profile/src/settings-consent-management-screen.tsx:276 routes.consentHistory |
| 293 | L4-19 동의 관리 | L3-44 이용약관 | the 보기 › of the 서비스 이용약관에 동의합니다 row | door | not built | packages/features/profile/src/settings-consent-management-screen.tsx pushes only deleteAccount (:139) and consentHistory (:276); no policy 보기 › rows |
| 294 | L4-19 동의 관리 | L3-45 개인정보 처리방침 | the 보기 › of the 개인정보 처리방침에 동의합니다 row | door | not built | same: no policy 보기 › rows |
| 295 | L4-20 클럽 설정 | L1-02 클럽 | the destructive Cell 클럽 보관 (a Dialog, then replace) | door | built | packages/features/clubs/src/club-settings-screen.tsx:242 onSuccess appRouter.replace(routes.clubs) |
| 296 | L4-20 클럽 설정 | L3-03 성장 분석 | the 모집 계획 Cell 성장 분석 | door | not built | no routes.clubAnalytics in packages/features/clubs/src/club-settings-screen.tsx or settings/* |
| 297 | L4-20 클럽 설정 | L3-29 테니스장 관리 | the 정보 Cell 활동 지역 | door | built | [control differs] packages/features/clubs/src/settings/info-section.tsx:217 routes.clubVenues from the venues Cell; the drawn Cell is 활동 지역 |
| 298 | L4-20 클럽 설정 | L4-14 회비 설정 | the 회비 Cell 회비 설정 | door | not built | no routes.clubDues in packages/features/clubs/src/club-settings-screen.tsx or settings/* |
| 299 | L4-20 클럽 설정 | L4-21 입금 계좌 | 클럽 설정 › 회비 › 입금 계좌 | door | to is new | no /clubs/[clubId]/settings/account route file or helper |
| 300 | link | L0-06 공유 링크 | a shared /s, /m, /p or /lb link opened in the app | link | built | apps/mobile/app/s/[sessionId].tsx, m/[matchId].tsx, p/[userId].tsx, lb/[clubId].tsx exist; share URLs built in packages/app/src/presentation/utils/share-cards.ts |
| 301 | link | L0-07 웹 공유 페이지 | a shared link opened in a browser without the app | link | built via another route | L0-07 has no route in page-levels; apps/web/app/s/[sessionId]/page.tsx (and m, p, lb, join-club) are the web landing pages with an OpenInAppButton |
| 302 | link | L2-02 일정 상세 | the shared link /s/[sessionId] (a member of the session’s club or a participant) | link | built | apps/mobile/app/s/[sessionId].tsx:93-96 Redirect to routes.clubSession when the viewer can read the session |
| 303 | link | L2-03 매치 미리보기 | the shared link /s/[sessionId] (a non-member) | link | not built | a non-member on /s sees PublicSessionSharePreview (apps/mobile/app/s/[sessionId].tsx:98-103), not routes.sessionPreview |
| 304 | link | L2-06 공개 프로필 | the shared link /p/[userId] | link | built | apps/mobile/app/p/[userId].tsx:37-38 Redirect to routes.profileDetail |
| 305 | link | L4-04 초대 코드로 가입 | an invite link /join-club?code | link | built | routes.publicClubInviteShare (packages/app/src/navigation/routes.ts) -> /join-club?code; parsed by parseJoinClubParams |
| 306 | push | L2-01 클럽 홈 | a 회비 push opens it at the 회비 pane | push | not built | signal-routes.ts:95-96 a dues signal opens routes.clubDues (L3-11), not 클럽 홈 at 회비; packages/app/src/presentation/hooks/use-notification-handler.ts:254 pushes the result |
| 307 | push | L3-01 신뢰 기록 | the tier-change and RSVP-block pushes | push | to is new | no /profile/trust route; signal-routes.ts:130 tier signals open routes.records, :143 trust signals open routes.profile |
| 308 | push | L3-01 신뢰 기록 | a 사유 인정 요청 push (신뢰 기록, the officials' view, at the request) | push | to is new | no /profile/trust route |
| 309 | push | L3-30 장소 정보 제안 내역 | the contribution pushes (a suggestion decided) | push | built via another route | signal-routes.ts:86 a contribution signal opens routes.venueContribution(contributionId) = L3-33, not the L3-30 list |
| 310 | push | L3-38 스코어카드 | the score pushes (a score to enter, a score under review) | push | built via another route | signal-routes.ts:100-101 a matchup signal opens routes.matchBoard (L3-39) when clubId+sessionId exist, routes.scorecard (L3-38) only as fallback |
| 311 | push | L3-41 게시글 | a club post notification | push | built | signal-routes.ts:110 routes.clubPost -> use-notification-handler.ts:254 |
| 312 | L3-11 회비 관리 | L3-46 장부 | the 장부 Cell at the page's end (owner review 48) | row | to is new | no /clubs/[clubId]/dues/ledger route file or helper |
| 313 | L1-04 기록 | L3-04 기간 기록 | the 경기 기록 Shelf head's door 전체 보기 › | door | built via another route | packages/features/records/src/records-screen.tsx:411 routes.recordsHistory = /records/history (RecordsHistoryScreen, a screen no page claims) |
| 314 | L4-15 설정 | L3-30 장소 정보 제안 내역 | the 앱 Cell 보낸 제안 (장소 정보 제안 내역 at 내가 보낸 제안) | door | not built | no Cell in packages/features/profile/src/settings/app-section.tsx or settings-screen.tsx; the header of packages/features/profile/src/settings-screen.tsx:19-23 says 제안 내역 moved to the 테니스장 directory (venue-finder-contribution-row.tsx:48) |
| 315 | L3-25 멤버 관리 | L3-32 가입 심사 | an applicant row (가입 심사) | row | built | packages/features/clubs/src/club-members/members-list-header.tsx:170 routes.joinReview(clubId, request.userId) |
| 316 | L3-25 멤버 관리 | L2-06 공개 프로필 | a guest row of 추천할 만한 게스트 | row | not built | packages/features/clubs/src/club-members/recommend-guest-row.tsx has no press to a profile (the row toggles a nomination, :59) |
| 317 | L3-03 성장 분석 | L4-10 멤버 초대 | the Cell 멤버 초대 | door | not built | no push to the L4-10 route in packages/features/clubs/src/club-analytics-screen.tsx |
| 318 | L2-04 장소 상세 | L3-30 장소 정보 제안 내역 | the owner Notice 검토할 제안 N건, action 장소 정보 제안 내역 | door | built via another route | /directory-venues/[id]: packages/features/sessions/src/venue-contributions/venue-contribution-links.tsx:15 routes.venueContributions({venueId}) (in the directory screen's closure) |
| 319 | L2-04 장소 상세 | L3-30 장소 정보 제안 내역 | the pending Notice’s 장소 정보 제안 내역 | door | built via another route | same venue-contribution-links.tsx:15 on /directory-venues/[id] |
| 320 | L2-04 장소 상세 | L4-07 장소 정보 제안 | the closed Notice’s 장소 정보 제안 | door | built via another route | /directory-venues/[id]: packages/features/sessions/src/directory-venue-detail/use-directory-venue-detail.ts:465 routes.newVenueContribution({kind:'report'}) and venue-contribution-links.tsx:22 lifecycle |
| 321 | L2-04 장소 상세 | L1-03 경기 | the 다음 일정 head’s 전체 보기 › (경기 filtered to the venue) | door | not built | packages/features/sessions/src/venue-detail-screen.tsx has no routes (see link 158) |
| 322 | L2-06 공개 프로필 | L3-06 선수별 전적 | the 나와의 전적 head’s door 자세히 › | door | not built | no routes.analysisRivals in packages/features/profile/src/public-profile-screen.tsx closure |
| 323 | L2-06 공개 프로필 | L3-01 신뢰 기록 | the 신뢰 head’s door 기록 보기 › | door | to is new | no /profile/trust route file or helper |
| 324 | L3-04 기간 기록 | L3-06 선수별 전적 | the Cell 상대 | door | not built | packages/features/records/src/record-detail-screen.tsx and record-detail/* push only routes.recordDay (:192) |
| 325 | L3-01 신뢰 기록 | L3-11 회비 관리 | the Cell 회비와 참가비 (an official’s view, 멤버 기록) | door | from is new | no /profile/trust screen |
| 326 | L2-06 공개 프로필 | L3-04 기간 기록 | the 전적 head’s door 전체 보기 › (owner review 52: 기간 기록 read as that person’s) | door | not built | packages/features/profile/src/recent-matches-section.tsx:66 routes.recordsHistory is shown only when isOwnProfile (a visitor sees no link), and it opens /records/history |
| 327 | L2-06 공개 프로필 | L3-38 스코어카드 | a 최근 경기 row (owner review 52), where the viewer may see the match | row | built via another route | packages/app/src/presentation/components/match-history-row.tsx:89 routes.clubSession -> L2-02 일정 상세, not L3-38 스코어카드 |
| 328 | L3-38 스코어카드 | L3-08 테니스 여정 | the result’s note glyph (owner review 52: the note sits on 테니스 여정) | door | to is new | no /profile/journey route file or helper |
Table 2: built but not drawn
Every push or replace in a screen whose target is a route a page claims (or a route no page claims, from a page's screen), where page-links has no link from that page to that page. Dropped on purpose?: yes = review 52 § 3 lists the screen; moved = the boards draw the same door on another page or control (the link number is given); no = not a page pair, or the app contradicts a drawn landing; unsure = the boards say nothing, so it is a missing link or a path dropped without a note.
| From route | To route | File:line | Dropped on purpose? | Note |
|---|---|---|---|---|
| L1-01 /(tabs)/(home) | L3-04 /records/[period] | packages/features/home/src/cards/recap-summary-card.tsx:201 | unsure | the week/month recap card; the 홈 board draws no recap card and review 52 § 3 does not list it, so it is either a missing link or a card the boards dropped |
| L1-05 /(tabs)/(profile) | L3-14 /messages | packages/features/profile/src/profile-screen.tsx:236 | moved | the boards put the 메시지 icon on the 홈 header (link 42, not built); the 프로필 header icon is not drawn |
| L1-04 /(tabs)/(records) | L3-19 /profile/friends/add | packages/features/records/src/records-screen.tsx:298 | moved | no-friends empty action; the boards draw it on 순위표 (link 204), not on 기록 |
| L1-04 /(tabs)/(records) | L4-11 /settings/edit-profile | packages/features/records/src/records-screen.tsx:310 | moved | no-region empty action; the boards draw it on 순위표 (link 205), not on 기록 |
| L1-04 /(tabs)/(records) | /records/history (no page) | packages/features/records/src/records-screen.tsx:411 | yes | review 52 § 3: the history is 기록's own list and 기간 기록's rows; link 313 (L1-04 -> L3-04) is the drawn replacement |
| L2-06 /profile/[userId] (own view) | /records/history (no page) | packages/features/profile/src/recent-matches-section.tsx:66 | yes | review 52 § 3 (history absorbed); shown only when isOwnProfile; the boards draw L2-06 -> L3-04 (link 326) |
| L2-06 /profile/[userId] (own view) | L3-09 /profile/achievements | packages/features/profile/src/achievements-preview-section.tsx:127 | unsure | isOwnProfile only; L1-05 -> L3-09 is drawn (96), L2-06 -> L3-09 is not |
| L2-06 /profile/[userId] | L2-02 /sessions/[sessionId] | packages/app/src/presentation/components/match-history-row.tsx:89 (via packages/features/profile/src/recent-matches-section.tsx) | moved | the boards draw the 최근 경기 row to L3-38 (link 327, owner review 52); the app opens 일정 상세 |
| L2-01 /clubs/[clubId] | /clubs/[clubId]/admin (no page) | packages/features/clubs/src/club-detail-screen.tsx:190 and :523 | yes | review 52 § 3 row 1: the admin screen's rows are 클럽 설정's groups and the 관리 gear sheet (review 48) |
| L2-01 /clubs/[clubId] | /clubs/[clubId]/preview (no page) | packages/features/clubs/src/club-detail-screen.tsx:178 (replace for a non-member) | yes | review 52 § 3 row 2: one home for members and visitors (review 50) |
| L2-01 /clubs/[clubId] | L1-02 /(tabs)/(clubs) | packages/features/clubs/src/club-detail-screen.tsx:229 (replace after leaving the club) | unsure | not drawn on any board; the leave flow's landing is a missing link or an implicit pop |
| /clubs/[clubId]/preview (no page) | L2-01 /clubs/[clubId] | packages/features/clubs/src/public-club-profile-screen.tsx:147,154 (replace) | yes | review 52 § 3 row 2 |
| /clubs/[clubId]/preview (no page) | L3-25 /clubs/[clubId]/members | packages/features/clubs/src/public-club-profile-screen.tsx:403 | yes | review 52 § 3 row 2; the visitor frames of L2-01 draw no members door |
| /clubs/[clubId]/preview (no page) | L2-02 /sessions/[sessionId] | packages/features/clubs/src/public-club-profile-screen.tsx:273 and public-club-profile/guest-sessions-section.tsx:66 | yes | review 52 § 3 row 2; the boards draw a non-member's session item to L2-03 (link 101) |
| /clubs/[clubId]/admin (no page) | L2-01 /clubs/[clubId] | packages/features/clubs/src/club-admin-screen.tsx:54 (replace for a non-admin) | yes | review 52 § 3 row 1 |
| L2-02 /sessions/[sessionId] | L3-42 /messages/[threadId] | packages/features/sessions/src/session-detail/actions/share-and-chat-actions.ts:58,78 | unsure | the session group chat door; no L2-02 -> L3-42 link on the boards |
| L2-02 /sessions/[sessionId] | L4-09 /messages/new-group | packages/features/sessions/src/session-detail/actions/share-and-chat-actions.ts:62 | unsure | creates the session chat from its participants; no L2-02 -> L4-09 link on the boards |
| L2-02 /sessions/[sessionId] | /tournament-board (no page) | packages/features/sessions/src/session-detail-screen.tsx:450 and create-tournament-modal.tsx:260 | yes | review 52 § 3: a tournament is stages of the session's matches (L3-38 / L3-39) |
| L2-02 /sessions/[sessionId] | /sessions/[sessionId]/payments (no page) | packages/features/sessions/src/session-detail/actions/primary-action.tsx:395; session-detail/sections/refund-banners.tsx:64 | yes | review 52 § 3: split into L3-16 (own fees) and L3-35 (host confirmations); link 137 draws L2-02 -> L3-35 |
| L2-03 /sessions/[sessionId]/preview | L2-02 /sessions/[sessionId] | packages/features/sessions/src/public-pickup-preview-screen.tsx:428,433,438,443 (replace) | unsure | bounce for a non-pickup, the host, a club member or an approved applicant; only the /s link (302) is drawn into L2-02 |
| L2-03 /sessions/[sessionId]/preview | L3-42 /messages/[threadId] | packages/features/sessions/src/pickup-host-card.tsx:79 | unsure | the 호스트 card's message button; the boards draw the host Cell only to L2-06 |
| L3-38 /sessions/[sessionId]/scorecard | L3-42 /messages/[threadId] | packages/features/sessions/src/scorecard/score-correction-sheet.tsx:111 | unsure | the score-correction sheet opens a DM thread |
| L3-29 /clubs/[clubId]/venues | L3-30 /venue-contributions | packages/features/clubs/src/club-venues-screen.tsx:349 | unsure | a 제안 내역 door on 테니스장 관리; the boards draw L3-29 -> L4-07 and L3-29 -> L2-04 only |
| L1-03c /(tabs)/(sessions) 테니스장 | L3-30 /venue-contributions | packages/app/src/presentation/components/sessions/venue-finder/venue-finder-contribution-row.tsx:48 | moved | the boards moved 제안 내역 to 설정 › 앱 (link 314, not built) and keep only 목록에 없는 테니스장 추가 on the feed end |
| L4-01 /create-session | L2-04 /directory-venues/[id] | packages/features/sessions/src/create-session/step2/create-session-step2.tsx:176 | unsure | the picked venue's detail from the 테니스장 step; the boards draw L4-01 -> L4-07 only |
| L4-02 /create-club | L2-04 /directory-venues/[id] | packages/features/clubs/src/create-club-step2.tsx:343 | unsure | a picked venue's detail from step 2; not drawn |
| L4-02 /create-club | L1-02 /(tabs)/(clubs) | packages/features/clubs/src/create-club/screen/club-setup-receipt.tsx:76,117 (replace when no progress) | unsure | the setup receipt's exit; the boards draw only the replace to L2-01 (258) |
| L4-02 /create-club | L4-20 /clubs/[clubId]/settings | packages/features/clubs/src/create-club/screen/club-setup-receipt.tsx:149 (replace) | unsure | the receipt's 클럽 설정 door (finish the setup); not drawn |
| L4-08 /venue-owner-claims/new | L4-07 /venue-contributions/new | packages/features/sessions/src/venue-owner-claims/existing-venue-picker.tsx:50 | unsure | the picker's add-a-venue row; not drawn |
| L4-08 /venue-owner-claims/new | L3-31 /venue-owner-claims | packages/features/sessions/src/venue-owner-claims/application-editor.tsx:157 (scope inbox) | unsure | not drawn |
| L4-07 /venue-contributions/new | L4-07 (kind switch) | packages/features/sessions/src/venue-contributions/lifecycle-editor.tsx:118; facts-editor.tsx:241; report-editor.tsx:43; venue-contribution-links.tsx:22 | no | the same page reopened with another kind (facts, courts, lifecycle, report): a self-link, not a page pair |
| L3-33 /venue-contributions/[id]; L3-34 /venue-owner-claims/[id] | the same page for the predecessor or successor record | packages/features/sessions/src/venue-contributions/detail-screen.tsx:130,139; venue-owner-claims/receipt-details.tsx:82,94,114; transfer-proposals.tsx:57 | no | record chains (supersedes, replaced by, outgoing tenure): self-links |
| L3-42 /messages/[threadId] | L4-10 /messages/add-members | packages/features/messaging/src/dm-thread/participants-modal.tsx:158 | unsure | the boards draw L4-10 -> L3-42 (274, pop back) but no door into L4-10 from the thread; page-links gives L4-10 four club-side openers (130, 182, 218, 317) while its claimed route is the DM add-members screen |
| L4-19 /settings/consent | L4-13 /settings/delete-account | packages/features/profile/src/settings-consent-management-screen.tsx:139 | unsure | a delete-account door on the consent page; not drawn |
| L4-20 /clubs/[clubId]/settings | L4-01 /create-session | packages/features/clubs/src/settings/operations-section.tsx:72 | unsure | the 운영 section is not on the 클럽 설정 board |
| L4-20 /clubs/[clubId]/settings | L2-02 /sessions/[sessionId] | packages/features/clubs/src/settings/operations-section.tsx:83 | unsure | same 운영 section |
| L4-20 /clubs/[clubId]/settings | L3-39 /match-board | packages/features/clubs/src/settings/operations-section.tsx:93 | unsure | same 운영 section |
| L4-20 /clubs/[clubId]/settings | L2-01 /clubs/[clubId] | packages/features/clubs/src/settings/archived-club-section.tsx:38 (replace after restoring) | unsure | restore from the archived view; the boards draw only 보관 -> L1-02 (295) |
| L3-13 /home/notifications | L3-11 /clubs/[clubId]/dues | packages/app/src/presentation/utils/signal-routes.ts:96 (pushed at packages/features/home/src/notification-center/use-notification-center.ts:159) | no | a 회비 row lands on 회비 관리; the boards say 클럽 홈 at 회비 (185): a missing link in page-links, or a wrong landing in the app |
| L3-13 /home/notifications | L3-32 /clubs/[clubId]/join-review/[userId] | packages/app/src/presentation/utils/signal-routes.ts:120 | unsure | page-links draws the 가입 신청 row to L3-25 (191); the app prefers the applicant's dossier |
| L3-13 /home/notifications | L3-33 /venue-contributions/[id] | packages/app/src/presentation/utils/signal-routes.ts:86 | unsure | a contribution decision row; the boards draw the push to L3-30 (309) |
| L3-13 /home/notifications | L3-34 /venue-owner-claims/[id] | packages/app/src/presentation/utils/signal-routes.ts:80 | unsure | an owner-claim announcement row; not drawn |
| L3-13 /home/notifications | L3-38 /sessions/[sessionId]/scorecard | packages/app/src/presentation/utils/signal-routes.ts:101,106,139 | unsure | fallback when a matchup, session or unrated-outcome signal has no clubId |
| L3-13 /home/notifications | L3-42 /messages/[threadId] (or L3-14 /messages) | packages/app/src/presentation/utils/signal-routes.ts:159 | unsure | chat signals; not drawn |
| L3-13 /home/notifications | L1-04 /(tabs)/(records) | packages/app/src/presentation/utils/signal-routes.ts:130 | unsure | elo_changed / tier_promoted / tier_demoted rows; the boards say L3-01 (189, 190, 307), a page that does not exist yet |
| L3-13 /home/notifications | L1-05 /(tabs)/(profile) | packages/app/src/presentation/utils/signal-routes.ts:143,155 | unsure | trust / progression / system / subscription rows; the boards say L3-01 for trust |
| push -> L2-01 / L3-32 / L3-11 / L1-04 / L1-05 / L3-42 / L3-39 / L3-33 / L3-34 | the same targets as the notification rows above | packages/app/src/presentation/hooks/use-notification-handler.ts:254 pushes getSignalRoute() (signal-routes.ts) | unsure | page-links draws push -> L2-01, L3-01, L3-30, L3-38, L3-41 only (306-311); the app's push set is the notification-row set |
| L0-04 onboarding (no route) | L4-01 /create-session | packages/app/src/navigation/onboarding-intent.ts:30 (pickup_host) | unsure | post-onboarding destination by entry intent; the boards draw L0-04 -> L1-01, L1-02, L1-03, L4-02 only |
| L0-04 onboarding (no route) | L4-04 /join-club | packages/app/src/navigation/onboarding-intent.ts:31,57 (invitee keeps the code) | unsure | same; link 305 draws the invite link, not the onboarding hand-off |
| web shell, every page >= 600px | L4-15 /settings; L4-01 /create-session; L3-13 /home/notifications; L3-14 /messages | apps/web/components/app-nav.tsx:169, :209, :287, :295 | no | WebNavCovered: the web nav carries 메시지, 알림, 설정 and the create button from 600px up; the boards draw the mobile header icons only |
| redirect routes (/leaderboard, /ranking, /activity, /activity/pickups, /clubs, /clubs/discover, /home, /profile, /records, (tabs)/(clubs)/discover) | L3-17, L1-04, L1-03, L1-02, L1-01, L1-05 | apps/mobile/app/leaderboard.tsx:11; ranking.tsx:5; activity/pickups.tsx:9; clubs/discover.tsx:4; (tabs)/(clubs)/discover.tsx:9 | yes | review 52 § 3 last row: kept for old links or dropped with the route tree |
| /m/[matchId], /p/[userId], /lb/[clubId] share cards | L2-02, L2-06, L2-01 | apps/mobile/app/m/[matchId].tsx:96; p/[userId].tsx:38; lb/[clubId].tsx:37 | yes | review 52 § 3: one web share page per object (L0-07); the pairs L0-06 -> L2-02 / L2-06 / L2-01 are drawn (20, 21, 24) |
Table 3: route helpers no page claims
Compared with page-code-map's "App routes no page claims" (20 routes there; 19 today). A helper is listed when its path is claimed by no page, or when nothing calls it. Callers are non-test, non-comment routes.<helper> hits (the helper's own file excluded).
| Helper | Path | Callers | Note |
|---|---|---|---|
routes.ranking | /records | 0 | routes.records already points at the same path; no caller, no page claims /records (a redirect) |
routes.matchHistory | /records/history | 0 | duplicate of recordsHistory; no caller; no page claims the path |
routes.createPost | /clubs/[clubId]/board/create | 0 | duplicate of clubBoardCreate; no caller (the path is L4-05's) |
routes.notificationsAt | /home/notifications?filter=... | 0 | no caller outside tests, though its doc says 홈's 할 일 전체 보기 opens it at 처리할 일 (the path is L3-13's) |
routes.home | /home | 12 | redirect route; callers use it as the app root (tab bar, back-fallback, redirects); no page claims /home |
routes.clubs | /clubs | 10 | redirect route to the 클럽 tab; no page claims /clubs |
routes.activity | /activity | 12 | redirect route to the 경기 tab; no page claims /activity |
routes.activityPickups | /activity?tab=pickup_finder | 3 | redirect with a query; callers: home-nearby-pickups-card, home-today-view, records-screen |
routes.records | /records | 6 | redirect route to the 기록 tab |
routes.profile | /profile | 9 | redirect route to the 프로필 tab |
routes.discoverClubs | /clubs?tab=discover | 3 | redirect with a query to the 클럽 tab's 탐색 pane |
routes.recordsHistory | /records/history | 2 | RecordsHistoryScreen, no page claims it (review 52 § 3) |
routes.clubPreview | /clubs/[clubId]/preview | 2 | PublicClubProfileScreen, no page claims it (review 52 § 3) |
routes.clubAdmin | /clubs/[clubId]/admin | 2 | ClubAdminScreen, no page claims it (review 52 § 3) |
routes.directoryVenue | /directory-venues/[id] | 10 | DirectoryVenueDetailScreen, no page claims it, yet it is the app's real 장소 상세 for every picker, list and signal; routes.venue (/venues/[id], L2-04's route) is a bare screen with no navigation |
routes.sessionPayments | /sessions/[sessionId]/payments | 4 | SessionPaymentsScreen, no page claims it (review 52 § 3) |
routes.tournamentBoard | /tournament-board | 2 | TournamentBoardScreen, no page claims it (review 52 § 3) |
routes.publicMatchShare | /m/[matchId] | 1 | share-cards.ts only; share card routes (review 52 § 3 -> L0-07) |
routes.publicProfileShare | /p/[userId] | 2 | share-cards.ts only; share card routes |
routes.publicLeaderboardShare | /lb/[clubId] | 1 | share-cards.ts only; share card routes |
routes.login | /login | 3 | L0-01 has route null; mobile has no /login route file (AuthGate renders LoginScreen), the web has apps/web/app/login |
routes.loginReturnTo | /login?returnTo=... | 2 | same: web only (join-club-screen.tsx:114, apps/web/components/route-guard.tsx:35) |
Route files with no routes helper at all (all are redirects kept for old links): /(tabs)/(clubs)/discover, /clubs/discover, /activity/pickups, /leaderboard (helper recordsLeaderboard targets /records/leaderboard). Every other unclaimed route in page-code-map has a helper listed above, except /lb, /m, /p share cards (listed). The eight page routes with no route file and no helper are exactly the pages marked new: L3-01 /profile/trust, L3-08 /profile/journey, L3-16 /profile/fees, L4-03 /clubs/[clubId]/events/new, L4-16 /settings/accounts, L4-21 /clubs/[clubId]/settings/account, L3-46 /clubs/[clubId]/dues/ledger, L3-47 /sessions/[sessionId]/draw.
Web-only routes (apps/web, not part of the 84 mobile route files): /status, /preview, /login, /api/*, /sitemap, and the web landing pages /s, /m, /p, /lb, /join-club.
The owed pages (page-links owed)
None has a route file under apps/mobile/app or apps/web/app, and none has a routes helper (checked: no events, regular, groups directory or helper). Three exist as inline sections of 클럽 설정 (L4-20), so the data and editors are built but not as pages:
- 정기 일정 (regular-meets editor): RegularMeetsSection inside ClubSettingsScreen (packages/features/clubs/src/club-settings-screen.tsx:464, settings/regular-meets-section.tsx)
- 조 (groups editor): ClubGroupsSection inside ClubSettingsScreen (club-settings-screen.tsx:466, settings/club-groups-section.tsx)
- 앨범 관리: GallerySection inside ClubSettingsScreen (club-settings-screen.tsx:390, settings/gallery-section.tsx) and the read-only /clubs/[clubId]/album
- 행사 (an event page): nothing: no route file, no routes helper, no screen (t().common.createEvent is the label of the session create CTA)
- 행사 just made (replace target of L4-03): nothing; L4-03 itself has no route
Unverified and limits
- Closure-based: a push in a file shared by two screens (e.g.
club-members-screen.tsxis imported into the L2-01 closure) was attributed by reading the file, not by running the app; the evidence column names the file:line so each can be re-checked. - Role gating (official, host, member, non-member) and feature flags (
isOwnProfile,canManageClub, entitlements, empty/first-run states) were read, not exercised; a control behind a gate counts as built. - Links whose
fromis a pseudo-source (link,push) were checked against the route files andsignal-routes.tsonly. [control differs]is a judgement of mine against theviatext; the JSON keeps the rawviaand evidence so it can be re-judged.