Skip to content

ADR 0025 minimum supported versions

Karthik P edited this page Oct 31, 2026 · 1 revision

ADR-0025: Minimum supported versions: Rust 1.85, Python 3.10, Node.js 22

fiscalclock 0.1.0 supports Rust 1.85 and later, CPython 3.10 and later, and Node.js 22 and later, and CI tests each floor.

Last reviewed: 31 Oct 2026

Status

Accepted on 31 Oct 2026 under the maintainer's delegation; may be revisited. The research proposal left this open ("Minimum versions: Rust MSRV, Python floor (3.10 or later), Node.js floor"), and the maintainer asked for the roadmap and 0.1.0 to be decided and built without them. Applied in 0.1.0.

Context

A minimum version is a promise to users and a cost to maintainers: every floor must be tested, and raising it later is a breaking change that needs an ADR (AGENTS.md). The proposal set only one constraint, Python 3.10 or later, and tied the Python wheel strategy to the floor: abi3t wheels once 3.15 is the floor (ADR-0011).

Facts as of 31 Oct 2026:

  • PEP 803 is Final and adds abi3t from Python 3.15 (PEP 803). Python 3.15.0 was released on 9 Oct 2026 and 3.15.2 is the current 3.15 release (PEP 790).
  • Node.js 22, 24 and 26 are listed as LTS lines and Node.js 20 as end-of-life since 24 Mar 2026 (Node.js previous releases). That page does not distinguish active and maintenance LTS.
  • npm trusted publishing requires npm 11.5.1 or later and Node.js 22.14.0 or later, according to a summary of the npm documentation (not raw-verified). This affects the release job, not users.

Decision drivers

  • Support the oldest versions that users are likely to run, without testing versions that are end-of-life.
  • Every floor must be proven in CI, not claimed.
  • Keep the Python wheel count small (ADR-0011).

Considered options

Rust

  • 1.85 (chosen). Pros: the crates use the 2024 edition and declare rust-version = "1.85", and the CI job msrv proves it builds and passes conformance on 1.85. Cons: users on older toolchains cannot use the crate.
  • Latest stable only. Pros: no MSRV job. Cons: forces upgrades on users for no feature reason, and the crate would break silently for them.

Python

  • 3.10 (chosen). Pros: the floor the proposal names; one abi3-py310 wheel per platform covers 3.10 and later. Cons: 3.10 to 3.14 must be supported until the floor moves, which delays abi3t.
  • 3.15. Pros: abi3t wheels from day one, one wheel per platform for both regular and free-threaded builds. Cons: excludes every CPython before 3.15, released three weeks before this decision.

Node.js

  • 22 (chosen). Pros: the oldest line listed as LTS as of 31 Oct 2026; CI tests 22 and 26. Cons: Node.js 20 users, end-of-life since March 2026, are excluded.
  • 24 or 26. Pros: Temporal is enabled by default in Node.js 26 (release notes). Cons: excludes users on Node.js 22 LTS, and the package does not need Temporal, because ISO strings work everywhere (ADR-0006).

Decision

Rust 1.85, CPython 3.10, Node.js 22. As applied in 0.1.0:

  • Rust: rust-version = "1.85" in crates/core/Cargo.toml and both binding crates. The msrv job in ci.yml runs cargo check and the conformance test on toolchain 1.85.
  • Python: requires-python = ">=3.10" in pyproject.toml and the abi3-py310 feature. CI tests 3.10 and 3.14 on three operating systems, plus 3.14t; the release smoke test installs the built wheel on 3.10.
  • Node.js: "engines": {"node": ">=22"} in package.json. CI tests 22 and 26 on three operating systems; the release smoke test installs the packed tarball on 22.

Consequences

Good:

  • Each floor is proven by a CI job, not only declared.
  • The Python floor lets one stable-ABI wheel per platform cover five CPython minor versions.

Bad:

  • Free-threaded CPython 3.15 has no wheel until the floor reaches 3.15 or a cp315t wheel is added (ADR-0011).
  • Raising any floor is a breaking change that needs a new ADR.
  • Intermediate versions (Python 3.11 to 3.13, Node.js 24) are covered by the floor's guarantees but not tested directly in CI.

Links

Clone this wiki locally