• v0.9.0 835bb28a20

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

    joeyr released this 2026-07-31 07:07:46 -05:00 | 239 commits to main since this release

    Changed

    • The op.gg and Riot halves now run concurrently, so pacing op.gg no longer
      costs the Riot crawl its window.
      They are unrelated hosts with unrelated
      limits and separate rate limiters — serialising them only ever meant one sat
      idle while the other waited out its own pacing. That was affordable when the
      op.gg half finished in ~14 minutes. At 12.5 s a page it takes ~2.5 hours,
      which would have left the Riot crawl ~30 minutes of a three-hour window, and
      champion-damage and champion-benchmarks are both built from those rows.

      Run together, each half gets the entire window instead of a slice. The crawl
      window no longer needs widening
      — the recommendation in 0.8.0's notes is
      withdrawn.

      Promise.allSettled, not Promise.all: a rejection in one half must not
      cancel the other, which is the same isolation the per-artifact try/catch gives
      inside each.

      The two op.gg passes (ranked, then classic) stay sequential with respect to
      each other. They are the SAME host, and running them together would double the
      request rate op.gg sees and undo the pacing.

    Fixed

    • Concurrent halves could have raced on the Forgejo branch ref. Both publish
      to the same branch, and the contents API's concurrency guard is the per-file
      blob sha — it stops two writers clobbering one file and says nothing about two
      commits racing to move the ref, which is what two different artifacts
      publishing at the same instant would do.

      Commits now go through a one-at-a-time queue (publish-queue.ts). Publishing
      is seconds against crawls measured in hours, so serialising it costs nothing
      measurable. A failed publish does not wedge the queue: later artifacts still
      commit, and the caller still sees its own rejection. Validation happens
      before queueing, so a schema failure surfaces as that artifact's error
      rather than waiting behind another half's commit.

    Downloads