• v0.10.0 2f4f066920

    v0.10.0
    All checks were successful
    CI / gate (push) Successful in 35s
    CI / image (push) Successful in 21s
    Stable

    joeyr released this 2026-07-31 08:54:18 -05:00 | 238 commits to main since this release

    Fixed

    • Classic counters were about to publish in the wrong id namespace, and it
      would have failed silently.
      crawlCounters is shared by both passes, and it
      keyed entries by whatever id the tier list gave it. op.gg indexes classic
      pages by BASE champion id — its classic tier list returns champion_id: 24
      for Jax and the page lives at /champions/jax, while jade_jax 307s — so the
      file would have been written with base ids while champ select and the live
      client both report 60xxx.

      That is the failure mode this repo spends most of its comments avoiding: the
      artifact validates, reads correctly, and diffs sensibly night to night, and
      not one lookup ever matches. The runes pass already shifted its keys; counters
      never got the same treatment because nothing exercised it.

      Three maps needed it, not one:

      • the entry keys (counters['60266']),
      • the opponent ids inside every matchup — op.gg names classic opponents by
        their base display name ("Jax"), so the directory resolves them to base ids
        while the consumer's board holds 60xxx, and
      • the tier list, which is a second consumer-facing id-keyed map.

      toQueueChampionId (new src/classic-ids.ts) is idempotent, so applying it
      at more than one point in the assembly path cannot double-shift an id into a
      range that exists for nobody. Six tests cover it, all four of which fail
      against the previous code; the ranked namespace is asserted alongside each,
      since the shift must happen for exactly one queue.

      No published file is affected — the classic pass is opt-in and has never run.

    • Classic counters recorded the rank band the crawl asked for, not the one
      op.gg served.
      Same false-provenance problem the classic runes schema already
      fixed: op.gg accepts tier on a classic page and discards it, so the data is
      all ranks whatever was requested. CLASSIC_TIER moved to common.schema.ts,
      where both classic artifacts can reach it, and the counters artifact now
      records all for that queue.

    Changed

    • The classic universe is 90 (champion, role) pairs, measured. A full sweep
      on 16.15 replaced the 81 an earlier estimate assumed — TOP 23, MIDDLE 22,
      JUNGLE 21, UTILITY 15, BOTTOM 9. The nightly op.gg budget is therefore ~732
      requests rather than 714, which at 12.5 s is ~2.54 h and still inside the
      three-hour window. The pacing is unchanged; the arithmetic behind it now
      matches reality.

    • The 0.9 coverage floors are kept for Classic Rift, on evidence rather than
      by default.
      The concern was that a proportional floor is harsher on a
      smaller universe. The same sweep returned 87/90 counters pages (96.7%) and
      90/90 runes pages (100%), so both clear it with real headroom. The three
      counters misses are stable rather than random — Fiddlesticks, Nunu and Gragas,
      all jungle, all serving a page with no data array — which is why the margin
      can be trusted. Split the floors only if a later measurement says so.

    • Dropped the dead runesArtifact: null branch from OpggPass and the comment
      claiming Classic Rift has no rune extractor. It has had one since 0.9.0.

    Downloads