• v0.15.0 0c5263afbd

    v0.15.0 — tell an empty op.gg items page from a broken one
    All checks were successful
    CI / gate (push) Successful in 38s
    CI / image (push) Successful in 26s
    Stable

    joeyr released this 2026-08-04 09:43:06 -05:00 | 204 commits to main since this release

    Separates "op.gg has no build for this pair" from "the parser is broken".
    They arrived at the crawl as the same event, and only one of them is a problem.

    Why

    The first production run of the classic items crawl covered 88 of 90 pairs. The
    two it missed — Nunu support and Kog'Maw mid — render on op.gg with no core
    build at all
    , and the crawl counted them as parse failures. They spent the 90%
    coverage floor, and championRoles: 88 against a 90-pair universe was
    indistinguishable from two pages having broken.

    Harmless at 2 of 90 and wrong later. This mode only thins out, and the first
    night it crossed the floor the crawl would have aborted on a run that was
    entirely correct — reporting a healthy crawl as a parser bug.

    How

    One page cannot fully separate the two: "op.gg has no build" and "op.gg renamed
    metaBuildItems" are both zero core builds. What a page can prove is that
    op.gg served the items route, because Next.js ships only the active route's i18n
    namespace. So the page answers what it can and the run settles the rest:

    • anchor present, no core buildempty; the pair still counts as
      answered toward coverage, because op.gg replied and the crawl read it;
    • anchor absent → thrown, counted as a failure exactly as before. A
      challenge page or a redirect is not evidence about any champion;
    • nearly every answered pair empty → abort, naming the section keys. That is
      a shape change, not a thin mode, and the coverage floor is blind to it: every
      page answers, so it reads a clean 100% and would publish an empty artifact.

    The new ceiling is ITEMS_CLASSIC_MAX_EMPTY (default 0.5). Last measured, 2 of
    90 answered pairs were empty; the failure it guards against sits near 100%.

    Added

    • generatedFrom.emptyPages on champion-items-classic.json — how many
      pairs op.gg rendered but published nothing for, so championRoles short of the
      universe is readable rather than ambiguous. Optional: absent means unknown, not
      zero, for artifacts written before the distinction existed.

    Verified against the real captured HTML for both empty pairs and a populated one,
    plus a truncated response to confirm it still throws. Gate green: typecheck,
    lint, 338 unit, 30 integration, build.

    Downloads