• v0.5.0 ee5b20e8b2

    0.5.0 — escalate a chronically stale artifact
    All checks were successful
    CI / gate (push) Successful in 34s
    CI / image (push) Successful in 14s
    Stable

    joeyr released this 2026-07-30 09:07:11 -05:00 | 243 commits to main since this release

    Declining to publish is correct — the coverage floors exist so a thin crawl cannot replace a good file — and it is also completely silent. The night a failure becomes chronic logs exactly what the first night logged, and the window still reports success on the strength of the artifacts that did publish.

    Patch 16.15 is the worked example: counters aborted at 55% coverage two nights running while champion-counters.json kept serving 16.14 data, and the only trace was one WARN among 122 others.

    Added

    Each of the four artifacts now carries a miss streak in a new publish_state table.

    outcome level
    missed, streak < STALE_AFTER_NIGHTS (3) WARN
    missed, streak >= STALE_AFTER_NIGHTS ERROR, naming the streak and daysSinceSuccess
    missed because something threw ERROR on the first night
    published after a streak INFO, naming the missed nights
    published normally nothing — the commit line already said so
    • It counts nights, not runs. The counter advances at most once per local calendar date. RUN_ON_START and a redeploy both re-enter the window, so without that guard, deploying a fix would trip the alarm it was fixing.
    • Faults skip the streak. A coverage abort is an expected non-result; a schema regression or a 403 from Forgejo is wrong immediately, and giving it three nights would bury the one signal worth acting on.
    • The state is in Postgres, not beside the heartbeat, which lives in an ephemeral /tmp — a redeploy would reset every alarm, and a redeploy is what happens right after shipping a fix for the thing being tracked.
    • Nothing is recorded when PUBLISH_ENABLED=false. A smoke run has no publish outcome, and letting it write would leave the production streaks reading stale.

    Fixed

    • A damage publish failure no longer costs the benchmarks artifact. The two come from one crawl and were documented as publishing independently, but shared a single try/catch — so a schema regression in the first skipped the second, built from rows already paid for.
    • The heartbeat is no longer touched after a Riot half that published nothing. runRiotWindow returned void and the caller marked the window successful unconditionally, so a night that dedup'd to zero new rows still reported health to the container healthcheck.

    Upgrading

    No schema change to any published artifact; consumers need no update. The migration is additive and idempotent. One new optional env var, STALE_AFTER_NIGHTS (default 3).

    Downloads