Skip to content

Commit 2f9e0a8

Browse files
committed
build(msrv)!: require Rust 1.98.0
- align the MSRV, contributor toolchain, dependency locks, and documented maintenance baseline - forbid algebraic float operations in numerical kernels to preserve IEEE-754 error and reproducibility contracts - add a scoped just update workflow with atomic Cargo tool-pin reconciliation - clean failed changelog and performance staging files without disturbing published artifacts BREAKING CHANGE: la-stack now requires Rust 1.98.0. Closes #208
1 parent 58cccfc commit 2f9e0a8

26 files changed

Lines changed: 849 additions & 191 deletions

AGENTS.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ When user requests commit message generation:
207207

208208
### Rust
209209

210-
- The current MSRV and pinned contributor/CI toolchain are Rust 1.97.1. Keep
210+
- The current MSRV and pinned contributor/CI toolchain are Rust 1.98.0. Keep
211211
`Cargo.toml`, `rust-toolchain.toml`, and `clippy.toml` aligned when that
212212
baseline changes deliberately.
213213
- Prefer borrowed APIs by default:
@@ -292,6 +292,7 @@ just ci # Full CI simulation (checks + tests + examples + bench co
292292
just test # Lib + doc tests (fast)
293293
just test-all # All tests (Rust, benchmark inputs, and Python)
294294
just examples # Run all examples
295+
just update # Update dependency locks and repository-owned Cargo tools
295296
```
296297

297298
### Detailed Command Reference

CONTRIBUTING.md

Lines changed: 36 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ clarity, and the fixed-dimension stack-allocation model.
66

77
## Getting Started
88

9-
Install Rust 1.97.1 through [rustup](https://rustup.rs/), Git, Python 3.14,
10-
[`uv` 0.12.3](https://docs.astral.sh/uv/), and `jq`. Install the repository's
9+
Install Rust 1.98.0 through [rustup](https://rustup.rs/), Git, Python 3.14,
10+
[`uv` 0.12.5](https://docs.astral.sh/uv/), and `jq`. Install the repository's
1111
pinned `just` version from its locked dependency graph:
1212

1313
```bash
@@ -25,6 +25,14 @@ just ci # run the comprehensive local CI path
2525
Use `just fix` when you intentionally want formatters and automatic fixes to
2626
change files. Run `just --list` for the full command surface.
2727

