Owner review 2 — rulings (2026-10-11)
Status: Active · Date: 2026-10-11 · Answers the owner's review-2 points on the flat v2 library boards. Evidence is in two research lanes: lane A (retroactive score recording: 14 products and the shipped model at its latest migrations) and lane B (strip, club hero, form strip, answer pair, doubles names, guests, rank column). Each ruling is logged for veto in the decision log. Companions: review-1 rulings, library.
Marks
| Board | Your mark | Now |
|---|---|---|
| Foundations | approved | approved |
| Library chrome | approved | approved |
| Library surfaces and content | approved with questions, changes | changes applied, approved |
| Library rows, cells and labels | approved with changes | changes applied, approved |
| Library controls | one question; Kakao button fine | the question was a defect, fixed; approved |
| Library overlays and feedback | approved | approved |
| Library conversation and scoring | rework score recording | rebuilt; awaiting your look |
| Library behaviour | approved | approved |
The answers at a glance
| # | Board | Your question | Answer | Ruling |
|---|---|---|---|---|
| 1 | Surfaces | The ELO block shows an NTRP range; identity has one NTRP | It should not: the range was the tier's band, a leftover. | The block shows the one NTRP the rating maps to ("ELO | NTRP 3.5"), the same as the identity's Level tag. A band appears only where a session states the range it accepts. |
| 2 | Surfaces | Why does the identity block alone have an edit icon? | No good reason. | One chevron and no buttons inside, like every Block. It opens the public profile; 프로필 수정 lives in 설정 › 계정 (/settings/edit-profile). |
| 3 | Surfaces | The band's edge should cut the middle of the club logo | Agreed, and it is the peer norm (LinkedIn 51%, X 50%, Strava 48%). | The 56 logo sits centred on the band's edge (28 over, 28 under) in a 2px canvas ring, so a light logo never melts into a light photo. |
| 4 | Surfaces | Would the avatar row in the club hero be too noisy? | Yes, and it is a privacy question. Five of seven club heroes observed carry no faces (Meetup, 당근 모임, Facebook Groups, Spond, 소모임). | The hero keeps "강남구 | 멤버 42명". Faces go in the 멤버 section, for members; a non-member sees the count. If social proof is wanted later: a "친구 3명" count, no faces. |
| 5 | Surfaces | Strip columns look uneven: too much space at the end | Right: equal columns left 48 to 67 pt of air after the last figure. | Every column but the last shares the width; the last hugs its figure and ends on the rail. The starts stay evenly spaced (your review-1 rule) and nothing trails. Strava pins its last column the same way. |
| 6 | Surfaces | Show the summary at the end of the form strip? | Yes. | "3승 2패" 12 after the cells, 15/22·600 ink, from the shipped recordValue formatter (English "3W 2L"); never red or green; the spoken label starts with it. |
| 7 | Rows | Does a person row always need a sub-line? NTRP shows twice | No. | Line 2 is optional and never repeats a fact the row shows: with a Level tag, NTRP is not line 2. Line 2 holds one context fact (role, group, trust) or nothing; without it the row is 64 tall. |
| 8 | Rows | Rank rows have more space in front | Right: the digits were right-aligned, so "4" started 36 in. | Digits start at the rail. The column is the widest rank's measured width: 20 (to 99), 28 (to 999), 40 (to 9,999), sized from the total so it never jumps when more rows load. |
| 9 | Rows | Mark guests and members on the roster | Mark guests only. | In a club or recurring session that has members, a guest carries the 게스트 Tag; members are the default and carry nothing; a pickup marks nobody. One Tag per person: 호스트 > 게스트 > 친구 > 예비. |
| 10 | Rows | Separate the names in a result row with a vertical divider | Yes. | A doubles pair is two names with the 1px break ("박지훈 | 최유나"), never split, read aloud with a comma. Where two teams share a line ("김민준, 이서연 대 박지훈, 최유나") partners take a comma, because the break drops at a wrap (below). |
| 11 | Rows | AnswerPair below the row or at the end? | Below. | Under line 2 in two equal columns, stacking from 1.5× text. A trailing pair squeezes the name, which is never cut, and equal widths keep 동의 and 거절 the same size in both languages. A single control (친구 추가) stays trailing. |
| 12 | Controls | Why is 개인정보 국외 이전 more padded than the other rows? | A defect: the 12 gap before the marketing row rendered as that row's padding. | One rhythm for every consent row; the [선택] prefix sets marketing apart. |
| 13 | Controls | The Kakao ProviderButton looks fine | Noted. | Unchanged. |
| 14 | Social | Rework score recording: retroactive, players first, both parties agree, hosts override | Rebuilt from the ground up. | The model below. |
Score recording: the model
| Part | Ruling |
|---|---|
| Who records | Any player in the match, after it ends: from the 스코어카드 (its Match state block says 점수 입력), the push, or the 일정 상세 Notice. |
| Who confirms | The submitter's team counts as agreeing; one opposing player confirms with 동의. The partner never confirms for the opponents. This is the norm in Playtomic, USTA and Dinkzter. |
| Silence | Never confirms, as you asked. One reminder at 12 h; at 24 h the request also reaches the host as a task on the 대진표 ("확인 대기 N경기", 바로 확정 on each row, 모두 확정 with a Dialog that names the count). |
| Dispute | 거절 keeps the claim and offers a counter-score. The submitter can take the counter in one tap; otherwise the host decides: version A, version B, 직접 입력 or 기록 제외. Unresolved after 7 days: 기록 제외. |
| Host override | Only a host or official who is not playing that match. Final, tagged 호스트 확정, every player is told, and each player may contest once within 48 h (이의 있어요). |
| Ratings | ELO moves only on an accepted result: an opponent's 동의, an accepted counter, or a host decision. Pending, disputed and excluded results are unrated, as in Playtomic, DUPR and UTR. |
| Live recording | Retired. The LiveScore glance block becomes the Match state block: this viewer's next action (점수 입력, 점수 확인, else the court), the teams, then the claim with its state Tag. |
| Policy | autoConfirmHours = null, reminderHours = 12, hostEscalationHours = 24, disputeVoidDays = 7, a 48 h contest window. |
Taps (flows board, Flow 7). A player enters a result in 3 (점수 입력, a quick pick, 확인 요청), against 12 today on ±1 steppers. One opponent agrees in 2 from the session page, 1 from the push. The host settles a dispute in 3, or confirms everything left unanswered for 24 h in 2.
Where my answer differs
- Silence (14). Lane A recommended Playtomic's 24 h auto-confirm, which keeps results from being stranded. You asked that both parties agree, so silence never confirms, and an unanswered request goes to the host at 24 h instead. If those tasks pile up in use, the 24 h auto-confirm is the fallback on file.
- Club hero faces (4). No faces, rather than adding the row back.
- AnswerPair (11). Kept below, refined to equal columns.
- Rank column (8). 20 / 28 / 40, not lane B's 16 / 24 / 32. Measured in Pretendard 600 tabular, "99" is 16.7 wide and "1,005" 36.9, so 16 would clip and 32 cannot hold the comma.
- Doubles names (10). The 1px break where a team stands alone on its line; a comma where two teams share a line. Drawn with breaks, an English match line wrapped onto three lines, and the middle one, "Seoyeon Lee vs Jihun Park", read as the match.
Found along the way
Eleven defects in today's score flow (lane A §1.3). The rebuild replaces this flow, so they are not patched now:
- The consent push is unreadable: title and body both read "대진".
- It opens the host's 대진표, which has no confirm control.
- The signal expires after 6 h but the call never does, and it blocks a fresh call.
- A host who is not playing sees a score button that always fails, with a raw English error.
- A rejection deletes the claimed score, and the host is not told.
- The +10% both-teams bonus is unreachable, yet 홈 shows 확인 필요 on every host-entered result with no way to clear it.
- 수정 on a completed match is a dead end: refused, with no Korean copy.
- One act has three permission gates.
- Any confirmed RSVP can overwrite any live score, and a tied time-up could open a 0-0 call.
- A missing score blocks the host's next round, and the time of entry becomes the match's end time.
- Players cannot record a best-of-3: their sets are never written.
Score format. The terminology guide already rules that scores keep the hyphen, yet about 60 scores on the boards used an en dash and the club-challenge tallies read "2 : 1". Every board now writes 6-4. English records use the shipped "32W 15L", and Korean date ranges use "~". The library lists the shipped strings that still write " : " (signals, clubs.scoreboard, tiebreakScoreline). The particle after a score follows the digit as read (6-3을, 6-4를); the shipped josaEulReul would print "6-4을".
Two board checks were passing blind. The verifier's middle-dot and time-range checks had never matched anything: the in-page check was a template-literal string, which turned \d and \s into plain letters. The check is now a real function, and each text rule is tested on known positives in Node and again inside every page. A new score check guards the format. All 16 flat v2 boards pass.
Privacy flag: avatar visibility. supabase/migrations/00260_discovery_avatar_visibility.sql defaults discovery avatars to public, so strangers' faces still show on discovery cards. That is looser than "non-members see no faces". Flipping the default to members-only needs a migration and your OK, because it changes existing users' privacy defaults. Not changed. Resolved the same day: you ruled "we are not showing strangers' faces by default. Non-members should see no faces", and migration 00691_faces_members_only.sql enforces it on every path (inventory: faces-members-only-inventory-2026-10-11.md).
What happens next
- The conversation and scoring board awaits your look; the other seven library boards are approved.
- Then brand and pages, as you planned.