Skip to content

association 4.0.0

Choose a tag to compare

@jeffknupp jeffknupp released this 18 Sep 03:37
· 760 commits to master since this release
  • 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.