Nothing in the repo pins the local toolchain, so local gates track a moving stable while CI pins 1.98.0 #122
Labels
No labels
blocked
bug
documentation
duplicate
enhancement
good first issue
help wanted
invalid
question
waiting-on-julian
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
jlxq0/matrix-mcp#122
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Found while running the release gates for
v0.10.5on21d74338. Not a defect in the tree — all five gates pass — but a gap between what CI measures and what a local run measures, which is the class of thing that turns a green local check into non-evidence without anything failing.The asymmetry
.forgejo/workflows/ci.yml:41pins the toolchain exactly, with a comment two lines above saying to bump it deliberately in its own change:The repository pins nothing. Verified against
origin/main:No
rust-toolchain, norust-toolchain.toml, no.tool-versions, no.mise.toml. The only pin anywhere is~/.config/mise/config.toml, which saysrust = "stable"— a machine-level setting, outside the repository, that resolves to whatever stable is on the day.Why it matters, and why it is invisible right now
Local gates and CI agree today. They agree because
rustup update stablewas run on this machine on 2026-08-25 and stable happens to be 1.98.0 — the same version CI pins. That is a coincidence of timing, not a property of the repository.The next stable release silently puts local gates above the CI pin. A developer then gets a green
cargo clippy --all-targets --all-features --locked -- -D warningsfrom a newer clippy than the one that will actually gate the merge, with nothing in the repository to compare against and no error anywhere. That is the directionci.yml's own comment warns about, and #112 is the record of it biting from the other side: this tree could not lint below 1.98.0 and nothing said so, so three releases went out with a local clippy failing on two#[allow]attributes naming lints that clippy did not have.So the failure mode is: a green local run stops being evidence about the pinned toolchain, and nobody is told.
Fix
Add
rust-toolchain.tomlpinning1.98.0, next to the CI pin, so both move in one deliberate change and a local run cannot silently diverge:Acceptance is that changing the CI pin without changing the toolchain file, or vice versa, is visible in one diff — and that a local
cargo clippyrun reports 1.98.0 on a machine whosestableis something else. The second half is the one that can fail: install a newer stable, confirmcargo clippy --versionstill reports 0.1.98 inside the repo.Not a bug in the tree
Stated so nobody chases it:
21d74338passes all five gates on 1.98.0 — fmt, clippy (exit 0), test (240 passed, 0 failed), audit (498 dependencies, 0 vulnerabilities, 8 pre-existing allowed warnings), anddeny check bans licenses sources.Retraction, recorded so it does not get repeated
This issue exists because of a claim that was wrong. It was first reported as "
RUSTUP_TOOLCHAINis set in the worker environment and overrides the toolchain file". Both halves are false and were checked afterwards:RUSTUP_TOOLCHAINis unset —echo "${RUSTUP_TOOLCHAIN:-<unset>}"prints<unset>.git ls-treeabove.What was actually seen was
rustup show active-toolchainprintingstable-aarch64-apple-darwin (overridden by environment variable RUSTUP_TOOLCHAIN). That string comes from mise's shim setting the variable for the duration of the call it wraps. It is the shim working as designed, and reading it as a stray variable inverted the diagnosis. The real gap is the missing in-repo pin, which is the opposite shape: not an override that shouldn't be there, but a pin that isn't.