Etapa G: BUMP de toolchain del catálogo 1.91.1→1.96 (destraba MSRV) + oxlint/ruff (101→103)
El usuario aprobó subir el rustc del sandbox. El rootfs de build (.dev-fs/alpine) migró a repos Alpine edge: rust/cargo 1.96.0 (+ gcc 15.2/musl 1.2.6/llvm22) + clang-dev/clang-libs (libclang p/bindgen de los *-sys). bootstrap-devfs.sh actualizado para reproducirlo. El 4/4 NO se afecta (usa SWAP_RUST con el rust hammer-built 1.91.1); esto es el toolchain del CATÁLOGO. Destrabados+promovidos: oxlint (1.94) y ruff (1.94) construyen+sellan static-musl. ouch lleva gueto gcc pero queda staged: sus deps C++ (unrar-ng-sys/libbzip3-sys) chocan en el link final (-lstdc++ vs la libc++ de zig). Frontera C++ = ortogonal al MSRV. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Delta semántico
Ninguna definición cambió: el cambio es de texto, documentación o datos.
6 archivos · +62 −46
- recipes/incoming/ouch.toml +3 −1
- recipes/incoming/oxlint.toml +0 −22
- recipes/incoming/ruff.toml +0 −22
- recipes/oxlint.toml +22 −0
- recipes/ruff.toml +22 −0
- scripts/bootstrap-devfs.sh +15 −1
diff --git a/recipes/incoming/ouch.toml b/recipes/incoming/ouch.toml
index 26eef483..01adf7ef 100644
--- a/recipes/incoming/ouch.toml
+++ b/recipes/incoming/ouch.toml
@@ -9,8 +9,10 @@ version = "0.8.0"
repo = "https://github.com/ouch-org/ouch"
commit = "d6e80634b63d53a18cb32dd1cbd613b6a3b61e45"
+# GUETO gcc: ouch vendorea bzip2/libbzip3-sys/zstd-sys/lzma (C); cc-rs los compila y zig-cc
+# falla. compiler="gcc" usa el musl gcc de Alpine. (MSRV 1.93 ⇒ rootfs edge rust 1.96.)
[build]
-compiler = "zig-cc"
+compiler = "gcc"
target = "x86_64-linux-musl"
link = "static"
flags = ["--bin", "ouch"]
diff --git a/recipes/incoming/oxlint.toml b/recipes/oxlint.toml
similarity index 100%
rename from recipes/incoming/oxlint.toml
rename to recipes/oxlint.toml
diff --git a/recipes/incoming/ruff.toml b/recipes/ruff.toml
similarity index 100%
rename from recipes/incoming/ruff.toml
rename to recipes/ruff.toml
diff --git a/scripts/bootstrap-devfs.sh b/scripts/bootstrap-devfs.sh
index 0159368c..1bcfd406 100755
--- a/scripts/bootstrap-devfs.sh
+++ b/scripts/bootstrap-devfs.sh
@@ -113,6 +113,18 @@ else
# y Alpine no trae ese std (no hay rustup). Falta resolver el toolchain Rust del lab (plan C.2)
# — ver docs/runbooks/stage1-vm-boot.md §8. Hasta entonces, los componentes C (musl, busybox)
# sí construyen end-to-end.
+ # BUMP DELIBERADO de toolchain (2026-06-22, [[cargo-recipe-msrv-ceiling]]): Alpine v3.23 trae
+ # rust 1.91.1 ⇒ techo MSRV que bloquea recetas modernas (ouch/uv 1.93, oxlint/ruff 1.94,
+ # zellij 1.92). edge trae rust 1.96.0. Apuntamos los repos del rootfs a EDGE para que `apk add`
+ # resuelva rust/cargo/clang 1.96 (+ arrastra gcc 15.2/musl 1.2.6/llvm22 como deps). El of_tree
+ # del 4/4 NO depende de esto (usa SWAP_RUST con el rust hammer-built); esto es el toolchain del
+ # CATÁLOGO. Para anclar una versión exacta en vez de un edge rodante, pinear un snapshot de edge.
+ if [[ -f "$ROOTFS/etc/apk/repositories" ]]; then
+ printf '%s\n%s\n' \
+ 'https://dl-cdn.alpinelinux.org/alpine/edge/main' \
+ 'https://dl-cdn.alpinelinux.org/alpine/edge/community' \
+ > "$ROOTFS/etc/apk/repositories"
+ fi
# `linux-headers`: UAPI del kernel (linux/kd.h, etc.) que zig cc NO bundlea; busybox y otros
# paquetes la necesitan. zig cc nativo la encuentra en /usr/include. (Lo destapó la
# verificación de reproducibilidad de Stage 2: con el config determinista, los applets de
@@ -140,7 +152,9 @@ else
# NOTA: `openssl-dev` YA NO va aquí — de-Alpinizado a recipes/openssl.toml (libcrypto estática,
# deps.build del kernel). El host-tool certs/extract-cert lo enlaza desde la capa overlay hammer.
# El runtime libcrypto3/libssl3 (que curl/git necesitan) lo trae Alpine aparte, no es openssl-dev.
- NEEDED="make autoconf automake m4 patch coreutils libtool pkgconf bash binutils g++ zlib-dev rust cargo linux-headers bubblewrap git curl kmod"
+ # `clang-dev clang-libs`: aportan libclang.so — `bindgen` (que usan varios *-sys: libbzip3-sys,
+ # etc.) lo carga en build para generar bindings de los headers C. No lo trae el base.
+ NEEDED="make autoconf automake m4 patch coreutils libtool pkgconf bash binutils g++ zlib-dev rust cargo clang-dev clang-libs linux-headers bubblewrap git curl kmod"
missing=""
for pkg in $NEEDED; do
# apk info -e devuelve el paquete si está instalado, vacío si no.