You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The version directives on this release's new public symbols name 4.0.0, and
the pinned install commands in README.md, docs/installation.rst and docs/usage.rst point at v4.0.0. Both are pre-release corrections rather
than changes: six directives said 3.1.0, written before the breaking change
below settled the number, and 3.0.0 shipped with its pins still on v2.2.0.
A coach question is refused, naming the real cause, instead of falling
through to the agent. No table here holds a coach, so the agent queried
tables with no such column and was then free to fill the silence from its own
weights - the failure check_coverage exists to stop. The refusal says what
is actually wrong rather than blaming the source, because "ESPN does not
publish coaches" was probed and is false: it serves two coach collections and
neither is usable (the season-by-season one ignores the season it is asked
for and returns today's staff, the per-team one covers 12 of 30 teams in
1996, never shows a mid-season change, and names the wrong coach for some
franchises outright). route() assigns the intent from the question's own
words, so ROUTER_PROMPT and ROUTER_SCHEMA are untouched - both hashes
unchanged - and no other question's routing can have moved.
A player ESPN lists twice in one team's box score, under two athlete_ids, is now merged into one row. Measured against the
2026-09-17 warehouse: 8 players, 69 team-games, none before 2003. A new player_box_stats_deduped table (association.fetch.repairs.duplicate_athletes)
picks the id with more career games carrying real minutes and keeps the
real row over a fabricated all-zero blank; a pair is merged only where
every shared game is safe (one side has no minutes, or both sides agree
exactly), so a future pair that genuinely disagrees is left unmerged rather
than guessed at. player_game_log now reads the merged table, so a
per-game lookup for one of these 8 players (single-game highs, streaks) no
longer sees a fractured career under two identities. Team-level sums and player_advanced_stats still read the raw table and are unaffected - see ISSUES.md.
A team-level question about Vancouver's 1995-96 season is no longer
answered from NULLs it did not have to be. ESPN serves an all-NULL team_box_stats row for every 1995-96 Grizzlies game - and, unrecorded
until now, for 25 more teams' games against them that season, plus one 2000
game - while its player_box_stats rows for the same games are real, with
real minutes. team_box_repair now rebuilds field goals, three-pointers,
free throws (with their shooting percentages), assists, steals, blocks,
fouls, individual turnovers and the offensive/defensive rebound split from
those player rows on any team row this shape touches - measured exact on
all 2,387 surviving 1996 regular-season team rows and all 2,472 surviving
2000 ones. totalRebounds and the columns the player box has no sibling
for (team turnovers, technicals, flagrant fouls, points in the paint, a
largest lead) still have nothing to rebuild from and stay NULL.
A team's rebounds are now comparable across the 2021/2022 season
boundary. ESPN's team box totalRebounds stopped counting rebounds it
credits to no player from 2022 on, so a split spanning the change (or any
comparison of an old season with a recent one) showed a team's rebounding
falling off a cliff for no basketball reason - measured at ~52 a game in
2019-2020, ~48 in 2021, 44.45 from 2022 on. player_splits and streak's
team-rebounds reads (query/conditions.py's _team_games and _TEAM_LINE)
now use offensiveRebounds + defensiveRebounds, which already equals ESPN's
own totalRebounds in every season from 2022 on and is populated everywhere totalRebounds is. team_metrics.py's avgRebounds (used by team_stat
and team_leaderboard) was checked and needs no change: unlike the
game-level column, ESPN's season aggregate already equals avgOffensiveRebounds + avgDefensiveRebounds in every season since 1994.
A playoff answer from 1995-1998 now says which games have no box score.
ESPN lists eight of those postseason games and serves each one a box score
with no player lines in it - probed live, all eight return a boxscore
carrying zero athlete lines where control games in the same seasons return
24, the athlete gamelog omits them, and plays starts too late to rebuild
them. 1997 is the one that costs an answer: the whole Chicago-Miami
conference final, so Michael Jordan's postseason read 14 games and 439 points
against ESPN's own 19 and 590, with nothing said. The game LIST is
deliberately not caveated - those games are in it, with scores and a winner,
so a playoff game count or head-to-head record over them is right.
Breaking: Coverage.partial and postseason_partial now map each season
to its own sentence, replacing a tuple of seasons plus one shared note; partial_note and postseason_partial_note are gone. team_box_stats is
short five games of the 1997 playoffs and ten of 2001's for unrelated
reasons, and one shared note named both in an answer about either - the
wrong-cause noise that module exists to stop. Nothing outside association.nba.coverage read the two removed fields, and season in coverage.partial still works, so the change is breaking only for a caller
that read a note off a Coverage directly. The next release is therefore
4.0.0, which is what the version directives here name.
A 2013-2018 shooting leaderboard now says who is missing from it. Those
rates are summed from the box scores ESPN serves zeroed for every Chicago and
New Orleans game, so 21 to 33 players a season clear the qualifying floor by
ESPN's own season totals and fall under it in the advanced table - 153
player-seasons, of which 83 are on the other 28 teams, short only the games
they played against those two. The 2015 true-shooting board omits Tyson
Chandler, its runner-up. The seasons are declared partial rather than filled
from the rebuilt box: a rebuilt season total is exact about half the time and
biased low, and no attempt column was ever measured.
A 2001 playoff question answered from the player tables now says what is
missing. Ten games of that postseason are not in ESPN's archive anywhere,
and the caveat saying so was declared only on games and team_box_stats -
which single_game_high and threshold_count never read, so "Shaquille
O'Neal had 4 games with 30+ points" was stated as fact over 11 of the 16
playoff games he played. player_box_stats, player_game_log and player_season_advanced_stats now declare it too, in the player's own words:
40 of the 190 players with a 2001 postseason line are short in the box
scores, 152 games in all. ESPN's per-player season line is complete and is
deliberately left uncaveated, since it is what proves the box scores short.