7. Low MSRV floor for the published reader; release-plz PR-based publishing¶
Date: 2026-07-24 Status: Accepted
Context¶
Both crates are published libraries that third parties link. The fleet MSRV
policy (CLAUDE.core.md, "Rust MSRV & Toolchain Policy") separates the dev
toolchain (pinned to current stable, for fmt/clippy consistency) from the
declared MSRV (a downstream-facing promise that must stay low and CI-verified
for published libraries). Publishing itself is bookkeeping the fleet standard
routes through release-plz, not hand-cut version bumps (CLAUDE.core.md,
"Releases are automated and reviewed").
Decision¶
MSRV. The dev toolchain is pinned to current stable (rust-toolchain.toml
channel = "1.96.0"), while the declared MSRV floor is 1.81
(Cargo.toml [workspace.package] rust-version = "1.81"), verified by a
dedicated CI job (.github/workflows/ci.yml msrv: MSRV (1.81),
dtolnay/rust-toolchain@1.81). That job builds default-features only — the
low-MSRV promise covers the bare reader for third-party reuse; the optional vfs
feature (ADR-0004) pulls forensic-vfs, whose 1.85 floor is deliberately higher
and validated by the --all-features jobs.
Publishing. Library releases go through release-plz (release-plz.toml,
.github/workflows/release-plz.yml; adopted in 13f9bda "chore(release): adopt
release-plz for library publishing"). It computes per-crate SemVer bumps from
conventional-commit types and opens a release PR whose merge publishes. Per the
fleet gotcha, git_tag_name is set to the <crate>-vX.Y.Z form to avoid
colliding with binary v[0-9]* tags (2d84d74). Cargo.lock is committed
(b8fde5b) to stabilise cargo-vet against the freshness treadmill.
Consequences¶
- A downstream crate can depend on
bitlocker-coreon any toolchain ≥ 1.81 without the VFS graph; opting intovfsaccepts the 1.85 floor. - Raising the 1.81 floor is a near-breaking change requiring an explicit reason, not a drift to match the 1.96 dev pin.
- Releases are a reviewed, one-click merge with a generated changelog, not a hand-typed version bump.
Note on recovered rationale¶
The policy behind a low, CI-verified MSRV floor is grounded in the fleet standard and the code. The specific choice of 1.81 (rather than the fleet's usual 1.75/1.80) is not explained in any commit message or comment; it is most plausibly the floor imposed by a dependency in the default graph, but that driver was not recovered from available history. Rationale for the exact number is reconstructed from structure; original intent not recovered in available history.