Device checklists — the only checks that need a phone
Status: Active · Last reviewed: 2026-10-06 · Owner: the phone in hand; everything else in the QA ladder is machine-run (qa-automation.md).
Each list is scripted to take about fifteen minutes with nothing to decide: install or update, seed once, walk the rows, tick or ✗ each row in the page QA board's Device lists view (https://claude.ai/code/artifact/435ac449-870f-4717-a2dc-209830650ece — the board renders this file, so the rows there are these rows). A ✗ with one sentence is enough; it lands in the feedback inbox with the row named and Claude reproduces from there.
Before any list
As of 2026-11-13 these lists (1 to 52) were written for the 0.11.0 build and the pre-flat-v2 pages; they are history, not a guide to the next build. The script for the 0.12.0 build is List 53, run after the pre-build and post-build checklists. The three steps below describe how the older lists were run.
- Preview channel on the 0.11.0 Android build (
e4583905, List 47); pull the latest OTA (background the app, reopen, or Dev panel → 업데이트 확인). - Seed once from the dev panel or the terminal:
node scripts/run-scenario.mjs full_qa(hosted QA bed; this overwrites the QA world — never on a database you called live).qa_showcaseis the lighter chain when only cards and live surfaces matter. - Sign in as the dev account by typing the e-mail and password (no build holds the password since 2026-11-13). Airplane mode is a separate list (offline behaviour is machine-tested; skip it here).
Legend: Route is what to open · Do is the gesture · Pass is what a Toss user would expect to see. Anything that needs a second person is marked (2p).
List 1 — Autonomous pass, wave 1 (after OTA of the 2026-09-17 decisions)
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | 클럽 tab | look at the header | a text action "초대 코드" (no key icon); tapping opens the code screen |
| 2 | 클럽 tab, account with no clubs | read the empty state | "클럽 탐색" filled, "초대 코드로 가입" outlined under it; the bottom "클럽 만들기" band is outlined, not filled |
| 3 | 클럽 tab, account with a club | look at the bottom band | "클럽 만들기" is filled again |
| 4 | club detail as an official | header | "관리" text action next to ⋯; white over the banner, brand colour once collapsed; ⋯ holds only 공유 and 나가기 |
| 5 | club detail as a plain member | header | no "관리"; ⋯ holds 공유 and 나가기 |
| 6 | club detail → 멤버 pane | scroll the header | member count line; "복식 파트너 추천" row for members; no 조 line when the club has one group; legend line + 조 lines when it has two or more |
| 7 | 관리 → 멤버 관리 | header | the partner row is gone from here |
| 8 | 관리 → 회비 관리 | unpaid row | inline "납부 확인" and "면제" pills, no ⋯; tapping the row opens the note editor; paid current-month row shows "납부 취소" |
| 9 | same | two or more unpaid rows | "전체 납부 확인" in the section header; confirm names the count and the total; one tap marks all; the toast counts them |
| 10 | session detail → host tools → 참가비 | title and sections | title "참가비"; section "입금 현황"; cost-split sessions show "정산" and the one-sentence explainer with 1,000원 rounding |
| 11 | same, pending row | pills | "입금 확인" (not 납부) and "면제" |
| 12 | 세션 만들기 from a club | step 3 | 형식 is pre-selected with the club's format and still changeable; pickup wizard starts empty |
| 13 | session edit (open session, nobody paid) | fields | 참가비 row is editable; the lock note names 종목/로테이션/모집 마감 only |
| 14 | session edit (a payment exists) | fields | 참가비 row disabled with "입금이 시작되어…" caption |
| 15 | scorecard rules strip | badges | a 듀스 or 노애드 badge next to tiebreak |
| 16 | any list | read secondary text | dates/venues/fees are visibly larger (14px); nothing clips mid-word |
| 17 | any card with a long venue name | title | wraps to two lines, never an ellipsis after one |
| 18 | 클럽 만들기 step 4 / 세션 만들기 step 3 | tier picker | plain 구력 lines; "자세히 보기" reveals the federation lines; tapping again collapses |
| 19 | same steps | 구성 field | one-line hint under the label; the "?" beside the tier label opens the tier sheet |
| 20 | session detail → 정보 | 로테이션 row | reads "N분마다 교대" |
| 21 | 홈 → 알림 filter chips | labels | "대항전", no "인터클럽" |
| 22 | 설정 → 신뢰 등급 row · public profile trust cell | tap | the trust sheet opens, four tiers with plain requirements, mine highlighted |
| 23 | 설정 → 문의하기 | rows | 이메일 문의 only (no Kakao until the channel URL is configured); tapping opens the mail app |
List 2 — Board device checks (three ack'd entries)
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | session detail with a participant whose photo URL is dead | participants section | initials or silhouette, never a blank circle (board fb_…3jw0x1) |
| 2 | 코트 → saved courts, airplane mode on then off | tile | pin glyph while the map image fails, image once it loads (board fb_…k39ijx) |
| 3 | 메시지 → open a seeded DM | header while loading and after | never a bare "메시지" once the thread has loaded (board fb_…szile3) |
List 3 — SessionCardV2 (owed since 2026-07)
Seed: card_showcase (or full_qa).
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | 홈, 경기 tab, club 일정 pane, records | scroll every feed | every session is the same V2 card; no old strip card anywhere |
| 2 | any card | map tile | district-scale tile with the red marker; no blank tile |
| 3 | live session card | top | attention strip (live / closing) tinted, marks icon-only under it |
| 4 | a saved session | right of the weather | bookmark glyph filled; tap toggles |
| 5 | a session you host | closing row | crown host mark |
| 6 | scroll a 30+ card feed fast | look for blanks | no blank cells (Fabric recycling class) |
List 4 — ATP live-set cards (owed since 2026-08-27)
Seed: live_showcase.
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | 세션 만들기 → match rules | pick a multi-set format | freeform steppers hide behind "형식이 세부 규칙을 정해요" |
| 2 | match board on that session | enter a score | per-set rows appear progressively; tiebreak entry when the set reaches the spec |
| 3 | session detail matchups card, spectator scorecard | scoreboard | N set cells, winner by sets won; single-set sessions unchanged |
| 4 | session edit | field rows | 코트 / 구성 / 실력 rows edit and save |
| 5 | live session (2p) | live pair | current-set games update within a few seconds without pull-to-refresh |
List 5 — Club home place surface (owed since 2026-08-23)
Seed: club_showcase.
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | club detail | scroll | album banner scrolls sideways; the top bar goes from ‹/⋯ over the banner to a solid bar with the title |
| 2 | identity block | read | avatar beside the title, emoji-led chips (📍 🎾 📅), tagline |
| 3 | mission card | new member | 가입인사 → 첫 일정 참석 → 첫 일정 후기 with the right step lit |
| 4 | schedule rows | tap the top row | collapses/expands; D-day, venue, one signal per row |
| 5 | feed | category chips | 전체 / 공지 / 자유 / 일정 후기 / 가입인사 (운영진방 for officials) filter the list |
| 6 | a post | tap 좋아요, open 답글 | counts update in place |
| 7 | 채팅 tab | list | the club room first, then every DM; no compose button |
List 6 — Flat layout device pass (F8, owed since 2026-09-07)
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | session detail, club detail, venue detail, profile, records | scroll each | canvas ground, no tinted card shells; one seam between sections, none inside a group |
| 2 | any detail page | left edge | text aligns at the 16px rail; nothing double-inset |
| 3 | dark mode | same five pages | borders one step above surface; no black-on-black rows |
| 4 | tab bar | switch tabs quickly | no elevation flicker on Android |
List 7 — Keyboard controller (activation is an on-device OTA loop)
Do this only when Claude ships an activation OTA and asks; the library is dormant in the 0.8.0 binary.
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | 세션 만들기 step with a text field at the bottom | focus it | the field rises above the keyboard without the whole screen jumping |
| 2 | DM thread | type | composer stays attached to the keyboard, no flicker on open/close |
| 3 | 참가비 결제 (PortOne WebView) | open | the WebView still fills the screen (top inset regression check) |
List 8 — Draft resume (owed since 2026-07)
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | 클럽 만들기 | fill two steps, kill the app, reopen 클럽 만들기 | "이어서 작성할까요?" offer; accepting restores both steps |
| 2 | 세션 만들기 | same | same |
| 3 | either | decline the offer | a clean wizard; the offer does not return |
List 9 — Create-club step 4 chips (owed since 2026-07-30)
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | 클럽 만들기 step 4 | format tiles | one-line pills ("복식 · 4인 기준"), selection visible, 44pt tall |
List 10 — Autonomous pass, waves 3/4 (OTA f3be020c, 2026-09-17)
Seed: live_showcase for rows 1–4, full_qa for the rest.
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | session detail of a live session | look under the hero | one band: 진행 중 · elapsed time · 라운드 N/M · 코트 N; it updates without pull-to-refresh |
| 2 | match board of the same session | top of the flow | the same band, same facts, first thing under the header |
| 3 | spectator scorecard of the same session | scroll the tabs | the band stays pinned above the tabs |
| 4 | a cancelled session | scroll | no empty matches section, no doubled hairline |
| 5 | 클럽 만들기 step 1 | toggle "기본 설정으로 빠르게 만들기" | off by default; on, the wizard runs name → where → when → review (four screens) and the progress dots match |
| 6 | same, review step | read the rows | 구성 혼합 / 형식 복식 / 실력 무관 / 균형 / 게스트 허용 each carry a 기본값 badge and open for editing on tap |
| 7 | 클럽 설정 (club created via quick start) | 인원 | a 정원 stepper exists and saves |
| 8 | 클럽 설정 → 정보 | 활동 지역 row | read-only district line with a link to 코트 관리; add a court in another district there and the line gains that district on return |
| 9 | 클럽 설정 → 갤러리 | upload | the OS picker allows multi-select (up to 4); one toast counts the uploads; no per-photo toast |
| 10 | club home, 전체 feed | after row 9 | "OO님이 사진 N장을 올렸어요" row with thumbnails and the 자동 marker; tap opens the album; the row is absent under 공지 |
| 11 | any picker with photo permission denied | pick | one dialog everywhere: "권한 필요 / 사진 접근 권한이 필요해요" (settings logo/banner/gallery, post photo, profile avatar, DM photo, club logo tile) |
List 11 — Owner report fixes (OTA a2cd626b, 2026-09-17)
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | any screen, phone online | switch Wi-Fi off and on, then leave the app and come back | no "연결이 끊겼어요" banner while the phone is online; if it appears during a switch it clears within a few seconds by itself |
| 2 | any screen | airplane mode on | the banner appears after about two seconds, not instantly, and lists fell back to cached content |
| 3 | same | airplane mode off | the banner clears within five seconds without touching the app; lists refresh |
| 4 | 클럽 tab (and 경기 tab) | look at the pinned 클럽 만들기 band | the band is the button plus 16px above the tab bar — no thick empty strip under the button |
| 5 | club detail, session detail, session edit | pinned CTA | 16px of band under the button before the navigation bar; the band colour continues to the screen edge |
| 6 | 클럽 만들기 / 세션 만들기 wizard | footer CTA | same 16px clearance as row 5; hint text above the button when the button is disabled |
| 7 | 세션 만들기 → 코트 search takeover, pick a court | confirm bar | same band as everywhere else |
| 8 | DM thread | composer | the composer sits directly above the keyboard/nav bar with no extra blank strip |
List 12 — Audit valid items (OTA c795a39a, 2026-09-18)
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | 홈, 이번 달 view with many sessions | scroll fast | cards appear as you scroll with no blank cells and no stutter; section titles and gaps look as before |
| 2 | 경기 tab — 내 경기 / 번개 찾기 / 저장됨 | look at the left edge | cards, titles and the filter bar share one 16px rail; nothing is double-inset |
| 3 | 클럽 → 일정 관리 | same | same rail on both panes |
| 4 | 기록 tab → ELO trend | tap a point, then slide across | the marker snaps point to point; the label above shows that match's date and ± delta; release keeps the point |
| 5 | same | scroll the page with a finger on it | vertical scroll still wins — the chart does not trap the drag |
List 13 — Web-render QA fixes (OTA OTA, 2026-09-18)
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | 기록 tab, scope row | look at the four pills | 우리 클럽 reads in full (no "우리 …"); the green pill sits exactly under the active label; tap 친구 → slides |
| 2 | 일정 → 참석자 관리 / 대진표 | find a member with no photo | a light-gray disc with initials, never bare letters floating beside the name |
| 3 | 클럽 홈, 일정 rows | with 4+ upcoming sessions, look at 일정 더보기 | the row sits on the same 16px rail as the rows above it; tap toggles expand/collapse |
| 4 | 일정 → 참가비 (free session) | scroll | the three facts sit tight; the amount input clears the 정산 내역 만들기 band; page scrolls |
| 5 | 일정 만들기 step 1 | look at the date field | placeholder / value inset from the border like a text field |
| 6 | 프로필, 친구 section | with zero friends | one CTA (친구 찾기), no chevron on the box; with friends: avatar stack + chevron |
| 7 | 프로필, 친구 section (hosted QA bed) | count | no friend named 알 수 없음 (migration 00656 removed the seed orphans) |
List 14 — Folded session card (OTA OTA, 2026-09-18)
| # | Route | Do | Pass | | --- | ---------------------------------------- | -------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | ----------------------- | | 1 | 경기 tab, 내 경기 (and 홈, 클럽 → 일정) | look at any card | three lines beside a square map tile: venue + one chip + bookmark / 📅 date time / 🎾 format style · tier dots | fee; a thin meter below | | 2 | same | a card where you are host or 참석 확정 | the chip beside the title reads 호스트 / 참석 확정 (or an attention chip like 마감 임박 when one applies) — never two chips | | 3 | same, a live session | look | the red band on top, the title chip shows your standing, no second 진행 중 | | 4 | same | tap a card | the hero repeats the same title + chip, then 📅 ⏰ 🎾 chips — the card read like a preview of this | | 5 | same, a long venue name | look | one line with … ; the tile stays a square; nothing below it is squeezed | | 6 | 360dp phone (small Android) if available | look at L3 | the tier numbers may ellipsize (…) — the 🎾 label and fee never do; nothing overflows the card |
List 15 — Event type, tier cue, panel filters (OTA OTA, 2026-09-18)
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | 경기 tab, 내 경기 / 번개 찾기 | look under the search bar | search + 필터 only — NO chip row (the quick chips were reversed the same day); tap 필터 → the panel starts 날짜 · 종목 · 경기 유형 — SUPERSEDED by List 16 #1 (the day headers are the frame now; there was never a "다가오는 일정" title, retest under List 16) |
| 2 | same | in the panel, 종목 → 복식 | the list narrows at once; every card's 🎾 line no longer says 복식; the 필터 badge shows 1 |
| 3 | same | in the panel, 날짜 → 오늘 | cards show ⏰ time only (no date); clear both → cards read 📅 date time again |
| 4 | same | 경기 유형 → 대회 (probably no results) | "조건에 맞는 일정이 없어요" with a 초기화 button; tapping it restores the list (번개 찾기 keeps your region) |
| 5 | any card | look at the tier segment | 🎯 leads the dots + numbers (no "NTRP" word on the card); 🔒 + grey numbers only on a session whose band excludes your rating |
| 6 | 일정 상세 | look at the hero | 📅 · ⏰ · 🎾 · 🎯 NTRP a–b chips in that order — the card unfolded; 정보 section starts with 경기 유형 정기 and still shows 경기 방식 |
| 7 | 일정 만들기 (club), step with 종목 | look after 종목 | a 경기 유형 field defaulting to 정기 with 대회 / 리그 / 대항전; the review step shows it only when not 정기; 번개 flow has no such field |
| 8 | a session created as 대회 | open its card and detail | card 🎾 reads "복식 대회", hero too; the info row says 대회 |
List 16 — Day sections, 2+2 card, tier cue fix, one title→item seam, no fee, text-only tier band, emoji line box, flush row headers (OTA c1d3e49f, 2026-09-18/20)
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | 경기 탭, 내 경기 | open the pane | day headers ("9월 19일 (토)" style) with 오늘/내일 meta stand above each day's cards; no "다가오는 일정" title anywhere above them |
| 2 | any session-card list (경기/클럽/홈) | look at any card | L2 reads ⏰ time · 🎾 format only — no date; L3 reads 🎯 dots+numbers | fee |
| 3 | any card, and the 🌱 trust chip on a member row | look at every emoji's bottom edge (⏰ 🎾 🎯 🌱) | drawn whole on YOUR phone's emoji font — the emoji now sits in a 20px line box (was 16); if any glyph is still cut, note which emoji and the phone model |
| 4 | 홈, 주 and 월 | look under the recap card; then switch to 오늘 | NO 이번 주 예정 / 이번 달 예정 title — day headers follow the recap card directly; 오늘 pane shows no day header (it's already a single day); card→card gap looks the same as on the 경기 tab |
| 5 | 클럽 → 일정 관리 (모집 중 / 진행 중 / 완료) | open each pane | day headers precede each day's cards on all three panes |
| 6 | 경기 탭, 번개 찾기 | scroll to the bottom until it loads more | day headers stay in list order as new pages append — no duplicate or misplaced header |
| 7 | 경기 탭, 필터 panel | 종목 → 복식 | every card's 🎾 line drops 복식; the day headers above them are unaffected |
| 8 | 클럽 미리보기 (active guest), 참여 가능한 일정 | scroll the section | day headers stand above the guest's session rows, same grammar as every other session list |
| 9 | 클럽 탭 내 클럽 · 알림 센터 · 클럽 멤버 · 기록 히스토리 · 코트 찾기 search | look at any section title and the first item under it | the gap is the same tight 8px everywhere (was noticeably wider on these five); the 조 group header on 랭킹 keeps its tier dot |
| 10 | any session card | look at L3 | 🎯 tier band only — no 무료 / ₩ amount on any card; the detail still shows the fee |
| 11 | any tier band (card L3, 클럽 card pill, 클럽 미리보기) | look at it | numbers only — no coloured dots before the NTRP values; the 티어 안내 sheet still shows its coloured legend |
| 12 | 클럽 → 멤버 / 회비 / 설정 / 관리, and any row list under a title | look at a section title and its first row | the first row's content starts about as far under the title as a card's border does on the 경기 list (measured 11–15dp vs 12); the 회비 avatar tops its three-line row instead of floating mid-row |
List 17 — Session detail, page-native (OTA 23aba75e, 2026-09-20)
Rewrites the 2026-09-20 morning "session share card" list (session-hero-quiet board, candidate D — docs/twomore_design_system/wireframes/session-hero-quiet.jsx's ShqPageNative): the hero card is retired, replaced by the page's own grammar starting right under the media band.
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | 일정 상세 | look at the hero | a map band (or, only when the session has no venue AND no free-text location, no band at all), a club-name eyebrow above the title, the venue name as the title — no chip, no fact rows, no fill meter on the hero itself |
| 2 | same, header | look at the top bar before and after scrolling | no title text over the hero (back button + ⋯ only); with a map band, scrolling solidifies the bar (still no title text); with no map band (rare — no venue/location), the bar never collapses, it's solid from the top |
| 3 | same, top rows below the hero | read the first block, before any banner/section | five rows, no title above them, no StatStrip: 일시 (date + time) · 종목 (format, + 경기 유형 word if not 정기) · 실력 (tier band, or "실력 무관") · 참가비 (your fee, "무료" if none) · 신청 마감 (date-aware, "없음" if none) |
| 4 | same, 참석 section | read the section header, not the rows | reads a recruitment word + count, e.g. "모집 중 6/16" — never a bare "확정 6명, 예비 0명" line while the session is still open/recruiting (that line only returns once the session is in_progress/completed/cancelled) |
| 5 | same, 정보 section | scan the rows | 경기 유형 · 경기 방식 · ELO 반영 · 날씨 (when forecast exists) · 로테이션 (when set) · 취소 규정 (when penalty applies) — no 종목/실력/참가비 rows here (they're in the top block above) |
| 6 | same, 공지 (a session with a description) | look at the 📣 line | the emoji sits vertically centered against the first line of text, whole (not clipped), same grammar as other glyph+text rows in the app |
| 7 | same | tap the map band | opens the venue's 테니스장 detail page (unchanged destination) |
| 8 | ⋯ → 공유 (or the Kakao/system share sheet) | send the link to yourself in KakaoTalk (or any app that unfurls links) | the unfurled preview still shows the Kakao image card (map/glyph tile + venue + facts) — unchanged, it renders from the web OG projection, not this screen's own hero; 참여하기 on the shared page still works unchanged |
| 9 | 번개 미리보기 (open a shared 번개 link while not a member) | scroll top to bottom | the SAME hero law as 일정 상세 (map band, club eyebrow, venue title, no chip); the top block adds a 승인 방식 row between 참가비 and 신청 마감 (자동 승인/승인 필요); no 시작 시간/최대 인원 rows; the 테니스장 card below has no second map — just address · 코트 · 운영시간 · 편의시설 + a 지도 보기 link |
| 10 | 일정 상세, top fact rows | look at each row's left edge | every row starts with its glyph — 📅 일시 · 🎾 종목 · 🎯 실력 · 💰 참가비 · ⏳ 참석 마감 (📝 승인 방식 on 번개 미리보기), the same glyphs the list card uses; the row reads as one unit despite the gap to its value |
List 18 — Session detail audit follow-through (OTA 80b7b66e — rows 1–11 also on 8ad45cd8, 2026-09-21)
Triage of the Gemini/Antigravity investigation of 일정 상세 and its reachable pages (docs/design/decision-log-autonomous-2026-09-17.md, GEMINI-AUDIT TRIAGE): the roster wall, the rules gate, the hero's missing tap cue, dead-end roster rows, the bare 정보 rows and the stale 참석 마감 — plus the owner's own Gemini-session changes (fee on the card's closing line, 👤 내 상태 row) now mirrored in canon and the kit.
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | 일정 상세 as a PLAIN member (not host, not 총무/대표) | tap 참석 → 전체 보기 (or the 외 N명 row) | the full roster opens (title 참석자) with 확정 + 예비 sections — no 접근 권한 없음, no 취소 section, no 제거 buttons; each row shows a chevron and tapping it opens that member's profile |
| 2 | same roster as 총무/대표 | open the same screen | title 참석자 관리 with the manage subtitle, a 취소 section, 제거 on confirmed/waitlisted rows (confirm sheet unchanged), 확정 on a 조-gated 예비 row |
| 3 | same roster as a 번개 host who is NOT a club admin | open via 호스트 도구 → 참가자 관리 | title 참석자 관리, the 취소 section, 확정 on a gated 예비 row, but NO 제거 buttons (the server refuses a non-admin host — the button never existed for real) |
| 4 | 일정 상세 as 경기이사 (match director, not 총무) | look at 호스트 도구, then open 경기 규칙 | the 경기 규칙 row is present and the editor opens and saves (before: row hidden / 접근 권한 없음 although the server allowed it) |
| 5 | 대진 방식 선택 → 토너먼트 setup, as a host who is not an admin | look at the 경기 시간 row | a plain read-only row — no "규칙 수정" hint/chevron (tapping it used to land on 접근 권한 없음) |
| 6 | 일정 상세 hero | look at the map band's bottom-left corner | a small "장소 보기" pill on the band; tapping the band still opens the venue page; a session with no venue id shows no pill |
| 7 | same, 참석 section rows | tap a participant row | opens their profile; the status badge (참석 확정 / 예비) still shows with a chevron after it |
| 8 | same, 정보 section | scan each row's left edge | 🏷️ 경기 유형 · 🏅 경기 방식 · 📈 ELO · (weather glyph) 날씨 — the ☀️/🌧 sits at the row START and the value is just "맑음 26°" (no second emoji) · 🔄 로테이션 · 📋 취소 규정; every glyph whole, not clipped (Samsung) |
| 9 | a session whose 참석 마감 has passed (or a completed one) | read the ⏳ 참석 마감 row | "9/20 오전 9:00 마감됨" (or "오늘 오후 6:00 마감됨") — always with a time, never a bare "9/20 마감됨" and never "9/20까지" |
| 10 | 경기 탭 / 홈 list cards as a BROWSING viewer | look at a card's closing line | fee text (e.g. 25,000원 / 무료) left of the meter; the venue title owns the whole first line (bookmark only); as host/confirmed the standing chip sits there instead and no fee |
| 11 | 설정 rows / 클럽 관리 hub rows | look at any row that carries a value or a 준비 중 badge | value/badge then ONE chevron, spacing unchanged from before (the primitive now composes it) |
List 19 — Public profile render loss fix & session detail header split (OTA 59f028ee, 2026-09-21)
Resolution of the Android Fabric native render loss on the Public Profile (/profile/[userId]) where child views below StatStrip disappeared and Button stretched to the bottom, plus native scroll ownership on DetailShell and SessionDetailHeaderRight component extraction for ARCH-10 file-size safety.
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | 공개 프로필 (/profile/[userId], e.g. from roster row) | view page on Android | StatStrip stat cells take their natural intrinsic height; 신뢰 등급 cell does NOT stretch vertically; 플레이 section and 친구 well render visibly below the strip |
| 2 | same, scroll behavior | scroll up and down | smooth native scrolling; bottom footer (신청 / 메시지 / 친구 추가 CTA) stays pinned without covering content or cutting off last items |
| 3 | 일정 상세 (/sessions/[id]) | tap header top-right bookmark button | bookmark toggles on/off with visual feedback |
| 4 | same, header top-right ⋯ menu | tap ⋯ icon | action sheet / menu opens with full list of session actions (공유, 캘린더 추가, etc.) and matching solid/collapsed ink |
List 20 — Session detail Option A alerts, selectable hover insets & badge typography (2026-09-22)
Elevating actionable transactional alerts (payment holds, refund obligations) to the top above the hero with rail padding; placing NoticeSection directly after core facts in the flat column; adding 12px inner padding, negative margin compensation, and rounded pill borders to ListRow and StatStrip interactive state layers; and setting the design-system badge default size to sm (12px badge role).
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | 일정 상세 with a pending payment hold (reserved) | open session detail page | 결제 대기 PaymentGateBanner (with 15-min countdown) renders below the hero title, as the first child of FlatColumn's alerts zone — above NoticeSection/LiveParticipantBar/SessionFactsSection; never buried below the fold (corrected 2026-09-23: layout changed by 85a12160) |
| 2 | 일정 상세 as host with pending refunds / overdue | open cancelled session with refunds | RefundBanners renders at the top above the hero; tap 환불하기 CTA routes directly to routes.sessionPayments |
| 3 | 일정 상세 with a host notice (description) | open session detail page | NoticeSection (Well tone="primary") appears directly below the alerts zone and ABOVE LiveParticipantBar/SessionFactsSection, before the roster and matches (corrected 2026-09-23: layout changed by 85a12160) |
| 4 | any list of ListRows (roster, host tools, settings) | hover or press a row on web/desktop or mobile | $surfaceTertiary highlight displays as a soft 8px-rounded pill with 12px breathing room around the leading avatar/glyph and trailing chevron, rather than a flush 0-inset hard rectangular border |
| 5 | any StatStrip (public profile, venue detail) | hover or tap a stat cell | state layer renders with 8px inner padding and $2 rounded corners cleanly within the cell boundary |
| 6 | 일정 상세 fact block (SessionFactsSection) | view 내 상태 row as host or confirmed participant | 호스트 or 참석 확정 badge text renders at 12px with proper line-height and balanced 4/8px padding; no longer shrunken to 10px micro font |
| 7 | status badges app-wide (status-badges.tsx) | check badges on list cards, roster, and details | Korean status badges (참석 확정, 마감 임박, 결제 대기, etc.) default to 12px badge role typography, visually proportional against 14px body text |
List 21 — Audit W0, Gemini follow-through, W1 batch 1 (OTA 7469af8a, 2026-09-23)
The P0 payment banner and ELO chart, the tappable-row seam root cause, the retired scroll pill, host tools in one place, and the first subtraction pass (docs/design/improvement-plan-2026-09-23.md).
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | 일정 상세 — a paid session you have NOT joined | open it | No 입금 필요 banner; the CTA is the plain 참석 CTA (PAY-NONE) |
| 2 | 일정 상세 — a cancelled paid session | open it | Terminal banner only; no payment banner |
| 3 | 일정 상세 — a paid session you joined, hold pending | open it | The 입금 필요 banner still shows, with the bank line and 입금 완료 |
| 4 | 일정 상세 → 참석 section | look at the roster | Title "참석 7/12"; confirmed rows carry no 참석 확정 badge; the host row reads 호스트, a waitlisted row 예비; the title sits 8dp above the first row |
| 5 | 일정 상세 as host → ⋯ | open the menu | Only 공유 / 그룹 채팅; no host tool there — they are in 호스트 도구, 8dp under its title |
| 6 | 일정 상세 as a non-host → ⋯ | tap 문의하기 | Your 1:1 thread with the host opens |
| 7 | any list of tappable rows | press and hold the first row | The grey press layer is rounded and whole (not clipped at the top) |
| 8 | 관리 (club admin) | open it | 운영 / 설정 titles 8dp above their rows; the top strip shows only non-zero counts, or 지금 확인할 일이 없어요 |
| 9 | any short list (e.g. 테니스장 관리) | open it | No floating 아래로 스크롤해 더보기 pill |
| 10 | 기록 → 최근 ELO 추이 | look at the chart | After wins the line rises and is green; one match still draws a line |
| 11 | 경기 tab | look at the lenses | The fourth lens reads 테니스장 in full |
| 12 | 홈 | switch 일/주/월; empty day → tap the card | Title reads 홈 on all three; 새로운 번개를 찾아보세요 opens 번개 찾기 |
| 13 | 클럽 (you have clubs) | look at the header and bottom | No pinned 클럽 만들기 band; a + beside 초대 코드 opens the wizard |
| 14 | 업적 | scroll the gallery | No 준비 중 rows; the 전체 count matches the rows shown |
| 15 | 클럽 홈 일정 rows | look at a day with two sessions | Each row shows a start time between the D-day chip and the venue |
| 16 | 일일 요약 / 기간 기록 match rows | look at a row | One context line (e.g. 복식), never 복식 / 복식 |
List 22 — Round 2: one match row, records subtraction, tab links (OTA 0aac6e5d, 2026-09-23)
The shared match row, the honest public profile, records without ghost rows, tier badges only at run starts, strings moved into i18n, and the ?tab= links that had landed on the wrong pane (docs/design/improvement-plan-2026-09-23.md, decision log ROUND 2 / TAB-PARAMS).
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | 홈 → 일, a day with nothing | tap 새로운 번개를 찾아보세요 | The 경기 tab opens on 번개 찾기 (not 내 경기) |
| 2 | 클럽, no clubs (or 탐색 entry) | tap 클럽 둘러보기 | The 클럽 tab opens on 탐색 (not 내 클럽) |
| 3 | 클럽, cold start as a member | kill the app, reopen on 클럽 | No 클럽 만들기 band flashes before your clubs load; the + icon appears once they do |
| 4 | Another player's profile | open it | 총 경기 is their match count (0 when none, never sessions attended); 승률/출석률 read like "67%" |
| 5 | Another player's profile → 클럽 | look at the section | No 전체 보기 link; the club row sits 8dp under the title; no 이미 친구예요 well |
| 6 | Another player's profile → 경기 기록 | tap a row | The row looks like a 기록 → 경기 기록 row and opens that 일정 |
| 7 | 기록 with fewer than 5 matches | scroll | No greyed "— — —" 개인 기록 rows |
| 8 | 기록 → 리더보드 (any tab) | scroll past the podium | A tier badge appears only on the first row of each tier run; tapping it opens the tier sheet |
| 9 | 일일 요약 of a mixed singles/doubles day | look at 최종 레이팅 | A formatted number ("1,013"), the doubles rating |
| 10 | 기록 → 형식별 통계 | look at the rows | 단식 / 복식 / 혼합 복식 as separate rows |
| 11 | 1:1 chat → block, then unblock | do both | Korean toasts from the app (차단/차단 해제), no raw text |
| 12 | 로그인 with a wrong password | submit | A Korean message about the password — no English or 세션 wording |
| 13 | 일정 상세, a pending 입금 hold | tap 입금 완료 | Toast: 입금 완료를 알렸어요. 호스트 확인을 기다려 주세요. |
| 14 | Android 설정 → 앱 → 투마 → 알림 | open the channel list | Channel names in Korean (일정, 대진표, 참석, 회비, 입금, 클럽 …) |
List 23 — Round 3: one number per metric, club ELO, sessions, home 일 (OTA faecdff0, 2026-09-23)
One since-join attendance rate, club-pool ratings labelled, session subtractions, strategy copy in i18n, and home 일 showing your clubs' sessions and pickups (decision log ROUND 3).
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | 홈 → 일, a day your club has a session | look | The club's session shows even if you haven't answered, with your 참석/미정 state |
| 2 | 홈 → 일, a day you joined a 번개 | look | The pickup shows on 일 (and its date has a dot in the calendar) |
| 3 | 홈 → 주 or 월, a period with no play | look at the recap | One calm line; no faded donut or overlay pill |
| 4 | 관리 → 출석 | look at the header and rows | Label reads 가입 후 출석률; a member who joined recently isn't penalised for older sessions |
| 5 | 관리 → 분석 | look at the funnel | The join conversion sits under 가입 버튼 탭; no figure above 100%; source rows have Korean labels |
| 6 | 클럽 → 랭킹, 기록 → 리더보드 → 클럽 | look at the ELO caption and podium | Club values read 클럽 ELO; the column fits "클럽 ELO" and "1,234" on one line |
| 7 | 프로필 | look at the streak stat | Reads 최장 연승 |
| 8 | 일정 상세 before a draw | scroll | No empty 경기 section |
| 9 | 일정 상세 → 참석자 | open it on a session with no 예비 | No empty group (no "(0)" well) |
| 10 | 번개 호스트 대시보드, no applicants | open it | One calm line; no big red 번개 취소 (cancel is in the detail's 위험 구역) |
| 11 | 일정 상세 → 경기 (same-tier players) | look at the rows | No identical medal on every player; rows don't repeat the round or a shared format |
| 12 | 클럽 → 대항전, a challenge past its end date | look at its badge | Reads 종료 |
| 13 | 라운드 추가 → 방식 | look at the presets | Names like 소셜 복식 / 실력별 단식 (no middle dots); descriptions show |
| 14 | 1:1 chat → delete your only message | go back to 채팅 list | The thread's preview no longer shows the deleted text |
When a list is done: move the page(s) to Done on the board. Claude reads the board, fixes ✗ items at the class level, and re-ships an OTA; the list is re-run only for the rows that changed.
List 24 — Round 4: one clock, person rows, exception ledger, kind groups, reports (OTA 0ce3160e, 2026-09-24)
24-hour times everywhere, one person row, 회비 as an exception ledger, admin work grouped by kind, a real 신고 flow, five-section 설정 and the round-4 review fixes: club chat reports reach club admins, per-kind dismiss, the DM row and host card on the canonical primitives (decision log ROUND 4 and ROUND-4 REVIEW entries).
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | 일정 상세 with a 참석 마감 | look at the deadline | 24-hour "HH:MM" (no 오전/오후) |
| 2 | 일정 만들기 → 마감 step | set a deadline, look at the receipt | 24-hour time |
| 3 | 일정 상세 → 참석자; 번개 호스트 대시보드 | look at the rows, tap one | Face (or initials), name, one sub line, a badge only for 호스트/예비; tap opens the profile |
| 4 | 기록 → 리더보드 (전체 / 지역 / 클럽), 클럽 → 랭킹 | look at the podium and rows | Player photos show, not only initials |
| 5 | 기록 → 상대 전적 | look | Both players show their photo |
| 6 | 관리 → 회비 | look at the top and the rows | Amount and due day stated once; sections 확인 대기 / 미납 / 완납 / 면제 (empty ones hidden); one 납부 확인 pill per unpaid row |
| 7 | 관리 → 회비 → tap a row | open the panel | 면제 / 메모 / 납부 취소 are there |
| 8 | 일정 → 출석 확인 | tap ✕ on a row, then tap it again | Rows are quiet; ✕ marks 불참 with a badge; a second tap clears it |
| 9 | 알림 → 할 일, admin of 2+ clubs | look, expand a multi-club row, tap chips | One row per kind; "N개 클럽" expands inline; each chip's count matches the rows it shows |
| 10 | A new player's public profile | open it | One line; no empty sections |
| 11 | 내 프로필 with no matches yet | look | Empty sections are gone; the 친구 찾기 prompt shows once |
| 12 | Public profile header | tap 공유, then ⋯ → 신고 | 공유 is its own icon; ⋯ holds 신고 / 차단; 신고 opens the report form |
| 13 | 관리 → 신고 N (admin strip), or a 신고 notification | open, resolve one | A 신고 review screen lists the reported member, reporter, date and reason; resolving removes it |
| 14 | A 대회 with no rounds | open the board | 라운드 만들기 shows; resetting asks a 처음부터 confirm |
| 15 | 설정 | scroll | Five titled sections 계정 / 알림 / 프라이버시 / 앱 / 지원; version, theme, legal, logout, 탈퇴 all there |
| 16 | 경기 → 테니스장 directory | look at the footer and header | 없는 장소 추가 (footer) and 제안 내역 (header) |
| 17 | 장소 정보 제안 or 소유자 인증 → 관찰 날짜 | tap the row | The native date picker opens; the picked date shows on the row |
| 18 | 클럽 → 테니스장 관리 | remove a venue | One confirm (web: one dialog, not two); the first row has its top inset |
| 19 | 프로필 수정 → 지역 | open it | One dropdown, not 17 chips |
| 20 | 회원 탈퇴 | look at the input | The placeholder is a hint, not the phrase to type |
| 21 | 클럽 홈 as owner or admin | look | No new-member mission |
| 22 | 클럽 게시글, 댓글 | look at the author line | Name first; time and category stacked below; 📌 공지 badge beside ⋯ |
| 23 | 관리 → 출석, a member who was a guest before joining | look at their rate | Never above 100% |
| 24 | A club chat → ⋯ on a member's message → 신고; then, as that club's admin, 관리 → 신고 | file one, open the list, resolve it | The report shows with its category (and the words, if any); 해결 처리 drops it from the 신고 count |
| 25 | 알림 → 할 일, one club with two kinds (e.g. 가입 + 미납) | dismiss one kind's row | The other kind's row stays; the bell count drops by the dismissed kind only |
| 26 | 채팅 list (and 클럽 → 채팅) | look at a 1:1 row and the 요청 tab | Face, name, last message below; time top-right with the unread dot under it; 요청 rows show 거절 / 수락, no chevron |
| 27 | 번개 미리보기, a pickup you don't host | look at the host card, tap it | Face, name, tier badge, 경기 수 / 출석률 below; tap opens the host's profile |
| 28 | 클럽 설정 → 게스트, a guest over the visit limit | look at the row | A warning badge on the row; the sub text is neutral |
| 29 | Web: 관리 → 신고 | open it | The 신고 list opens (no 404) |
| 30 | 신뢰 등급 explainer (tap your tier badge) | read the footer | Says reports from 3+ members, not "3 reports" |
When a list is done: move the page(s) to Done on the board. Claude reads the board, fixes ✗ items at the class level, and re-ships an OTA; the list is re-run only for the rows that changed.
List 25 — Open-issues pass: rails, avatars, answer-by deadline, venue picks (OTA d1d5eb27, 2026-09-24)
The regressions the emulator found in round 4, the RSVP deadline as an answer-by time, venue picks everywhere, and the smaller fixes (plan docs/design/open-issues-plan-2026-09-24.md).
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | Open the app after this update | look | You are still signed in |
| 2 | 클럽 → 관리 → 멤버 관리 | look at 대표 / 총무 / 멤버 | Every row shows the member's name (and 조), not just a photo |
| 3 | 관리 → 회비 | look at the rows | Rows sit on the page margin (nothing touches the screen edge); 납부 확인 is an outline pill |
| 4 | 프로필 → 친구 목록; 일정 → 참석자 | scroll | Every person shows a photo or initials — never an empty grey circle |
| 5 | 메시지 | look at the list | All titles start at the same line; a group shows two faces inside one circle's space |
| 6 | 메시지, a 1:1 chat with no messages | look, then open it | No preview text on the row; the chat opens empty as the row suggests |
| 7 | 일정 상세 with a 응답 기한 ahead | look at the facts | Reads 응답 기한 "…까지"; nowhere says 마감 |
| 8 | A session whose 응답 기한 has passed, seats left | look at its card and detail | Not "모집 마감"; the 응답 기한 row is gone; 참석 still works |
| 9 | 일정 만들기 → 응답 기한 | read the caption | Explains attendees are asked to respond by then and can still join while seats remain |
| 10 | 일정 상세 → 정보 | look | 경기 방식 is one row, with the ELO effect as a second line |
| 11 | 일정 수정 → any field | open it | The field's button says 적용; the page's own button says 저장 |
| 12 | 일정 수정 → 장소 | change it | Opens the venue search; the picked place replaces the old one |
| 13 | 일정 만들기 → 장소 | search a place that isn't listed | No free-text venue; "없는 장소 추가" takes you to the suggestion form |
| 14 | 클럽 → 테니스장 관리 | search a missing place | Leads to 없는 장소 추가; the header has 제안 내역 |
| 15 | 경기 → 테니스장 | scroll to the end | "찾는 곳이 없나요?" with 없는 장소 추가 and 제안 내역 |
| 16 | 복식 파트너 추천 | look at a candidate's breakdown | Values like 29/40 stay on one line |
| 17 | 클럽 홈 mission card; a post linking a session | look at the right edge | A chevron icon, not a typed › |
| 18 | Any screen | use normally | Nothing blocks the app (the update gate stays open on this build) |
List 26 — One rating, counting posts, clean initials (OTA 930dbd7c, 2026-09-24)
A player has one ELO now; a club's ranking is that ELO among its members (plan docs/design/club-rating-unification-plan-2026-09-24.md). Post counts now count every member, and club initials skip brackets.
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | 클럽 → a club → 기록 → 랭킹 | look at the caption and numbers | The column reads ELO (never 클럽 ELO); two members with the same ELO share a rank |
| 2 | Same list | compare a member with their profile | The ELO in the ranking is the same number as on that member's profile |
| 3 | Same list | look for a member who never played | Members with no rated match are not in the ranking |
| 4 | 기록 → 리더보드 → 클럽 | look at the podium and rows | Values read ELO; ranks match the club's 랭킹 tab |
| 5 | 클럽 → 관리 → 조 설정 → 재편성 미리보기 | look at the proposed groups | Groups follow members' ELO (the profile number) |
| 6 | 관리 → 분석 | look at 평균 ELO | A plausible average of the members' profile ELOs |
| 7 | A completed club 일정 → 결과 → 순위 | look at 클럽 내 순위 | The rank change is small and sensible (no jump from mixing two ratings) |
| 8 | 클럽 → 소식, someone else's post (as a member) | comment, then pull to refresh | The comment count goes up by one and stays |
| 9 | Same post | react, then pull to refresh | The reaction count goes up and doesn't snap back |
| 10 | 클럽 → 내 클럽 | look at club avatars without a logo | Initials never show a bracket or symbol ("[참가자뷰] 라이브" reads 참라) |
| 11 | 클럽 → 내 클럽, a card with many members | look at the member faces | The count chip reads +9 (with the plus), never a bare 9 |
List 27 — Club colour bands, friends going, rules-change notice (OTA 6631a5d0, 2026-09-24)
Three owner questions decided on evidence (decision log: OWNER QUESTIONS DECIDED): photo-less clubs show their own colour instead of a stock photo, sessions say when friends are going, and a rules change tells the players.
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | 클럽 → 내 클럽 / 탐색 | scroll past clubs without their own photo | Each shows a short band in its own colour (matching its emblem), not the same court photo |
| 2 | Same list, a club WITH a photo | look | The full-width photo is unchanged; while it loads, the club's colour shows, not a grey block |
| 3 | A photo-less club you manage → detail | look at the top | The coloured band shows 사진 추가; tapping it opens the album |
| 4 | Same screen | look at ‹ / 관리 / ⋯ at the top | They are dark and easy to read on the light band (white in dark mode) |
| 5 | A photo-less club you don't manage → detail | look | The band only, no 사진 추가 |
| 6 | 홈 or a club's list: a club session a friend has joined, you haven't | look at the card's bottom-left chip | Reads 친구 참석 with the number of friends |
| 7 | Same session → detail → 참석자 | look at the rows | Friends sit first with a 친구 badge; your own row still says 나 |
| 8 | A session you have joined | look at the card | No 친구 chip; your own status (참석 확정) shows |
| 9 | A pickup you host → 경기 규칙 | open it | You can edit; the screen says players will be notified when players have joined |
| 10 | Change a rule and save (as a joined player on a 2nd phone) | check notifications | The player gets an 일정 변경 notification |
List 28 — Realistic club photos and logos (hosted data, no OTA, 2026-09-25)
The seed world's photos and logos are now real (decision log: REALISTIC-SEED-MEDIA): photos taken at tennis courts and clubs, and original club emblems. Nothing ships to the app; the hosted QA data changed, so the installed preview build shows it as is.
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | 클럽 → 내 클럽 | scroll | Clubs with albums show real court and club photos, not flat drawn shapes; about half the clubs show a real emblem or photo logo |
| 2 | 클럽 → 탐색 | scroll | A club named after a place wears that place (송파구 테니스 → 송파 / SONGPA); neighbouring clubs rarely share a logo |
| 3 | 강남 코트 클럽 → detail | swipe the photo banner | Each page is a real photo; the dots, 앨범 N and ‹ / 관리 / ⋯ stay readable over busy photos |
| 4 | Same → 앨범 | read the captions | Each caption describes its photo (단체사진 shows a group, 야간 shows a night court) |
| 5 | 탐색 → a club with a logo and no photos | open it | The colour band with the real logo in its circle; say whether the band colour clashes with the logo |
| 6 | 클럽카드 M1 → 소식 → 오늘 코트 사진 공유합니다 | open the post | Two real photos |
| 7 | 강남 코트 클럽 → 관리 → 클럽 설정 | look at 로고 and 배너 | Real logo and banner previews |
| 8 | Dark mode → 클럽 lists | look at logos on a white square | Say whether the white logo squares look wrong on the dark list |
| 9 | 클럽카드 M2 / M3 / D2 | look | Still no photo and no logo (flag mark and colour band), by design |
| 10 | 광진 갤러리 운영 테스트 → 관리 → 사진 승인 | look | The pending photo is a real doubles shot; the rejected one is visibly blurred |
List 29 — Every club wears a photo; tighter session cards (OTA d9673491, 2026-09-26)
A club without its own photo now shows one of 27 court scenes, and an admin can pick another (decision log: COVER-ALWAYS). Session cards pull their time and tier lines together (CARD-FACT-GROUP). A replaced logo shows at once, and uploaded logos get a thin edge in dark mode (FLAGGED ISSUES).
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | 클럽 → 탐색 | scroll the whole list | Every card has a photo; clubs without their own show a court scene, and neighbouring cards rarely share one |
| 2 | 클럽카드 M2 / M3 / D2 | look | Each shows a court scene, no longer a colour band; the flag and people cluster still sit on the photo edge |
| 3 | A club with no photos (e.g. 클럽카드 D2) | open it | The banner is the same court scene as its card; ‹, 관리 and ⋯ stay readable over it |
| 4 | Same, as its admin | look at the banner | A small 사진 추가 pill sits bottom-right on the photo and opens the album |
| 5 | A club you are not in → 클럽 미리보기 | look at the top | A photo, never an empty colour field |
| 6 | Your club → 관리 → 클럽 설정 → 배너 | tap 기본 사진 선택 | A gallery of 27 court scenes opens with the current one ringed; picking one closes it and the preview, card and banner all change |
| 7 | Same | 배너 변경 (upload), then remove it | Your upload replaces the default and the 기본 사진 badge goes; removing it brings back the club's own default |
| 8 | Same → 로고 변경 | upload a new logo, go back, reopen app | The new logo shows on the card and the club page at once, and still after a restart; the old one never flashes back |
| 9 | Dark mode → 클럽 lists | look at clubs with white logos | A thin edge outlines each uploaded logo; nothing reads as a floating white square |
| 10 | 홈 / 경기 → any session card | look at the two lines under the title | ⏰ time · 🎾 format and 🎯 level sit close together as one group, with more space above them from the title |
List 30 — Bigger club photo, legible controls, two-line feed, one session fact list (OTA 80baf5ab, 2026-09-27)
The club photo is 2:1 of the screen (PHOTO-BAND-2:1). A soft dark edge keeps the controls over photos legible (PHOTO-SCRIM). Feed rows are two lines (FEED-TWO-LINES).
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | Any club → club page | look at the top photo | Noticeably taller (about half the screen's width), faces not cut off; the name and tabs still show below it |
| 2 | A club whose photo is bright (sky, court) | look at ‹, 관리, ⋯ | All three read clearly; a soft dark shade at the top edge, no circles behind the icons |
| 3 | Same | scroll up until the bar turns white | The shade disappears with the switch; no grey flash |
| 4 | Same, album with 2+ photos | look at the bottom of the photo | The page dots and 앨범 N pill read clearly; swipe to the last page (앨범 전체 보기): no shade there |
| 5 | A club you are not in → 클럽 미리보기 | look at the top | Same photo height as the club page; the 1/N pill sits bottom-right, not under ⋯ |
| 6 | Club page → 홈 feed | read a member post | Two lines above the text: the name, then time and board (e.g. 3시간 전 │ 자유); a bigger face |
| 7 | Same | read a 사진 올림 / 경기 결과 row | Same two-line shape: the sentence, then time │ 자동 |
| 8 | A post with a link (e.g. an 오픈채팅 URL) | tap the link, then tap the row text | The link opens the browser; tapping elsewhere opens the post |
| 9 | A post linked to a session | look at the session chip | Date and format on one line inside the chip |
| 10 | A venue page (코트 상세) | look at ‹ and the actions over the map | Readable over the light map |
| 11 | Any session → session page | read the facts under the title | One list: 일시, 종목, 경기 유형, 경기 방식 (with "ELO 반영/미반영"), 실력, 참가비, (취소 규정), 응답 기한, 날씨, 로테이션; no 정보 section further down |
| 12 | Same, a session with 7+ attendees | look at the 참석 header, then tap 외 N명 | "참석" on the left, "12/16명" on the right, no 전체 보기; the 외 N명 row shows three faces and opens the full list |
List 31 — Compact session facts, big feed photos (OTA d30a5f27, 2026-09-27)
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | Any session → session page | read the facts under the title | At most 7 rows: 일시 (with 응답 기한 under it when set), 종목 ("복식 │ 정기 │ 경쟁", with ELO and rotation under it), 실력, 참가비, and 취소 규정 / 날씨 only when they apply |
| 2 | A session with no RSVP deadline | look for 응답 기한 | No "없음" row anywhere |
| 3 | A session with a cancel penalty | read 취소 규정 | "시작 N시간 전부터 늦은 취소" in the warning colour |
| 4 | Club page → 홈 feed | scroll | A single photo spans the row, not a small thumbnail; two photos sit side by side; three or more show three squares with +N |
When a list is done: move the page(s) to Done on the board. Claude reads the board, fixes ✗ items at the class level, and re-ships an OTA; the list is re-run only for the rows that changed.
List 32 — One session record: the wizard review and the page's edit state (OTA 31371ae5, 2026-09-27)
The standalone 일정 수정 page is gone; a session is now edited in place on its own page, and the create wizard's last step reads the same field list, in the same order, with the same words (decision log: "merge the edit pages").
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | Session page, as its host, open session | tap 수정 | The fact block turns into a hint line + rows; 응답 기한/종목/한 경기 시간 and 취소 규정 show a lock with the reason; the footer CTA disappears |
| 2 | Same, edit state | tap 시간 | The time editor opens; 적용 closes it and the row shows the new time |
| 3 | Same, a session with confirmed attendees | change the date or time, then tap 완료 (header) | A confirm names how many people will be told, before it saves; a toast confirms the save |
| 4 | Same, edit state with an unsaved change | tap back | A confirm offers to discard; keeping editing leaves the row as changed |
| 5 | Session page as a plain member (not host/총무) | look at the header | No 수정 text action |
| 6 | 일정 만들기 → last step (확인); club 만들기 → last step (확인) | read the rows, tap one | Session review: one flat list, no card box; tapping a row returns to its step; 응답 기한/종목/한 경기 시간 and 최대 인원 carry their own note; club review is the same flat-list grammar |
List 33 — Edit-mode navigation and unsaved-changes guards (OTA 3673febd, 2026-09-27)
The session page's edit state now offers 취소/완료 instead of a back chevron, and every full-screen editor (경기 규칙, 프로필 수정, 글쓰기) asks before an unsaved change is lost to a stray back or swipe.
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | Session page, as its host, open session | tap 수정 | The bar shows 취소 (left, regular weight) and 완료 (right) — no back chevron; the page shows only the hero and the fact rows (alerts, notice, live bar, 참석, 경기, 호스트 도구, 위험 구역, and the bottom CTA are all gone); the map band no longer opens 테니스장 |
| 2 | Same, edit state, nothing changed | tap 취소 | Leaves the edit state at once — no confirm |
| 3 | Same, edit state | change a field, then tap 취소 | "수정을 그만둘까요?" confirm — 계속 작성 keeps editing, 그만두기 discards and leaves the mode |
| 4 | Same, edit state with an unsaved change | swipe from the left edge (iOS); press the hardware back button (Android) | iOS: the swipe does nothing (locked); Android: the same "수정을 그만둘까요?" confirm as 취소 |
| 5 | 경기 규칙 screen (호스트 도구 → 경기 규칙) | change a rule, then leave (back/swipe); repeat and tap 저장 instead | Leaving with a change asks "나갈까요?" — 삭제하고 나가기 leaves, 계속 작성 stays; 저장 returns without asking |
| 6 | 프로필 수정 (프로필 → 수정); 클럽 → 글쓰기 | type/change something, then leave; repeat and save/post instead | Same "나갈까요?" confirm on leaving with an unsaved change; a successful save/post returns without asking |
List 34 — One hero band for maps; separated fact rows (OTA 1c8cc520, 2026-09-27)
Every map band (session, venue, directory venue) is now the same 2:1-of-width hero band a club's photo/album already uses (MAP-BAND-2:1) — no more separate, shorter fixed strip. A fact list whose rows carry a second line spaces every row further apart from its neighbours (FACT-ROW-RHYTHM); a list of plain one-line rows stays as compact as before.
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | Any session → session page | look at the top map | As tall as a club page's photo band (about half the screen's width), sharp — not stretched or blurry |
| 2 | A venue page (코트 상세); a club's court page (경기 → 코트 → any venue) | look at the top map on each | Both the same height as the session page's map band |
| 3 | Any session → session page | read the facts under the title (일시, 종목, 경기 방식, …) | Rows with a second line (e.g. 경기 방식 with its ELO note) sit clearly apart from their neighbours — no lines between rows |
| 4 | A venue page → 이용료; a session's 참가비 row | read those one-line rows | Still compact — no extra gap was added where every row is a single line |
List 35 — Pencil + bottom edit sheets, bare edit page, map controls, one bottom CTA, dark badges (OTA a14ad2de, 2026-09-28)
Every editable row now trails a pencil instead of "수정" text, and tapping one rises a bottom edit sheet instead of a centered dialog (EDIT-PENCIL, EDIT-SHEET). The session page's edit state drops its map and hint line (EDIT-PAGE-BARE). The map band's own header controls read white over a dark top gradient, and the "장소 보기" pill is gone (MAP-BAR-INK, MAP-NO-CHIP). Detail pages keep exactly one bottom CTA — host tools and the destructive actions moved into the ⋯ menu (ONE-BOTTOM-CTA). Dark-mode badge fills lifted a tonal step so they read as chips again (BADGE-DARK-FILL).
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | Any session page, as its host | look at the header, then tap the pencil | The header shows a pencil + ⋯ — no bookmark, no "수정" text; a plain member instead sees a bookmark + ⋯ (never both, never three glyphs) |
| 2 | Same, edit state → tap any editable row | tap 장소, then 참가비/공지 (a text field) | A sheet rises from the bottom with a full-width [취소 | 적용] pair, rounded top corners, no drag handle, no X; the 참가비/공지 sheet lifts further when the keyboard opens |
| 3 | Same, edit state | look at the whole page | No map, no hint line above the rows; the bar is titled "일정 수정" with 취소 (left) and 완료 (right) — a plain bar, not the collapsing one |
| 4 | Any session → session page | look at the map band's ‹ / bookmark-or-pencil / ⋯ | White glyphs read clearly over a dark top gradient on the map, matching a club photo's own header treatment |
| 5 | Same | look for a "장소 보기" pill on the map, then tap the map | No pill anywhere on the band; tapping it still opens the venue page |
| 6 | Session page, as its host | scroll to the bottom, then open ⋯ | The bottom shows only the one primary CTA; ⋯ holds 참석자 관리 · 경기 규칙 · 호스트 관리 · 출석 확인, then red 경기 종료 · 일정 취소 · 일정 삭제, each still confirming |
| 7 | 대회 board (토너먼트), as its host | look beside the header status text | ⋯ opens with one row, 대회 취소 (confirm-gated); the bottom keeps only 다음 라운드/라운드 만들기 |
| 8 | Dark mode → any session roster/club member list | look at 호스트 / 친구 / 게스트 badges | Each reads as a distinct filled chip against the row background — none blend into it |
List 36 — Session facts lead with the decision (OTA afc1ff71, 2026-09-28)
The session page's fact block now shows in two layers: what a player needs to decide leads — 일시, 장소, 참가비, and any warning — and the game's own details (종목, 대상, a calm forecast) wait behind a tinted "자세히 보기" text link, closed on every visit (FACTS-LEAD-DETAIL).
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | Any session page | open it fresh, without scrolling | The first screen shows 일시, 장소 and 참가비, then "자세히 보기", then the 참석 title and its first roster rows — all above the bottom CTA |
| 2 | Same | tap "자세히 보기", then tap "접기" | 종목 and 대상 (and a calm weather line, if there is one) join the SAME list right under the lead rows; 접기 removes them again |
| 3 | A session with a late-cancel fee penalty, or one with a rainy forecast | open it fresh, without tapping 자세히 보기 | The warning (취소 규정 or 날씨) already shows in the lead rows, above the link — never hidden behind a tap |
| 4 | Any session page, after tapping 자세히 보기 to open it | leave the page, then come back | "자세히 보기" shows again — the block is closed, not remembering the last visit's choice |
List 37 — One chevron collapse pattern; the session hero zone (OTA cc805948, 2026-09-28)
Every collapse/expand control in the app is now the same chevron — never a text link (EXPAND-TOGGLE; DisclosureLink is deleted). The session page's alerts/notice/live bar and its fact block now read as one hero with the map and title, with no divider between them — the page's first divider sits above 참석 (HERO-ZONE).
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | Any session page (with a notice or an alert banner showing) | open it fresh, without scrolling; look between the notice/alert and the facts, then down to right above 참석 | No divider line between the notice/alert and the fact block — they read as one block under the map and title; the FIRST divider on the page sits right above 참석 |
| 2 | Any session page | scroll to just under 참가비, tap the chevron there, then tap it again | A lone chevron (no text) sits under the lead facts; tapping it slides 종목/대상 (and a calm weather line, if any) into place and the chevron turns up; tapping again closes them and turns it back down |
| 3 | Club creation wizard → 4단계 인원, with a schedule set | tap the 모집 목표 result box's headline row | No "왜 이 숫자죠?" text anywhere; the row itself is the tap target, its trailing chevron turns up, and the 게임 슬롯/필요 인원 arithmetic appears beneath it |
| 4 | Club creation wizard → 5단계 회비, with a court fee entered | tap the 제안 월 회비 headline row | Same pattern — the row is the tap target, the chevron turns, the per-venue arithmetic and 월 예산 line appear beneath it |
| 5 | Club creation wizard → 3단계 스타일 → 범위 설정, with a federation-credentialed tier in range | tap the chevron under the tier list; then turn on VoiceOver (iOS) or TalkBack (Android) and focus it | The chevron reveals the federation/league detail lines with no text link anywhere; the screen reader announces "자세히 보기, 버튼" collapsed / "접기, 버튼" expanded — never silent |
List 38 — Every collapse is the chevron (OTA 6c0882e2, 2026-09-28)
The 2026-09-28 audit found fifteen more hand-rolled collapse/expand controls across the app — chevrons swapped by hand, rows with no expanded state for a screen reader, and four remaining text toggles (전체 보기/접기, 일정 더보기/접기, 설정 더보기/접기, 더보기/접기). All of them are now the one ExpandToggle/ExpandChevron pattern from List 37 — never a text link.
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | Club home → 일정 tab, a club with more scheduled sessions than fit on screen | scroll to the bottom of the schedule rows, tap the chevron, then tap it again | A lone chevron (no "일정 더보기"/"일정 접기" text) sits under the rows; tapping shows the rest and turns the chevron up; tapping again folds them back and turns it down |
| 2 | Club home → 기록 tab, a club with more ranked members than the visible list; then open any member's stats card | tap the ranking footer chevron, tap it again; in the stats card, tap the 전적 (record) row | The footer's old "전체 보기"/"접기" pill is now a lone chevron with the same open/close behavior; the stats card's 전적 row keeps its W-L-D value but now trails the shared chevron, and opens/closes the partner/opponent ledger below it |
| 3 | Club home → 멤버 tab, or Club Members screen (/clubs/[clubId]/members), a club with 2+ regular members | tap the "멤버" section header | The header (count on the right, chevron trailing) is the whole tap target; the chevron turns up and the member rows slide into view; tap again to collapse |
| 4 | Club settings → 사진첩 (gallery), any uploaded photo row | tap the photo row | The whole row (thumbnail + caption + status) is the tap target with a trailing chevron; tapping opens the caption/visibility editor beneath it; tapping again folds it away |
| 5 | Create-club wizard → 지역 step (after picking a venue) and → 일정 step (any scheduled venue row) | tap the picked venue's court-count row; then tap a schedule row | Both show only a plain chevron (never a separate up/down icon swap) that turns up when its panel is open and down when closed |
| 6 | Profile → 문의하기 (Contact & FAQ), and Profile → 공지사항 (Announcements) | tap any FAQ question; then tap any announcement row | Both rows are ExpandToggle headers with a trailing chevron; the FAQ answer and the announcement body slide in on open. The announcement row now shows a chevron it never had before |
| 7 | Home tab → 할 일 (admin attention) band, an item type held by 2+ clubs (e.g. 미납 회비 across clubs) | tap the grouped row | The row's trailing chevron turns up and the per-club rows slide into place beneath it; tap again to collapse |
| 8 | Records tab → any period → 기록 상세, a period with 6+ distinct opponents; and the scope chip above the stats | scroll to 상대 전적, tap the chevron, tap it again; then tap the scope chip | A lone chevron replaces the old "더 보기" row — tapping shows up to 10 opponents, tapping again folds back to 5; the scope chip's own trailing chevron turns up while its filter fields are open |
| 9 | Sessions: create-tournament flow's 설정 section; a session's 정보가 달라요 (venue correction) 더 보기 panel; 경기 스코어카드 round headers | tap the tournament 설정 summary row; tap the venue-correction 더 보기 row; tap a scorecard round header | All three are a lone chevron (no "설정 더보기"/"더 보기"/"접기" text, no bordered box on the venue-correction one) that opens its panel/rows on tap and folds them back on a second tap |
| 10 | Any venue search/pick screen with more results than fit (create-club 지역 step, or 경기 탭 → 테니스장 찾기 → search) | scroll to the bottom of the results, tap the chevron, then tap it again | A lone chevron replaces the old "테니스장 N곳 더보기" text button; tapping opens every loaded result, tapping again folds back to the short list |
| 11 | Public pickup preview (a pickup's shared/discovery preview link), opened signed out | open the screen and look between the title and the fact list, without scrolling | No divider line between the map/title and the fact block — they read as one hero; the page's first divider sits below the facts, above the host card |
| 12 | Any row above, with VoiceOver (iOS) or TalkBack (Android) on | focus the chevron row and activate it | The screen reader announces the row's action (its own label, or "자세히 보기"/"접기") plus its expanded/collapsed state — never a silent glyph |
List 39 — Fee off once you're in; chevron spacing; names never cut (OTA 481f7306, 2026-09-28)
The 참가비 row now hides once the viewer's spot is settled (owner: "removing the 참가비 from sessions that you've already signed up for because you've already paid for it most likely"); the session fact block's lone chevron moved onto the list's own row rhythm (owner: "if we are rendering the chevron as a separate row, we should give it proper spacing up and below"); and a person's name now wraps to two lines everywhere instead of clipping (owner: "we shouldn't cut people's names. Other things should be cropped if we are crammed for space").
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | Session detail, a session you're confirmed and paid for | read the fact block | No 참가비 row — your spot is settled |
| 2 | Session detail, a session you're waitlisted for, or one you're only browsing (no RSVP) | read the fact block | 참가비 still shows — you may still be asked to pay |
| 3 | Session detail, a session you're confirmed for but still owe | read the top of the page and the fact block | The payment banner states the owed amount; the 참가비 row itself is gone (the banner already states the price) |
| 4 | Session detail, as the session's host | read the fact block | No 참가비 row — the host runs it and pays nothing |
| 5 | Session detail, any session | scroll to the fact block's chevron and look at the space above and below it | The gap from the last fact's text to the chevron equals the gap between any two facts; the gap from the chevron to the divider below matches |
| 6 | Club home → 일정 tab, a club with more scheduled sessions than fit on screen | scroll to the schedule rows' chevron | Evenly spaced above (matching row rhythm) and below (against the divider) — no lopsided gap |
| 7 | Club home → 기록 tab (ranking) | switch between 전체 and 조별 | 전체 shows a 조 column per row; 조별 shows no 조 column at all (its section header already names the group) — no blank column either way |
| 8 | Club home → 기록 tab (ranking), your own row | find your row in either view | "나" sits right beside your name, not in a separate trailing column |
| 9 | Records → 리더보드, or a session's 순위/스코어카드 standings, with a long Korean name | find that row or the podium | The full name wraps to a second line — never cut with "…" |
| 10 | 참가비 payment screen (session payments), club ranking, records, or match history, with a long name | scan any row | Names wrap to two lines everywhere instead of clipping |
| 11 | Any screen above | switch to a large system font size | Rows grow to fit two-line names and the chevron spacing without clipping or overlap |
List 40 — Named chevrons; ranking second line; no press band (OTA e7e5c480, 2026-09-28)
A chevron that hides a different kind of content than what already shows now names it, quietly (owner: "look for best practices and reflect them. We are always going for something clean and uncluttered"); club/session ranking rows drop their 전적/변동 columns for one quiet second line under the name (owner: leaderboard density pass); and the pressed/hovered tint band on rows and cards is gone — press just settles and dims the thing itself (owner: "is there a way to indicate that something is being pondered for action without rendering the grey band over the component?").
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | Session detail, fact block closed (any session) | read the chevron row at the bottom of the fact block, without tapping | It reads "종목 │ 대상 │ 날씨" in quiet grey, chevron trailing — not a bare glyph |
| 2 | Session detail, same chevron row | tap it | The 종목/대상/날씨 rows appear above; the words on the chevron row drop and only the chevron remains, in the same place — tap again to fold back |
| 3 | Sessions: create-tournament flow, 설정 section (a session with a generated group draw) | look at the summary sentence above the chevron, then tap it | The sentence ("N개 조, 조당 M명…") is now the chevron row's own header — no separate summary line above a bare chevron; tapping opens the 조/진출/시드 knobs beneath it |
| 4 | A venue's 정보가 달라요 (correction) flow, more than 3 editable fields | read the folded-fields row, without tapping | Field names show up to 3 ("이름 │ 종류 │ 코트 구성"), then "외 N개" for the rest — never a bare chevron or "더 보기" text |
| 5 | Club home → 기록 tab (ranking), 전체 view | read the header row, then any member row | Header reads 조·#·선수·ELO — no 전적 or 변동 column; a row shows the record and delta ("N승 N패 ▲N") on a quiet line under the name, ELO alone on the right |
| 6 | Club home → 기록 tab (ranking), a member with no rating change this week | find their row | The record line has no delta at all (no "+0") — it's dropped, not shown as zero |
| 7 | Club home → 기록 tab (ranking) | switch to 조별 | No 조 column on any row — the section header above already names the group |
| 8 | A score-driven session's 스코어카드 → 순위 tab | read any ladder row | The ELO delta sits on a line under the player's name, not beside the points value |
| 9 | Any browsing list (club list, session list, feed) or a list row (club home schedule, ranking, settings) | press and hold a card, then a row | The content itself dims and settles slightly on press — no grey/tinted band appears over the card or row |
| 10 | Web build, any of the same cards/rows | hover with a mouse, do not click | A gentle dim + pointer cursor — no band; move off and it returns to normal |
| 11 | Web build, any of the same rows | Tab to the row with the keyboard, don't press Enter | A visible focus ring still outlines it — unaffected by the tint-band removal |
| 12 | Any pressable card/row, with reduced motion on (OS accessibility setting) | press and hold | Only the dim shows — no scale/settle motion, still no tinted band |
List 41 — Section title to first item is 8pt on the club pages (OTA e924136a, 2026-09-28)
Owner: "there is a wider gap between the section and items on the club pages (my clubs and discovery) than in other pages". Measured on the web build from the title to the first card: 홈 8pt, 내 클럽 24pt, 탐색 20pt. After the fix all three measure 8pt.
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | 클럽 tab, 내 클럽 (member of 2+ clubs) | look at 가입한 클럽 and the first club card | The card sits as close under its title as the 홈 tab's cards sit under theirs (8pt) |
| 2 | 클럽 tab, 탐색 | look at 추천 클럽 and the first club card | Same 8pt gap; no extra space under the title |
| 3 | 클럽 tab, 내 클럽, with a guest invite (게스트 section) | scroll to the 게스트 section | A clear 16pt break between the last member card and the 게스트 title; 8pt under the title |
| 4 | Club → 순위 → 조별 | scan the A조 → B조 boundary | The groups still sit apart as before; no gap opens between a group title and its first row |
| 5 | 내 클럽, pull to refresh (the list re-sorts) | refresh twice | The gap under 가입한 클럽 stays 8pt after the refresh (the stale-separator bug no longer returns) |
List 42 — Privacy, consent and onboarding integrity; venue facts; tab and a11y semantics (OTA dbcb379e, 2026-09-29)
Owner: "Yes to all, but dev doesn't need to be handled too carefully." This implements Stages 0–1 of the page-quality review (.audit/page-polish-20260929/claude-review.md). Needs migrations 00675–00677 on the hosted project.
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | 설정 → 프라이버시 | change 지역 and then 성별 quickly, one after the other; leave and come back | Both changes stuck — the second didn't undo the first |
| 2 | 설정 → 프라이버시, airplane mode, cold open | try to tap a chip | The chips are inert until the profile loads online — nothing saves against defaults |
| 3 | 설정 → 알림 수신 toggle | turn it off and on | Push delivery follows the toggle; 설정 → 동의 관리 shows the 마케팅 알림 consent unchanged by it |
| 4 | 설정 → 동의 관리 → 마케팅 알림 (an account that had it granted) | read its state; turn it on; leave and come back | It reads withdrawn after the 00676 cleanup; turning it on sticks (re-consent works — it used to silently stay withdrawn) |
| 5 | 동의 관리 → 마케팅 알림 | turn it off, then on, then off | Each change sticks; no error toast |
| 6 | Onboarding (fresh account), reach 완료, go back to 동의 | uncheck a required consent, then jump forward to 완료 and tap 시작하기 | You're sent back to the 동의 step; nothing is saved until it's checked again |
| 7 | Onboarding, 완료 → back to 이름 | clear the name, jump to 완료, tap 시작하기 | Sent back to the 이름 step |
| 8 | A club venue's detail page | tap 길찾기, then 지도 | 길찾기 opens turn-by-turn directions; 지도 opens the place on the map (they used to be crossed) |
| 9 | Venue directory detail of a venue open overnight (e.g. 22:00–02:00), after midnight | read the hours line | 영업 중 — not 영업 종료 |
| 10 | Venue directory: a venue nobody has described as indoor or outdoor | read the hero facts and its card | No 야외/실내 fact at all — it used to say 야외 for every unknown venue |
| 11 | A public pickup preview (not joined), below its minimum | read the attendance line | "N자리 남음" counts real open spots (max − confirmed); a separate line says how many more are needed to play |
| 12 | Host a pickup at a venue found through search | create it, then open the session | The session's venue has the searched venue's map and address — not a bare name |
| 13 | Web build, 홈 → 주 / 월 / 일 tabs | tap 주, then 월 | The underline indicator moves under the tapped tab each time (it used to stay on 일) |
| 14 | Web build, any page | pinch or ctrl-+ to zoom | The page zooms (it was locked) |
| 15 | Web build, venue finder (코트 찾기) | open it without touching anything, then turn on 가까운 순 | Opening never prompts; turning on 가까운 순 asks the browser once, and allowing it sorts by distance (denying turns the chip back off) |
List 43 — Install the 0.9.0 preview build (EAS build a55c851f, 2026-09-29)
Phase A of the dependency upgrade: Expo SDK 55 latest patches, React Native 0.83.10 and TypeScript 6. The app version is now 0.9.0, a new runtime: preview OTAs from here on reach only this build. List 42's checks carry over unchanged.
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | Install the APK from the build page | open the app cold | It boots to 홈 without a crash; 설정 → 앱 버전 reads 0.9.0 |
| 2 | 홈 → a session → back, 클럽 → a club → back | move through tabs and push/pop a few screens | Transitions and the back gesture behave as before; no blank screens |
| 3 | A long list (코트 찾기, 클럽 탐색) | scroll hard up and down | No blank rows or cells (the FlashList recycling class) |
| 4 | A wizard with a text field (일정 만들기) | type, go back with unsaved edits | The keyboard behaves as before; the unsaved-changes prompt still appears |
| 5 | 설정 → 알림 수신 | toggle it | Push registration still works (a test push arrives, or the setting saves without error) |
| 6 | Any screen with a photo or map | open it | Images and static maps load |
List 44 — Install the 0.10.0 build: Expo SDK 57, React Native 0.86 (EAS build 2a544fb5, 2026-09-29)
Phase B of the dependency upgrade. The app version is now 0.10.0, a new runtime: install it, and later preview OTAs reach only this build. It supersedes the 0.9.0 build (List 43's checks apply unchanged). Navigation now runs on Expo Router's own fork of React Navigation, so rows 2–4 matter most.
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | Install the APK from the build page | open the app cold | It boots to 홈 without a crash; 설정 → 앱 버전 reads 0.10.0 |
| 2 | 홈 → leave for another tab and come back | watch the list | It refreshes on return (screen focus still reaches the app); nothing polls while you're away |
| 3 | 프로필 수정, change a field | press Android back, then try the iOS back swipe | Android back asks 계속 작성 / 삭제하고 나가기 (계속 작성 keeps the edit); the iOS swipe is locked while unsaved |
| 4 | 일정 만들기 wizard with typed input | press back | The same question appears; nothing is lost silently |
| 5 | 홈 → 주 / 월 tabs; any collapsing header | tap the tabs; scroll a detail page | The indicator slides to the tapped tab; the header collapses smoothly |
| 6 | A date/time field (일정 만들기 → 일시) | open the picker | The date/time picker opens and returns the chosen value |
| 7 | 경기 → 코트 찾기 and 클럽 탐색 | scroll hard up and down | No blank rows (the FlashList recycling class) |
List 45 — Web frame pinned to the viewport; route params on both platforms (OTA 0f6c2142 on 0.10.0, 2026-09-29)
Review Stage 2 (F01, F12). Rows 1–4 are web (a phone browser or a narrow desktop window); rows 5–6 apply on the phone too.
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | Web: 프로필 or 경기 while loading, or any short page | look at the bottom of the screen | The tab bar is at the bottom of the screen, not floating mid-page |
| 2 | Web: 클럽 → 내 클럽 with several clubs (a long list) | scroll down | The list scrolls under a fixed title and the tab bar stays pinned; the page itself doesn't move |
| 3 | Web: a session detail with a bottom button (참석 / 초대) | scroll the page | The bottom button stays pinned at the bottom of the screen |
| 4 | Web: 이용약관, then another page | scroll 이용약관 down, then open another page | 이용약관 scrolls normally; the next page opens at its top |
| 5 | An invite-only club you're not in (클럽 탐색 → its page) | tap its join button | The join screen names that club and warns if a code belongs to a different club (web too) |
| 6 | Venue directory → a venue → 여기서 일정 만들기 | open the create-session wizard | 어디서 is pre-filled with that venue and region (web too) |
List 46 — Page state, drafts, readable content (OTA 88456c6d on 0.10.0, 2026-09-29)
Review Stages 3–5 (F09, F10, F11, F14, F15, F16, F18, F20, C02, C04). Rows 1–15 are on the phone; row 16 is web.
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | 클럽 → 내 클럽, with airplane mode on | open the tab cold | An offline or error message with retry, never "가입한 클럽이 없어요" |
| 2 | 기록 | pull to refresh | The spinner stays until the numbers update |
| 3 | 기록 → 전적 on the dev account (many sessions) | open it and scroll | It loads (no "Failed to fetch"); month headers line up with the rows |
| 4 | 클럽 설정 → 계좌 | type a new account number, switch apps, come back | What you typed is still there |
| 5 | 일정 만들기 → 규칙 | edit the rules, leave the wizard, resume the draft | The edited rules are kept |
| 6 | 코트 정보 제보 (a venue → 정보 수정) | type something, press back | A leave confirmation appears; nothing is lost silently |
| 7 | 코트 소유 신청 (a venue → 소유 신청) | scroll the venue list, pick one, fill the form | One side margin (not double); the list scrolls smoothly; the submit button stays pinned at the bottom |
| 8 | 코트 소유 신청 내역 → a receipt | scroll the receipt | The action buttons stay pinned at the bottom |
| 9 | 클럽 관리 → 신고 관리 with a long report | read the row, then tap 처리 | The reason shows up to 4 lines; the confirmation shows the whole report before the action |
| 10 | 설정 → 알림 설정 | read the quiet-hours and payment helpers | Each helper reads whole, not cut at one line |
| 11 | 개인정보처리방침 / 이용약관 | scroll the tables and article titles | Long values and titles wrap; nothing is cut off |
| 12 | A long Korean club or session name (iPhone) | look at where the line breaks | Lines break between words, never inside one |
| 13 | A club you're not in (클럽 탐색 → 미리보기) | look at the page | Capacity reads as information, the member count appears once, no empty gallery section |
| 14 | 기록 → a ranking row → 멤버 통계 while loading | open it on a slow network | Unknown values show "···", never 0% or 0/0 |
| 15 | A comment or join request containing a link | tap the link | It opens |
| 16 | Web: a shared session link (/s/…) | read the subtitle | The grey subtitle is clearly readable |
List 47 — Install the 0.11.0 build: MMKV 4, security refresh (EAS build e4583905, 2026-09-30)
Phase C of the dependency upgrade. The app version is now 0.11.0, a new runtime: install it over 0.10.0 (don't uninstall first, so row 2 tests the stored data). Later preview OTAs reach only this build. Local storage moved to MMKV 4 (a new native module), so rows 2–4 matter most. List 46's checks apply unchanged.
Status (2026-10-06): still open. The owner's install smoke on this build is the one outstanding owner item; every later OTA list (48–52) assumes it.
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | Install the APK over the 0.10.0 app | open the app cold | It boots without a crash; 설정 → 앱 버전 reads 0.11.0 |
| 2 | The first launch after installing | look at the first screen | You're still signed in, and the last tab and settings you used are kept |
| 3 | 홈, then airplane mode, then close and reopen the app | open 홈 and 클럽 | The lists you saw before appear from storage, with the offline message |
| 4 | 일정 만들기 → fill two steps → close the app → reopen | open the wizard again | It offers to resume the draft |
| 5 | 설정 → 로그아웃, then sign in again | open 홈 | The previous account's data doesn't flash before the new session's |
| 6 | 경기 → 코트 찾기 and 클럽 탐색 | scroll hard up and down | No blank rows |
List 48 — Tamagui 2 (OTA aca045c1 on 0.11.0, 2026-09-30)
The UI library moved to Tamagui 2 as an OTA — no new install: open the app twice to pick it up. Layout is meant to be unchanged; accessibility labels moved to the web vocabulary. Emulator-checked: 클럽, 기록 and 설정 render and nothing crashed.
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | Every tab | tap through 홈 / 클럽 / 경기 / 기록 / 프로필 | Icons show; nothing is misaligned compared with yesterday |
| 2 | Any card or row | press and hold, then release | The press dims and settles as before |
| 3 | 홈 → 일 / 주 / 월; 클럽 → 내 클럽 / 탐색 | tap the tabs | The indicator slides to the tapped tab |
| 4 | 경기 → 코트 찾기 | look at a venue without a photo | A map thumbnail or the pin placeholder shows, never an empty box |
| 5 | A session detail, then 참석 | open it, then RSVP | The page and the bottom button look as before; the button responds |
| 6 | Optional: TalkBack on (설정 → 접근성) | swipe through a club card and the tab bar | Each card and tab reads its name and state (selected, expanded) |
List 49 — Animation driver, heading levels, slider keys (OTA 5f531fd6 on 0.11.0, 2026-09-30)
No new install: open the app twice. Animations now run on Tamagui's Reanimated driver (the Moti driver is deprecated); presets are unchanged, so nothing should look different. Emulator-checked: 홈 → 주 moves the indicator and nothing crashed.
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | 홈 → 일 / 주 / 월; 클럽 → 내 클럽 / 탐색 | tap the tabs quickly, back and forth | The indicator glides as before; no stutter or jump |
| 2 | A toast (e.g. save a venue) | trigger it | It slides in and out as before |
| 3 | Any expandable section (전적, 필터) | open and close it | It expands and collapses smoothly |
| 4 | 설정 → 접근성 → 동작 줄이기 on | repeat row 1 | The indicator snaps without animating |
| 5 | Web: a range slider (일정 만들기 → 실력) | click the handle, then press ← / → | The value steps with the arrow keys |
| 6 | 경기 → 코트 찾기 | look at a card with a rating | The rating and its review count stay on one line together |
List 50 — Partner candidates and analytics facts (OTA 08fb8f05 on 0.11.0, 2026-09-30)
Your board answers Q2 and Q3. No new install: open the app twice.
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | 클럽 → 멤버 → 복식 파트너 추천 | scroll the list | Each candidate is one row: face, name, NTRP │ ELO, one reason, the 궁합 score on the right |
| 2 | Same screen | tap a candidate | The four factor bars, the shared record and 프로필 보기 open under it; tap again to close |
| 3 | Same screen | open two candidates | Both stay open, so you can compare |
| 4 | Same screen, an open candidate | tap 프로필 보기 | Their profile opens |
| 5 | 클럽 관리 → 성장 분석 (when available) | look at 탐색 and 주요 경로 | Each count is a row: label left, number right; 최근 N일 sits beside the 탐색 title |
List 51 — Web app on a desktop window, phone unchanged (OTA ee2b6a90 on 0.11.0, 2026-09-30)
Your go on the web-app board (W1–W5) and Q1. The phone should look exactly as before except the titled post (row 1). Rows 2–3 are the phone regression; the rest is the web app in a desktop browser (yarn web, sign in with the dev account), no install.
Status (2026-10-06): the web rows (4–10) still apply unchanged — the Codex landing (List 52) touched the web app only at /status, the onboarding redirect and vitals.
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | Phone: 클럽 → a post that has a title | open it | The title leads (club name above it, author and time as chips); the title is not repeated in the body |
| 2 | Phone: 홈, 경기, 일정 상세, 설정 | open each | Same as before: bell on 홈, 번개 만들기 band on 경기, 참석 band pinned on the session, back on 설정 |
| 3 | Phone: 클럽 → 앨범 | open it | Still three photos per row |
| 4 | Web, window ≥ 1200: 홈 | look | Labeled sidebar left (번개 만들기, five tabs, 알림, 메시지, you → 설정); sessions in a 3-column grid |
| 5 | Web, window ~ 700–1100 | narrow the window | The sidebar becomes an icon rail; under 600 the bottom tab bar returns |
| 6 | Web: an 일정 상세, window ≥ 840 | look | The page sits in a centred column; 참가비, the 모집 bar and the 참석 button sit in a pane on the right |
| 7 | Web: 메시지 → a thread | click another conversation | The list stays on the left; the right side swaps to that conversation |
| 8 | Web: 설정 → 프로필 수정 | look | The settings list stays on the left with 프로필 수정 highlighted |
| 9 | Web: 번개 만들기 | click it | The wizard opens as a centred column; 다음 lines up with the fields |
| 10 | Web: any page | press Tab once | "본문으로 건너뛰기" appears top-left; Enter jumps past the sidebar |
List 52 — Codex landing: privacy, payments, messaging, clubs repairs (OTA 1719d507 on 0.11.0, 2026-10-06)
Migrations 00678–00690 are live on the hosted QA project (hosted DB at 00690) and the functions send-push, check-push-receipts, seed-scenario, fetch-holidays and export-user-data are deployed. No new install: open the app twice. Rows 1–7 are the phone; rows 8–10 are the web app in a desktop browser (yarn web, dev account). (2p) rows need a second account.
| # | Route | Do | Pass |
|---|---|---|---|
| 1 | Phone: 클럽 설정 → 클럽 보관, then 내 클럽 | archive a club you own, then open its row in 내 클럽 | The archived row shows; its recovery view restores the club within 30 days and it returns to the active list |
| 2 | Phone: 클럽 설정 → 소유권 이전 | open the recipient list with two members of one name | Members with the same or no nickname stay distinguishable, so you can pick the right one |
| 3 | Phone: 클럽 → a post with photos | open the post, then a photo | Photos load (they now come from signed links) and open full size |
| 4 | Phone (2p): a 파트너 invite | enter a code that belongs to a different invite | 참여 is refused with a clear message and nothing is joined; the right code joins |
| 5 | Phone: 일정 상세 → 입금 → 입금 확인 (as the session host) | confirm a member's transfer | The row turns paid for the host (without 총무 role); a second tap does nothing and shows no error |
| 6 | Phone (2p): 메시지 → a group conversation → 나가기 | leave, then reopen the stale thread and leave again | You leave once; the repeat shows no error and no duplicate system message |
| 7 | Phone (2p): another account replies to your message | background the app, wait for the push, then open it | The push arrives once; the app-icon badge counts it; opening the thread clears the badge |
| 8 | Web: /status | open it signed in and signed out | It renders the status page; signed in, your profile region loads without an error |
| 9 | Web: a new account's first sign-in | finish sign-in | It lands on onboarding, not 홈; finishing onboarding then lands on 홈 |
| 10 | Web: any page, devtools Network, filter vitals | navigate between three pages | Vitals posts return 2xx or 204; no repeated failures in the console |