Changelog
Unreleased
Added
- SOS rank column on
/rankingsand/team/[slug]:(2·WP2 + WP3) / 3, ranked across D1 (1 = toughest). Exposed assos_rankin/api/rankings. - Series view on
/scoreboardgroups games into multi-game series and shows leader, status, and per-game scores at a glance.
Changed
- Scenarios is forward-only. The flip-past-result toggle is gone.
- Tiered revalidation: live pages (
/,/scoreboard,/api/rankings) revalidate every 5 min;/methodologyhourly;/scenariosand/pathevery 30 min; the rest every 10 min. - Centralized site URL via
web/lib/site-config.ts.NEXT_PUBLIC_SITE_URLoverrides the default Vercel domain formetadataBase,robots.txt, andsitemap.xml.
Removed
/whatif → /scenariosredirect (route was renamed months ago).- Past-result flip mode in scenarios.
Pre-Unreleased
Changed
- Game-data source moved from Warren Nolan team-schedule pages to the NCAA contests GraphQL endpoint (
sdataprod.ncaa.com). One HTTP call per date instead of ~300 per-team page scrapes; full coverage across all 29 D1 conferences. The Edge Function is now single-shot rather than chunked. - Game identifier moved from ESPN
event_idto NCAAcontest_id. Box-score links go toncaa.com/game/<id>. Schema migration0008_games_ncaa_contest_id.sqladds the column and dropsespn_event_id. - Edge function rewritten as a single-shot pipeline. The chunked phase RPCs (
start_scrape/append_chunk/finalize_scrape) stay in migrations in case we need them again. - Python scraper: new
cbb_hub.ncaa_contestsmodule andscrape-ncaaCLI subcommand. Seeds team IDs from the existing season JSON to keep Supabase foreign keys stable.
Removed
- ESPN scoreboard ingest (
src/cbb_hub/espn.py,supabase/functions/_shared/espn.ts) and its tests.
Added
/scoreboard. Yesterday's finals, today's slate, tomorrow's matchups, with date navigation. Ranked games sort to the top./standings. Conference standings by league: conference record, overall record, canonical rank.- Year-round homepage. The hero copy and quick links shift between preseason, regular season, conference week, postseason, and offseason based on the snapshot itself. Adds a wire strip for yesterday, today, and on-deck.
lib/season-phase.ts. Derives the calendar moment from the snapshot (first/last/next game) so copy stays correct as the season rolls.- Brand: Field of 64. Wordmark, mark, type system, color tokens, OG and favicon assets as Next.js routes.
- Design system: Container, PageHeader, Card, Badge, Button, Stat, TeamCell primitives.
- Canonical rank anchored to the NCAA's published RPI. Each scrape persists
published_ranksalongside teams and games; every page orders by that rank rather than locally-computed base RPI. - Live accuracy panel on
/methodology: top-25 match count, exact-rank matches, mean and median absolute rank delta vs the published index. lib/season-state.tsis a singleReact.cache()-backed view over season JSON, RPI computation, ranks, and records.- Public JSON API returns rank source, computed rank, and a parity summary alongside the rankings.
Changed
- Methodology page replaced its static "23/25 overlap" claim with a live accuracy panel.
- Scraper signature:
scrape_seasonreturns(teams, games, published_ranks);save_seasonaccepts apublished_rankskeyword. - Pages no longer call
loadSeason/calculateRPI/rankByRPIdirectly; they consumegetSeasonState()fromlib/season-state.ts.
Removed
- Per-page boilerplate from
create-next-app.
0.1.0 (2026-05-18)
Added
- Python RPI engine with hand-verified unit tests covering venue weighting, self-exclusion in WP2, and D1-only filtering.
- TypeScript port of the engine, parity-tested against Python (1e-9 agreement across all 308 teams).
- Warren Nolan scraper with rate-limited fetcher, on-disk HTML cache, and parser tests against pinned fixtures.
- Season JSON I/O and CLI:
scrape,rank,validate. - Next.js (App Router, Turbopack) frontend: top 25, full rankings, bracket projection, what-if simulator.
- GitHub Actions workflow that scrapes every 30 minutes during the season and commits refreshed data when it changes.
- Repo hygiene: LICENSE, CONTRIBUTING, CODE_OF_CONDUCT, SECURITY, issue and PR templates, Dependabot, CodeQL.
- Sitewide metadata, sitemap, robots.txt, PWA manifest, skip link.