feat(dev-base): bake the Rust toolchains consumers pin #1058
No reviewers
Labels
No labels
burndown-2026-06
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
coherence-core
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
qa-fixture
role/ai
role/creator
role/design
role/director
role/engineer
role/exec
role/human
role/ops
role/qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-flight-deck/agentic-os!1058
Loading…
Reference in a new issue
No description provided.
Delete branch "ops/dev-base-pin-rust-1.90.0"
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?
The problem
A repo pinning a channel in
rust-toolchain.tomldownloads it fromstatic.rust-lang.orgon the first cargo call of every CI run. That request has no cache, and when the runner's egress to that host degrades, every Rust repo goes red on a network fault rather than on its own code.galaxy-gen#84 is the worked example. Five consecutive runs produced no usable signal, and
publishhas not run since, so that site is several commits behind its own main.Two fixes were tried there and rejected on evidence. Retrying was implemented, measured, and reverted - it turned a 3-minute failure into a 10-minute one and fixed nothing, because no retry repairs a path that will not complete a body transfer. Unpinning trades a loud failure for a silent one; that pin exists because a floating channel broke galaxy-gen's main on the same commit that added its clippy gate.
The change
RUST_PINNED_VERSIONS, a space-separated list declared once indocker-bake.hcland threaded to both Dockerfiles.stableremains the default toolchain, so nothing changes for consumers that do not pin.Each baked toolchain additionally gets
clippy,rustfmt, andwasm32-unknown-unknown.The components are the point. galaxy-gen pins
components = ["clippy", "rustfmt"], and baking a bare toolchain would leave rustup fetching those at first use - the same download in a different place. This is the detail that decides whether the fix works at all.Verified by running it, not reading it
Built the payload and executed the toolchain inside it:
Worth recording: the first attempt failed to build.
rustup toolchain install X --profile minimal --component clippy rustfmtis invalid - the[TOOLCHAIN]...argument is variadic and swallowsrustfmt, givinginvalid toolchain name: 'rustfmt'. Each component needs its own flag. A static check would not have caught that; only the build did.ward exec dev-base-checkpasses with no warnings.Guard against a silent pass
The full image verifies each pin end to end -
cargo +PIN --version,clippy --version,fmt --version, and the wasm32 target - and fails when the list arrives empty. The bake file passes args tofullexplicitly, so an unplumbedRUST_PINNED_VERSIONSwould otherwise make the loop iterate zero times and pass. Confirmed both targets resolve it via--print.Cost and scope
One extra toolchain in the Rust payload: ~150s on a cold build, cached thereafter. Adding a future pin is a one-line edit to the default. Consumers keep owning their own
rust-toolchain.toml; this only decides what is already resident when they ask.Refs coilyco-gaming/galaxy-gen#84