Skip to content

Owner review 1 — rulings (2026-10-11) ​

Status: Active · Date: 2026-10-11 · Answers the owner's 23 review points on the flat v2 library boards, plus the audit of the sections they did not comment on. Evidence is in the three research lanes: lane A (layout, type, blocks, English, motion), lane B (notices, fields, validation, wizard, CTA helper), lane C (header, overlays, media band, messaging, live score, session rows, horizontal lists). The owner asked for research and best judgment; each ruling is logged for veto in the decision log. These rulings feed the consolidated library and the board rebuild.

The answers at a glance ​

#Owner questionAnswerRuling
1A dot in front loses the front gapAgreed. Nothing may enter the side margin.A leading dot takes a slot inside the rail, 8 + 8, on every row of a list that can show it; content starts at 36. The day header's "today" dot is dropped (오늘 already says it).
2Why the extra padding above headersIt is the section divider: the space above a heading is about twice the space below, so the title belongs to its own rows. Peers measure 33.8 above, 16.8 below.Keep 32 above; the space below grows 8 → 12. Day header: 24 above, 12 below. Section titles move up to 20/28·700.
3Type scale and accessibilityMostly in line; three gaps.New 16/24 reading size for comments, posts, dialog and notice bodies, toasts, terms and input text. Tab labels 11 → 12. Nothing in Hangul below 12. Wrapping small text gets 1.5 line height. Labels scale to 200%.
4Is 20 the standard marginThere is no single standard. Apple's own margin is 16 up to 375-pt phones and 20 from 390 pt (measured 20.00 in Apple's apps). Material and 당근 use 16, Toss and the banks 24.Keep 20 on 390–440-pt phones; 16 below 390; 24 from 600 (tablet and web).
5Block grammarOne grammar: label on top, the figure in the middle, the qualifier below, left-aligned.The whole block is the button with one chevron; no buttons inside; one state table (loading, empty, error, offline, long text, 200%).
6Strip: equal division, alignmentYour eye was right: the columns were equal but the text starts were not (133 then 116 apart).Equal pitch, left-aligned, label above the figure, no divider lines; 2–4 columns; reflows to two-up when a figure does not fit.
7Notice: a better way than the iconPeers lead with the message, not a generic icon.The title states the state (마감이 가까워요). No ⓘ. A severity mark only on warning and danger, a specific glyph only when it adds meaning (wifi-off, lock). Five tiers; the loud amber and red slabs only when the main action is blocked.
8Media row: court as the main informationAgreed (11 of 13 peers lead with title or place).Venue on line 1, time on line 2 in ink. In discovery, format and level go on line 3. Exception: when every row is at the same court, the court moves into the list head and the time leads.
9Input best practiceLabel on top, a 3:1 border, no helper by default.One field grammar for every field type (below).
10Wizard: two control areasBack at the top and the main button at the bottom is the funnel convention (GOV.UK, KRDS, Toss TDS, HIG). The fault was spacing.Keep the split. The progress bar moves to its own row, 16 clear of the buttons, with a "3/6" count.
11Helper texts: whenRarely.None by default. Only for a rule people cannot guess, a one-line consequence, a scale, or a live value. Below the control; an error replaces it.
12Notice under a field, iconA field note answers "what will this do".One line goes in the field's support line; more becomes a neutral notice with no default icon. Never hide essential information behind an ⓘ.
13Validation best practiceReward early, punish late.Check on leaving a field; re-check live once wrong; on submit focus the first error. Error = 2px red border + 16 glyph + 600 message in $errorText.
14Header text actions: icons only?Agreed, with one exception for mode controls.Ten universal header icons only. Text appears only to leave or commit a mode (취소, 완료, 저장, 건너뛰기, 전체 선택), drawn as small buttons. 관리 becomes a gear with a badge plus labelled entries in the page.
15When is an action sheet usedOne rule by what the person is doing.Confirm → Dialog. Command for an object → bottom MenuSheet (renamed from ActionSheet). Pick a value or enter data → Sheet. Read at length → page.
16CTA helper best practiceDecision facts above the button.Only for money, terms that change the decision, what is missing, or a failure. One line, two at most. The disabled main button becomes soft-disabled: grey, pressable, and the press shows what is missing.
17Media band iconsBack plus at most two icons.‹ at the left; share first, then save or ⋯. No text, pills or place actions on the photo; venue actions (길찾기, 공유, 전화) become a labelled row under the title.
18Message bubble spacingMeasured against KakaoTalk, iMessage, Signal.Within a run 2 (was 4); system lines 20 around; 12 from the last bubble to the composer; no home inset while the keyboard is up.
19Live score controls unclearAgreed.A full-screen recorder from the score block: each team's panel (at least 160 tall) is the button, named with the players' names; a labelled 되돌리기 that says what it reverts; screen kept awake. It counts games (our data model and Korean club scoring), with tiebreak points at 6-6.
20Warnings compact and actionableAgreed.State or consequence first, then one verb. A toast only for results and undo; failures go next to the button or in a notice that stays.
21English version clutteredEnglish runs about 1.33 times the Korean width.Line budgets by role, short date and count formats (Sat, Sep 19 · 4 courts), only the least important segment truncates, shorter English tag labels.
22Motion and accessibilityThe tokens match Material 3 and Seed; gaps found.Reduce Motion becomes a short fade, not a cut. Added: drag alternatives (WCAG 2.5.7), the iOS label checklist, larger targets.
23Horizontal participant listYour goal (a clean page) is right; the evidence says not for the roster. None of eight peers scrolls people sideways, and people miss items past the edge.The roster shrinks to one row of four faces with the count in its head and the full list one tap away (saves 116 pt). Sideways shelves are used for photos, upcoming sessions and recommendations.

