Skip to content

Flat v2 — open issues ​

Status: Living · Last reviewed: 2026-10-20

The one list of what is still open in the flat v2 redesign, aggregated after owner review 43. Everything decided lives in the component library (flat-v2-component-library-2026-10-09.md) and on the boards; the dated reasoning lives in the rulings and the decision log. When an item closes, delete it here and record the ruling.

1. Decisions (owner) ​

D1–D6 were decided in owner review 44 (owner-review-44-rulings-2026-10-16.md).

D7 was decided in owner review 45: the theme picker is retired (one scheme, S2; light, dark and system stay). The club logo generator is untouched: it is hue-based and never read the app themes.

2. Reviews (owner) ​

  • Owner review 46 (in progress): the owner's library pass began on 2026-10-19 with the hub board (R1) and the list-a board: 28 marks, worked in research lanes A–F (owner-review-46-rulings-2026-10-19.md). The rest of the pass (list-b, detail, forms, auth, flows) is still to come. Rounds 1 to 5 are drawn (알림, M14, and 신뢰, M6; the club pages; navigation, M28, and best partners, M24; the detail board's links, 참가비 내역, 나와의 전적 and 성장 분석's plan; the four forms batches); the owner's check is next.
  • Kit gaps from round 1: the tier guide (K2, FvkTierGuide) for the trust and ELO explainers, which compose Cells until it lands; the hub, forms and detail boards' local Cell groups move onto FvkCellGroup with their batches (hub and forms done in round 2). From round 2: a pressable Cell with a trailing control (동의 관리's 보기 door sits in the expand slot until then); a press and a mine kind for FvkBlock (the season and the member's dues Blocks override slots today); an answering Text row; a pair avatar at the doubles stack's width; a setup checklist; a tone for a signed amount; one sheet for a pair's record and the best-partner score. From round 3: the photo viewer; a menu row with facts as a prop (the Info hint and the Score Sheet landed in round 4). From round 5: a Notice's default retry copy (auth's AuPgStart still types the canned body and 다시 시도); the Empty state's copy, the stacked Cell's second line and the picked MediaRow landed in round 5. From R3: 알림's end line and the hub's scrolled 홈 can move to the kit's FvkFeedEnd and the Section head's stuck; the English venue names on the hub's Feed items read the full name where the library's rows shorten it (Olympic Park).
  • Next on the boards: the owner's check of rounds 1 to 5 (the record page lists them from item 16), then R3's remaining pages (below). Small items round 5 found: 멤버 기록's hero says 12회 중 9회 beside four listed absences (9 + 4 is 13); the auth board's two fixed-height frames (rc-closed 896, co-200 1232) sit outside the measure tools, and rc-closed lost its pin fact; the session sheet's 일정 수정 and 참가비 관리 glyphs are the design's, since the code's host menu has neither door.
  • Forms pass (owner, 2026-10-19): before the owner reviews the forms board, the lead takes another pass at its proposed designs against the design principles, the decisions and the owner's feedback so far (the page grammar, the shared foundation, the accepted components, the wizard canon, review 46's rulings) and fixes what diverges. All four batches are drawn (round 5 drew the reveal); the forms board goes to the owner as one check.
  • R2. Detail board: 선수별 전적.
  • R3, the remaining pages under the page grammar (started 2026-10-20, while the owner checks rounds 1 to 5): the first batch is drawn (the 경기 tab, 리더보드, 친구 목록, the proposal lists and the retired 경기 기록; 공개 프로필, the receipts, 대진표, 기간 기록, 일일 요약, 게시글, 토너먼트; 홈 in English, the forms backdrops, departures in the header, the auth headers). The second batch waits on that check, since it redraws pages the rounds drew or touched: 가입 심사 (five Modules), 성장 분석 (six), both 장소 상세 pages (11 and 13 blocks; their facts become one 정보 Module), 내 신뢰 기록 (참석 기록 as the last Feed), 선수별 전적 (주요 선수 three; its Feed head), 멤버 기록 (four Modules), 회비 관리 (the ledger above the roster) and list-a's 가입 심사; then the zone-level failure frames and the 200%, dark and English frames the audits found missing (the hub's other panes among them).
  • W2 gate: the component waves (W2 Tag and Choice, W3 primitives, W4 pages) start when the owner says the library pass allows it. The W2 research is done (w2-tag-and-choice-2026-10-19.md): 128 files, of which 68 move mechanically; the owner opened W2 as W2a on 2026-10-19 ("I say yes to all recommendations"); W2b moves with the pages. W2a landed the same day (docs/history/rebuild-log.md): the Tag, Choice, ChoiceSet, LineSlot and text-scale pieces; the rules and the ratchet; the status wrappers on the Tag (tone map D1, for the owner's veto); 72 files moved by the Badge codemod, 29 chip sets by the ChoiceSet codemod, the chip family rebuilt on the Choice ▾; the canon and COMP-2. W2a's two hand lanes landed in rounds 2 and 3; W2b's 44 judgment files remain on the ratchet and move with their pages, mapped page by page in the research doc.

3. Data and code (in progress) ​

C1–C6 were approved in owner review 44 and run as the build waves W0.1–W5 in docs/architecture/flat-grammar-v2-migration-plan.md § Build waves. An item leaves this list when its wave ships.

Drawn in review 46 and proposed as build waves W0.7 (알림) and W0.8 (신뢰) in the migration plan; they wait for the owner's check of the drawings:

  • M6, 신뢰: attendance recorded in every club and pickup (the setting decides enforcement only); the tier on its new gates, in private.recalculate_trust_tier and trust-tier.rules.ts together behind the parity gate; the window of the last 20 records within 12 months; 사유 인정 요청 and the officials' answer; the server deciding who sees what (a stranger the tier only); the 내 신뢰 기록 page; pushes that name the true cause.
  • M24, best partners in code: a candidate with no attendance record scores a neutral 8 of 15 (computeAttendanceScore(null) is 0 today); the Score Sheet and its rules Sheet replace the card's expanding bars.
  • M28, navigation in code: a check that every route has an inbound link and that the mutual pairs of the library's § 1.15 hold, generated from the routes.* call sites.
  • M14, 알림: the page is in code (L3-13, 2026-10-21: time sections, the filter with 처리할 일 from signals_open_requests(), delete with 되돌리기, Select mode). Still open (W0.7): a row kept for 30 days instead of expiring with its signal (전체 and 안 읽음 count by expires_at until then); repeats grouped into one row; the bell from the unread rows only (the client's netting of critical and high rows goes, so the bell equals 안 읽음); the six push families (이런 알림 끄기 turns off the signal category until then), 메시지 and the per-club levels on 알림 설정; quiet hours with the payment exemption; the 친구 요청, 사유 인정 요청 and 신고 alerts. Not built: swipe to delete, the pinned time head; 홈's 할 일 door (W4) calls routes.notificationsAt('todo'). The board's English rows say session where the app says event. The kinds the board does not draw keep their v1 noun titles (22 in ko/signals.ts, such as 일정 변경, 회비 장기 미납 and 환불 미정산) where line 1 wants the actor-first sentence, and 환불 미정산's body puts a whole sentence on line 2 (it crops after the club); their sentences come with W0.7's families.
  • 참가비 내역 in code: the page (/profile/fees and MyFeesScreen are proposed names) reads useMySessionPayments, sessionPaymentGateState and refundState; the board's grounding lists those sources, and the screen blueprint gains its row when the screen lands.
  • Sessions named by place and day, in code: a chat started from a session opens with sessionTitle(session) today (the type alone) and should open named by its club and day; the session signals carry the stored legacy title (00109's NEW.title) and should name the club and the day too (with W0.7); the share preview (get_public_share_preview) already returns the venue, the club and the day.
  • 클럽 만들기's skippable steps: create-club-step7.tsx reveals 공개 설정 and 사진 정책 on a touch; the board draws a step whose every section has a default whole (the 2026-08-25 defaulted-axis law), and the code follows when the page is rebuilt.
  • R3 in code: 경기's three panes (activity-screen.tsx draws four: 내 경기, 번개 찾기, 저장됨, 테니스장); /records/history retires with 기록's Feed; another person's 업적 (the gallery reads the viewer's own), the several-clubs read for 공개 프로필, a full standings page for 토너먼트, the 친구 요청 page and 선수별 전적 for a period are owed; FeedList draws no end yet (hasMore is unread).
  • The result scale in code: ActivityHeatmapCard colours a day by its count today; it takes the result scale (each match's result, the comparison activityMetricTone makes) when 기록 moves to flat v2, and the Form strip is new. On the boards, 기간 기록's 활동 draws activity dots for 경기 수 while the app's calendar opens on ELO and colours 결과 by the same rule: it takes the heatmap's discs in R3's second batch.
  • No meta lines in code: LabeledField caption (every hint), AttachedPanel sentences, the CTA band helpers that explain, and the Caption rows and section notes the app draws today leave as each page moves to flat v2 (library 1.16); the Feed item's who row replaces its footer (SessionCardV2, ClubCard, DirectoryVenueCard and ChallengeBlock as they become Feed items).
  • For the owner (2026-10-20): 프로필 수정's 비공개 values beside 공개 범위 설정; one word for a venue on the forms: settled in batch 60 (테니스장 on every venue-finder row and its error; 장소 only for a club event; 활동 장소 stays, it is not a pick). Settled in batch 60: 일정 만들기 asks 경기 방식 (친선 | 경쟁) and says under it what the choice does to ratings (ELO 미반영 / ELO 반영).
  • The page levels in code: the app has no level contract yet; each screen takes its level's lead as it moves to flat v2 (docs/workflows/page-levels.json names the screen's level and family), and 회비 관리's plan row leaves for 클럽 설정. 내 회비 retires (2026-10-21): a member's dues are 클럽 홈's 회비 pane, and a 회비 push opens 클럽 홈 at 회비; 클럽 가입하기 names the club as its row.
  • The cohesion pass in code (2026-10-25): the app's money screens drop their Select mode (rows of the section the band acts on are picked by tapping them), row ⋯ menus become a row's Sheet on managing pages, the Level tag leaves rows outside the Roster, Podium and rankings, and every door's label is its page's title (§ 1.18, § 1.19). The owed pages (정기 일정, 조, 앨범 관리, 행사) need drawing before their code moves. The app-side edge list from routes.* (§ 1.15's prevention) can now be checked against docs/workflows/page-links.json.
  • The L0 and L1 page review in code (2026-10-27): nothing here is built. The discovery lists (클럽 › 탐색, 경기 › 번개 찾기, 예정 and 테니스장, and 기록's 경기 기록) take the Header's search icon (기록 has none), the first head's 필터 ▾ and the row of removable Choices under it, with one 지역 filter and the NTRP band slider (the app's RegionDistrictFilter and TierRangeSelector already work; the UI around them is what changes). 경기 regains 경기 방식, 코트 유형 and 참가비, 기록 drops the 기간 and 단복식 the first board had invented, and 저장한 코트 reads 저장됨. 홈's 할 일 becomes Feed-item rows with the count in the head. 프로필's identity Block takes a frame per member state (user-state.rules.ts, profile.entity.ts), its 신뢰 head opens 내 신뢰 기록, and TrustTierInfoSheet moves behind that page. 본인인증 is not built (EXT-19): 1/3 본인인증 offers PASS, 토스, 네이버 and 카카오 straight to each provider (KG이니시스 통합인증 with directAgency) and 다른 방법으로 인증, then 2/3 약관 and 3/3 첫 시작 (the owner, 2026-10-28: "as ruled before"); the stops are failure, a phone not in the member's name, under 14 and a duplicate account; the 통합인증 CI question and Kakao's CI paperwork are the vendor's (decision log, 2026-10-28). The shared-link previews return what, when, where, level and seats and never a person, and the share card is the page's own Block as a 1200 × 630 image with no live count. Each screen's blueprint entry is written when the screen lands.
  • The second pass in code (2026-10-28): nothing here is built. The filter sheets compose the app's own pieces in one order (보기, then 날짜 and 지역 as Picker rows, then Choice sets, then band sliders): 날짜 needs the date picker sheet over DateSelection (the presets over the month grid DayCalendarPicker already draws), 수준 reuses TierRangeSelector's slider, and 참가비 becomes a band over FEE_OPTIONS in place of the RangeChip. 할 일 rows need the subject on HomeTask (the session and its venue, the applicant, the dues period and sum, 회비 납부's 납부 기한). The interim email sign-up needs a Send Email hook that mails a registered address its sign-in link instead of the sign-up link (Supabase sends nothing to a confirmed duplicate).
  • The language pass in code (2026-10-28): the boards lead; packages/app/src/config/i18n/ko/* follows screen by screen as each page is built (the words in the library's § 1.19, the rules in docs/design/copy-plans/2026-10-28-flat-v2-language-pass.md). Two things wait on others: the consent rows keep their legal wording (…에 동의합니다) until counsel reviews it, and the achievement names and lines live in the achievement catalog's seed, so the 업적 page's wording changes there.
  • 신뢰 점수 in code (decided 2026-10-29, research § 7 of owner review 48): a profiles.trust_score beside, then instead of, trust_tier; private.recalculate_trust_tier becomes the score's recalculation over the same inputs plus lateness and the excused flag; the parity gate checks the point table; computeTrustScore reads score ÷ 100 × 15; the signal fires on a deduction only; TrustTierBadge and TrustTierInfoSheet give way to the score Cell and the point table. The boards draw it first.
  • Live play in code (owner review 48, batch 4, 2026-10-29; the library's § 10 Live pages, research § 8):
    • tournament matches move into matches with a stage and a group (the tournament record keeps format, group size, advancers and seeding); TournamentBoardScreen and /tournament-board retire, and a tournament session's 일정 상세 opens 스코어카드 and 대진표 like any session;
    • get-default-tab.ts and SpectatorScorecardScreen: LIVE first; the elapsed minutes per match in play (a started_at per match, or the round's start); the resting viewer's 다음 경기 block;
    • a group ranks by 승수, then 승자승 between two, then 게임 득실 (the pools rank by point difference alone today, the round-robin groups by head-to-head then point difference); the round labels in single-elimination.ts become 결승, 4강 and N강 in i18n; no 3·4위전;
    • a court queue for a tournament (no model today: courts are assigned per round), and the push when a court frees;
    • the 대진표's 할 일 Task Cells (점수 입력 전, 시간 지난 경기 beside 검토), ScoreEntry in sequence, 늦게 온 선수 추가 (AddRound's 선수별 도착 picker moves behind the ⋯), the band 4라운드 시작 and 본선 대진 만들기;
    • the 경기 중단 step reaches the submit RPC's outcomes (walkover, abandoned; no UI picks them today);
    • the recap Block and the result card (오늘의 기록, 결과 공유).
  • 매치 in code (owner review 48, batch 5, 2026-10-29): the app's copy says 번개 (packages/app/src/config/i18n/ko/*: activity, common, home, onboarding, sessions, signals and five more) and moves to 매치 screen by screen, as the language pass does; when the first screen moves, scripts/check-i18n-house-style.mjs's rule 픽업 → 번개 becomes 번개, 픽업 → 매치, and matchTiebreakSetLabel and match_tiebreak_in_lieu_bo3 read 타이브레이크 10점.
  • Owner review 48, after batch 4 (2026-10-29). Left open by the redraw:
    • pausing a court and pushing its later matches back (research § 1's item 7) is not drawn;
    • King of Court's 코트승급전 tab keeps its place after LIVE in code; no board draws it;
    • a full-screen pan-and-zoom of a large draw (32강 and up) is not drawn: the Bracket pages by round.
  • Owner review 48, after batch 3 (2026-10-29). Left open by the redraw:
    • A mistaken 도착했어요 stamp has no fix for the host (시간 바꾸기 edits the window, not the stamp).
    • A 확인할 사람 row never answered by the session's end: an automatic 불참, or open until the host answers?
    • 홈's Block names a check-in state (review 28) that no frame draws; 일정 상세's band is the drawn path.
    • The bell needs a seen state apart from each row's read state (the badge clears on open, the dots on tap); confirm useAcknowledgeSignals covers both.
    • FvkDocPage takes no lead slot, so the detail board composes the legal pages (DtlDocPage); fold it into the kit.
    • The FAQ's new answers need the owner's or counsel's check.
  • Owner review 48, after batch 2 (2026-10-29). Questions the redraw left open:
    • May only officials open 신뢰 기록 from 공개 프로필 (기록 보기)?
    • 공개 프로필's club fact opens 클럽 홈 but carries no visible affordance.
    • 알림 may not need a 처리할 일 filter now that 홈's 할 일 filter lists every kind; no frame draws an officer's 할 일 filter.
    • The kit's MediaRow has no answer slot: 신뢰 기록's pending request composes an AnswerPair under a row.
    • 홈 no longer opens 알림 at 처리할 일.
  • Owner review 48, after batch 1 (2026-10-28). Two library specimens still draw a second door beside a head's 전체 보기 to the same place (the Roster's +N cell; the Shelf's trailing 전체 보기 tile in flat-v2-lib-surfaces), against § 1.18's one control per destination; the Shelf's tile left with the kit in batch 2 (2026-10-29); the Roster's +N cell is still open. The superseded boards (flat-v2-components, -controls, -patterns, -additions, -brand) keep their old head command and text doors as the historical record. The shipped 알림 keeps 모두 읽음 in its header ⋯ until its screen is rebuilt from the board (docs/canon/notifications.md).
  • As-of on a cached list (owner decision 16, 2026-11-10; follow-up batch F1c, ruling O6): a cached money, attendance or score list does not say when it was read; needs a drawn piece. The kit has no as-of slot on list pages (metaWithAsOf exists only inside a Block's offline state), so 회비 관리, 장부, 참가비 내역, 출석 현황, 참석 확인, 참석자 관리, 스코어카드, 기록 and 순위표 show a warm cache offline with no "last read" line. Recorded in each page's blueprint Gaps; no piece was invented.
  • Money, follow-up F2 cut 1 (2026-11-11): (1) The dues notice for a one-off says 회비 배정 with the club and the amount; it does not name the one-off. Naming it at read time needs the plan's id in the signal's context (a change to signals_on_dues_insert and a new migration), the client resolving the name per notice and the push text built the same way: not a small change, so it waits for the notification families (W0.7). (2) The 납부 기한 Stepper on the recurring plan page wraps at 200% text: a kit defect in the Stepper's row, not worked around (a fix needs its own board frame and measure). (3) club-dues-two: a member with a month and a one-off both open pays the head charge (the recurring one) first; recorded for the owner, not changed. (4) The 회비 관리 Dialog for 회비 만들기 on a one-off never charged still uses the shared generateBody ("N명에게 …씩 알려 드려요"), which states the count as a promise; the plan page's Dialog words it as a reading (onceCreateBody). (5) A camera source for a receipt (사진 찍기) waits for a native build (docs/release-evidence.md S19).
  • In code (2026-10-20): 클럽 홈's panes open on Section heads (no Block); the trust page's records as two-line rows with the venue's map and a record Sheet.

4. Outside the code (owner) ​

Tracked in the External Blockers Register:

  • EXT-17: file 다붓이 at KIPO through a 변리사, once the product work is done (owner, 2026-10-19).
  • EXT-18: register dabusi.app and the brand addresses.
  • EXT-19: 본인인증 quotes.
  • EXT-20: the cockpit's Access gate.
  • EXT-2: counsel's pass on the legal text, which still says 투모(TwoMore).
  • EXT-14: the Kakao templates.

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