DetailShell ("상대 전적") over a SummaryCard + CalloutCards + a "주요 상대" FeedList. States gate strictly in order: error → JUST a QueryErrorState (nothing else); loading → 2 SkeletonCards; no data OR zero records → ONE unified EmptyState (the code never distinguishes "no opponents" from "no matches"); else the full analysis. Win-rate everywhere is wins / (wins + losses) — draws are excluded from the denominator.
apps/mobile/app/records/analysis/rivals.tsx → records/src/head-to-head-screen.tsx
packages/features/records/src/head-to-head-screen.tsxpackages/app/src/presentation/components/status/status-badges.tsx