• v0.21.0 04d317bd67

    v0.21.0
    All checks were successful
    CI / gate (push) Successful in 45s
    CI / image (push) Successful in 16s
    Stable

    joeyr released this 2026-08-04 21:41:12 -05:00 | 150 commits to main since this release

    Added

    order.late in champion-builds.json — the completed items bought after the core, per item, with their own record. This is what lets a consumer render a six-item build without any set of six ever having been a published key.

    The gap it fills: core stops at three items and owned.items counts everything a champion finished with, unable to tell an opener from a last pick. On the first published file, approximating "what comes after the core" from owned led Caitlyn bottom's list with Hexoptics C44 — her most common first item.

    Per item, not per set

    "Items 4-6 as a set" would split {Void}, {Void, Zhonya} and {Void, Zhonya, Banshee} into three keys, because players finish at different item counts — the unbounded-key problem this file already rejects for full builds, merely moved later in the build. One row per item has none of that.

    A third denominator, and the shape says so

    late nests inside order because its population is a subset of order's: only sampled games that reached a fourth completed item count toward late.games. A reader dividing a late row by order.games would understate every share, so the number it should be divided by sits beside it — the same device that keeps owned and order apart.

    Capped at nine

    The one capped list in this artifact. Six is the obvious number and is wrong: core and late are measured independently, so an item can honestly appear in both — bought third in one game and fifth in another — and a consumer skipping duplicates while rendering six alongside a three-item core needs three spares. Nine can never come up short.

    Order is dropped within late where core keeps it. By the fourth item a build is reacting to the game rather than following a plan, and "Void Staff then Zhonya's" versus the reverse reflects who the enemy fed.


    Additive: every existing field keeps its meaning, and lol-companion reads the file unchanged until it opts in.

    Gate green: typecheck, lint, 534 tests across 29 files, build.

    Downloads