• v4.8.0 4fd4d0813f

    v4.8.0 — serve last patch's artifacts instead of blanking the board
    All checks were successful
    CI / build-and-test (push) Successful in 1m36s
    Stable

    joeyr released this 2026-09-10 20:28:34 -05:00 | 8 commits to main since this release

    Fixed

    • The board no longer goes blank on patch-drop day. On 16.18 the whole
      Summoner's Rift half of the app was empty at once: no defensive-ban
      recommendations, no tier badges, no lane auto-assignment on enemy picks, and
      neither Rune nor Item Import. The cause was one rule applied in five places --
      every consumer compared the artifact's patch to the live patch with !== and
      discarded the file whole on any mismatch.

      The crawler needs a night of games on a new patch before it can publish for
      it, so patch-drop day is always off-patch. That rule was written while the
      op.gg scrapers still sat behind it, and refusing an off-patch artifact meant
      "fall through to a source that has already rolled over". The scrapers are
      gone. The fall-through now lands on nothing, so a strict reject stopped
      meaning "prefer the fresher source" and started meaning "show a blank board" --
      for as long as the crawler stayed behind, which a failed nightly window
      extends by another day.

      An artifact is now servable when it is the current patch, or the
      immediately preceding one published within seven days. Both gates matter and
      they guard different failures: the patch step bounds how far the meta can have
      moved -- champion-counters, -synergies, -benchmarks and -builds
      already pool the current patch with its predecessor when they are built, so
      serving the predecessor's file is serving data the next file would have
      included anyway -- while the age cap bounds how long a dead crawler can go
      unnoticed. Patch adjacency alone would serve 16.17 against 16.18 forever; a
      crawler that died in October would still look like a working app in January.
      Past the cap the board goes honestly empty, which is the signal that something
      upstream needs fixing.

      Standing in is never silent. The counters adapter now stamps the assembled
      ChampionStats with the artifact's patch rather than the requested one,
      which is what lets StatsProvider tell a stand-in from a current file and
      return cached-fallback (reason off-patch) instead of fresh. That maps
      onto the renderer's existing 'stale' freshness, so every affected
      recommendation carries the warning icon it already had for cached stats. The
      tier list reports 'stale' for a complete roster read out of last patch's
      file, kept distinct from 'partial' -- partial means rows are missing and the
      board will have gaps, stale means every row is there and describes last patch.

      Measured against the real 16.17 cache on a 16.18 client: counters for Evelynn
      jungle go from a permanent miss to 52 matchups, the tier list from 0 rows to
      274 across all five roles, and Rune and Item Import from nothing to 4 pages
      and 4 builds.

      Synergies were unaffected throughout -- that provider already indexed whatever
      it fetched -- which is why Pool Strength kept working while everything beside
      it was blank.

    Notes

    • The data/ artifacts this reads are published by lol-companion-data. A
      blank board past the seven-day cap means that crawler has stopped publishing,
      not that this app is broken.
    Downloads