description: >- English summary: Onoo commercial roadmap. Phase 1 ✅ — Trusted data foundation (games, box scores, standings). Phase 2 ✅ — Player profiles (hero, charts, stats). Phase 3 ✅ — Discovery (search, game pages, leaders, awards). Phase 4 🟡 — Academy management (student profiles, payments, group management). Phase 5/6 planned: public API, enterprise features, mobile app. Revenue model: league subscription (paid pilot) + per-game fees. Non-goals: streaming, fantasy, consumer analytics.
Оноо — Сагсан бөмбөгийн үйлдлийн системийн замын зураг
Арилжааны босго (paid pilot)
Одоогийн бизнес загвар дээр суурилсан босго. Шаардлагатай бол өөрчилж болно:
| Gate | Outcome |
|---|---|
| Discovery | Contracted pilot, 1,000,000 MNT deposit, нэг улирлын гэрээ |
| Paid proof | 100% final-score accuracy, 0 сэргээшгүй event, whistle-to-recap < 5 минут |
| Full season | Satisfaction ≥8/10 ба улирлын гэрээ 14 хоногийн дотор |
| Expansion | Native mobile, follows/push, claims — full-season renewal-ын дараа л |
Horizon A — Лиг эхлэсэн paid proof
Phase 1–7 нь Оноо-ийн одоогийн хэрэгжих замын зураг. Эдгээр нь trusted records, public athlete value, league renewal-ийг батална.
AI хэрэгжүүлэгчдэд: үе шат бүрийн execution spec нь docs/plans/ дотор байна. Энэ roadmap нь юу/яагаад, spec-үүд нь яаж гэдгийг харуулна. Эхлээд docs/plans/00-conventions.md, дараа нь тухайн phase-ийн spec-ийг унш.
Phase 1 — Trusted data foundation (ажиллаж буй)
Execution spec: plans/phase-1-trusted-foundation.md
-
stat_eventsjournal, ruleset vocabulary, projection rebuild command, authorization cutover. - Submission review UI, journal durability tests, handoff UI.
- Ops console, integration tests, chaos tests, venues CRUD, seasons CRUD.
Phase 2 — Player profile as showcase
Execution spec: plans/phase-2-player-showcase.md
- Roster onboarding kit, consent & takedown, hero identity card, social links.
- Season story arc, shooting profile, career highs & milestones.
- Radar chart, recent games strip, plain-language summaries.
- Report-error intake, season selector & career view, box score below fold.
Phase 3 — Final-Whistle Pack
Тоглолт дууссанаас 5 минутын дотор бүх publishable asset бэлэн болно.
- Game recap pages — final score, top performers, lead-change flow.
- Shareable stat cards — тоглогчийн game/season line-ийн зураг.
- Sponsor placements — "presented by" slots.
- Awards & MVP races — shareable award graphics.
- Provisional-final publication — "Урьдчилсан" badge бүхий snapshot.
- Auto Mongolian recap text — deterministic narrative.
- One-click share/download — бүх asset дээр.
Phase 4 — League proof & renewal
- Embeddable widgets — standings, leaders, schedule.
- English profile view/export — scout-facing toggle.
Phase 5 — Discovery & organic growth
- Standings redesign — zebra rows, sticky header, team color accent, playoff line, streak/last-10 dots
- Awards & MVP races —
cmd_grant_awardSECURITY DEFINER function, admin awards page with grant Dialog + list,getMvpRace/getPlayerAwardsin data.ts,MvpRacecard on leaders,AwardsShelfon player page - Qualification rules
- Home: tonight's games — live/today/yesterday/standings sections with GameCard components and 20s live polling
- Search & browse — player/team/league-ийг хурдан олох.
- Search expansion — ⌘K palette + /search page cover shop products, games, competitions (season reports), with integration + E2E coverage
- SEO basics — sitemap, metadata, indexable public pages.
Phase 6 — Live experience
- Public visibility for provisional games —
getGamesByDate/getGameByIdnow read fromv_public_live_gamesUNION withv_public_games. Provisional games show with amber "Урьдчилсан" badge. Live games show scores. - Live game center — realtime score, on-fire indicator, play-by-play.
- Live-updating player stat lines — Supabase Realtime.
Phase 7 — Team insights (design-partner beta)
- Efficiency metrics — ORtg, DRtg, NETRTG, PIE, Four Factors, pace.
- Team performance dashboard — offense/defense trends, Four Factors, efficiency chart, per-game advanced stats.
- Player development timeline — month-over-month stat progression (MonthlyProgression on player page).
- Opponent scout card — дараагийн өрсөлдөгчийн нэг хуудас profile (teams/[slug]/scout).
Horizon B — Баг ба академийн ажиллагаа
Эдгээр нь стратегийн дараагийн үе шат. Лигийн paid-proof gate ба домайн бүрийн paid discovery pass-ыг давсны дараа л эхэлнэ.
Phase 8 — Shared basketball organization foundation
- Canonical identity for leagues, clubs, teams, academies, guardians.
- Official roster snapshots, eligibility, transfers, identity disputes.
- One account + least-privilege org roles.
- Private storage, audit, retention, consent, break-glass support, dark theme.
Phase 9 — Team operations
- Team staff and role administration.
- Roster intent, availability, transfer requests.
- Training schedule, attendance, facilities.
- Team dues and expense workflows.
- Basketball-specific performance and opponent prep.
Phase 10 — Academy operations
Product architecture and delivery plan: features/academy-management.md
Phase 10a нь deliberately minimal: admin dashboard дахь academy info, existing-auth access, basic payments, read-only program/trainer/location display. Enrollment, attendance, consent, offline workflow-ууд дараа орно.
- Academy info in admin dashboard: name, logo, contact, timezone, settings.
- People auth: existing accounts-аар нэвтрээд nav-д "Academy" харагдана.
- Basic payments through shop QPay.
- Read-only program, trainer, location display.
- No enrollment, no attendance, no consent, no offline.
Phase 10b — Student & enrollment
- Student profiles with guardian info, medical essentials, photo upload.
- Enrollment management: registration, program assignment, dates.
- Attendance, consent, waivers.
- Multiple children per guardian.
- CSV import/export.
Phase 10c — Full operations
- Offline-safe attendance with IndexedDB queue.
- Attendance reports by student, offering, coach, date range.
- Payment history and receipts per student.
- Ordered waitlist with promotion rules.
Phase 10d — Advanced
- Guardian OTP, multi-child dashboard.
- Verified QPay callbacks.
- Private message threading.
- Extended reporting: attendance analytics, financial summaries.
- Private identity-link record.
Phase 11 — Guardian self-service and commerce experience
- Guardian self-service, multi-child access, consent history.
- Registration, invoice/payment history, receipts, refunds, reconciliation.
- Basketball-specific announcements and reminders.
- Subscription and entitlement model.
Phase 11b — Public news (2026-08-07)
- News articles: admin CRUD with draft/publish lifecycle, public listing + detail pages, home latest-news strip, RLS + RPCs, tests (T-11b.1).
Phase 12 — Web performance & PWA
Lighthouse-based performance pipeline (mobile/desktop budgets), JS bundle trimming, data-layer caching, deploy-safe service worker. See tasks/T-12.1-web-performance-pwa.md.
- Lighthouse tooling: configs, budgets, npm scripts, README docs.
- JS trim: Sentry lazy-load, chart out of UI barrel, dnd-free loading skeleton, Oswald weights.
- CLS fix: hero-height-mirroring skeleton (desktop 0.276 -> 0.02).
- Data caching: getGamesByDate cacheLife("realtime") — warm requests 1490ms -> 456ms.
- PWA service worker: network-first navigations, cache-first hashed assets, production registration, offline E2E.
- Mobile home perf 78 -> 84, LCP 5.9s -> 4.5s, CLS 0; desktop home 98.
- Home critical path: box-score query parallelized (T-12.2). Polyfill trimming and hero-first streaming investigated — not shipped (evidence in task spec).
- Production-readiness verification: complete unit, integration, E2E, typecheck, lint, and production-build gates.
Phase 13 — Public Basketball Intelligence
Official-record-first public analytics across home, game, player, team, leaders, standings, search, comparison, and saved preferences.
- Public contract, curated views, official-source evidence, and private-note isolation (T-13.1).
- Canonical player/team metrics and reusable intelligence primitives (T-13.2).
- Evidence-backed Game Recap Lab with accessible momentum tables (T-13.3).
- Player Intelligence Lab with approved-record trends, insights, and favorites (T-13.4).
- Team Dossier, competition-scoped benchmarks, and public scout (T-13.5).
- League Pulse, leaders filters, standings race, and global search (T-13.6).
- Competition-scoped compare, favorites API, interaction analytics, and release proof (T-13.7).
Phase 14 — Platform hardening
Improvement-plan P0 batch from features/feature-map-gaps-improvement-plan.md: trust & hygiene before further features.
- Retire stale
derive-game/ brokennotify-game-eventsedge functions; in-DB command path is authoritative (T-14.1). - Sponsor placements wired end-to-end (public slots read
v_public_sponsor_slots) (T-14.1). - CI pipeline: lint/typecheck/unit/integration on PR; build + e2e on main (T-14.1).
- Dead code + duplicate generated types removed; tests repointed at real components (T-14.1).
Phase 15 — Improvement plan P1/P2 (half-built surfaces + parity)
Completing the remaining half-built surfaces and STAT.mn-parity gaps from features/feature-map-gaps-improvement-plan.md §6 P1–P2.
- Quick Shot / shot-location capture in the tracker — one-tap shots with optional court coordinates; heatmap/live-court/shot-chart data path (T-15.1).
- Clutch stats derivation from the journal (close games, margin ≤ 5) wired into the player page (T-15.2).
- Tournament model (rounds/groups) + FIBA-style hub: group tables, knockout + classification brackets, leaders, games by round (T-15.3).
- Real /teams/vs matchup hub + series pages (record, trend chart, meetings, season breakdown) + team-page opponents (T-15.4).
- Realtime home/scorebar via shared postgres_changes hook; 20s polling and TODO(5.1) removed (T-15.5).
- Verified QPay callbacks: server-side checkPayment, immutable payment_events ledger, exactly-once settlement, admin reconciliation (T-15.6 / T-10d.2).
- Offline attendance: IndexedDB journal, idempotent replay, staff reports + financial analytics, deterministic check-in codes (T-15.7 / T-10c.1 / T-10d.4).
- Auto-award RPC (period MVP, player-of-week from qualified leaders) with propose/approve/reject lifecycle (T-15.8).
- Lineup +/- analysis surface on team analytics (minutes, NETRTG, top/bottom lineups) (T-15.9).
- csv_import_log + waitlist_history wired into import/promotion flows (T-15.10).
- Season/competition selector (shareable URL), all-time record boards, home leader strips, zone standings for grouped competitions (T-15.11).
- White-label tenant theming: tenant_config, admin branding CRUD, subdomain shell branding (T-15.12).
- Quick check-in attendance with 6-digit codes (T-15.13).
- Sitemap/SEO completeness — records, awards, academy, shop routes (T-15.14).
Phase 16 — Production readiness
Closing the gaps found in the 2026-08-06 admin coverage audit.
- FastGate widened:
test:allruns typecheck + lint + unit + integration; broken types can no longer ship past the local gate (T-16.1). - Route-level tests for every previously untested admin API route (products/orders, competitions/venues, sports, team-seasons, catalog/reference, link-student-to-player, teams availability/training/context, org reference/break-glass, branding, audience, dashboard, players [id]/photo, submissions evidence, sponsors + logo + placements) (T-16.1).
- E2E runs on pull requests, not just main push (T-16.1).
- Remote admin credential restored (admin@onoo.mn password reset via GoTrue admin API, sign-in verified) (T-16.1).
- Gate 3 decision record drafted for Phase 11 — awaiting owner approval (T-16.1).
Phase 17 — Scoresheet analytics & continuous uploads
Turning every FIBA Official Statistics PDF upload into public analytics and making the admin upload path safe for continuous season-long updates.
- Game score-flow chart: cumulative home/away scores from FIBA 5-minute checkpoints with Q1–Q4 boundaries + accessible table (T-17.1).
- Team scoring-source chart (paint / 2nd-chance / fast-break / TO points / bench per game) + flow columns in the per-game table (T-17.1).
- Player shot-distribution heatmap (court zones + scatter) wired into the player Distribution tab; starter badge + FIBA fouls C/D in the game log (T-17.1).
- Upload hardening: PDF team-code validation,
cmd_seed_game_rostersauto-seed, name-based player identity fallback (T-17.1). - Anonymous-read grant fix for FIBA-derived analytics tables (checkpoints/periods/summary were 42501-hidden) (T-17.1).
- Game Intelligence Lab: lead-differential momentum chart, game-control panel (time leading / biggest lead / longest run / lead changes / times tied), point-source breakdown (paint / fast-break / 2nd-chance / TO points / bench) on the game page (T-17.4).
- Per-game EFF column on the player game log via
@onoo/corecomputeEfficiency(T-17.4). - FIBA checkpoint parser fix: merged-header extraction and flow-line guard produce correct 5-minute checkpoint values for real PDFs (T-17.4).
- Scoresheet evidence review UI: admin parses a FIBA PDF, previews every value (players/flow/checkpoints/warnings), then explicitly confirms before publish — review-gated path shared with the instant upload (T-17.2).
- Season-long flow trends: per-game chart of the 5 FIBA flow categories + time-leading on team analytics, with accessible table and empty state (T-17.3).
- Game-page milestones:
@onoo/coredetectGameMilestones(double-double / triple-double / 20+) badges on recaps (T-17.5). - Recap v2 lab story: run / biggest-lead / time-leading sentences in the recap; momentum share card gains a Тоглоомын хяналт facts row (T-17.5).
- Live momentum chart in the live game center, derived from
stat_eventsviaderiveBoxScoresemantics (T-17.5). - Player dossier rewired: league-overlay radar, stat-card flips (season vs career), milestones, recent games, monthly progression, career timeline; trend brush-range summary badges + cross-tab highlight (T-17.5).
- Leaders: 13-stat sortable tabs, 8-category leader strips (eff/+/−/TS added), drag-to-compare to the live compare page (T-17.5).
- Standings: inline single-expand row expansion (last-5, top scorers, next game, diff bars) replacing the drawer (T-17.5).
- Historical import: shared reviewed pipeline in
scripts/lib/fiba-import.ts+ manifest CLIscripts/import-official-stats.ts; BUBL seed refactored onto it (T-17.5).
Phase 18 — Performance & hardening
Search and core surfaces stay fast as data grows; repeat work is cached instead of recomputed.
- Search performance:
searchAll/searchPlayersAndTeamscached server-side (use cache+cacheLife("realtime")) via the cookieless anon client;/api/search+/api/search/quickresponses cached 60 s (browser/CDN) with stale-while-revalidate (T-18.1). - Admin search: pg_trgm GIN indexes on
players.canonical_name/name_latin+teams.name/short_code(base-table ILIKE); deterministicORDER BY canonical_nameon/admin/api/players(T-18.3).
Phase 19 — UX audit fixes
2026-08-06 live audit (VERDICT: FAIL — 3 Critical, 5 High, 8 Medium) on onoo.zuiiotech.com.
- Canonical base:
SITE_URLconstant (env + onoo.zuiiotech.com fallback) wired through sitemap, robots, metadataBase, per-route canonicals, JSON-LD, and embed footers — no more dead onoo.mn URLs (T-19.1). - Contrast: dark
--muted-foreground0.55 → 0.62 — WCAG AA on every surface (T-19.1). - Mongolian copy + terminology: "Эзэн" tab, "Сүүлийн тоглолтууд", "Өндөр", canonical Самбар/Дамжуулалт labels everywhere (T-19.1).
- Teams directory at /teams — footer "Багууд" link no longer 404s (T-19.1).
- Team "next game" excludes finished statuses — no more finals under "Дараагийн тоглолт" (T-19.1).
- Redeploy: the live build was stale vs repo (search, box-score empty states, MN toggle, stat labels) — fixed by shipping the current code (T-19.1).
- Admin user manual: "Гарын авлага" page documents every sidebar menu entry with a Mongolian description + direct link; reachable from a new "Тусламж" sidebar group (T-19.2).
- VitePress docs site: onoo-docs.vercel.app renders the repo docs/ markdown (feature docs, vision, architecture, roadmap) with sidebar, search, mermaid; docs stay single-source via symlink (T-19.3).
- Client demo data prep: regenerated every published game's player lines + team stats on the remote project so box scores are internally consistent (pts = 2·fgm + tpm + ftm, team totals match scores), rebuilt per-game season stats, restored the Дээд Лигийн Цом tournament hub, seeded awards + sponsor placements; added per-game columns to v_public_leaders and fixed the MVP-race EFF double-divide (T-19.4).
Phase 20 — Gap closeout (2026-08-06)
All 16 gap ideas (docs/tasks/gaps/) audited against the shipped codebase. 14 already shipped under T-13.x/T-15.x/T-19.1; G-07 residual implemented; G-16 remains the only open gap — blocked 2026-08-10 (owner deferral, not needed for now).
- G-01 Score flip animation —
flip-digit.tsx/score-board.tsxon landing + game detail. - G-02 Skill radar league overlay — ghost polygon, toggle default on, dual tooltip.
- G-03 Season arc brush — recharts Brush + range summary + cross-highlight with game log.
- G-04 Multi-category leaderboard strip — 8 category strips on landing + leaders.
- G-05 Standings row expansion — chevron accordion rows (with T-19.1).
- G-06 Card flip stats — hero + player intelligence overview flip cards.
- G-07 Drag-to-compare — leaders drag shipped; 2026-08-06 added compare-page delta-highlighted table (>10% rule), radar entrance animation, season arc overlay (
compare-arc.tsx, APIgameLines). - G-08 Tournament hub — single-page hub with groups, bracket, games by round.
- G-09 Tournament bracket — round columns + classification bracket.
- G-10 Swipeable game cards — touch swipe + action panel.
- G-11 Drag-to-reorder leader categories — dnd-kit + localStorage order.
- G-12 Interactive court heatmap — SVG zones + tracker shot capture.
- G-13 Season/competition selector — URL-persisted on 4 pages.
- G-14 Countdown timer — next scheduled game on landing.
- G-15 Shareable stat cards — server-rendered OG cards + share button.
- G-16 Live court animation —
live-court.tsxexists but demo-only; needs tracker/live-route realtime integration (XL). Blocked 2026-08-10: owner deferral — not needed for now.
Phase 21 — League insight features (2026-08-06)
User-selected "easy + wow" features: zero scorekeeper effort, computed from existing public views. Тоглолтын баатрууд (Game Heroes) was already shipped via recap-header/top-performers.
- Хүчний чансаа (T-21.1) — win% + last-5 form + SOS composite, trend arrows, standings page.
- Багын тайлан карт (T-21.2) — five A–F categories vs league population, team page.
- Сэтгэл хөдөлгөм тоглолтууд (T-21.3) — 0-100 drama score (margin, total, max lead), standings page.
Phase 22 — EuroLeague-inspired public UI (2026-08-07)
Competitive research against euroleaguebasketball.net: adopt the layout patterns that make sense for a score-driven product. All presentation-layer on existing views.
- Mobile bottom nav — 5 thumb-friendly destinations below lg, inline nav hidden (T-22.1).
- Standings rank chips on schedule cards + home strip (T-22.1).
- Site-wide next-game countdown strip with ticker sponsor slot (T-22.1).
- Player-to-Watch spotlight per team in the game hero (T-22.1).
- Add-to-calendar (.ics) download on the game page (T-22.1).
- Standings view toggle — Хүснэгт / Цуврал / Форм (T-22.1).
- Venue line on game cards (T-22.1).
- Public site performance — "use cache" on public queries + font priority (T-22.2). Home mobile: PERF 76→82, LCP 6.7s→4.7s; all public pages improved.
- Next.js 16.3 optimization batch (T-22.3) — partial prefetching (one App Shell per route), runtime prefetching on filter pages, cacheTag + admin revalidateTag (instant score/standings propagation), generateStaticParams on entity routes, Web Analytics, cached sitemap.
- Migration prefix fix —
20260806120000_seed_game_rostersrenamed to20260806130000(duplicate-prefix collision blocked local Supabase).
Phase 23 — NBA.com parity & league video (2026-08-07)
Competitive-parity batch against nba.com (comparison:
docs/features/nba-com-comparison.md). All gaps from the audit shipped: content engine, schedule/stats parity, navigation discoverability, plus the owner-approved YouTube video surface (league channel embeds — VISION video non-goal lifted for embeds only).
- News feature completed (T-11b.1) — admin CRUD (/admin/news), public /news + /news/[id], home latest-news strip, nav/footer links; migration+seed already existed, UI was missing.
- League videos —
videostable + cmd_* RPCs + v_public_videos, admin console, public /videos with embedded player + thumbnail grid, home strip; league YouTube channel embeds (no video hosting). - Schedule team filter — /games?team= via TeamFilter select + per-team link on team pages.
- Season calendar export — /api/calendar/season.ics (multi-event feed, ?team= scope) + button on /games.
- Daily leaders — most recent game day, top-5 per 6 categories on /leaders (NBA stats-hub parity).
- Public transfers feed — v_public_transfers (approved only) + /transfers page.
- Nav discoverability — "Илүү" dropdown (Мэдээ, Видео, Рекордууд, Наградууд, Тэмцээнүүд, Хуанли, Шилжилтүүд, Тайлбар, Баримт бичиг) + expanded footer.
- Hide-scores spoiler toggle — scorebar eye toggle (localStorage).
- Stats glossary — /stats-glossary (MN explanations of ORtg/DRtg/PIE/Four Factors…).
- Key dates —
league_dates+ admin console + /key-dates page. - Per-team records — team-scoped record boards on /teams/[slug].
- Pre-game preview card — head-to-head record + recent meetings on scheduled /games/[id].
- Competition hubs — /competitions index + /competitions/[id] (standings, leaders, recent games, tournament structure).
- Reviews RLS tightening — product_reviews SELECT restricted to approved (org admins see all) — completes the in-progress moderation policy.
Phase 24 — Security hardening (2026-08-07)
Audit-driven hardening of the live deployment (onoo.zuiiotech.com + iyhujghadlymroihxyiy.supabase.co): live-verified RLS gaps, dependency CVEs, admin auth, security headers. Spec: T-24.1.
- Dependency CVEs:
postcss(3 advisories via next pin),fast-uri,js-yaml,hono—pnpm auditnow clean (T-24.1). - RLS: dropped
orders_admin_all/products_admin_all/reviews_admin_all(any authenticated user could read/write all orders, products, reviews);consent_policies+break_glass_accesswrites scoped to owning org admins (T-24.1). - Storage: admin buckets (
player-photos,team-logos,product-images,sponsor-logos) writes require an org admin — live-verified bypass closed (T-24.1). - Admin upload routes require org-admin membership; dev credentials removed from the login client bundle (T-24.1).
- Security headers (X-Content-Type-Options, Referrer-Policy, Permissions-Policy, X-Frame-Options, CSP frame-ancestors 'self');
stat_eventsanon reads column-scoped (T-24.1).
Phase 25 — Terminology & i18n consistency (2026-08-07)
Unify Mongolian stat labels on common usage. Core i18n (
packages/core/src/i18n/stats.ts) is the single source of truth; components importgetStatLabelinstead of inline copies.
- Stat label terminology unification (T-25.1) — canonical set Оноо / Самбар / Дамжуулалт / Булаасан / Хаалт; radar, compare radar, stat cards, season arc, awards pills, OG images all read from core; 3 old streams collapsed into one.
Phase 26 — Homepage polish (2026-08-08)
User request: trim the "Илүү" nav dropdown to footer-only destinations, lead the landing hero with the newest league video (NBA.com style), keep the news preview visible.
- Nav cleanup (T-26.1) — Мэдээ and Видео promoted inline in the desktop nav; "Илүү" dropdown + MORE_ITEMS removed (secondary destinations stay in the footer); Base UI dropdown runtime error gone with the menu.
- Featured video hero (T-26.1) — landing hero embeds the newest published video (youtube-nocookie player, title, "YouTube-ээр нээх") with a compact next-game panel; scoreboard hero remains the empty-state fallback; the latest-videos strip no longer duplicates the hero video.
- News preview (T-26.1) — "Сүүлийн мэдээ" strip with up to 3 latest published articles stays on the landing page.
- Full-width video hero (T-26.2) — hero video spans the full container width with the next-game strip below; news cards get aspect-video image slots.
- Space League channel feed (T-26.2) — newest @SpaceLeague video (channel UC1P-4WO1Qeg1kBQiy2q8SgA) leads the hero via the YouTube Data API v3; falls back to admin videos until YOUTUBE_API_KEY is set (YouTube killed RSS feeds; scrape verified dead).
Phase 27 — NBA.com editorial layout (2026-08-08)
Fresh live analysis of nba.com (2026-08-08) applied to the landing page: editorial hierarchy (featured story + headlines + topic rails) instead of a uniform grid. Pure presentation on existing data paths — no schema changes.
- Featured news + headlines rail (T-27.1) — home news section becomes a featured story (kicker, cover image, "Унших" CTA) beside a compact headline rail with dates (NBA "Stories/Headlines" pattern); up to 5 articles.
- Лигийн булан league corner (T-27.1) — latest-transfers and upcoming key-dates mini-feeds (hide when empty) plus quick-link chips into the footer-only league pages: Наградууд, Рекордууд, Тэмцээнүүд, Статистикийн тайлбар.
Phase 28 — Test suite hardening (2026-08-09)
E2E suite hardening after a full admin-page test pass surfaced 9 failures: shop checkout locator collisions, SWR first-read staleness in content admin CRUD specs, and an order-dialog validation-message bug. Suite is now green and deterministic against the local stack.
- Admin page E2E fixes (T-28.1) — dialog-scoped shop locators, role-based h1, SWR-tolerant poll-with-reload public assertions, orphan-row purge in beforeAll, Спэйс Лиг transfer pick, order-dialog first-error-wins validation mapping.
Phase 29 — Responsive & performance audit (2026-08-09)
Full audit pass (user request 2026-08-09): three parallel code scouts + live browser probes at 360/390/768/1440px against Next.js 16.3 docs. Fixed P0 home clipping, sticky-header conflicts, LCP iframe hero, image loading, touch targets, and a11y semantics.
- Responsive fixes (T-29.1) — home leaders/standings cards were clipped by the court-divider grid auto-column (fixed with grid-cols-1 + min-w-0); countdown strip moved out of the sticky stack so inner sticky offsets (shop filter, players toolbar, MVP race) always clear the header; /teams/vs gained horizontal padding; standings mobile rank cell and awards stat-pill rows wrap at 360px.
- Performance (T-29.1) — YouTube hero + featured video are click-to-play poster embeds (LCP no longer pays iframe JS); news covers and video thumbs use next/image with sizes; countdown pauses on hidden tabs; slow poll skips while Realtime is connected; search/rank-map/next-game/daily-leaders queries moved from cacheLife realtime→frequent; unused global DrawerProvider removed; SW caches bounded (40 nav / 300 static / 50 misc).
- UX & a11y (T-29.1) — skip link targets the always-present #content wrapper; sponsor marquee replicas aria-hidden + inert + motion-reduce; leaders tabs get role=tab/aria-selected; touch targets raised to ≥40px (date nav, pagination, scorebar hide button, mobile shop button); home game times rendered in Asia/Ulaanbaatar; dead #play-by-play anchor now resolves on game pages.
Phase 30 — Test coverage expansion (2026-08-09)
Audit-driven coverage push: every non-boilerplate src file now has a test import, the coverage gate became enforceable, and E2E gaps were closed with new specs.
- Full test coverage expansion (T-30.1) — 0 untested non-boilerplate src files (was 198); 119 boilerplate pages covered; ~135 new test files (+1205 tests); E2E specs for live tracker + 11 uncovered admin pages;
test:coveragescript +@vitest/coverage-v8; thresholds raised to 72/65/70/60; coverage 52.78→77.74% stmts, 53.86→79.2% lines; merged-tree FastGate green (4049 unit + 669 integration + 22 E2E). - Direct LazyYouTubeEmbed component test (T-30.2) — last src file without a direct test import now covered (poster/eager-no-iframe, click-to-play nocookie iframe, id encoding, className pass-through).
Phase 31 — E2E reliability (2026-08-10)
E2E CI red on 4 of 5 runs (12–13 failures,
net::ERR_FAILED). Root cause: the PWA service worker'snetworkFirst/cacheFirstcalledevent.waitUntilwithouteventin scope — every SW-controlled navigation and static-chunk request rejected. Also fixed prerender-abort spam on the Next 16.3.0-preview.8 build (cache-complete fetchers + noallow-runtimeprefetch), an RLS gap hiding rosters from the tracker for live/scheduled games, the stale videos embed assertion (T-29.1 click-to-play), and the racy tracker game-finder. Full suite now 204 passed / 0 failed; the 3 previously skipped tracker live-flow specs execute and pass. Also fixed in CI follow-up: game OG image Satori crash on scored games, videos embed hydration race.
- E2E CI stabilization (T-31.1) —
public/sw.jspasseseventintonetworkFirst/cacheFirst(ReferenceError fix, same bug verified on the deployed sw.js); 13 pages dropprefetch="allow-runtime",partialPrefetchingoff; 9 public fetchers made cache-complete ("use cache" + cacheLife + cacheTag, tournament fetchers on the cookieless client) — kills the per-request prerender-reject + Sentry spam; nav/sidebar Linksprefetch={false}; CI E2E retries 3; tracker spec waits for the client-side table and prefers a live game; videos spec clicks the poster first; RLS migration20260810120000_tracker_rosters_live_games.sql(anon: approved games only, authenticated: + live_provisional/scheduled); FastGate green (4049 unit + 703 integration), E2E 204 passed / 0 failed. Stable upgrade: next 16.3.0-preview.8 → 16.3.0 stable — prerender-abort bug fixed upstream; partialPrefetching re-enabled, prefetch exports restored as "partial".
Phase 32 — Player page NBA.com layout (2026-08-23)
User request: nba.com-style player page — season stats table + last games at the top, everything else below, tabs merged 5 → 2. Presentation-layer only.
- Player page NBA.com layout (T-32.1) — team-color hero banner, then everything in player-priority single scroll: stats table → recent games → game log → trend → shooting → distribution → analytics → clutch; sticky anchor section nav; tabs removed (nothing hidden behind clicks); players tree 217/217 tests, tsc + biome clean, browser-verified.
Phase 33 — Player profiles (2026-08-24)
Player biographies are a single free-text field managed by admins and shown on public player profiles. Hidden players stay masked.
- Player bio support (T-33.1) —
players.bioadmin CRUD, maskedv_public_player_profiles.player_bio, and public profile section; local and remote migrations, generated types, integration test, and gate evidence recorded.
Phase 34 — Athlete self-service (2026-08-24)
Players claim their profile through a scoped, single-use team invite and edit their own biography.
- Athlete self-service bio via team invites (T-34.1) — hashed invite lifecycle, staff roster actions, email/Google sign-in callback, and audited self-service bio edits.
- Order-independent fallback seed migration (T-34.2) —
20260824120000_seed_leagues_fallback.sqlcreates its organization and sport parents idempotently before inserting G League, Mini League, Junior Cup, and their 2026 seasons; fresh ordered migration apply passed twice and the running local database was a no-op.
Horizon C — Unified basketball network
Баг эсвэал академийн модулиуд renew хийж, cross-domain identity/privacy/support metrics батлагдсаны дараа л эхэлнэ.
- Unified identity across academy, team, league.
- One consent-filtered athlete timeline.
- Public athlete story composed from approved records.



