Owner review 2, lane B: strip, club hero, form strip, answer pair, doubles names, guests, rank column (2026-10-11)
Status: Draft · Date: 2026-10-11 · Evidence and one recommendation per point for owner review 2, points 1 to 7 on the flat v2 boards. Audience: Korean club members aged 40 to 60, on phones, low digital literacy. Every source was opened or captured on 2026-10-11 (tags in §0; the age of the underlying content is given where it matters). Companions: library, review-1 rulings, board contract. Nothing outside this file was changed.
While this lane ran, the kit and the decision log already took points 1, 3, 5, 6 and 7 (commit c7d174981 plus the pending decision-log entry). Each section says whether the evidence confirms, refines or disputes what was applied. Points 2 and 4 were open.
At a glance
| # | Point | Recommendation | Against the kit now |
|---|---|---|---|
| 1 | Strip end spacing | Adopt the proposal: columns 1 to n−1 share the width, the last column is auto width and ends on the right rail (x 370 at 390). All columns left-aligned, label over figure. Pitch = (350 − last width) / (n − 1). | Same. The fit test should use that pitch. |
| 2 | Club hero | Band edge through the logo's middle: overlap 28 of 56 (50%, was 16). No member faces in the hero; faces only in a members section, for members. Non-members get the count. | Not applied. |
| 3 | Form strip summary | Yes: "3승 2패" at the end of the same row, 12 after the last cell, 15/22·600 $text, from t().common.recordValue. | Same. |
| 4 | AnswerPair | Keep it below line 2, in the text column. Two equal columns of (text column − 8) / 2; stack when a label does not fit. Never trailing. | Unchanged (hugging pair). |
| 5 | Doubles names | Keep the 1 px break between partners ("박지훈 | 최유나"). In two-line scoreboard cells stack one partner per line, no separator. | Same. Optional contrast refinement. |
| 6 | Guests on a roster | Mark 게스트 only, and only in a club or recurring session that has members: neutral weak sm Tag. Precedence 호스트 > 게스트 > 친구 > 예비. | Same. |
| 7 | Rank column | Left at the rail (applied), and shrink the column to the widest rank's digits: 16, 24, 32 (was 24, 32, 40), so the avatar sits at 48, 56, 64. | Refines: the kit still reserves 24. |
0. Evidence tags and limits
| Tag | Meaning |
|---|---|
| F | App Store listing frame (app:n, n counts from 0) fetched through the iTunes lookup API. A marketing frame of a real build. Listings in Appendix A. |
| W | Public page rendered logged out in headless Chromium (390 × 844 at 2×, or 1280 wide). URLs in Appendix B. |
| P | Pixel or DOM measurement on an F or W capture. Numbers in Appendix C. |
| D | Documentation or law text read in this session. |
| C | Code or library in this repo. |
| S | Search-result title or snippet only; the page itself was blocked. Flagged where used. |
Not observed, so no claim is made: Instagram's native profile counts and follow-request rows; Discord, X, Slack, KakaoTalk, 밴드 and 당근 모임 request rows; Toss and 카카오뱅크 stat strips (no listing frame shows one); the Apple Fitness workout summary; Sofascore (bot wall) and ESPN team form (its match page shows five scored matchups instead); ATP, WTA and BWF doubles screens (singles only on the day, or HTTP 403); Apple Game Center and Toss 만보기 rankings; Strava ranks above 9; Spond's help centre (client-rendered); a 밴드 hero. Marketing frames are not full apps, and pt values read off them are ratios to the screen width (about ±2).
1. Strip end spacing
Question. Two to four headline figures side by side, equal columns, left-aligned text. A short last figure leaves about 60 pt of air after it against a 20 pt margin on the left. Proposal: columns 1 to n−1 share the width, the last hugs its content. Does any peer do it?
Evidence
| Source | What it does | Space after the last column | Tag |
|---|---|---|---|
Strava feed card (strava:5): Distance, Time, Elevation, Achievements | Label over figure, left-aligned. The first three are content-wide with equal gaps (68 and 66 px at crop scale). The fourth is pinned to the right margin, and both its lines are right-aligned. | none | F, P |
Strava Progress (strava:6) | Two figures: the left one left-aligned, the right one right-aligned to the margin. | none | F |
Strava workout and activity detail (strava:3, strava:8) | 2 × 2 grids; label and figure centred in each half. | n/a (grid) | F |
NRC Activity (nrc:1): 3 Runs, 5'14" Avg. Pace, 1:48:04 Time | Figure over label, left-aligned, content-wide columns with equal gaps (about 34 pt at a 350 pt content width). The strip spans 71% of the content width. | 29% (about 100 pt at 350) | F, P |
UTR profile (utr:1): UTR 7.45, UTR 7.66, UTR-P 3.1 | Label over figure, left-aligned. Starts at 0, 35.4% and 71.4% of the content width. | 7.7% (27 pt at 350) | F, P |
Peloton (peloton:4, peloton:1) | Progress card: figure over label, left-aligned, near-equal pitch. Home rings: three equal thirds with ring, figure and label centred. | n/a | F, P |
Instagram profile (logged out), X profile (xtwitter:6, x.com/NASA), 당근 모임 hero | No columns: inline "number label" pairs, left-aligned, content-wide ("104M followers · 90 following", "115 Following 92.3M Followers", "멤버 1029 · 게시글 2528 · 18분 전 활동"). | ragged | W, F |
ATP WTA Live head-to-head (atpwta:1) | Comparison rows: left value flush left, label centred, right value flush right. | none | F |
Toss TDS TableRow | align="space-between" pushes the left and right items to opposite ends; align="left" groups them at the start. | none or ragged, by prop | D |
| Toss Securities stock header (web, desktop, tossinvest.com/stocks/A005930) | Label and value pairs in content-wide groups (1일 범위 and 52주 범위 as two rows with a range bar), left-aligned; the next group (거래대금, 체결강도) starts after a 1 px vertical hairline; the strip runs on past the edge behind a ">" button | scrolls | W |
Apple Fitness (applefitness:0), Toss (toss:0 to 5), 카카오뱅크 (kakaobank:0 to 7), 당근 (daangn:1 to 7) | No horizontal strip in the listing frames: Fitness stacks Move, Exercise, Stand and shows two equal tiles; Toss and 카카오뱅크 show account lists, one figure block, two equal buttons; 당근 shows icon grids and a pay card. | n/a | F |
What the evidence says
- Left-aligned, label and figure stacked, is the sports-app norm (Strava, NRC, UTR, Peloton Progress). Centring appears only in fixed-width grids and ring tiles (Strava workout, Peloton Home). A centred strip would start its first figure (pitch − width) / 2 inside the rail, about 37 pt at n = 3, which breaks the rail law.
- Peers that let a row end short use content-wide columns with a fixed gap, not equal pitch, and accept what is left (NRC 29%, UTR 7.7%). Your 60 pt sits mid-range; nobody removes it.
- The end pin exists: Strava's feed row and Progress card, ATP's head-to-head and TDS space-between all put the last item on the end margin. Strava right-aligns both lines of the pinned column.
- No peer combines equal pitch for the first n−1 columns with an auto last column. The proposal is Strava's end pin applied to the equal-pitch rule you set in review 1. For n = 2 it is exactly the Strava Progress card.
Recommendation
Adopt the proposal. The kit already draws it (FvkStrip: repeat(n−1, 1fr) auto); the library entry still says "n equal-pitch columns".
- Grid: columns 1 to n−1 are
1fr, the last isauto; text left-aligned in every column; label 13/18·500$textSecondaryover figure 24/32·700$texttabular; pad 12 above and below; no dividers. - Pitch p = (350 − w) / (n − 1) at 390, where w is the widest line of the last column at the current text scale. The last column's right edge is on the right rail (x 370). Starts stay evenly spaced at 20 + i × p.
- Worked numbers (estimates from Pretendard advances: digit 0.6 em, % 0.9 em, Hangul 1 em, "Attendance" 69 px from the library):
| Case at 390 (content 350) | Equal pitch now: starts, air after last content | Hugging last column: starts, air after last content |
|---|---|---|
| ko, 3: 총 경기 47, 승률 68%, 출석률 92% | 20, 136.7, 253.3; 66.7 | 20, 170, 320; 0 |
| ko, 4: those plus 연속 3 | 20, 107.5, 195, 282.5; 61.5 | 20, 128, 236, 344; 0 |
| en, 3: Matches 47, Win rate 68%, Attendance 92% | 20, 136.7, 253.3; 47.7 | 20, 160.5, 301; 0 |
- Gaps between blocks stay close to equal when contents are similar (107 and 100 in the first row), so the eye reads even air as well as even starts.
- The last column's lines stay left-aligned. The figure ends on the margin only when it is the widest line; if the last column were 총 경기 (label 43 over figure 29), the label would end on the margin and the figure would stop 14 short. If both lines must end on the margin, right-align the last column as Strava does, at the cost of one ragged left edge in that column. Not recommended.
- Fit test: test the first n−1 figures against p − 8 (not 350 / n − 8); the last column cannot overflow itself. Reflow 2-up when w exceeds 40% of the content width (English label at 200%).
- A linked last column keeps a 44 minimum press width by extending its hit area to the left.
- Library edit: Strip, Anatomy and Fit test. Kit: fit test
fvkCStripFitsstill divides by n.
2. Club hero: logo overlap and member faces
Question. (a) The logo overlaps the cover band by 16 of 56. The owner wants the band's edge through the logo's middle. What is the convention and the usual ratio? (b) Would a row of member avatars after "강남구 | 멤버 42명" be too noisy, and what about privacy for non-members?
(a) Evidence: overlap ratio (share of the logo or avatar that lies over the cover)
| Surface | Overlap | How it was measured | Tag |
|---|---|---|---|
LinkedIn profile (linkedin:3) | 51% | cover 4:1 (236 px), avatar with ring 309 px, 159 px over the cover | F, P |
| X profile (x.com/NASA, desktop) | 50% | cover 600 × 200, avatar 133, 67 over | W, P |
| Strava club page (strava.com/clubs/strava, 390) | 48% | square logo 124 × 124 (32% of the width), 60 over; the cover is 400 tall | W, P |
| Facebook Page (a tennis tournament's page, desktop) | 35% | avatar 171, 60.5 over | W, P |
Facebook profile (facebook:4) | 71% | cover 16:9, avatar 45% of the screen width, 292 of 410 px over | F, P |
| 당근 모임 (two tennis groups and one other) | 0 | cover 390 × 170 full-bleed; logo 48 × 48 sits 19 below it at the rail (16); the bold name and a meta line beside it | W, P |
| Meetup group | none | rounded photo card, no logo, then title, rating, location, "5,360 members", Join this group | W |
Facebook Group (facebook:3) | none | cover, group name, "Public group · 4.1K members", Joined and Invite buttons | F |
Spond group (spond:5) | none | the group photo is the cover; "64 members" and "12 subgroups" are white pills on its lower edge | F |
소모임 group (somoim:5) | none | cover band, then chips 서초구, 운동/스포츠, 멤버 38, then the title | F |
Reading. Straddling is a convention of profile-like surfaces (LinkedIn, X, Strava club, Facebook page and profile): median 50%, range 35 to 71%. Group apps with no logo concept (Meetup, Facebook Group, Spond, 소모임) and 당근, which hangs the logo below the band, do not straddle. Our 16 of 56 is 29%, below every measured straddler, so it reads as a mistake rather than a choice. "The edge through the middle" is the LinkedIn, X and Strava pattern, and Strava's is a rounded-square club logo like ours.
(b) Evidence: where member faces appear
| Source | Where faces appear | How many, how big | Logged out? | Tag |
|---|---|---|---|---|
| Strava club page | Hero area: the member count (about 7.8 million) and a row under the Join Club button | 4 shield avatars, 38 pt, gap 14 | yes | W, P |
| Meetup group page | Not in the hero. A Members section lower down: "Members 5,360, See all". Event cards: 3 faces beside "6 attendees". | 12 initial-letter circles, 40, 5 per row; faces 18, overlap 6 | initials; the member list and attendee list need login | W, P |
| 당근 모임 page | Not in the hero. A "멤버 1029" section lower down: first 3 members as rows (avatar 36, nickname with gender, age or NTRP, dong, one line of intro; some carry a crown glyph) | 3 rows | yes (public group, pseudonymous nicknames) | W, P |
소모임 meeting card (somoim:5) | In the 정기모임 card with "12/50 (38자리 남음)"; the frame shows the pre-join state (가입하기) | about 8 small overlapped faces and a "+" | yes | F |
밴드 schedule card (band:3) | On the card, beside "28명 참석" | 3 faces, about 21 pt, overlap 30% | n/a | F, P |
Facebook Group (facebook:3), Spond (spond:5) | Not in the header; the count is text or a pill | 0 | n/a | F |
X profile (xtwitter:6) | "Followed by A, B, C and 93 others": the viewer's own graph only | 3 faces, about 16 | n/a | F |
Reading. Of seven heroes observed, five carry no faces (Meetup, 당근, Facebook Group, Spond, 소모임). The two that do are Strava (four members) and X (three accounts the viewer already follows). Faces otherwise live in a members section or on the session card (who is coming). Logged-out viewers get initials (Meetup: all 12 shown are initials in a 5,360-member group, so probably the logged-out treatment), pseudonymous nicknames with dong-level region (당근) or only a count; Meetup puts the full lists behind a login.
Privacy (D, C). 개인정보 보호법 제2조 제1호 가목 defines personal information as information that identifies a person "through name, resident registration number and image (영상) etc.", and 제2조 제2호 counts 공개 and 제공 as processing; 제17조 제1항 제1호 lets a controller provide it to a third party with the data subject's consent (law text read through the law.go.kr open API, 법률 제21445호, in force 2026-09-11). In this repo: the library's Avatar entry says "a non-member's preview shows counts, never names"; supabase/migrations/00260_discovery_avatar_visibility.sql gates the discovery avatar stack by profile_visibility.avatar, whose default is public (opt-out) for any discovery viewer; docs/canon/sessions.md keeps faces off session cards and ships "friends going" as a chip. The owner's rule (non-members see no identifiable faces) is stricter than that default.
Recommendation
(a) Overlap. Logo 56 r12 at x = rail; the band's bottom edge at the logo's centre: overlap 28 of 56 (50%). Keep the name column at x = rail + 68 with the name's top 24 below the band; the logo's bottom edge (28 below the band) then sits 4 below the name's top, so check on the board that the logo reads as beside the name's first line. Add a 2 px $background ring inside the 56 box (image 52, inner radius 10) so a light logo does not melt into a light photo (Facebook, X and LinkedIn all ring theirs; the ring stays inside the box because nothing but full-bleed surfaces may enter the margin); an uploaded logo keeps its $borderSubtle hairline. Height stays 82 or 114. The no-band variant is unchanged. Edit: library Club hero anatomy and its board caption (now "overlaps the band by 16"), FvkCClubHero.
(b) Faces. No. A third group of faces beside the logo, name and meta line competes with the logo, the one identity mark, for people who scan slowly, and 5 of 7 observed heroes keep faces out. Keep the single line "강남구 | 멤버 42명" (MetaSegments). Faces belong to a 멤버 section for members (the library's Avatar row: 40 × 4 from the rail, gap 8, a "+N" gray100 circle, the count in the section head, a tap opens the list). Non-members see the count only. If the hero needs social proof, add a third segment "친구 3명" (counts, no faces), the same ruling as 친구 참석 on 번개 찾기 in the decision log and the pattern of X's "Followed by". Flag for the owner: if the rule stands, the 00260 default should flip from public to club_members, because discovery cards still show strangers' faces by default.
3. Form strip summary
Question. The strip shows the last five results as small 승/패 cells. Should "3승 2패" sit at the end of the row?
Evidence
| Source | Form representation | Count | Tag |
|---|---|---|---|
Flashscore app (flashscore:8, flashscore:5) | Five letter chips (W, L, grey "?") about 19 pt with 4 pt gaps, centred under the team name; the league position ("14.") sits beside the logo; the FORM filter offers 5 to 30 matches | none | F, P |
| Naver Sports K League, match 전력 tab (대전 vs 전북) | Five 승/무/패 chips on each side of the label "최근경기": 18 × 18, radius 3, gap 3, 12 px text; the chip nearest the label carries a red dot | none on the chips; the season "6위 10승 10무 10패" sits under the team name | W, P |
| Naver Sports KBO 순위, "최근 10경기" column | No chips: text "8승 1패 1무" in a column headed 최근 10경기 | text only | W |
ATP WTA Live head-to-head (atpwta:1) | The count is the headline ("Wins 0 and 1" in large figures); matches are secondary | count only | F |
| ESPN soccer match page (desktop), HEAD-TO-HEAD "Last 5 Matchups" | Five scored rows (goals left and right, competition, date and venue between); no chips | none | W |
| Sofascore | not observed (bot wall; its listing frames show no form strip) |
Reading. In Korean the count is written N승 N패 N무, in that order, as plain text (Naver). No peer pairs chips with a trailing count on the same row: Flashscore and Naver football rely on letter chips for readers who already know the idiom, Naver baseball uses the count alone, and ESPN lists the last five meetings as scored rows with no count. Peers keep cells at 18 to 19 pt and never colour the count. The argument for the count is our audience: a 24 pt cell with a 12/16 letter is read by shape, while "3승 2패" is the sentence a 50-year-old repeats to a partner, and it is the string already used for rows.
Recommendation
Yes: the count at the end of the same row, which is what the kit draws.
- Cells 24 × 24, r6, gap 4 (unchanged); then 12 (4 gap plus 8 margin); then "3승 2패" 15/22·600
$text, tabular, never red or green. - Text from
t().common.recordValue(wins, losses)(packages/app/src/config/i18n/ko/common.ts:506; en "3W 2L"): one formatter shared with the row variant "최근 5경기 3승 2패"; draws are omitted when 0. - Spoken label starts with the count: "최근 5경기 3승 2패: 승, 승, 패, 승, 패".
- At 1.5× text the count wraps under the cells (cells do not scale, the count does). With fewer than five results, count what exists ("최근 3경기 2승 1패"); with none, draw nothing.
- Library edit: Form strip anatomy and accessibility lines.
4. AnswerPair placement
Question. A request row has 수락 and 거절. Under line 2 in the text column, or trailing? Long Korean names must never be cut; 200% text; button label length.
Evidence
| Source | Placement | Names and context | Tag |
|---|---|---|---|
Facebook notifications (facebook:9), friend request | Below the text, in the text column: Confirm (blue) and Delete (grey) as two equal buttons filling it (48% each, gap about 9 pt, about 39 pt tall) | "Nikos De Jager sent you a friend request." wraps; "6 mutual friends" sits above the buttons | F, P |
LinkedIn notifications (linkedin:5), invitation | Below the text, left-aligned in the text column, auto width: Accept (blue fill) and Ignore (outline) | Name, headline and "3 mutual connections" lines above the buttons; names wrap | F |
KakaoTalk 친구 tab (kakaotalk:5) | One small tonal button, 선물하기, trailing and centred on the row | Short names on one line | F |
| Instagram, Discord, X, Slack, 밴드, 당근 모임 | not observed (login wall or HTTP 403) |
Reading. The two peers whose request rows carry long names and context lines put the pair below, inside the text column; the trailing button in KakaoTalk is a single short action. The library's own contract already says "one trailing element per row" and treats ⋯ and 친구 추가 as that one element, so a trailing pair would be two. Arithmetic at 390 (text column 390 − 20 − 52 − 20 = 298; sm button = label + 32): a trailing pair is 62 + 8 + 62 = 132 at 100% and leaves 154 for the name after a 12 gap. At 200% each button is 92 wide, the pair is 192, and 94 is left, so a four-syllable name ("남궁민수", 4 × 30 = 120) breaks inside the name. Below, the name keeps 298 at every scale.
Recommendation
Keep it below; refine the pair.
- Position: 8 under line 2, left edge on the text edge (x 72), never trailing.
- Two equal columns, each (text column − 8) / 2 (145 at 390), sm tonal, 36 tall with 44 slop, gap 8. Equal widths keep 수락 and 거절, or Accept and Decline, the same size in either language. Facebook fills the column the same way; LinkedIn hugs.
- If either label + 32 exceeds the half (English "Decline" at 200% on a 360 pt phone), stack the two full width, 8 apart, 수락 on top: the Dialog pair's existing rule.
- A single trailing control (친구 추가, 선물하기) stays trailing and is not affected.
- Library edit: AnswerPair anatomy; kit
FvkAnswerPair(hugging today).
5. Doubles names in a result row
Question. "박지훈 최유나" runs together and "Jihun Park Yuna Choi" is ambiguous. The owner suggests a vertical divider; middle dots are banned and the app's separator is a 1 px bar.
Evidence
| Source | How a doubles team is written | Separator | Tag |
|---|---|---|---|
| Flashscore tennis (flashscore.com/tennis, ATP doubles at Shanghai) | One partner per line ("Khachanov K." over "Rublev A."), a flag per line, a larger gap between teams, the winners in bold, the set score trailing | none | W |
SwingVision (swingvision:4) | An overlapped two-avatar cluster and two names on two lines, set scores in a trailing column; its meta line uses "|" between facts | none | F |
| Korean sports press, 2026-09 (headlines) | "'세계 1위' 김원호-서승재" (머니투데이); "[아시안게임] '세계 1위' 서승재·김원호" (Supple); the order differs between outlets | hyphen, middle dot | S |
| BWF World Tour headlines | "Kumamoto Masters: Kim/Seo Equal 37-Year Record" | slash | S |
Sofascore (sofascore:7), not names | "73% | 16% | 11%" with thin vertical dividers | 1 px bar | F |
| Toss Securities web stock header (not names) | Groups of facts separated by a 1 px vertical hairline, not a dot or a slash | 1 px bar | W |
Reading. Where the pair is a scoreboard row, partners stack, no separator (Flashscore, SwingVision). Where it is a run of text, Korean press uses a hyphen or a middle dot, tour headlines a slash. No peer puts a vertical bar between names (Toss's own stock header does separate fact groups with a 1 px vertical hairline), but none of the text separators suits us: the middle dot is banned, the hyphen collides with the hyphen or en dash in "6–4", and the slash is a glued fact. The owner's bar is the app's own break for separate pieces ("proper visual breaks for each semantically meaningful piece of information"), and the evidence has no standard that overrides it.
Recommendation
Keep the 1 px break in inline rows (the kit does: FvkMeta over the names), and stack in two-line cells.
- Inline (ResultRow L1, PersonRow L1): names 15/22·600
$text, each its own node, a 1 px bar 0.8 em tall (12 at 15/22) with 8 each side; a name never splits inside, and the break never ends a line (when the second name wraps to its own line the bar drops, as the kit does). Accessible name "상대 박지훈, 최유나" (comma, asMetaSegmentsalready reads its facts). English "Jihun Park | Yuna Choi": the bar is what resolves the four tokens. - Scoreboard cells (LiveScore block, ScoreRecorder panels): one partner per line, no separator, as Flashscore and SwingVision do. The library text "a doubles pair is one name that wraps to two lines" should say two lines by construction, so a pair never wraps mid-pair.
- Refinement, only if the bar is missed on a device: the kit's break is
edge#D4D4D4, 1.48:1 on white, and the code's$borderSubtle#DFE7E1is 1.27:1. WCAG 1.4.11 exempts graphics whose information is conveyed otherwise (here the 17 pt gap against a 4 pt word space, and the spoken comma), so this is not required. If it is missed, give the partner break$borderControl#8E8E93(3.26:1) and leave other breaks alone.
6. Guest marking on a roster
Question. A session roster shows faces, names and level tags. Guests should be distinguishable from members in club or recurring sessions. Which side is marked, and with what?
Evidence
| Source | Who is marked | With what | Tag |
|---|---|---|---|
| Microsoft Teams, guest-access doc (updated 2026-08-07) | the guest | "A guest's name includes the label (Guest)", and an icon on a channel that has guests | D |
| Slack Help, "Understand guest roles" | the guest | "Multi-Channel Guests have a square shape next to their names, while Single-Channel Guests have a triangle." | D |
| Facebook Groups (TechCrunch, 2017-10-26; the pattern persists in 2026 guides, S) | admins, moderators, new members | badges: "members will now be able to easily spot group admins, moderators and members who only recently joined the group" | D |
| 당근 모임 member rows | a few members (the meaning is not documented; probably leaders) | a crown glyph, orange or teal, after the nickname; most rows carry none | W |
| Meetup group page | the organizer | "Victor W. is a Super Organizer" callout inside the Organizers card | W |
플랩풋볼 (flab:1, flab:3) | no tag; guest is a product lane | top tabs 소셜 매치, 게스트, 팀, 구장 예약; the match roster is a card grid with level pips | F |
| TeamSnap help centre | nobody: no guest concept | searching "guest" returns two unrelated articles (tournament messaging, PayPal), and "sub" none about substitutes | D |
| Spond | hosts listed apart from participants | per a help-centre snippet; the page was not retrievable | S |
Reading. Every roster that distinguishes someone marks the exception and never the default: guests (Teams, Slack), admins and new members (Facebook), the organizer (Meetup), a few crowned members (당근). Two styles: a word (Teams "(Guest)", Meetup's "Super Organizer") and a glyph (Slack's square and triangle, the 당근 crown). A glyph has to be learned, and 당근 documents neither crown; for low-literacy users the word wins. Where everyone is a guest by definition (플랩풋볼 소셜 매치, our 번개) nobody is marked. This supports your instinct and the kit's rule.
Recommendation
Mark 게스트 only, never the default, and only where the session belongs to a club (or recurs) and has members; a pickup marks nobody.
- Tag: neutral weak sm (24 tall, r6, 13/18·600,
gray100fill,$textSecondarytext, pad 0 8; about 55 wide, English "Guest" about 52). In the Roster cell it takes the 호스트 slot beside the Level tag; in PersonRow lists it is the row's one Tag (BADGE-EXCEPTION). Where a row has a trailing control, the guest is a line-2 role fact (already ruled). - Precedence under the one-Tag rule: 호스트 > 게스트 > 친구 > 예비. Identity role outranks relationship and status; a waitlisted guest sits under the 예비 section heading, which already says it. The viewer's own row keeps the 나 suffix and, if a guest, the 게스트 Tag, so every viewer reads the same roster.
- Word: 게스트, the term the terminology guide already uses (게스트 신청). When guests outnumber members (a guest day) keep marking guests, since they are the exception to membership; add a 멤버 Tag in that session type only if you want it.
- Library edit: PersonRow Tag exception and Roster anatomy.
7. Rank number alignment
Question. Rank digits are right-aligned in a fixed 24, 32 or 40 column, so "4" starts about 36 pt in while other rows start at the 20 margin. Left, right or centred, and how wide?
Evidence
| Source | Alignment | Column | Tag |
|---|---|---|---|
| Naver Sports KBO and K League tables (ranks 1 to 12) | centred | digits centred on x = 24 css px; "1" to "9" span 7.5 px, "10" 14 px; so a column of about 16 px, two digits wide, if it starts at the 16 px page margin (inferred) | W, P |
| Duolingo league screenshot (ranks 8 to 12) | centred | single digits centre 118.5 px, "10" to "12" centre 119.5 px at 3×; a column of about 48 pt if it starts at the margin (inferred; it also holds medal glyphs) | W, P |
| chess.com leaderboard (mobile web) | centred | "#4" and "#5" centred on the 40 pt column shared with the 1 to 3 medal tiles | W, P |
ATP WTA Live rankings (atpwta:3, ranks 1 to 15) | left | the left edges of "9" and "10" coincide (322 and 323 px) | F, P |
Strava segment (strava:9), Apple Games, Toss 만보기, UTR and Playtomic | not observable | only single digits, no list, or no legible frame | F |
Reading. Three of four measurable peers centre; one, a sports app, is left-aligned. The one-digit difference between ranks 9 and 10 (8 pt) has to land somewhere: before the digit (right-aligned: your 36 pt start), split (centred, the peers' choice, 3.5 to 4 pt each side) or after it (left-aligned: ATP WTA Live and the kit). Your front-gap law puts it after the digit, between the number and its face, where it is least visible. What the slot width then decides is how far the number sits from its face. Ours reserves 24 for ranks up to 99, so a single digit sits 28 pt from its face and "10" sits 20, against 12 between a face and its name.
Recommendation
Keep digits left-aligned at the rail (applied) and make the slot literally the widest rank's width, as the decision-log entry says: today's 24 is 8 wider than two digits.
- Slot = digits of the widest rank × 8 (a 13/18·600 tabular digit is 8): 8 for 1 to 9, 16 for 10 to 99, 24 for 100 to 999, 32 from 1,000; then 12. The avatar sits at 40, 48, 56, 64 (library table now: 56, 64, 72). Digit to face becomes 20 for a single digit and 12 for "10" in a list that runs past 9, the same 12 as face to name.
- The one-digit swing (8) stays in any slot width; only the tight slot removes the extra 8 that the 24 slot adds everywhere. If the board still shows the swing as loose, centre the digits in the same tight slot: a single digit then starts at 24 and "10" at 20, at the price of 4 pt of leading space.
- Size the slot from the total ranked count, which the RPC knows, not from the loaded rows, so it does not jump when the next page loads. At larger text the digits grow with the label scale: width = digits × 8 × min(scale, 1.5), rounded up to the 4 grid.
- Library edit: Figure column and the Leading marker table (rank column row); kit
rankWdefault 24.
Appendix A. Listing frames used (F)
Frames come from the screenshotUrls of https://itunes.apple.com/lookup?id=ID&country=CC; index n counts from 0. Version and release date are as of the lookup on 2026-10-11.
| Key | Listing | ID (CC) | Version, released |
|---|---|---|---|
| strava | Strava | 426826309 (us) | 484.0.0, 2026-10-07 |
| nrc | Nike Run Club | 387771637 (us) | 7.79.3, 2026-09-02 |
| utr | UTR Sports | 1519232627 (us) | 2.1.5, 2026-10-05 |
| peloton | Peloton | 792750948 (us) | 15.134.0, 2026-10-08 |
| applefitness | Apple Fitness | 1208224953 (us) | 8.5, 2026-10-06 |
| 284882215 (us) | 582.0.0, 2026-10-07 | ||
| 288429040 (us) | 9.1.579, 2026-10-07 | ||
| xtwitter | X | 333903271 (us) | 12.33, 2026-10-08 |
| spond | Spond | 755596884 (us) | 4.63.3, 2026-09-24 |
| flashscore | Flashscore | 766443283 (us) | 26.10.1, 2026-10-06 |
| atpwta | ATP WTA Live | 1480255719 (us) | 3.4.18, 2026-08-03 |
| swingvision | SwingVision | 989461317 (us) | 11.9.68, 2026-10-09 |
| sofascore | Sofascore | 1176147574 (us) | 26.09.28, 2026-10-05 |
| somoim | 소모임 | 582910479 (kr) | 4.4.1, 2026-10-06 |
| band | 밴드 | 542613198 (kr) | 30.2.2, 2026-10-08 |
| flab | 플랩풋볼 | 6608972481 (kr) | 2.0.1, 2026-09-21 |
| kakaotalk | 카카오톡 | 362057947 (kr) | 26.8.4, 2026-10-07 |
| toss | 토스 | 839333328 (kr) | 5.279.0, 2026-10-02 |
| kakaobank | 카카오뱅크 | 1258016944 (kr) | 2.65.0, 2026-10-06 |
| daangn | 당근 | 1018769995 (kr) | 26.41.0, 2026-10-07 |
Appendix B. Pages and documents used (W, D, S)
Public pages were rendered logged out on 2026-10-11 at 390 × 844 at 2× unless noted.
- 당근 모임: https://www.daangn.com/kr/group/열정의-테니스-jt4fgqhx1vaf/ (멤버 1029), https://www.daangn.com/kr/group/오산테니스-1dgp2ycebn9k/ (멤버 409), https://www.daangn.com/kr/group/실명으로-hmca7zsqswas/ (멤버 6).
- Meetup: https://www.meetup.com/tennismeetuphongkong/ (the full member list at
/members/and attendee lists at/events/<id>/attendees/redirect to a login). - Strava club: https://www.strava.com/clubs/strava. X: https://x.com/NASA (1280 wide). Facebook Page: a tennis tournament's official page (1280 wide). Instagram: https://www.instagram.com/nasa/ (390 and 1100 wide).
- ESPN: https://www.espn.com/soccer/match/_/gameId/401879268/leeds-united-arsenal (1200 wide).
- Toss Securities: https://www.tossinvest.com/stocks/A005930/order (1280 wide; the mobile web page only links to the app). Flashscore: https://www.flashscore.com/tennis/. Naver Sports: https://m.sports.naver.com/kbaseball/record/kbo, https://m.sports.naver.com/kfootball/record/kleague, https://m.sports.naver.com/game/202610091005181 (전력 tab).
- chess.com: https://www.chess.com/leaderboard. Duolingo league screenshots: raw device captures (1206 px wide) published by Deconstructor of Fun, undated, https://duolingo.deconstructoroffun.com/mechanics/leagues (
league-8.png). - D: Slack https://slack.com/help/articles/202518103; Microsoft Teams https://learn.microsoft.com/en-us/microsoftteams/guest-access; TechCrunch https://techcrunch.com/2017/10/26/facebook-rolls-out-new-tools-for-group-admins-plus-badges-and-profiles-for-members; TDS https://tossmini-docs.toss.im/tds-mobile/components/table-row/ and https://tossmini-docs.toss.im/tds-mobile/components/grid-list/; WCAG 1.4.11 https://www.w3.org/WAI/WCAG22/Understanding/non-text-contrast.html; 개인정보 보호법 via
https://www.law.go.kr/DRF/lawService.do?OC=test&target=law&MST=283839&type=XML; TeamSnap help search https://helpme.teamsnap.com/search?query=guest. - S (title or snippet only): 머니투데이 https://www.mt.co.kr/sports/2026/09/30/202609300851777490O; Supple https://supple.kr/news/cmuko9vew002r6lku8pkv1nuk; BWF https://bwfworldtour.bwfbadminton.com/news-single/2025/11/16/kumamoto-masters-kim-seo-equal-37-year-record/ (403 on fetch); Spond help https://help.spond.com/en/articles/25877-how-to-track-and-trace-event-attendees.
Appendix C. Measurements (P)
Source pixels unless stated; screen widths are the phone's visible screen in the frame (393 pt equivalent).
| Item | Numbers |
|---|---|
Strava feed strip (strava:5, 1.4× crop) | label starts 60, 270, 504, 800; first three content-wide, gaps 68 and 66; fourth spans 800 to 981, its value row 812 to 980; photo edge 978 |
NRC (nrc:1) | content 807 px wide; starts 0, 157, 395; ends 571 (70.8%); gaps 78 and 79 px = about 34 pt at 350 pt |
UTR (utr:1) | content 908 px; starts 64, 385, 712 (pitch 321 and 327); last ends 902, 70 px short (7.7%) |
Overlap, Facebook profile (facebook:4) | screen 915 px; cover y 530 to 1044; avatar y 752 to 1161 (410); over the cover 292 = 71% |
Overlap, LinkedIn (linkedin:3) | screen 938 px; cover y 1076 to 1312 (236); avatar y 1153 to 1462 (309); over 159 = 51% |
| Overlap, X (desktop) | avatar 133; cover bottom 67 below the avatar top = 50% |
| Overlap, Strava club (390, 2× scan) | cover y 67 to 467 css; logo 124 × 124, y 407 to 531; over 60 = 48% |
| Overlap, Facebook Page (desktop) | avatar y 342 to 513 (171); cover bottom y 402.5; over 60.5 = 35% |
| 당근 모임 (DOM at 390) | cover 390 × 170 at y 60; logo 48 × 48 at (16, 249); member avatars 36, pitch about 60; section heads 20 px |
| Meetup (DOM at 390) | attendee faces 18 × 18 at x 20, 32, 44; member initials pitch 56, circle about 40 |
| Strava club members (390) | 4 avatars 38 wide, x 13, 65, 117, 169 |
| Naver form chips (DOM at 390) | 18 × 18, radius 3, pitch 21, 12 px text; left team lefts 54.5 to 138.5, right team 233.5 to 317.5 |
| Rank, Naver (2×) | single digits x 40 to 55 (centre 47.5 to 48), "10" x 34 to 62 (48), "11" x 37 to 57 (47): centred on 24 css px |
| Rank, Duolingo (raw 3×, 1206 px) | "8" and "9" x 108 to 129 (centre 118.5); "10", "11", "12" x 96 to 143 (centre 119.5) |
| Rank, chess.com (2×) | tile column x 64 to 143 (centre 103.5 in the scan); "#4" and "#5" x 84 to 123 (centre 103.5) |
Rank, ATP WTA Live (atpwta:3) | ranks 1 to 9 x 322 to 332; ranks 10 to 15 x 323 to 343: left edges coincide |