Where the answer differs from the suggestion ​

  • Wizard (10). Kept split. Unifying at the top hides 다음 from the keyboard; unifying at the bottom fights Android's edge-back and was the design you found "out of proportion" three times. Only the spacing changes.
  • Participant list (23). One row of four instead of a horizontal scroll. The sports apps closest to ours (플랩풋볼, Spond, TeamSnap, Playtomic) all show rosters without sideways scrolling, and the roster is what the join button acts on.
  • Margin (4). 20 stays. It is Apple's own margin on current iPhones; 16 and 24 are the other two families. Changing it would cost a full board rebuild for no evidence-based gain.
  • Live score (19). Games rather than points, because the data model and club scoring work in games.
  • The edit sheet. My earlier "no ×, 취소 + 저장 pair" goes: KRDS, 당근 Seed and Apple all put a close in the title row. Edit sheets get × in the title and one 저장 at the bottom, matching your one-button footer law.

Decisions taken with the rulings (lane A D1–D7, lane C) ​

#DecisionRuling
D1Margin20 (16 below 390, 24 from 600)
D2English clock24-hour, the same formatter as Korean
D3English money and minutes₩ in tabular figures; relative time Nmin
D4Shorter English Tag copyadopt the six shortened labels
D5Landscapedecided with the first iOS build (phones portrait until then; WCAG 1.3.4 departure recorded)
D6Press springsadopt ζ 0.9; skip the distance helper
D7Section title size20/28·700
C-1Header registry‹ × 검색 공유 저장 알림 메시지 설정 추가 ⋯; at most two trailing; ⋯ only with three or more rows
C-2관리 entrygear + badge, pane tool Cells, 할 일, a one-time coachmark; five-official test; fallback a small tonal 관리 button
C-3초대 코드the 클럽 tab's + opens 클럽 만들기 · 초대 코드로 가입 · 클럽 찾기
C-4Long documents약관 and policies open as pages, not sheets

The field grammar (points 9, 11–13) ​

Every field is label · control · support line.

PartRule
Label13/18·600 ink, above the control. Required: the one asterisk (owner LAW), hidden from screen readers, with "필수" in the accessible name and a legend once per form. Optional fields say "(선택)" after the label.
Control48 tall, r12, 1px $borderControl #8E8E93 (3.26:1, WCAG 1.4.11). Input text 16/24. Placeholder is an example value in tertiary, never a label, never "(선택)".
Support line18 tall, 4 under the control: the hint or the error on the left, the counter on the right.
Hintnone by default; only the four warranted cases
Counterfrom 80% of the limit (always on text areas); typing past the limit is allowed and shown as an error, never blocked
Error2px danger border, a 16 alert glyph and the message 13/18·600 in $errorText #A3261F; replaces the hint; restates the rule
Timingvalidate on leaving the field after an edit; once wrong, re-validate on each change until fixed; on submit, focus and announce the first invalid field; an error summary only with three or more errors

Audit fixes adopted (sections not commented on) ​

  • Contrast: input border, switch off track, slider thumb and the segmented control's selected state reach 3:1 (WCAG 1.4.11).
  • $errorText #A3261F for red text at 14px and below; #B8332E stays for fills and large text.
  • Targets: icon buttons 48 (was 44); FAB 56; Switch 52 × 32 (Material 3).
  • Toasts: no glyph; results 4 s, with 되돌리기 8 s; never for errors (they vanish).
  • Skeletons appear after 300 ms; nothing under 1 s; a determinate indicator past 10 s.
  • Button loading keeps a label ("저장 중…") beside the spinner.
  • Dialog buttons name their action (계속 작성 · 나가기); never a bare 취소 that could mean the user's task.
  • CTA band: the red helper line is allowed for an action failure (the board's "never red text" note goes).
  • Section action and CTA helper text 15/22; roster names 15/22; the album overlay is a counter without dots.
  • Kakao button radius 12, the Kakao Login guide's literal value ("radius는 12 픽셀"), which also equals our lg Button radius and removes the special case. (Kakao Sync's guide converts the same 12 px to 6 dp; either reading is within Kakao's rules, and 12 is the simpler one.)
  • Reactions sheet shows the message it reacts to; the heatmap gets a text equivalent and a legend; ScoreEntry gets an advisory line and no auto-advance into the tiebreak field.

What happens next ​

  1. The library is consolidated into one clean specification with these rulings applied: each component once, current values only, history in the decision log.
  2. Every board is rebuilt to the library and to the review format (contract §8): frames with one-line captions, specs behind the closed "Show specs" toggle. The library boards are reorganized so each component lives on one board.
  3. The flows board is re-counted, and the gate runs before anything is pushed.

Status (2026-10-11): all three done. The library is one edition (v2.1, eleven families). Every flat v2 board composes from the shared kit in the review format: foundations 21; library chrome 111, surfaces 120, rows 141, controls 174, overlays 96, conversation and scoring 78, behaviour 132; brand 32; pages hub 83, list A 173, list B 120, detail 267, forms 278, sign-in 61; flows 63 phones with every tap marked. scripts/verify-flat-v2-boards.mjs passes all of them with zero failures, and the recount is in the IA doc §3.

Markdown remains the source of truth. Run yarn docs:check before handoff.