← Cockpit Wireframes
Compaction — 일정 · 코트 · 스코어카드
Approved — build queue
Venue Finder · 코트 찾기
ArchiveStrip Map · 세션 스트립 전체 시나리오Headers · 헤더 아이콘Compaction — 일정 · 코트 · 스코어카드Compaction — 클럽 상세 · 홈Compaction — 기록 · 프로필Live anchor — 진행 중 밴드Density · 카드 밀도토스트 — 리디자인 제안위저드 내비게이션 — 결정 보드드래프트 복원 — 무음 복원클럽 조 편성 — 모델 결정 보드Session Detail — Redesign · 일정Venue Detail — Redesign · 테니스장Profile Detail — Redesign · 프로필Tournament Detail — Redesign · 대항전Applicant Detail — Redesign · 가입 심사Canvas Migration — 회비 · 멤버 · 규칙Record Detail — Redesign · 기록Venue Filters · 코트 필터 재구성
Decided 2026-09-08 — shipped; kept as the decision record
Interactive kit · grounded in code

Compaction — 일정 · 코트 · 스코어카드

Compaction — session detail, scorecard, venue detailDuplication audit (2026-09-08) §3, decisions D1–D4, D11, D12. Drawn originally as open proposals — the owner has since RULED on every one (the audit doc's own "Owner rulings" table). Reground 2026-09-11 (checked against current code, not assumed): D1/D3/D11 are shipped or already match the ruling (green "Shipped"); D2 was ruled YES but the cleanup hasn't shipped yet (still a build item); D4/D12 were REJECTED (muted "Rejected — closed") — those two phones draw the proposal that will NOT ship, kept only as the record of what was considered. Each caption's "Ruling" line quotes the audit table verbatim. D1 also gets two phones (at rest / scrolled) since its proposal is itself a scroll-state transition.
🗺️
복식 친선토 7/24 (D-2)09:00–11:00양재 시민의숲 3, 4번 코트
At rest
복식 친선
6/8확정 인원
무료내 참가비
없음참석 마감
참여
전체 ›
🙂
김민준 (호스트)3.5
확정
🙂
이서연4.0
확정
Scrolled
D1Nav-bar title reveals only after the hero scrolls awayShipped
Then: the DetailShell title sat in the header at rest, on top of the hero's own title — the same fact shown twice at once. session-detail-screen.tsx rendered a plain DetailShell with no scroll wiring at all.Proposal: reuse CollapsingTopBar (already shipped, club-detail-screen.tsx) — a transparent scrim with no title at rest, solid chrome with a centered title once the hero scrolls past. Applies the same way to the match board and venue detail (both are DetailShell-over-hero screens too).Ruling (shipped, duplication-audit-2026-09-08.md): YES — CollapsingTopBar on every detail page with a graphical hero; the hero must not restate a session title; the flat one-fact-per-row metadata is rejected in favour of a compact identity pattern; detail-page side spacing must match club detail. Both parts shipped: DetailShell grew a generic `header: 'default' | 'collapsing'` prop (ONE shared mechanism, not the 3-separate-wiring-sites tradeoff below worried about) — session-detail-screen.tsx and both venue-detail screens pass `header='collapsing'` (session-detail gates it on `hasHeroMedia`; match-board-screen.tsx's hero is a TypeHero with no media to scroll behind, so it was never in scope) — and the hero identity pattern (session-hero-section.tsx) replaced the flat metadata rows.
복식 경쟁
🗺️
복식 경쟁수 7/28 (D-DAY)20:00–22:00양재 시민의숲 1번 코트
8/12확정 인원
₩10,000내 참가비
19:30참석 마감
참여
전체 ›
🙂
김민준 (나)3.5
확정
🙂
박도윤3.0
확정
정보
종목
복식
성격
경쟁
실력
C ~ D
ELO 영향
반영
참석 확정하기
D2StatStrip is the one numbers row
Today: 확정 count still appears in StatStrip AND the 참여 section's meta line ('N명 확정 · 예비 M', participation-section.tsx — unchanged); fee still appears in StatStrip AND the 정보 FactList's 참가비 row (info-section.tsx: 'Always renders — mirrors the monolith'). One part of 'when' already resolved: the hero identity pass (owner ruling 2026-09-08) folded the D-day into the hero's own date line as a qualifier ('7월 28일 (일) D-2') — the separate D-day badge this decision also asked to fold is gone. What's left duplicated is the count/fee, not the date.Proposal: keep StatStrip as the one numbers row — drop the 참여 meta count and the 정보 fee row (D-day fold already shipped, see 'Today').Ruling (decided, duplication-audit-2026-09-08.md): KEEP the StatStrip as the one numbers row, each page choosing its key facts. Follow-through: canon note added; the actual restatement removal (참여 count, 정보 fee row) has not executed yet — this remains a build item, not an open question.Trade-off: a viewer scanning only 참여 or 정보 (StatStrip already scrolled off-screen) loses the count/fee context those sections used to repeat locally.
복식 친선
🗺️
복식 친선
라이브
토 7/2409:00–11:00양재 시민의숲 3, 4번 코트
8/8확정 인원
무료내 참가비
3라운드진행 중
경기3라운드 진행 중
1코트 · 김민준·이서연 vs 박준호·최지우 · 6-3
D3Header live dot vs. hero strip badgeShipped
Then: live is signaled twice: the header's PulseDot beside the title (session-detail-screen.tsx:331-335, in_progress only) AND the hero's badge row (the strip's lead chip, session-hero-section.tsx:88-96).Proposal: keep the header dot — it's the one that survives scrolling once D1 ships — and leave the hero badge alone.Ruling (shipped, duplication-audit-2026-09-08.md): Key badges live BESIDE the title, never below; header live dot stays. Supersedes hero canon 2026-09-06(g); part of the identity pattern. Already matches current code: session-detail-screen.tsx's titleLeading PulseDot and session-hero-section.tsx's titleBadge (the strip's lead chip) both render today, deliberately — this was a keep-both ruling, not a skip.
복식 경쟁
🗺️
복식 경쟁수 7/2820:00–22:00양재 시민의숲 1번 코트
8/12확정 인원
₩10,000내 참가비
19:30참석 마감
정보
취소 규정
24시간 전 100% 환불
형식 · 성격 · 실력 · ELO 영향 자세히 보기
D4정보 collapses behind one disclosureRejected — closed
Then: InfoSection always renders every fact — 형식/성격/티어/ELO/참가비/로테이션/취소 규정 — even though it's reference-only, never re-checked mid-scroll (info-section.tsx: no self-gate, mirrors the old monolith).Proposal (rejected): collapse behind one disclosure row; keep the cancellation-penalty line visible outside it — the one row with an actual consequence, not just a spec fact.Ruling (rejected, duplication-audit-2026-09-08.md): NO — 정보 stays expanded. Closed. The phone above draws the rejected disclosure proposal for the record; info-section.tsx today still always renders every fact, matching the pre-proposal 'Today' state, and that is what ships.
대진표
3판 2선승6게임타이브레이크듀스
1라운드완료
4경기
2라운드진행 중
2/4경기
3라운드예정
예정
D11Scorecard rules strip shown once per sessionShipped
Then: RoundHeaderRow's `headerExtra` injected a RoundRulesStrip on EVERY round (draws-tab.tsx, live-tab/use-live-tab-state.tsx) — the same badges (format/target/win-by/tiebreak) repeated once per round even though rules rarely change mid-session.Proposal: show the rules strip once, above the round list; repeat only on a round whose effectiveRules actually differ from the session default.Ruling (shipped, duplication-audit-2026-09-08.md): YES rules once per session; open: a visual anchor at the top of live pages. Rules-once shipped: draws-tab.tsx now renders `sessionRulesHeader` (a RoundRulesStrip for `session.matchRules`) ONCE above the structured round list; each round's own `headerExtra` only adds a strip when `roundRulesDifferFromDefault` is true, resolving this decision's own open question exactly this way (a live-tab.test.tsx case asserts the omission). The anchor half is still open — see the separate `/wireframes/live-anchor` proposal board.
양재 시민의숲
📷
양재 시민의숲하드 · 4면
정보 출처 · 호스트 확인 · 기여 내역더보기
검토 대기 중인 제안
코트 재질 정정 제안2건 대기
대기
D12Venue detail bottom utility stack behind one disclosureRejected — closed
Then: four separate blocks stack at the bottom in order — SourcesSection (✚ 정보 출처) → HostConfirmSection (always present, never self-gates) → VenueContributionLinks → PendingReviewSection (row-gated) — directory-venue-detail-screen.tsx:396-402.Proposal (rejected): collapse Sources/HostConfirm/ContributionLinks behind one disclosure row; PendingReviewSection stays visible outside it so an approver never opens a disclosure to find pending work.Ruling (rejected, duplication-audit-2026-09-08.md): NO collapse; each detail page gets its own pass. Closed. The phone above draws the rejected disclosure proposal for the record; directory-venue-detail-screen.tsx today still stacks all four blocks flat in the same order, matching the pre-proposal 'Today' state, and that is what ships.
Spec (grounding, anatomy)

Six page-reshaping decisions from the 2026-09-08 duplication audit (§3, D1-D4/D11/D12), each drawn in its proposed final state rather than a before/after pair — D1 (nav-bar title reveal-on-scroll) is the one exception, drawn as two phones (at rest / scrolled) because the proposal IS a state transition. Covers session detail (D1-D4), the scorecard draws tab (D11), and venue detail (D1, D12). The owner has since ruled on all six (the audit doc's "Owner rulings" table) — D1/D3/D11 shipped or already match; D2 ruled yes, not yet built; D4/D12 rejected and kept only as the historical record. Reground 2026-09-11.

grounded in 10 source file(s)
packages/features/sessions/src/session-detail-screen.tsxpackages/features/sessions/src/session-detail/sections/session-hero-section.tsxpackages/features/sessions/src/session-detail/sections/participation-section.tsxpackages/features/sessions/src/session-detail/sections/info-section.tsxpackages/features/sessions/src/scorecard/round-header-row.tsxpackages/features/sessions/src/scorecard/round-rules-strip.tsxpackages/features/sessions/src/directory-venue-detail/directory-venue-detail-screen.tsxpackages/ui/src/detail-shell.tsxpackages/ui/src/app-header.tsxdocs/audits/duplication-audit-2026-09-08.md