adopt ecosystem MSRV floor 1.88; drop the time pin
- rust-version 1.85 -> 1.88 (ecosystem-wide resolution from the audit sessions; matches noq 1.2's floor, sits below iroh 1.91) - Cargo.lock: time 0.3.36 pin removed (existed only to keep the 1.85 claim satisfiable); tree re-floated to current - phase-0: MSRV thread marked RESOLVED; OQ-TLS-08 narrowed to the quinn->noq feature-rename half; lesson recorded (rust-version is passive metadata — claims must be compile-checked, not assumed) Verified: cargo test, test --all-features, clippy -D warnings, fmt --check, rustup run 1.88 cargo check
This commit is contained in:
+32
-34
@@ -313,32 +313,33 @@ library); `quinn`/`tcp`/`acme` feature-gated;
|
||||
needed by any client dialing public X.509 endpoints regardless of
|
||||
transport); `futures` acme-gated (the event loop's `StreamExt`).
|
||||
|
||||
**MSRV verification (2026-09-09).** The sibling crates declare
|
||||
**MSRV verification (2026-09-09).** The sibling crates declared
|
||||
`rust-version = "1.85"`, but that claim was never compile-checked
|
||||
against the TLS dependency tree: with default resolution, `rcgen →
|
||||
yasna/time` pulls `time 0.3.5x` which requires rustc 1.88, and both
|
||||
this crate's fresh lock *and alknet's own `alknet-tls`* fail
|
||||
`rustup run 1.85 cargo check` for exactly that reason. Resolution here:
|
||||
pin `time` to `0.3.36` (the last release with an MSRV ≤ 1.85) in
|
||||
`Cargo.lock` and commit the lock — `cargo check` verified under the
|
||||
real 1.85 toolchain. Two standing consequences: (1) the lock is
|
||||
repo-state — `Cargo.toml` alone does not carry the MSRV guarantee, and
|
||||
a future `cargo update` that re-floats `time` silently breaks the
|
||||
1.85 claim; (2) the honest MSRV for the *dependency tree* is 1.85 only
|
||||
with the pin — if Phase 1 later decides `rust-version` should track
|
||||
reality (e.g. 1.88+), that is a one-line change plus unpinning. Either
|
||||
way, the decision is recorded here rather than inherited silently.
|
||||
`rustup run 1.85 cargo check` for exactly that reason. Interim
|
||||
resolution: pin `time` to `0.3.36` and verify under the real 1.85
|
||||
toolchain.
|
||||
|
||||
**MSRV pressure from the noq/iroh direction.** noq 1.2 declares
|
||||
rust-version 1.88 and iroh 1.1 declares 1.91 (both edition 2024). The
|
||||
quinn 0.11 path today keeps the tree at 1.85; the noq path raises the
|
||||
crate's de facto floor to 1.88+ for consumers that enable the quic
|
||||
feature. Since quic/iroh consumers (the rewrite) sit on iroh 1.91
|
||||
anyway, this argues for Phase 1 setting `rust-version = 1.88`
|
||||
crate-wide (matching noq's floor, below iroh's) and unpinning `time` —
|
||||
see OQ-TLS-08. The alknet-tls extraction source (quinn-only, no iroh
|
||||
dep) can stay at its own floor; the floors only unify at the
|
||||
assembly layer.
|
||||
**RESOLVED 2026-09-10 — ecosystem floor raised to 1.88.** The finding
|
||||
was audited across the whole ecosystem (3 published + 1 unpublished
|
||||
crate, dedicated audit sessions): the 1.85 claim failed in all of
|
||||
them; every crate has now adopted `rust-version = "1.88"` with the
|
||||
lock re-floated. alktls follows: `rust-version = "1.88"`, `time` pin
|
||||
dropped (it existed only to keep the 1.85 claim satisfiable),
|
||||
`rustup run 1.88 cargo check` verified. The lesson recorded for the
|
||||
ecosystem: `rust-version` claims are passive metadata — nothing fails
|
||||
at build time on modern toolchains, so the claim must be
|
||||
*compile-checked* against the resolved tree, not assumed; a committed
|
||||
`Cargo.lock` is what makes an MSRV claim reproducible either way.
|
||||
|
||||
**MSRV pressure from the noq/iroh direction — subsumed.** noq 1.2
|
||||
declares rust-version 1.88 and iroh 1.1 declares 1.91 (both edition
|
||||
2024). The 2026-09-10 ecosystem floor of 1.88 (above) matches noq's
|
||||
exactly and sits below iroh's, so the noq/iroh MSRV pressure that
|
||||
motivated the Phase 1 lean is already absorbed — what remains of
|
||||
OQ-TLS-08 is only the feature-rename half (`quinn` → `noq`).
|
||||
|
||||
## Prior art: noq and the quinn→noq shift (2026-09-09)
|
||||
|
||||
@@ -544,13 +545,10 @@ The extracted `quinn` feature + `for_quinn()` accessors face a decision:
|
||||
rewrite is the only one — so this doubles the accessor surface for
|
||||
nothing.
|
||||
|
||||
Leaning A. Sub-decision: with the noq feature as the QUIC path, the
|
||||
crate's de facto MSRV floor rises to noq's 1.88 (iroh consumers sit at
|
||||
1.91 anyway). Phase 1 should set `rust-version = 1.88` crate-wide and
|
||||
unpin `time` (the 1.85 pin exists only to keep the aspirational 1.85
|
||||
claim — with an honest 1.88 floor, default resolution is fine and one
|
||||
less pin to maintain). The `tcp` feature (tokio-rustls) has no 1.88
|
||||
pressure of its own; a unified 1.88 crate floor is the simple shape.
|
||||
Leaning A. MSRV sub-decision RESOLVED 2026-09-10: the ecosystem floor
|
||||
is 1.88 crate-wide (matching noq's; `time` unpinned — see §Version and
|
||||
dependency posture), so the only open half of this OQ is the feature
|
||||
rename itself.
|
||||
|
||||
Also record in the Phase 1 ADR: noq 1.2's `rustls-aws-lc-rs` feature is
|
||||
the wiring for ADR-084's provider posture on the QUIC path, and iroh
|
||||
@@ -558,10 +556,10 @@ the wiring for ADR-084's provider posture on the QUIC path, and iroh
|
||||
feature-select the *same* rustls 0.23 + aws-lc-rs stack this crate
|
||||
already pins, so no new provider decision is needed.
|
||||
|
||||
**Status:** open — needs a Phase 1 ADR (feature-gate + accessor naming
|
||||
is one-way-door API surface). Lean A with the 1.88 floor; final call
|
||||
belongs to the Phase 1 ADR alongside OQ-TLS-04's accessor-shape
|
||||
decision.
|
||||
**Status:** open (feature-rename half only) — needs a Phase 1 ADR
|
||||
(feature-gate + accessor naming is one-way-door API surface). Lean A;
|
||||
final call belongs to the Phase 1 ADR alongside OQ-TLS-04's
|
||||
accessor-shape decision.
|
||||
|
||||
## Survey / prior-art list
|
||||
|
||||
@@ -607,8 +605,8 @@ All internal; this crate has no external research debt:
|
||||
caller-owned ALPNs, iroh key-not-config
|
||||
- [x] Version/dependency posture recorded (§Version and dependency
|
||||
posture) — rustls 0.23 line current; feature-gate shape per spec;
|
||||
MSRV verified under the real 1.85 toolchain (`time` pin) with the
|
||||
honest-floor decision deferred to OQ-TLS-08
|
||||
MSRV verified and resolved 2026-09-10 (ecosystem floor 1.88,
|
||||
`time` pin dropped, verified under the real 1.88 toolchain)
|
||||
- [x] noq/iroh investigation (2026-09-09) — noq 1.2 published, iroh 1.1
|
||||
built on it; TLS seam API-compatible with quinn 0.11 (mechanical
|
||||
port); one rustls 0.23 tree across all QUIC paths; key-not-config
|
||||
|
||||
Reference in New Issue
Block a user