diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9359f3d..67e225e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,13 +4,24 @@ on: push: branches: [main] pull_request: + schedule: + # Mondays 06:00 UTC. A new Rust release lands on its own schedule, so + # without this the advisory `stable` job below only runs when someone + # happens to push, and breakage can sit unnoticed for weeks. + - cron: '0 6 * * 1' env: CARGO_TERM_COLOR: always +permissions: + contents: read + jobs: test: runs-on: ubuntu-latest + # Nothing it covers can change on a timer: the toolchain is pinned and + # the dependencies are locked. The weekly run is for `stable` only. + if: github.event_name != 'schedule' steps: - uses: actions/checkout@v4 # Pinned, and kept in step with `devVersion` in flake.nix, so CI and @@ -27,6 +38,7 @@ jobs: msrv: name: Build on the declared MSRV runs-on: ubuntu-latest + if: github.event_name != 'schedule' steps: - uses: actions/checkout@v4 # Must match `rust-version` in Cargo.toml and `msrvVersion` in @@ -38,11 +50,15 @@ jobs: stable: name: Latest stable (advisory) runs-on: ubuntu-latest - # Advisory only. The pinned `test` job is the gate; this one exists so - # that a new stable release breaking the build or firing a new clippy - # lint is visible before the pin moves, without failing a pull request - # that did not cause it. Check it when bumping `devVersion`. - continue-on-error: true + # Deliberately NOT `continue-on-error`: a failure here should render as + # a real red X, not a green check with an annotation nobody reads. + # + # This job is advisory all the same — it tracks a moving toolchain, so a + # new clippy lint can break it through no fault of the change under + # test. **Keep it out of the required status checks** in branch + # protection; that, rather than a flag in this file, is what stops it + # blocking merges. Expect it red sometimes, and fix it when bumping + # `devVersion`. steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable diff --git a/CHANGELOG.md b/CHANGELOG.md index 4597efc..980f07c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,9 +12,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - A declared minimum supported Rust version of **1.88**, verified by running the test suite against it. The floor comes from the dependency graph (`reqwest` → `url` → `idna` → `icu_*`), not from this crate's own code. - CI builds on both the MSRV and the pinned dev toolchain, plus an advisory - job on latest stable that reports breakage from a new Rust release - without gating pull requests. + CI builds on both the MSRV and the pinned dev toolchain, plus a weekly + advisory job on latest stable that reports breakage from a new Rust + release. The advisory job fails visibly rather than silently; it is kept + non-blocking through branch protection rather than `continue-on-error`. - Wrappers for every one of the API's 34 `Route::resource` groups, plus `users` — 265 methods. See `COVERAGE.md` for the per-endpoint inventory. - `COVERAGE.md`, a detailed record of what is wrapped, what is not, and why, diff --git a/CLAUDE.md b/CLAUDE.md index d20be02..c4b1b07 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -23,12 +23,22 @@ Two versions are pinned, and **three places must agree** when either moves: | Dev toolchain | 1.99.1 | `devVersion` in `flake.nix`, `test` job in `ci.yml` | | MSRV | 1.88 | `msrvVersion` in `flake.nix`, `rust-version` in `Cargo.toml`, `msrv` job in `ci.yml` | -CI has a third job, `stable`, which tracks latest stable and is marked -`continue-on-error`. It is **advisory, not a gate**: it exists so a new +CI has a third job, `stable`, which tracks latest stable and runs weekly +(Mondays, via `schedule`) as well as on push and PR. It exists so a new Rust release that breaks the build or fires a new clippy lint shows up -before the pin moves, without failing a pull request that did not cause it. -Check it when bumping `devVersion` — if it is red, the bump needs work -first. Nothing needs to stay in sync with it. +before the pin moves. Check it when bumping `devVersion` — if it is red, +the bump needs work first. Nothing needs to stay in sync with it. + +**It is advisory, but it reports red.** There is deliberately no +`continue-on-error`, because a green check with an annotation is a signal +nobody reads. That means **it must stay out of the required status checks** +in branch protection — that repo setting, not anything in `ci.yml`, is what +keeps it from blocking merges. Expect it red occasionally through no fault +of the change under test; that is the tradeoff for it being visible. + +The pinned `test` and `msrv` jobs skip scheduled runs (`if: +github.event_name != 'schedule'`), since a pinned toolchain against a +locked dependency graph cannot change on a timer. The MSRV is set by the **dependency graph**, not by this crate's code: `reqwest` pulls in `url` → `idna` → `idna_adapter` → `icu_*`, and the `icu`