Device checklists — the only checks that need a phone
Status: Active · Last reviewed: 2026-09-17 · 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, mark ✓ or ✗ on the page QA board (https://claude.ai/code/artifact/435ac449-870f-4717-a2dc-209830650ece, the page's own entry). A ✗ with one sentence is enough; Claude reproduces from the board.
Before any list
- Preview channel on the 0.8.0 Android build (
2afd1b89); 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. - Log in as the dev account. 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) |
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.