• v3.17.0 031d0ba8e7

    v3.17.0 — Classic Rift tier badges
    All checks were successful
    CI / build-and-test (push) Successful in 1m51s
    Stable

    joeyr released this 2026-08-07 23:38:30 -05:00 | 10 commits to main since this release

    Fixed

    • Classic Rift shows tier badges, and guesses enemy lanes again. Both
      symptoms read the same per-role tier snapshot, and that snapshot was built
      from champion-counters.json unconditionally — a file keyed by live champion
      ids. Every 60xxx lookup missed, so classic cells rendered no badge and every
      locked enemy fell into the board's "Unassigned" group until the user picked a
      lane by hand.

      champion-counters-classic.json has carried a complete tierList since data
      v0.11.0 and the app has been downloading it since 3.14.0 for counters. It is
      now read for tiers too: 90 champion-roles across all five lanes, keyed by the
      same 60xxx ids champ select already hands us.

    Changed

    • One tier snapshot holds both rosters, and the board needs no mode signal.
      Riot allocated the Classic Rift roster at 60000 + base id, so a classic id
      can never equal a live one and a single map can carry both without a
      collision. Every renderer consumer of that map does an exact-id lookup — the
      badge reads its own cell's championId, the lane inference reads each
      enemy's — so a classic cell finds classic rows and a live cell finds live ones
      out of the same map, with no map-id plumbing reaching the renderer at all.

      The provider still keeps the two apart internally. getAll() answers for the
      live roster only, because its consumer — the Suggested Picks candidate pool —
      walks a role's entire list and offers everything inside the user's meta
      filter, where a merged map would suggest Jade Annie in a ranked game.

    • The classic counters fetch is awaited before the tier snapshot is built.
      It was fire-and-forget, which lost the race it needed to win: the tier refresh
      reads the artifact synchronously and has nothing to fall back on when it is
      missing. The file may still legitimately 404 — the producer's classic pass is
      opt-in and the mode is limited-time — so a rejection is caught rather than
      allowed to skip the publish, and there is deliberately no scrape behind it.
      buildOpggTierListUrl takes no queue parameter, and ranked rows served as
      classic would be the confident wrong answer rather than a missing one.

    Downloads