28+
Use `just update` for deliberate dependency and tool maintenance. It composes
29+
`just update-dependencies`, which advances Cargo dependency requirements and
30+
the Cargo/uv locks, with `just update-cargo-tools`, which upgrades only the
31+
Cargo CLI packages owned by `setup-tools` and atomically reconciles their root
32+
`justfile` pins. The tool updater requires `cargo-install-update` from the
33+
`cargo-update` package and does not touch unrelated Cargo executables or uv's
34+
user-global tool environments.
35+
2836
The repository uses `cargo-nextest` for runnable Rust tests, `cargo-machete`
2937
for unused-dependency checks, and `just cargo-lock-check` to verify that the
3038
committed Cargo lockfile matches the manifest. `rumdl` checks Markdown,
@@ -44,25 +52,34 @@ global `RUSTFLAGS='-D warnings'`, this denies lint warnings only for local
4452
packages without changing rustc arguments and creating separate cache
4553
artifacts. Rustdoc has a separate warning contract, so `doc-check` continues to
4654
set `RUSTDOCFLAGS='-D warnings'` for the default and `exact` documentation
47-
surfaces. See the [Rust 1.97 release notes](https://doc.rust-lang.org/stable/releases.html#version-1970-2026-07-09)
55+
surfaces. See the [Rust 1.98 release notes](https://doc.rust-lang.org/stable/releases.html#version-1980-2026-08-20)
4856
and [Cargo configuration reference](https://doc.rust-lang.org/cargo/reference/config.html#buildwarnings).
4957

50-
The remaining Rust 1.97 tooling changes require no repository configuration:
51-
52-
- Rust's default v0 symbol mangling is accepted. Repository code, benchmark
53-
reporting, and support scripts do not parse raw Rust symbols or require the
54-
legacy format. Any future symbol-processing tool must support v0 rather than
55-
forcing the nightly-only legacy override.
56-
- The warn-by-default `linker_messages` lint is covered by the manifest's
57-
warnings-deny policy. The Rust 1.97.1 upgrade completed `just ci` on Linux,
58-
macOS, and Windows without linker diagnostics, so no platform suppression is
59-
justified.
60-
- `resolver.lockfile-path` is not configured. Local, CI, release-benchmark, and
61-
historical-comparison worktrees are writable and use the committed root
62-
`Cargo.lock`; an alternate path would split the lockfile and provenance source
63-
without helping a read-only-source workflow.
64-
- The updated must-use behavior for `Result<_, Infallible>` and
65-
`RepeatN::default` do not intersect production code in this repository.
58+
Rust 1.98's `f32`/`f64::algebraic_{add,sub,mul,div,rem}` operations are
59+
forbidden in `src/`, examples, and benchmark implementations. They permit
60+
real-number transformations such as reassociation with unspecified precision,
61+
which can invalidate the crate's documented error bounds and deterministic
62+
operation order. Their relaxed treatment of non-finite values and signed zero
63+
also conflicts with typed non-finite classification, while varying results
64+
would weaken reproducibility and benchmark comparability. Repository Semgrep
65+
rules enforce this policy; retain ordinary IEEE-754 operations and `mul_add` in
66+
the existing numerical paths.
67+
68+
Any future approximate or fast-math API requires a separate design issue, an
69+
explicit public contract, independent correctness analysis, and representative
70+
benchmarks. It must remain opt-in and must not change existing APIs.
71+
72+
The remaining Rust 1.98 changes require no repository configuration:
73+
74+
- `core::fmt::NumBuffer`, integer `format_into`, `NonZero::from_str_radix`,
75+
circumfix stripping, UTF-16 decoding, and mutable atomic-slice APIs do not
76+
simplify an existing path or address a demonstrated bottleneck.
77+
- The compatibility changes for runtime symbols, trait-object lifetimes,
78+
ambiguous imports, attributes, structural equality, `assert_eq!` temporaries,
79+
and derived ordering require no source change after comprehensive validation.
80+
- New or promoted targets do not alter the Linux, macOS, and Windows MSVC CI
81+
matrix. Cargo 1.98's stable changes are fixes for Windows credential-provider
82+
line endings and diagnostic capitalization; no configuration change is needed.
6683

6784
## Contributor Workflow
6885

Cargo.lock

Lines changed: 42 additions & 42 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
name = "la-stack"
33
version = "0.4.4"
44
edition = "2024"
5-
rust-version = "1.97.1"
5+
rust-version = "1.98.0"
66
license = "BSD-3-Clause"
77
description = "Fast, stack-allocated linear algebra for fixed dimensions"
88
readme = "README.md"

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -570,8 +570,8 @@ cargo run --features exact --example exact_solve_3x3
570570

571571
A short contributor workflow:
572572

573-
Install Rust 1.97.1 through [rustup](https://rustup.rs/), Git, Python 3.14,
574-
[`uv` 0.12.3](https://docs.astral.sh/uv/), and `jq`. Then install the pinned
573+
Install Rust 1.98.0 through [rustup](https://rustup.rs/), Git, Python 3.14,
574+
[`uv` 0.12.5](https://docs.astral.sh/uv/), and `jq`. Then install the pinned
575575
`just` release from its locked dependency graph:
576576

577577
```bash

clippy.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Clippy configuration for the la-stack crate.
22

33
# Keep lint behavior aligned with Cargo.toml and rust-toolchain.toml.
4-
msrv = "1.97.1"
4+
msrv = "1.98.0"
55

66
# Lint levels are owned by Cargo.toml.

docs/RELEASING.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ to crates.io.
1414

1515
## Conventions and environment
1616

17-
The current MSRV and pinned release-validation toolchain are Rust 1.97.1. Keep
17+
The current MSRV and pinned release-validation toolchain are Rust 1.98.0. Keep
1818
`Cargo.toml`, `rust-toolchain.toml`, and `clippy.toml` aligned whenever a future
1919
release deliberately changes that baseline.
2020

docs/roadmap.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,21 @@ The goal is targeted profiling and implementation cleanup for operations where
146146
to changes that preserve numerical behavior, allocation-free fixed-size storage,
147147
and clear const-generic code.
148148

149+
### v0.4.5 Rust 1.98 Numerical Policy
150+
151+
The `v0.4.5` milestone continues stable-Rust maintenance without broadening the
152+
crate's scalar or algorithm scope.
153+
154+
- [#208](https://github.com/acgetchell/la-stack/issues/208) raises the MSRV and
155+
pinned contributor/CI toolchain to Rust 1.98, audits the final stable release,
156+
and adds a repository guard against the new algebraic floating-point
157+
operations in correctness-sensitive source, examples, and benchmarks.
158+
159+
The existing IEEE 754 operations, deterministic accumulation order, error
160+
bounds, exact fallbacks, and typed non-finite behavior remain authoritative.
161+
Any future approximate or fast-math API requires a separate opt-in design and
162+
correctness analysis.
163+
149164
### v0.5.0 Generic Const Expressions
150165

151166
`v0.5.0` is reserved for the post-stabilization const-generic API revision.

0 commit comments

Comments
 (0)