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 (Operations)
- Verified QPay callbacks and invoice reconciliation.
- Multi-location scheduling and capacity management.
- Extended reporting: attendance analytics, financial summaries.
Phase 11 — Guardian portal (Deferred / Out of Scope)
Guardian self-service portal (SMS OTP login, parent app) is deferred out-of-scope per business decision; academy staff manage students, attendance (offline-ready), and QPay invoices directly via
/admin/academy.
- Basketball-specific announcements and reminders.
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:
docs-site/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 gap ideas (docs/tasks/gaps/) audited against the shipped codebase. G-16 (Live court shot heatmap/animation) was removed from the product scope per owner direction.
- 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.
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
UCsIas3OHQmpldkpcbtbgyKg; the id previously written here,UC1P-4WO1Qeg1kBQiy2q8SgA, 404s and was stale) leads the hero; falls back to admin videos until YOUTUBE_API_KEY is set.
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.
Phase 35 — Landing layout fixes (2026-09-05)
2026-09-05 landing review: sponsors below content, hero empty state with search + quick links, selector above data, single empty states, compact text-only news slider.
- Landing layout fixes (T-35.1) — sponsors moved below page content, competition selector tops content, hero fallback carries search + browse links, collapsed empty-state wall, dots-free compact news slider.
- NBA-order landing sections (T-35.2) — sponsors back on top, news second, matches next, top players after (nba.com order).
- Hide empty players/games sections, show conditionally (T-35.3) — no-data placeholders render nothing; each section appears only with data.
Phase 36 — Production CPU optimization (2026-09-07)
Reduce avoidable serverless active CPU from global Supabase auth proxy work while retaining protected-route session verification.
- Production CPU optimization — Supabase auth proxy (T-36.1) — public pages bypass the auth proxy; protected and session-dependent routes keep verified session handling.
Phase 37 — Player fan feedback (2026-09-07)
Public emoji reactions (3 fixed, no login) + post-moderated comments on player pages. Owner waived VISION no-comment rule for player pages.
- Player emoji reactions + public comments (T-37.1) —
player_reactions/player_commentstables with toggle/report/hidecmd_*commands, curatedv_public_*views, player-page pills + comments UI, 38 tests.
Phase 38 — Player self-service profiles (2026-09-08)
Claimed players customize their own detail identity without admin help. Stats stay league-owned.
- Player self-customizable detail page (T-38.1) —
nickname/cover_urlcolumns, maskedv_public_player_profiles,cmd_update_my_player_profileRPC,/api/me/profile+/api/me/photoself routes, customize drawer (bio/photo/social/facts), hero nickname + cover, 23 unit/route/component tests + 2 anon E2E.
Phase 39 — News entity linking (2026-09-08)
Tag players/teams on news articles; related news surfaces on player/team pages.
- News mentions (T-39.1) —
news_mentionsjunction table, maskedv_public_news_mentions,cmd_set_news_mentionsRPC, admin tag picker with search, mention chips on articles, related-news sections on player/team pages, 27 unit/route/component/data tests + 6 integration + 3 E2E (CI-local seed fixtures).
Phase 40 — Public slider reliability (2026-09-14)
One Embla engine replaces both hand-rolled sliders (owner UI review: buggy news progress line + sponsor banner drift).
- Embla slider engine (T-40.1) —
embla-carousel-react+embla-carousel-autoplay8.6.0; news hero progress follows the plugin clock (hidden-tab safe), sponsor banners use selected-snap dots; 16 slider tests green, tsc + Biome clean.
Phase 41 — Entity-surface parity (2026-09-14)
Teams/games/players review polish against NBA.com/Yahoo/ESPN patterns — presentation-layer only, no schema changes.
- Teams/games/players review polish (T-41.1) — rank/streak/PPG team cards + search; full team schedules + leaders strip + transfers; games competition + status filters; game videos + PBP filter table; players anchor nav; player splits + career table + transfers.
- Leftover entity-surface gaps (T-41.2) — box-score starter/bench groups; roster DNP availability; directory height/weight/age chips; hero linescore table.
- Entity-surface round 3 (T-41.3) — competition-scoped teams hub; roster bio chips; depth chart; A-Z directory; Athlete JSON-LD; shared sub-nav; unified heroes.
- Public pages speed (T-41.4) —
sin1region pin next to Supabase; footer threeheadcounts instead of four row queries; competition-scoped, narrowed leaders/standings selects; cached tenant social links with branding invalidation; dnd-kit split out of the leaders initial chunk.
Phase 42 — Detail declutter (2026-09-14)
Basic-first layering on game/team/player detail — presentation-layer only, no schema changes.
- Detail declutter basic-first (T-42.1) — recap+box above analysis on game detail; 5-row basic comparison + disclosure; team analyst links below depth; season table basic-6 + advanced disclosure; leaders qualification caption + glossary links; daily leaders below main grid.
Phase 43 — List richness + ops closeout (2026-09-14)
Team next-game lines + games spoiler toggle without new list-path queries; G-17..G-19 parked honestly.
- Ops closeout G-17..G-19 (T-43.2) — G-17 superseded (Zuiio ID SSO, no Google path); G-18 Google leg removed, magic-link click is a 1-minute owner task; G-19 parked awaiting owner staff names.
Phase 44 — Scorebar split (2026-09-15)
Independent completed (30%) + pending (70%) panes with per-pane arrow scrollers.
- Scorebar 30/70 split (T-44.1) — status-scoped completed/pending reads, ScorebarPane arrows, 30/70 desktop + pending-first mobile.
Phase 45 — Game detail responsive (2026-09-15)
390px game detail: no page-level horizontal scroll, duel-bar label-first rows, sticky box-score player column.
- Game detail mobile responsive (T-45.1) — chart max-width cap, single-column page grids, DuelBar/TeamComparison label-first mobile rows, sticky player column in box score.
Phase 46 — News inline entity links (2026-09-16)
@player/#teamshortcuts in the news body with autocomplete; stored tokens render as entity links and feed the T-39.1 tag rows.
- Inline @/# entity shortcuts in news (T-46.1) — token helpers, MentionTextarea (
@players+teams /#teams-only), picker preselect, detail link render, create/edit junction merge, 99 scope tests green.
Phase 47 — Public pages density (2026-09-15)
Strip the outer surface panel from public listings and home sections; one
PageHeadertitle stack, plain rows instead of card-in-card.
- Public pages density (T-47.1) —
PageHeaderprimitive,Card variant="plain", de-boxed home sections, tighter listing containers, plain teams directory cells.
Phase 48 — Team Site Pilot (2026-09-16)
Seasonal per-team SaaS from one shared DB and one deploy: each paying team gets its own branded host with its team page at
/and its own sponsor strip.
- Tenant team binding + seasonal entitlement (T-48.2) — additive team binding,
plan+paid_through, explicit root-domain host resolution. - Tenant home + sponsor strip (T-48.3) — shared
TeamHome, request-time tenant branch at/, team-only nav shell, sponsor strip.
Phase 49 — Team Site Pilot hardening (2026-09-16)
Team tenants show only their own team's world: no league destinations in the header, footer, or mobile tab bar.
- Team-only shell (T-49.1) — header/footers/tab-bar scoped to the team; league surfaces hidden on team hosts.
- Scout game-plan block (T-49.2) — printable attack/defend/watch/rotation summary from existing matchup data.
- Load flags + next practice (T-49.3) — foul-risk/heavy-load badges on depth chart, RLS-gated practice strip on team home.
- Titan tenant UX hardening (T-49.4) — team-scoped public games/players/home, tenant-safe shell, redirects, metadata, and a11y fixes.
Phase 50 — Homepage + games cleanup (2026-09-18)
Owner requests 2026-09-18: one daily-leaders board replaces the top-performances + standings-leaders sections and the floating social dock (T-50.1); /games matches the NBA app reference — no calendar-sync promo wall, no noisy season/group texts — and the news slider loses its pause toggle (T-50.2).
- Home daily leaders + floating dock removal (T-50.1) — photo/name/team big cards, competition-scoped, empty collapses.
- Games NBA-clean (T-50.2) — calendar promo + season line + group eyebrows/counts removed; GameGroup title-only; hover/focus autoplay pause kept; week strip hides zero-game days.
- Players NBA-compact (T-50.3) — PageHeader hero removed (sr-only title kept), single-row tab strip, h2 + season selector on one row, compact 3-col podium, gap-4 rhythm.
- Games mobile filters merge (T-50.4) — PageHeader hero removed (sr-only title kept), view toggle + status pills share one scrollable toolbar row, team/season picks share one compact row, week strip month label removed, empty-day next-game link retained.
Phase 51 — Competition league context (2026-10-19)
Competition listing, detail, and full-table links keep the selected league context.
- Preserve Mini League competition context (T-51.1) — preserve the league slug across public competition navigation and verify the resulting standings.
Phase 51 — Public header diet (2026-09-18)
Owner verdict: listing heroes, boxed toolbars, sticky players tabs, and roomy home section heads waste vertical space. One compact breadcrumb title row per page.
- Public header diet (T-51.1) — breadcrumb
PageHeader, underline players tabs, unboxed grid toolbar, compact home title rows.
Phase 52 — Team page NBA parity (2026-09-18)
Review findings on
/teams/[slug]vs NBA.com/ESPN/Basketball-Reference: sticky sub-nav, single roster, category leaders, honest hero form, featured next game. Presentation-layer only — no schema changes.
- Team page NBA parity fixes (T-52.1) — sticky sub-nav, merged roster, category leaders, hero streak, featured next game.
Phase 53 — PDF 1-Click Import & Sync (2026-09-20)
User request: PDF 1-click to import everything; currently 2-phase (recognize date/teams, then upload same file again on game page). 1 import and everything synced.
- PDF 1-Click Import & Sync (T-53.1) — single-drop auto-detection, 1-click sync button in /admin/import, auto-sync toggle, zero-reupload staging, and direct publish on game page.
Phase 54 — Auto game news (2026-09-20)
Owner request: the uploaded scoresheet should also produce the news article. One article per game from the same verified numbers the recap shows — story angle chosen deterministically (milestone / clutch / comeback / upset / streak / dominance / result), auto-tagged to both teams and the top performers, share-card cover, draft-first with auto-publish once the record is verified.
- Auto game news from published scoresheets (T-54.1) — pure
@onoo/coregenerator,news.source_game_id+cmd_upsert_game_newsidempotency, write-free preview then publish, game-page backlink, backfill CLI.
Phase 55 — Game highlight photo automation (2026-09-20)
Owner request: let league administrators upload a real game highlight photo with the PDF and automatically use it in the generated news graphic.
- Game highlight photo automation (T-55.1) — PDF + photo upload, deterministic photo-backed 4:5/9:16/landscape cards, sponsor overlays, automatic news cover update, and later photo replacement.
Phase 56 — Design system consistency (2026-09-22)
Owner report: component sizes drift per page. One fixed height per control type app-wide — toolbar
h-8, line tabsh-9content-width, card titlestext-base, icon chipssize-8.
- Design system fixed sizes (T-56.1) — Input
h-8, TabsTrigger lineh-9content-width, toolbar/tab/card-interior caller cleanup, fixed-scale test.
Phase 57 — Game page highlight surface (2026-09-22)
Audit finding: T-55.1 uploads the real game art, but the public game page does not expose it. The same page also has inconsistent top-performer ranking and recap copy/UI defects.
- Game page highlight surface + ranking parity (T-57.1) — expose the uploaded hero photo, unify EFF rankings, and correct recap, factor, heading, key, and share defects.
Phase 58 — Full-rewrite pilot (2026-09-22)
Prove the Server View-Model + Pure View + thin shim pattern on one orphan component so the full vibe rewrite touches only views + tokens.
-
Full-rewrite pilot (T-58.1) —
hero-card.view-model.ts+hero-card.view.tsx+ thinhero-card.tsxshim, boundary greps, 11 focused tests green. -
Split fan-out (T-58.2) — home-pulse, games-list, hero-banner, season-table split via 4 isolated workers; boundaries grep-verified, 24 new + 47 shim tests green.
-
Unified identity across academy, team, league (T-C.1) — canonical identities linking students to players with cross-domain affiliations.
-
One consent-filtered athlete timeline (T-C.1) — unified timeline combining official game records and academy milestones.
-
Public athlete story composed from approved records (T-C.1) — verified affiliations and multi-organization journey on public profiles.
Phase 59 — Teams directory refinement (2026-09-23)
Owner request: reduce teams directory control duplication for the current 24-team, two-group league.
- Team directory controls and group sorting (T-59.1) — one shared sort control, group-preserving ordering, no missing-record regressions, and square team-logo rendering.
Phase 60 — Player directory controls (2026-09-23)
Reader controls for the player list's optional columns, with group and per-field toggles.
- Player grid column visibility (T-60.1) — bio and statistical columns can be toggled individually or by group; all columns remain visible by default.
Phase 61 — Basketball icon clarity (2026-09-23)
Owner request: clarify public basketball stat icons and tracker action cues.
- Basketball icon semantics (T-61.1) — match leader glyphs to stats and add compact tracker action cues without removing labels or made/missed marks.
Phase 62 — Player detail analyst (2026-09-24)
Owner request: dedup the player detail page — one canonical block per fact, analyst graphs kept, repeated numbers removed.
- Player detail dedup + analyst layout (T-62.1) — slim intel/trend/shooting, wire five orphans, canonical section order with anchor nav.
Phase 63 — Public item consolidation (2026-09-25)
Owner request: clean up public list/grid items + teams grid/list switch.
- Public list-item consolidation (T-63.1) — one
MediaThumbCard, shared YouTube helpers, one transfer-label map, dead_MEDALSremoved. - Teams grid/list switch and sortable columns (T-63.2) — grid default, sortable list with optional columns, mobile-local scroll.
Phase 64 — Team leaders tile refinement (2026-09-25)
Owner request: remove gaps between team leader tiles, make them square, and show player photos as backgrounds with readable text.
- Square team leader tiles (T-64.1) — equal-width flush desktop row, scrollable square mobile row, full-bleed photos with a fade and initials fallback; categories and profile links remain. Focused checks passed; FastGate blocked by resource and local stack prerequisites.
Phase 65 — Team games history (2026-09-25)
Owner request: replace the TeamHome card wall with compact rows and add a full history log.
- Team games history log (T-65.1) — TeamHome shows max 5 rows + true-total link;
/teams/[slug]/gameshas season/status pills and 20/page pager with clamped params. Polish: venue line, aligned tabular scores, icon pager, eyebrow header.
Phase 66 — YouTube stream auto-match hardening (2026-09-28)
Audit of the live channel against 48 real Season 7 games found 22 games with no stream and 4 orphaned uploads.
- YouTube stream auto-match hardening (T-66.1) — Data API v3
UULVlive-streams playlist as the primary source (paginated; RSS kept as fallback because it 404s for hours daily and caps at 15 items), Cyrillic transliteration soГОВИЙН УЛИАСmatchesGOVIIN ULIAS, bounded 1-edit typo tolerance forROGORER/RIGORER, and date-aware ranking so rematches resolve to the right game day. Measured on real data: 26→30 games matched, 4→0 orphaned uploads, 11→0 uploads claimed by two games. 43 unit tests green. NeedsYOUTUBE_API_KEY(free) to activate the Data API path.
Phase 67 — Player profile section navigation (2026-09-28)
- Player sticky section headings (T-67.1) — removed jump navigation; each section heading remains visible below the site header during scroll.
Phase 68 — Floating capsule mobile navigation & design system alignment (2026-09-28)
- Floating capsule mobile navigation & design system alignment (T-68.1) — floating capsule mobile dock, news entry in mobile nav, S7 Monlive duo tokens in DESIGN.md and globals.css, and rounded-full pill-in-pill alignment for segmented controls.
Phase 69 — Worker subrequest and cache resilience (2026-09-28)
Owner request: fix Cloudflare Worker subrequest-limit errors, 503 responses, and regional-cache errors.
- Worker subrequest and cache resilience (T-69.1) — batch related-news reads, use R2 directly instead of the regional Cache API, keep D1 invalidation active, and verify the live error rate after an authorized deploy.
Phase 70 — Supabase advisor hardening (2026-09-28)
Remote advisors (2026-09-28): 16 anon-executable definer RPCs, 96 authenticated-executable, 18 RLS-no-policy tables, 67 multi-permissive flags, 149 unused indexes, leaked-password toggle. After: multi-permissive 0, rls-no-policy 0; only accepted flags remain.
- Supabase advisor hardening (T-70.1) — revoke anon payment/trigger EXECUTE, reporter-hash guard, deny-all RPC-internal + legacy tables, staff-scoped error reports, policy merges, unified stat_events; prove with integration tests + advisor re-query.
Phase 71 — Data correctness (2026-09-30)
Production player averages were rounded because
season_player_statsused integer columns.
- Player season-stat decimal precision (T-71.1) — change 14 average columns to
real, rebuild approved projections, and verify fractional public-directory values.
Phase 72 — Home page query performance (2026-09-30)
- Home game-day query scoping (T-72.1) — send the homepage's league, competition, and team scope to both public game-view queries; preserve the date/count output and verify with focused unit coverage. The local integration scenario is ready but could not run because Supabase was unavailable.
- Homepage Supabase read-path cuts (T-72.2) — direct DB limits for the homepage news/video strips, DB-side GROUP BY for the date strip, join-free card views for hot schedule paths, and volatility-split cache windows.
Phase 73 — Public visibility regression (2026-09-30)
Production report: departed player 404s while on the top-steals board; highlight card logs
internal image response is empty. Root cause: T-70.1 policy merges emptied verified-game views for anon.
- Verified-game anon reads + departed-player profiles (T-73.1) — restore anon reads of verified-game provenance and resolve departed-player profiles via the leaders fallback.
Phase 74 — Homepage instant path (2026-10-01)
- Homepage instant path (T-74.1) — 1-day edge cache on card ImageResponses + module font cache; layout scorebar-tree removal; team_slug-only footer count; always-share rankMap prefetch.
Phase 75 — Player detail minimal V2 (2026-10-02)
- Player detail minimal V2 (T-75.1) — season averages own one block, game log owns one block, V2 nav labels (Дундаж/Тоглолтууд/Сплит). Presentation-layer only.
Phase 76 — Cloudflare delivery gaps (2026-10-02)
- Cloudflare delivery gaps (T-76.1) — immutable fingerprinted assets, independent homepage streams, scoped Worker public-POST limits, and native Images transforms implemented locally. Headless homepage verified; final cross-family review is CLEAN for the corrected intake guard. Full Worker preview and approved live deployment pending.
Phase 77 — Public read-path performance (2026-10-04)
- Public read-path performance (T-77.1) — reuse loaded player competition options; filter game news/videos before limits. Real-read proof: one player request removed; news 10,427→536 bytes with full output parity. 70 focused unit/component + 4 local integration tests; cache audit recorded. No deployment or production latency claim.
Phase 78 — Player detail reliability (2026-10-04)
- Player detail statistics and chart reliability (T-78.1) — appearance denominators, career totals/averages and highs, chart labels/units, confidence, mobile core stats, and recent-form takeaway implemented. Headless career totals, tooltips, and 320/375px layouts verified. Final review corrections cover career pagination, unknown-minute MPG, and comment hydration; real-DB and final browser checks pending.
Phase 79 — Dependency upgrade release verification (2026-10-05)
- Dependency upgrade release verification (T-79.1) — verify the locked application/tooling upgrades together with the final delivery and player fixes; exercise coverage and the generated Worker, then pass CI before approved production activation.
Phase 80 — Team page performance (2026-10-05)
- Team page progressive loading (T-80.1) — team identity, games, and leaders render before independent secondary streams; schedule matching runs after mount with the original 50-video range. 10 focused tests, real-data SSR browser checks at desktop/360px, and client preview checks pass. Owner-selected lightweight check excludes full Next.js hydration; not deployed.
Phase 81 — Hosted Worker release build (2026-10-05)
- GitHub-hosted Worker release build (T-81.1) — manual build-only workflow, commit-labelled artifact, local authenticated preview upload. Keep Workers Free; do not bypass failed CI or promote a failing preview. Deployed version 24931df5 at 100% on 2026-10-05.
Phase 82 — Public mobile UX corrections (2026-10-08)
- Public mobile UX corrections (T-82.1) — remove stale scheduled fixtures from the scorebar, improve mobile discovery of home games and key statistics, reduce the game hero image height on mobile, and keep navigation labels readable.
Phase 83 — Static game share cards (2026-10-08)
- Pre-rendered game share cards (T-83.1) — generate immutable landscape, story, and highlight PNGs in the admin browser; resolve public card requests to static assets and keep Worker image rendering out of the request path.
Phase 84 — Players leaders navigation (2026-10-11)
- Players leaders view in header and mobile nav (T-84.1) — sixth primary destination
/players?view=leaderswith desktop/mobile active states, directory toggle, and dead-link repairs. 58 focused tests green, tsc clean.
Phase 85 — Stat glossary coverage (2026-10-12)
- Stat glossary everywhere + central page (T-85.1) — underlined tap-for-definition on all public team/game/player/home metric labels;
/stats-glossarygains search, formulas, and#keyanchors with dialog deep links. 86 files / 546 focused tests pass, tsc clean. Team leader-strip cards, admin consoles, and news markdown stay plain (documented in spec).
Phase 86 — Team hero scoring pair (2026-10-12)
- Team hero per-game points allowed (T-86.1) — the identity strip now pairs the scoring average (
Дундаж т/оноо) with the opponent average (Дундаж алдсан), derived frompoints_againstover games played. Focused header test 11 green; hero verified at 1440px and 390px.
Phase 87 — Worker 1101 fix and edge page cache (2026-10-13)
- Worker 1101 fix and edge page cache (T-87.1) — the Next 16.4.0 Worker deploy returned error 1101 on every route because OpenNext's bundle kept a dynamic
require(this.middlewareManifestPath)that workerd rejects; a patched@opennextjs/cloudflare(bundle externals, preview-props manifest branch, null middleware manifest) removes it. Public HTML now serves from L1caches.default→ L2 R2 (page-cache/v1/, 6 h) before the Next render, with purge on public-data invalidation. Deployedc4a3f991; live/200, repeat/hit-l1+cf-cache-status: HIT, scanner paths 404,/adminuncached. Workers Free retained.
Phase 88 — Public UI review follow-up (2026-10-13)
- Public UI review fixes (T-88.1) — mobile navigation, player identity width, page-level headings, and deterministic Mongolian news dates are implemented. Eight focused test files (107 tests) and Biome checks pass. The stale proxy matcher assertion that also failed on base main now matches
src/proxy.ts. Product images remain blocked because the public view has 15 products with empty image arrays and the product-images bucket has no objects; do not use placeholders. Browser checks need approval to start the local app.
Phase 89 — Public state hardening (2026-10-14)
- Public loading, empty, and error states (T-89.1) — shared
LoadingShell+PublicErrorStateprimitives; 12 shape-matchedloading.tsxfiles (transfers, key-dates, competitions, competition hub, records, news, news article, videos, players/compare, teams/vs index + matchup, shop product) plus a shop grid-col fix; 8 segmenterror.tsxboundaries on one Mongolian template; 5PublicEmptyStateconversions (games list, awards, shop filter, vs picker, guardian sections). 1226/1226test:changed, tsc clean, 24 static screenshots CLEAN. Live-server check skipped (swap guard blockspnpm dev).
Phase 90 — Season leader averages (2026-10-14)
- Season leader averages by team games (T-90.1) — homepage leader cards and
/players?view=leadersnormalize per-game metrics by each player's team verified games (v_public_leaders.team_games_played); invalid denominators are excluded. Focused tests and Biome clean.
Phase 91 — Standings loading layout stability (2026-10-15)
- Standings fallback reserves the first viewport during streaming (T-91.1). The layout-shift E2E test is in place; local browser verification is blocked until a production server can run within the host resource guard.