Two targeted fixes for inflated country scores (ES 83, SE 77): 1. pseo_country_overview: replace AVG() with population-weighted averages for avg_opportunity_score and avg_market_score. Madrid/Barcelona now dominate Spain's average instead of hundreds of 30K-town white-space towns. Expected ES drop from ~83 to ~55-65. 2. location_profiles: replace dead sports culture component (10 pts, tennis data all zeros) with market validation signal. Split scored CTE into: market_scored → country_market → scored. country_market aggregates AVG(market_score) per country from cities with padel courts (market_score > 0), so zero-court locations don't dilute the signal. ES (~60/100) → ~6 pts. SE (~35/100) → ~3.5 pts. NULL → 0.5 neutral → 5 pts (untested market, not penalised). Score budget unchanged: 25+20+30+15+10 = 100 pts. No new models, no new data sources, no cycles. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
serving
Analytics-ready views consumed by the web app and programmatic SEO.
Query these from analytics.py via DuckDB read-only connection.
Naming convention: serving.<purpose> (e.g. serving.location_profiles)