Skip to content

ci: CI-style clippy already fails on clippy 1.96 — Linting goes red repo-wide when the runner's stable updates #513

Description

@aacruzgon

Summary

cargo clippy --all-targets --all-features -- -D warnings — the CI-style gate — already fails on
a clean checkout
with clippy 1.96. CI does not see it yet because dtolnay/rust-toolchain@stable
is still on an older stable. The moment the GitHub runner's stable reaches 1.96, the Linting job
goes red on every branch and every open PR simultaneously.

Reproduced on main-derived branches at clippy 1.96 (ac68faa20c, 2026-05-25):

error: could not compile `helios-auth` (lib) due to 2 previous errors
error: could not compile `helios-auth` (lib test) due to 2 previous errors
error: could not compile `helios-fhir-gen` (build script) due to 3 previous errors
error: could not compile `helios-fhir` (build script) due to 3 previous errors
error: could not compile `helios-hfs` (build script) due to 2 previous errors
error: could not compile `helios-serde-support` (lib) due to 2 previous errors

The 12 lints

Two rules, five files, none of them recently touched:

File Lines Rule
crates/auth/src/jwks/fetcher.rs 90, 165 collapsible_if
crates/fhir-gen/build.rs 29, 30, 31 collapsible_if
crates/fhir/build.rs 31, 32, 33 collapsible_if
crates/hfs/build.rs 34, 35 collapsible_if
crates/serde-support/src/lib.rs 161, 162 doc list item without indentation

Clippy 1.96 extended collapsible_if to if let chains, which earlier versions did not flag. The
suggested rewrite is the let-chain form this codebase already uses elsewhere, e.g.:

// crates/auth/src/jwks/fetcher.rs:165
if let Some(val) = directive.strip_prefix("max-age=")
    && let Ok(secs) = val.trim().parse::<u64>()
{
    return Some(Duration::from_secs(secs));
}

That form requires edition 2024 / Rust 1.88+, and the workspace MSRV is already 1.90, so no MSRV
change is needed.

Why this is worth doing before the runner updates

  • All 12 are mechanical, and the fix is confined to five files that no open PR modifies — so it can
    land as one small PR with near-zero conflict surface. Waiting means fixing it while every branch
    is red.
  • Until then, the CI-style gate cannot pass locally, so a red clippy result is not evidence that
    a given change is at fault. That is a real drag on local pre-flight checks: contributors have to
    hand-verify their own crate with cargo clippy -p <crate> --all-targets --all-features and grep
    the log for the files they touched.

Suggested fix

  1. Apply the 12 mechanical rewrites.
  2. Consider pinning the toolchain so local and CI agree, rather than tracking stable on both sides
    and drifting again. A rust-toolchain.toml at the workspace root would do it; there is none
    today, and the workflows use dtolnay/rust-toolchain@stable.

Where it came from

Hit while running the required pre-merge checks for #503 (PR #512), whose own files are clean under
--all-features.

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions