Skip to content

fix(ci): Rust 1.97 lints + repin orphaned action SHAs (unblocks all 11 Dependabot PRs)#707

Merged
KedoKudo merged 14 commits into
mainfrom
fix/clippy-197-and-action-pins
Jul 11, 2026
Merged

fix(ci): Rust 1.97 lints + repin orphaned action SHAs (unblocks all 11 Dependabot PRs)#707
KedoKudo merged 14 commits into
mainfrom
fix/clippy-197-and-action-pins

Conversation

@KedoKudo

@KedoKudo KedoKudo commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

Unblocks the 11 red Dependabot PRs (#677#687) and the failing Dependabot Updates job on main.

  • Fix the Rust 1.97 lints that fail cargo clippy -- -D warnings on every PR (clippy::question_mark; 37× float_literal_f32_fallback).
  • Repin two actions whose commit SHAs are unreachable from any branch and crash Dependabot's github_actions updater: taiki-e/install-action → v2.83.0, dtolnay/rust-toolchain (11 steps) → master head.
  • Pin the toolchain via rust-toolchain.toml so new stable releases no longer redden open PRs. Pinned at 1.96.1, not 1.97.0: segfault on Rust 1.97.0 rust-lang/rust#159035 (P-critical x86-64 miscompile) triggers far more commonly on 1.97.0. The wheel-policy gate now also runs on toolchain-pin changes.
  • Review-pipeline hardening in nereids-fitting: analytic Jacobian for background-only KL fits, aliased-role-index accumulation in the wrapper models, documented index invariants, FD-oracle regression tests.

Validation: clippy -D warnings clean, cargo test 1270 passed / 0 failed, pixi run test-python 212 passed — all under the pinned 1.96.1. The Dependabot-updater fix is only verifiable by the first scheduled run after merge.

🤖 Generated with Claude Code

KedoKudo and others added 11 commits July 10, 2026 15:09
… majors)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…_fallback)

Rust 1.97.0 landed on CI runners (CI floated `stable`) and its new lints
fail `cargo clippy -- -D warnings` on every PR:

- clippy::question_mark at nereids-fitting/src/poisson.rs:1457 — the
  if-let-else-return-None collapses to `inner_jac.as_ref()?` (exact
  semantics-preserving rewrite; FD fallback comment retained).
- 36x float_literal_f32_fallback (rust-lang/rust#154024) in apps/gui:
  bare float literals feeding egui `impl Into<f32>` params now need an
  explicit `_f32` suffix (machine-applied via cargo clippy --fix).
- +1 proactive suffix in the cfg(linux) block darwin clippy cannot see:
  file_dialog.rs:505 anchor offset array.

Gate evidence (rustup 1.97.0): clippy -D warnings exit 0; cargo test
workspace 1264 passed / 0 failed; pixi run test-python 212 passed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Two action pins pointed at commits on no branch, which crashes
Dependabot's github_actions update job on main (find_container_branch:
'no such commit', see failing 'Dependabot Updates' runs):

- taiki-e/install-action was pinned to the orphan per-tool tag SHA
  `cargo-llvm-cov` (ci.yml) -> repinned to release tag v2.83.0
  (c7eb1735), matching security.yml's style; security.yml aligned from
  v2.82.9 to the same.
- dtolnay/rust-toolchain was pinned to a force-pushed-away `stable`
  branch head (29eef336, unreachable from every current ref) -> all 11
  steps repinned to the permanent master branch head (fa04a145), the
  README-sanctioned shape when passing an explicit `toolchain:` input.

Also pin the Rust toolchain (rust-toolchain.toml, channel 1.97.0) so a
new stable release can no longer redden all open PRs at once; workflow
`toolchain:` inputs aligned from `stable` to `1.97.0` (pre-install
optimization — rustup proxies enforce the file regardless).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…er checkpoint

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ile in 1.97.0

Review round 1 (cross-family, Codex-found + Claude-verified against primary
sources): rust-lang/rust#159035 is an OPEN P-critical / I-miscompile /
O-x86_64 LLVM regression in 1.97.0 — optimized safe code segfaults; 1.96.1
is unaffected; the upstream revert (rust-lang/rust#159047, reverting
#155850) merged 2026-07-10 and is in no stable release. Release wheels for
the ORNL x86-64 RHEL fleet build under this pin, so 1.97.0 is unacceptable
until a fixed stable ships.

- rust-toolchain.toml: channel 1.96.1 + rationale; precedence comment
  narrowed per rustup override docs (cargo +toolchain / RUSTUP_TOOLCHAIN /
  nearer overrides win over the file).
- workflows: all 11 'toolchain:' inputs 1.97.0 -> 1.96.1.
- CONTRIBUTING.md: '(stable toolchain)' -> pinned-by-rust-toolchain.toml.

The 37 Rust-1.97 lint fixes in the previous commit are kept: they are
valid 1.96 code and future-proof the bump to the first fixed stable.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…back tests

Review round 1 P2s:

- TransmissionKLBackgroundModel::analytical_jacobian returned None (whole-
  model FD fallback) whenever the inner Jacobian was absent — including the
  background-only case (inner params fixed, just b0/b1 free) whose columns
  are trivially analytic (dT/db0 = 1, dT/db1 = 1/sqrt(E)). Mirror the
  sibling CountsBackgroundScaleModel guard: fall back to FD only when inner
  params are actually free without an analytical inner Jacobian.
- Add the two missing coverage points: FD fallback when the inner model
  lacks analytical_jacobian (wrapper returns None, fit converges via FD)
  and the background-only analytic path (exact column values + fit
  convergence).
- .harness/TASK.md: correct R1's recorded evidence command to the loop
  actually run; add R21-R25 requirement lines omitted from plan coverage.

Gates (rustup 1.96.1): clippy -D warnings exit 0; cargo test 1266 passed
0 failed (+2 new); pixi run test-python 212 passed 1 skipped.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…t =)

Review round 2 (Codex-found, Claude-verified with an independent runtime
FD reproduction): neither TransmissionKLBackgroundModel nor its sibling
CountsBackgroundScaleModel forbids the two background/scale indices from
aliasing (pub fields, no constructor). evaluate() reads the aliased
parameter for both roles, so its true derivative is the SUM of the two
column contributions (1 + 1/sqrt(E), resp. f*T + B) — but both column
fills ASSIGNED, so the second overwrote the first (e.g. 0.5 vs correct
1.5 at E=4). Pre-existing defect; the round-1 background-only analytic
path extended its exposure. Accumulate with += instead: identical for
distinct indices (each column touched once on a zeroed matrix), correct
for aliased ones.

Adds one aliased-index regression test per model, checked against an
in-test central finite-difference oracle computed directly from
evaluate() — independent of the analytic path under test.

Gates (1.96.1): clippy -D warnings exit 0; cargo test 1268 passed
0 failed (+2); pixi run test-python 212 passed 1 skipped.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…sh contract evidence

Review round 2 VERIFIED P1: maturin-action resolves the in-container
manylinux compiler from the repo-root rust-toolchain.toml (verified in
the pinned action source, getRustToolchain -> rustup override), so a
pin-only bump PR would change the release-wheel compiler WITHOUT
scheduling the manylinux_2_28 gate — exactly the tag-time breakage class
(0.2.0 yank) the gate exists to catch at PR time. Add the file to the
wheel-policy paths filter.

Also refresh .harness/TASK.md evidence that went stale after the
1.97.0 -> 1.96.1 repin (R5 records the deviation + its P1 rationale;
R6 re-evidenced with the final-tree gate run; R23 made count-free).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Review round 3 (cross-confirmed by both LLM families at find time): the
background-only analytic path returns Some for free sets of b0/b1 only —
if such an index ALSO designates a parameter the inner dyn FitModel
reads, the analytic column carries only the background contribution and
silently omits dT_inner/dp (undetectable through dyn FitModel; the
background indices are excluded from the inner free set by
construction). On main the same misuse fell back to FD and was correct.
No shipped configuration collides (pipeline appends kl_b0/kl_b1 as
fresh indices), so per both reviewers the fix is the API contract:
document the disjointness invariant on the pub index fields of BOTH
wrappers; the supported b0==b1 aliasing (accumulating columns) is called
out explicitly.

Also: .harness/TASK.md now follows its own supersession protocol for the
1.97.0->1.96.1 repin — R5/R6 flipped to [?] pending explicit user
approval, new R26 records the superseding 1.96.1 requirement + evidence.

Gates (1.96.1): fmt OK; clippy -D warnings exit 0; nereids-fitting lib
tests 193/0; cargo doc -D warnings exit 0 (doc-comment-only code diff —
full workspace suite unchanged from previous run at 1268/0).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… indices

Review round 4 P2 (parallel-path audit of the aliased-index class fixed
in poisson.rs): NormalizedTransmissionModel and MultiplicativeBaselineModel
filled their role columns via first-match if/else-if chains, so two role
indices sharing one parameter (accepted by the pub constructors without
validation) silently kept only the first role's derivative. Convert both
chains to independent role checks that ACCUMULATE (+=) into the zeroed
matrix — identical for distinct indices, correct for aliased ones — and
document the index invariant on both structs (role-inner collisions stay
undetectable through the filtered inner free set, same as the poisson
wrappers).

The two resolution-coupled fill sites (TransmissionModelMulti density/
temperature; EnergyScale t0/L_scale FD arms) keep their first-match
layout — restructuring them for a degenerate case the pipeline cannot
construct is not worth the risk — and now carry explicit
distinct-indices-assumed comments pointing at the hardened pattern.

Adds one aliased-index FD-oracle regression test per hardened wrapper
(BackA==BackB pinned to exactly 1 + 1/sqrt(E); b0==b1 vs central FD).

Gates (1.96.1): clippy -D warnings exit 0; cargo test 1270 passed
0 failed (+2); pixi run test-python 212 passed 1 skipped.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@riking

riking commented Jul 11, 2026

Copy link
Copy Markdown

The pin is 1.96.1: the review pipeline (Codex-found, cross-family verified against primary sources) established that 1.97.0 ships an OPEN P-critical x86-64 miscompile (rust-lang/rust#159035); optimized safe code segfaults; 1.96.1 unaffected; fix in no stable release)

Note: Affected versions are actually Rust 1.87.0 through Rust 1.97.0 .

Rust 1.97.0 makes the trigger condition more common.

KedoKudo and others added 3 commits July 11, 2026 07:00
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
rust-lang/rust#159035's underlying LLVM codegen issue predates 1.97
(LLVM 20 era); 1.97.0's enum-tag change (rust-lang/rust#155850) makes
the trigger condition far more common, and the issue's reproducer
passes on 1.96.1. The previous comment overclaimed '1.96.1 is not
affected'. Pin choice unchanged: 1.96.1 matches what main already
shipped with and avoids the widened 1.97 trigger.

Correction prompted by external review on the PR (thanks @riking).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Root-cause fix for essay-style PR bodies: no description-style rule
existed, and the docs-hygiene section directed audit/investigation
memos INTO the PR body. New Commit Style rule: short what/why +
validation + risk; no per-edit inventories (the diff shows those), no
review-round narratives. Long-form memos move to PR comments or commit
messages; docs-hygiene pointers updated accordingly.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@KedoKudo

Copy link
Copy Markdown
Contributor Author

The pin is 1.96.1: the review pipeline (Codex-found, cross-family verified against primary sources) established that 1.97.0 ships an OPEN P-critical x86-64 miscompile (rust-lang/rust#159035); optimized safe code segfaults; 1.96.1 unaffected; fix in no stable release)

Note: Affected versions are actually Rust 1.87.0 through Rust 1.97.0 .

Rust 1.97.0 makes the trigger condition more common.

Thanks 😄

The underlying LLVM issue predates 1.97 (the issue's reproducer passes on 1.96.1) and 1.97.0's #155850 tag change widens the trigger. Keeping the 1.96.1 pin since it matches what CI already built with; we'll bump when a stable ships with the revert.

@KedoKudo
KedoKudo merged commit e1f7837 into main Jul 11, 2026
13 checks passed
@KedoKudo
KedoKudo deleted the fix/clippy-197-and-action-pins branch July 11, 2026 21:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants