Project provisioning can put a toolchain on PATH again. On macOS it could not, and the failure took the whole [setup] payload down with it.
A patch release for one image bug found while writing the provisioning docs. Cleat will offer to refresh your box image on the next start, because the fix lives in the image rather than the CLI.
Fixes
[setup]provisioning failed on macOS whenever a step touched a shell rc file - the box remaps its user to your host account, then takes ownership of the paths that need it. The shell rc files and~/.configwere not in that set, so on any host whose user id is not the image's own (which is every Mac) a[setup]step that appended to~/.bashrcor~/.profile, or created a directory under~/.config, was refused. A payload runs underbash -e, so that refusal aborted the entire provisioning run. This is what rustup, the .NET install script and the uv installer all do by default. The box now takes ownership of those paths too.~/.configis claimed non-recursively on purpose, so theghcapability's mount of your real~/.config/ghkeeps host ownership.
Changes
- The bundled image spec moved to 4, so existing boxes are offered a refreshed image on the next start. Accepting it recreates the box: your project files and Claude state are untouched, ad-hoc installs inside the box are not. Any approved
[setup]re-runs automatically on the new box. - The
examples/setupstarters no longer depend on that fix landing, so they also work on a box created before it. rustup runs with--no-modify-path, uv installs unmanaged into~/.local/bin, and the .NET and Rust examples expose their binaries by symlinking into~/.local/bininstead of editing a shell rc file. The box already puts~/.local/binfirst on the session PATH, and a provisioning payload never sources an rc file anyway. - The Rust example installs
build-essentialandpkg-config, and the .NET example installslibicu72on arm64. The slim base ships neither, sorustccould not link anddotnet --infoaborted with exit 134. - 1773 (+3) behavioral tests across 52 files, including one that fails if the
~/.configownership fix ever becomes recursive and starts rewriting your real~/.config/gh. - 384 (+2) mutations caught, 0 missed, 0 skipped.