Build the solstice rust CI image from a refraction-forger recipe, with a writable RUSTUP_HOME and clippy/rustfmt baked in #1
Loading…
Reference in a new issue
No description provided.
Delete branch "claude/wi-019faa04-build-the-solstice-rust-ci-image-from-a"
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?
Anima work item
019faa04-868e-7f60-ae26-d7eab7114a3a.Why now
The image behind solstice's
runs_on: rustlane cannot install a pinned Rust toolchain. Every job that ships arust-toolchain.tomldies here — reproduced twice on 2026-07-28, byte-identical, from the job's own log (job_logs, request1a063681-97bc-4bbc-beee-ae6645af6ac6):RUSTUP_HOMEis/opt/rust/rustup, owned by root, while the job runs assol(workdir/home/sol/work). rustup resolves the pin, tries to download, cannot create its temp dir, and exits. This is not specific to 1.96 — no pinned toolchain can install, so the lane silently lints against whatever rustc the image happens to carry.That blocks Anima WI-352 ("CI lints against an unpinned toolchain"), which has now been dispatched, diagnosed, rebased and parked at its retry cap three times against this one error.
What the live image actually is
/var/lib/solstice/images/solstice-rust.qcow2— 5.4 GB, dated 2026-06-03, owned bysolstice, hand-built and not reproducible from any recipe in git. Meanwhilerefraction-forgeralready carriesimages/ubuntu-rust-ci.kdl, which is not what is running: it installs jammy's distrorustc/cargoand creates a userci, whereas the live image has/opt/rust/{cargo,rustup}and a usersol. So the recipe and the running artifact have diverged completely.Till's direction (2026-07-28): fix this via refraction-forger rather than by patching the live qcow2.
Ask
images/ubuntu-rust-ci.kdl(or a newsolstice-rust.kdl) up to what the lane actually needs, and publish it as the image solstice boots forruns_on: rust. The point is that the CI image becomes reproducible from git — a hand-built qcow2 from June is why nobody could see what was wrong with it.chown -R sol:sol /opt/rust(or the CI user the recipe creates) at build time, or setRUSTUP_HOME/CARGO_HOMEunder the job user's home. KeepCARGO_HOMEpointing at a shared, pre-populated registry cache so jobs do not re-download crates every run — onlyRUSTUP_HOMEneeds to be writable.rustfmtandclippyas components, so a pinned job resolves offline and does not depend on network at job time. This is the substance of Anima WI-227 ("Bake clippy + rustfmt into the solstice-rust runner image"), which is human-parked on the Anima side; this item is where the work actually lives.tools.toml) assumes it. Do not regress that — a cache miss degrades silently into full compiles.Acceptance criteria
rust-toolchain.tomlpinning 1.96.0 printsrustc 1.96.0from the=== toolchain ===section and proceeds.cargo fmt --checkandcargo clippyboth run without the job installing anything at runtime.refraction-forgerfrom a recipe in git, and rebuilding it twice yields the same toolchain versions.Verification hook
The fastest end-to-end check is Anima WI-352's branch (
claude/wi-019f9aa3-ci-lints-against-an-unpinned-toolchain-d): it pins 1.96.0 and makes bothfmtandclippyblocking. If that branch goes green, this is done.Evidence
jobs.request_id = 1a063681-97bc-4bbc-beee-ae6645af6ac6, and an identical earlier one ate34b42b0-a065-40d1-aa50-44896c077aca. Both readable viajob_logs(note:repo_owner/repo_nameare NULL on native-lane rows, so the MCP cannot find them by owner/repo — queryjob_logsbyrequest_iddirectly).archibald:/var/lib/solstice/images/solstice-rust.qcow2.refraction-forger/images/ubuntu-rust-ci.kdl.WIP: Build the solsticeto Build the solsticerustCI image from a refraction-forger recipe, with a writable RUSTUP_HOME and clippy/rustfmt baked inrustCI image from a refraction-forger recipe, with a writable RUSTUP_HOME and clippy/rustfmt baked in