Commit Graph
236 Commits
Author SHA1 Message Date
sergioandClaude Opus 4.8 9baa3fb85c Etapa G: tanda cli-rust-8 — 11 promovidos estáticos (corpus 159→170)
Granja JOBS=4 sobre cli-rust-8 (import 13/19): build-yield 10/13 +
cargo-hack re-arreglado. Todos ELF static-musl que corren:
ast-grep 0.43, boxxy 0.8.5, cargo-msrv 0.19.3, cargo-sweep 0.8,
comrak 0.52, genact 1.5.1, macchina 6.4, numbat 1.23, rage 0.11.2,
repgrep 0.16.1 (rgr), cargo-hack 0.6.45.

cargo-hack: de-Alpinizado a receta mínima (la fase compile custom con
`cargo auditable build` daba binario dinámico; el path default del lab
aplica crt-static + linker zig → estático). Verificado `file ... statically`.

Diferidos a .deferred (frontera de libs ausentes): hurl (libcurl+libxml2+
openssl-sys), termscp (Cargo.lock no carga bajo el vendor del lab).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 21:02:58 -04:00
sergioandClaude Opus 4.8 71bc228102 Etapa G: cosecha tanda CLI Rust — 5 promovidos estáticos (corpus 154→159)
Drenada la cola de 14 staged. 5 sellados+publicados al repo firmado, todos
ESTÁTICOS y ejecutan (versión correcta):
  - topgrade 17.6.1, git-absorb 0.9.0, cargo-audit 0.22.1, yazi 26.5.6, cargo-edit 0.13.11

Patrón común de de-Alpinización (estilo zellij): el lab NO trae `cargo auditable`
⇒ reescritas LIMPIAS sin él ni manpage/completions. Claves de la tanda:
  - SIN fase compile custom ⇒ path default del lab (aplica crt-static tras `cargo
    rustc --`, sólo el bin top, NO en RUSTFLAGS donde rompería los proc-macros) +
    linker zig-cc ⇒ binario estático. Las fases custom con `cargo build` salían
    DINÁMICAS (musl pie) y no corrían en el host — corregido.
  - compiler="gcc" donde hay deps-C de build-script (git2/openssl/ring/mlua-lua/
    jemalloc/onig): el CC=zig global rechaza el triple x86_64-alpine-linux-musl; el
    gueto gcc-musl los compila, linker sigue zig-cc. +deps zlib en git-absorb/cargo-audit.
  - cargo-edit: 4 bins (cargo-add/rm/upgrade/set-version, no hay bin `cargo-edit`);
    el path default (`cargo rustc -- flags`) exige un único target ⇒ fase custom que
    itera los 4 bins con crt-static por-bin.
  - yazi: dropeado el patch system-lua + dep lua5.5 ⇒ mlua vendorea su Lua.

Diferidos a incoming/.deferred (frontera dura, motivo documentado):
  - jless → libxcb (clipboard X11, dep real sin receta)
  - b3sum → proyecto anidado con Cargo.lock propio (el vendor del lab no lo alcanza)
  - dprint/mprocs → libclang.a/bindgen (clang-sys estático)
  - hck → libz-sys (-lz no hallado), kalker → gmp, dura → Cargo.lock stale,
    xcp → libfs i32/u64 musl, mdcat → #![deny(warnings)] en lib (path default no
    deja inyectar --cap-lints)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 17:49:50 -04:00
sergioandClaude Opus 4.8 3ebee950ab Etapa G: nu/nushell al corpus (153→154) — el giant más duro, sellado
nushell 0.104.1: uno de los paquetes más duros del ecosistema (openssl-sys + libgit2-sys +
libssh2-sys + libsqlite3-sys + mimalloc, todos sus C vendoreados). Fix clave: convertir la
receta del estilo abuild (fase compile custom, que NO monta el wrapper .hammer-zig-cc) al
build POR DEFECTO (flags=['--bin','nu']) ⇒ el wrapper traduce el target alpine→musl que zig
no conoce, y los -sys compilan. Dropea system-deps.patch (vendor todo). mise diferido
(.deferred: su build.rs busca git/archivo en build-time).

HALLAZGO GENERAL: recetas import-Alpine con fase abuild + C-deps fallan porque la fase custom
no monta el wrapper zig-cc. Fix = usar el build por defecto (sin fase compile).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 15:19:43 -04:00
sergioandClaude Opus 4.8 e4f682b87e Etapa G: zola al corpus (152→153) — el giant de tera/oxc/grass/ravif sella
Granja dedicada de giants (JOBS=3, RAM 31G): zola ✓ (no necesitaba fix, solo tiempo).
mise ✗ (su build.rs busca git/archivo faltante) y nu ✗ (openssl-sys: la fase abuild no
monta el wrapper zig-cc → zig recibe target alpine que no conoce) quedan para fix.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 14:55:08 -04:00
sergioandClaude Opus 4.8 adbf986133 Etapa G: cosecha tanda openssl/git2 — 4 promovidos (corpus 148→152)
Granja sobre incoming (giants apartados): monolith + tuc + cargo-generate + cargo-outdated
sellados y promovidos + repo re-firmado. Valida los fixes de hammer-build de esta sesión:
- monolith: openssl-sys vía OPENSSL_DIR.
- cargo-generate/cargo-outdated: cargo-tools COMPLETOS (git2+openssl) — libgit2-sys vendorea
  su libgit2 con cmake; openssl-sys usa la openssl del corpus. Frontera C-FFI destrabada.
- tuc: cargo build (sin auditable).
14 staged (aws-lc/lint/C-libs/mecánicos) + 3 giants en .deferred para tanda dedicada.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 13:34:38 -04:00
sergio 3520e12574 Etapa G: aparta giants (mise/zola/nu) a incoming/.deferred — bloqueaban el promote del farm 2026-06-23 13:20:14 -04:00
sergioandClaude Opus 4.8 897e355957 Etapa G: prep frontera git2 — cargo-audit/generate/outdated (openssl + libgit2 vendored)
Aplica el mismo patrón openssl a los cargo-* (dep 'openssl' ⇒ OPENSSL_DIR) y deja que
libgit2-sys vendoree su propio libgit2 con cmake (sin dep espuria). cargo-audit: además
'cargo auditable'→'cargo build', fix path '../target'→'target', dep 'openssl-dev>3'→'openssl'.
Quedan staged para la próxima granja (validar el vendoring de libgit2 con zig-cc/cmake).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 13:02:21 -04:00
sergioandClaude Opus 4.8 fd456ca9f0 Etapa G: destraba frontera openssl-sys (OPENSSL_DIR + fallback de deps al corpus)
Dos fixes en hammer-build que juntos destraban las recetas con C-FFI:
- Inyecta OPENSSL_DIR=/usr + OPENSSL_STATIC + OPENSSL_NO_VENDOR cuando la receta declara
  'openssl' como dep ⇒ openssl-sys usa la openssl hammer-built (estática/musl) en vez de
  buscar en el host y abortar.
- resolve_dep_path(): fallback al catálogo PADRE — una receta en recipes/incoming/ ahora ve
  las deps del corpus recipes/ sin duplicarlas (la granja construye desde incoming/).
Recetas: +dep openssl a monolith/mdcat/mise; tuc saca 'cargo auditable'→'cargo build'.
VALIDADO: monolith v2.10.1 sella (openssl-sys linkea contra la openssl del corpus).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 12:38:31 -04:00
sergioandClaude Opus 4.8 ff17454a47 Etapa metal: habilita DRM_I915 + firmware (panel TigerLake se apaga sin él)
Diagnóstico cerrado: el reboot-probe probó que el kernel está VIVO en el metal del
usuario (se reinicia solo); la pantalla negra es porque el panel TigerLake se apaga al
pasar el kernel y solo i915 (driver Intel real) lo reenciende — efifb/simpledrm/earlyprintk
escriben a un fb muerto (validado: nomodeset tampoco). Era un recorte de más (i915 venía
-d del kernel QEMU). Fix = lo que toda distro normal trae:
- linux-metal.toml: -e DRM_I915 -e DRM_FBDEV_EMULATION (saca -d DRM_I915).
- metal-firmware.sh: inyecta i915/tgl_* (DMC/GuC/HuC, 1.3M) en /lib/firmware/i915.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 11:54:49 -04:00
sergioandClaude Opus 4.8 5012549f85 Etapa metal: USB de bisección (initramfs tiny) + fix piso FAT32 de la ESP
- Diagnóstico metal: con systemd-boot, earlyprintk=efi NO imprime NADA del kernel
  (solo 'Loaded initrd MEDIA_GUID' + 'Measured initrd PCR 9' y cuelga) ⇒ el kernel
  no llega ni a su consola temprana: hang en ExitBootServices o el decompresor.
- metal-usb-sdboot.sh: piso de 48MiB a la ESP (FAT32 -F exige ~33MiB; con initramfs
  chico caía debajo y la firmware no leía el BOOTX64.EFI → 'Not Found').
- USB de bisección (work/hammer-tiny-usb.img, initramfs busybox 1.3MB): ✓ OVMF llega a
  /init. Si en el metal del usuario ARRANCA a shell ⇒ el cuelgue era el initrd 100MB;
  si TAMBIÉN cuelga ⇒ es el kernel/EBS (probar nokaslr/no5lvl).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 01:26:29 -04:00
sergioandClaude Opus 4.8 ce0cf8762e Etapa G: pre-carga cola para granja nocturna — cli-rust-7 (6 vía Alpine) → incoming 21
tandas/cli-rust-7.txt (24 nombres, yield 6/24: yazi/topgrade/kalker/git-absorb/jless/tuc;
el path nix dio 0 por el gotcha de sandbox, solo Alpine). Cola incoming=21 para drenar.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 01:13:57 -04:00
sergioandClaude Opus 4.8 1dc5c16fbd Etapa metal: USB systemd-boot + kernel diagnóstico (esquiva quirk LoadOptions del firmware)
El boot por EFI-stub DIRECTO se cuelga en el firmware del usuario tras 'Measured initrd
PCR 9' (quirk EFI_LOAD_OPTION del firmware + initrd 100MB por la firmware). Pivote:
- scripts/metal-usb-sdboot.sh: arma work/hammer-metal-usb.img (disco GPT+ESP FAT32) con
  systemd-boot (binario del host, crutch de bringup) como BOOTX64.EFI + loader entry.
  systemd-boot provee el initrd por LoadFile2 (esquiva el parseo de cmdline del firmware)
  y permite EDITAR la cmdline en vivo (tecla 'e') ⇒ iterar sin recompilar 45min.
  ✓ VALIDADO OVMF: menú → 'Loaded initrd from LINUX_EFI_INITRD_MEDIA_GUID' → arje-zero PID1.
- linux-metal.toml: kernel diagnóstico — cmdline +earlyprintk=efi,keep +ignore_loglevel
  +efi=novamap (ve el boot en pantalla post-ExitBootServices) y -DEBUG_WX (saca el trace).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 00:33:46 -04:00
sergioandClaude Opus 4.8 30d8c95577 Etapa metal: ✓ VALIDADO boot UEFI por EFI-stub (ISO como disco USB) + nota Secure Boot
work/hammer-metal.iso (257M) bootea en OVMF por las dos vías como DISCO:
- virtio-disk y USB-storage(xhci): EFI-stub carga kernel+initrd de la ESP (GPT
  isohybrid), cmdline horneado aplica, usbhid/cfg80211 init, arje-zero PID1, SIN panic.
- El '-cdrom' falla (El Torito EFI se trunca >32MB) pero es IRRELEVANTE: un USB es disco
  ⇒ la firmware lee la ESP por GPT. Confirmado el escenario real del pendrive.
Falta solo el hardware: quemar y bootear (Secure Boot OFF).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 22:31:41 -04:00
sergioandClaude Opus 4.8 63d0871664 Etapa metal: banner de marca para el motd del live (icono martillo+# + wordmark)
scripts/hammer-banner.txt: icono ASCII cabeza-de-martillo rellena de '#' (el hash
content-addressed) + handle, wordmark 'hammer' (toilet pagga, estilo pixel-block que
rima con la cabeza de hashes) + acrónimo HAMMER + uso WiFi. metal-iso.sh lo copia a
/etc/motd ⇒ es lo primero que ves al loguear en consola. Reutilizable como base de
logo/wallpaper.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 22:09:40 -04:00
sergioandClaude Opus 4.8 b1e2eb95ce Etapa metal: arranque UEFI por EFI-stub directo (esquiva GRUB 2.14 roto)
La rama GRUB-EFI cuelga (bug GRUB 2.14 del host rolling, afecta a cualquier kernel).
Solución: bootear el kernel por su EFI-STUB directo, sin GRUB-EFI.

- linux-metal.toml: CONFIG_CMDLINE_BOOL=y + CMDLINE horneado
  ('console=tty0 ... initrd=/initramfs.cpio.gz rdinit=/init'). Sin FORCE ⇒ en BIOS
  GRUB sigue mandando su cmdline. Confirmado en fuente (libstub/file.c:50): el
  EFI-stub convierte '/'→'\' y efi_load_initrd cae a la carga por cmdline sin loader.
- iso-image.sh: modo EFI_STUB=1 ⇒ la ESP lleva el bzImage como \EFI\BOOT\BOOTX64.EFI
  + initramfs.cpio.gz en su raíz (FAT32). La firmware lanza el kernel directo.
- metal-iso.sh: pasa EFI=1 EFI_STUB=1 (híbrido: BIOS GRUB + UEFI EFI-stub).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 21:57:46 -04:00
sergioandClaude Opus 4.8 487d741f08 Etapa metal: ensamblador del ISO EFI (pieza 4) + hallazgo regresión EFI
- scripts/metal-iso.sh: arma work/hammer-metal.iso (kernel metal + firmware AX201
  + wpa_supplicant + wifi-connect), consola en pantalla (console=tty0).
- VALIDADO BIOS (QEMU): el kernel metal bootea, inicializan usbhid/i8042 (teclado),
  e1000/e1000e/igb, cfg80211+regulatory (stack WiFi), simpledrm/VGA console, y
  arje-zero arranca PID1. iwlwifi/nvme presentes (no bindean en QEMU sin hw real).
- HALLAZGO: la rama UEFI (OVMF) NO bootea el kernel — regresión pre-existente de
  GRUB 2.14 (host rolling): GRUB-EFI dice 'Booting' y el kernel queda mudo, con
  CUALQUIER kernel (el QEMU tmb falla; efi-boot-test FALLA UEFI / PASA BIOS).
  Fix propuesto: boot por EFI-stub directo (sin GRUB-EFI) — requiere kernel con
  CONFIG_CMDLINE embebido + ESP con bzImage como BOOTX64.EFI.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 21:45:28 -04:00
sergioandClaude Opus 4.8 3aec59ea41 Etapa metal: stack de red WiFi — libnl + wpa_supplicant (pieza 3)
- recipes/libnl.toml: netlink lib (libnl-3 + libnl-genl-3), estática, deps
  flex/bison/m4 (regenera parsers). Base nl80211 del kernel metal.
- recipes/wpa_supplicant.toml: supplicant WPA2 2.11, driver nl80211 sobre libnl,
  CONFIG_TLS=internal (sin dep openssl; suficiente WPA2-PSK). Compila a la 1ra con
  zig-cc/musl ⇒ wpa_supplicant/wpa_cli/wpa_passphrase ESTÁTICOS x86-64. udhcpc de
  busybox da el DHCP. (iw omitido: wpa_cli scanea.)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 21:03:16 -04:00
sergioandClaude Opus 4.8 ac2835f4e7 Etapa metal: kernel-metal (drivers reales =y) + firmware AX201 + ESTADO.md
Pieza 1+2 de 'hammer en el metal' (laptop TigerLake, WiFi AX201):
- recipes/linux-metal.toml: variante del kernel con hardware real built-in
  (efifb/simpledrm, USB+HID, AHCI/NVMe, cfg80211+mac80211+iwlwifi/iwlmvm,
  e1000e/r8169, USB-CDC). Conserva los bits hammer (overlay/userns/fanotify/
  virtio) ⇒ sigue booteando en QEMU. MODULES=off (monolítico, sin modprobe).
  Deja linux.toml INTOCADO (su of_tree es load-bearing del selfhost).
- scripts/metal-firmware.sh: inyecta iwlwifi-QuZ-a0-hr-b0/cc-a0 + regulatory.db
  en /lib/firmware de un rootfs (descomprime .zst → .ucode plano). Blobs fijos
  (TODO pin a linux-firmware).
- ESTADO.md: resumen humano del proyecto.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 20:56:19 -04:00
sergioandClaude Opus 4.8 367b167991 Etapa G: cosecha cli-rust-6 (parcial) — 8 al corpus (137→145)
Granja cortada a tiempo (devuelvo la CPU); promoví manualmente los 8 sellados antes del corte:
cargo-binstall/cargo-bloat/cargo-deny/cargo-expand/cargo-machete/cobalt/fnm/ripsecrets. zola
quedó a medio compilar (no sellado) + el resto de cargo-* fallan por dep-C (openssl/git2) —
quedan staged para la próxima. build-yield parcial 8/22.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 17:53:58 -04:00
sergioandClaude Opus 4.8 d109af9022 Etapa G: pre-carga la cola — tanda cli-rust-6 importada (15/15, lista para la próxima granja)
Sin construir (no peleamos CPU ahora). import-batch 15/15 (nix=14, alpine=1) + pin 14 tag→SHA.
Herramientas cargo + dev CLIs: cargo-edit/deny/audit/expand/machete/bloat/outdated/generate/
binstall + mdcat/zola/cobalt/mise/fnm/ripsecrets. La próxima sesión arranca con build-farm.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 17:06:39 -04:00
sergioandClaude Opus 4.8 6bdbb17d48 Etapa G: cosecha cli-rust-5 — 15 al corpus (122→137) + tanda + cola
Granja JOBS=4 con scudo ya mitigado + toolchain 1.96: gitu/hgrep/igrep/kmon/kondo/mask/nomino/
oha/pik/ripgrep-all/rustscan/sad/serie/stylua/systeroid construyen+sellan+corren static-musl
(build-yield 15/23). pik confirma que sysinfo (antes MSRV 1.95) ya entra con 1.96. Incluye
tandas/cli-rust-5.txt (import 17/19) + dura/xcp staged (nuevos fallos: E0308/edición, triage).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 16:42:18 -04:00
sergioandClaude Opus 4.8 2032df4085 Etapa G: MITIGA scudo (alias libscudo→musl) → destraba trippy/jnv/presenterm (119→122)
El edge rust depende de scudo-malloc y los shims rustc/cargo lo linkean como primer NEEDED ⇒
scudo interpone malloc en todo el proceso y CRASHEA a rustc en ciertos proc-macros (corrupted
chunk header / SIGSEGV). No se puede apk-del (rust depende). Mitigación: aliasar
/usr/lib/libscudo.so → la libc musl ⇒ el NEEDED resuelve pero malloc cae a musl, sin scudo.
Los shims no usan símbolos scudo-específicos (sólo querían el override), seguro y reversible
(.orig-scudo). bootstrap-devfs.sh lo reproduce (paso 3a-bis).

Destrabados+promovidos: trippy (trip 0.13.0), jnv (0.7.1), presenterm (0.16.1) — antes
crasheaban rustc, ahora construyen+corren static-musl.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 16:01:37 -04:00
sergioandClaude Opus 4.8 5468010a08 Etapa G: b3sum reescrita Cargo-limpia (WIP, queda staged)
Quita el over-build de Alpine (cmake/ninja+TBB de la libblake3 C → deps samurai/onetbb
espurias). El bin b3sum vive en el miembro b3sum/ del workspace blake3; el lab inyecta
[workspace] vacío en el root ⇒ -p b3sum no resuelve + vendorea las deps del root. Queda
staged; re-importar de nix lo daría rooteado en el crate b3sum directamente.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 15:28:45 -04:00
sergioandClaude Opus 4.8 f7669073d3 Etapa G: cosecha cli-rust-4 — 11 al corpus (108→119)
Granja JOBS=4 sobre la cola recargada, toolchain 1.96: atuin/csvlens/dua/erdtree/fselect/
git-cliff/rip2/rnr/skim/television/vivid construyen+sellan static-musl y se promueven al repo
firmado. build-yield 11/20. Quedan staged 9: b3sum (recipe arreglada, retry), dprint (clang-sys
pide libclang.a estática), hck/nu (deferidos), jnv/monolith/mprocs/presenterm/trippy (triage).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 15:24:30 -04:00
sergioandClaude Opus 4.8 81ad23e8bb Etapa G: recarga la cola — tanda cli-rust-4 importada (18 staged para la granja)
import-batch sobre tandas/cli-rust-4.txt (20 entradas) → 18/20 (nix=17, alpine=1; fallaron
huniq/dua-cli por src no-clasificable). pin ancló 17 tag→SHA. Cola lista: atuin/television/
git-cliff/skim/dprint/trippy/mprocs/dua/erdtree/b3sum/vivid/monolith/presenterm/rip2/jnv/
csvlens/fselect/rnr (+ hck/nu staged previos). Techo MSRV ahora 1.96 ⇒ candidatos modernos entran.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 14:38:36 -04:00
sergioandClaude Opus 4.8 ae4daa44a5 Etapa G: ouch al corpus (107→108) — esquiva el frente C++ dropeando rar/bzip3
ouch construye+corre (0.8.0) con --no-default-features --features use_zlib,use_zstd_thin +
gueto gcc: mantiene gzip/zstd/bzip2/xz/zip/tar (deps C, gcc las compila), descarta unrar/bzip3
(deps C++: el link estático pide -lstdc++ y la libc++ de zig choca con los objetos g++). El
frente C++ general queda pendiente; ouch no lo necesita para los formatos comunes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 14:38:27 -04:00
sergioandClaude Opus 4.8 1868a2e303 Etapa G: biome al corpus (106→107) — toolchain JS/TS, cfg_select estabilizado en 1.96
biome (antes E0658 'cfg_select', macro nightly) construye+sella con 1.96. Cierra la tanda
desbloqueada por el bump: oxlint/ruff/zellij/uv/watchexec/biome = 6 al corpus.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 14:19:25 -04:00
sergioandClaude Opus 4.8 b73fcc2b70 Etapa G: watchexec al corpus (105→106) — el feature nightly se estabilizó en 1.96
watchexec (antes E0658 'debug_closure_helpers', feature nightly) construye+sella con 1.96:
la feature se estabilizó. b3:557bff16. Confirma que el bump destraba no sólo MSRV de deps
sino features de std antes nightly.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 13:44:50 -04:00
sergioandClaude Opus 4.8 565c5435c1 Etapa G: uv al corpus (104→105) — gestor de paquetes Python (astral), destrabado por 1.96
uv 0.8.x (MSRV 1.93, antes bloqueado) construye+sella static-musl con el toolchain 1.96
(zig-cc puro, sin gueto; sus deps C compilaron limpias). b3:7af4e822.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 13:31:44 -04:00
sergioandClaude Opus 4.8 c8aecf2b2f Etapa G: zellij al corpus (103→104) — multiplexor de terminal, destrabado por el bump 1.96
zellij 0.44.3 (MSRV 1.92, antes bloqueado) construye+sella con el toolchain 1.96: gueto gcc
(openssl-sys/aws-lc-sys/libgit2 en C) + deps.build=[zlib] resuelto desde recipes/ (dir corpus,
donde zlib.toml es hermano). b3:5e06634f.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 13:26:35 -04:00
sergioandClaude Opus 4.8 e393c6bd4d 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>
2026-06-22 12:48:24 -04:00
sergioandClaude Opus 4.8 420cb822df Etapa G: helix al corpus (100→101) — el editor modal construye headless
Validado el fix de gramáticas: con HELIX_DISABLE_AUTO_GRAMMAR_BUILD=1 (+ gueto gcc por
tree-house-bindings/tree-sitter + de-Alpinizado cargo-auditable→cargo build) helix 25.07.1
construye+sella estático (b3:034e12cf) y se promueve al repo firmado. Las gramáticas
tree-sitter NO se compilan en build (el sandbox es hermético, sin red); van por runtime/.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 11:32:49 -04:00
sergioandClaude Opus 4.8 c02c4fa0e0 Etapa G: xplr al corpus (99→100) + helix destraba el fetch de gramáticas
xplr construye con el gueto gcc (mlua-sys/Lua linkeaba mal _Unwind_* bajo zig-cc) → promovido.
CORPUS LLEGA A 100 recetas. helix: añade HELIX_DISABLE_AUTO_GRAMMAR_BUILD=1 — su build.rs
intentaba git-clonear 245 gramáticas tree-sitter (panic en el sandbox hermético); pendiente
de validar en la próxima construcción.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 11:15:53 -04:00
sergioandClaude Opus 4.8 a8684c98f4 Etapa G: fixes para la 3ra pasada — hck/helix/xplr (frente C-bajo-zig)
Triage de la 2da pasada, todos del mismo frente (crate Rust con dep-C que zig-cc rompe):
- helix: gueto gcc (tree-house-bindings/tree-sitter; cc-rs detecta familia con `zig -E` y falla)
- xplr: gueto gcc (mlua-sys/Lua; link suelta _Unwind_* de libgcc bajo zig-cc)
- hck: + deps.build=[zlib] (libdeflate ya pasó con gcc, ahora libz-sys pide -lz; gitui precedente)

NOTA: hck y zellij declaran zlib (corpus), pero resolve_build_dep busca $base_dir/zlib.toml y
en incoming/ no está ⇒ se construyen aparte desde recipes/ (donde zlib.toml es hermano).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 10:49:00 -04:00
sergioandClaude Opus 4.8 ff2aa48dbe Etapa G: 2da pasada de la granja — 4 al corpus (95→99) + jless diferido
Los 5 fixes de la pasada anterior validados al construir: gitoxide (max-pure mató
openssl-sys), sccache (--no-default-features), taplo y typos (eran víctimas del disco lleno,
no fallos reales) construyen+sellan y se promueven. jless DIFERIDO: la crate clipboard 0.5
es X11-only (libxcb) y removerla exige cirugía del Cargo.lock bajo --locked (clipboard-win lo
comparte rustyline) — no vale para un visor JSON teniendo jq/jaq.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 10:48:51 -04:00
sergioandClaude Opus 4.8 0aec90392a Etapa G: fixes de recetas para la 2da pasada de la granja (5 frentes)
Triage de los fallos de la 1ra pasada, adaptados por su causa raíz:
- gitoxide: feature `max-pure` (rustls+zlib-rs) en vez de `max` → mata openssl-sys
- sccache: --no-default-features (default=all arrastra backends cloud→reqwest→openssl)
- hck: gueto gcc (libdeflate-sys rompe en intrínsecos AVX512/evex512 bajo zig-cc)
- helix: de-Alpinizado `cargo auditable`→`cargo build` (auditable no está en el lab)
- jless: patch de-X11 que stubea la crate `clipboard` (arrastra libxcb, sin X11 headless)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 10:09:31 -04:00
sergioandClaude Opus 4.8 00b2cb584b Etapa G: cosecha de la granja — 7 al corpus (88→95) + descarta 4 misimports
build-farm JOBS=4 sobre la cola: bacon/cargo-nextest/cargo-watch/htmlq/jaq/joshuto/
mdbook construyen+sellan y se promueven incoming→corpus. joshuto valida que el frente
crate+dep-C (git2/libgit2-sys vendored) compila bajo el lab. Descarta 4 misimports por
colisión de nombre: dog (cat-en-C de Debian, no el cliente DNS Rust), felix (apache-felix
Java, no el file-manager), fx (json-viewer en Go, sin toolchain go), tre (libtre regex C,
no el árbol Rust). Re-pin de la próxima tanda los traerá por su crate real.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 10:09:21 -04:00
sergio 9d29e3cf40 Etapa G: starship al corpus (87->88) — zig puro, confirma que no había deadlock
starship 1.25.1 construye+corre estático con zig-cc PURO (sin gcc). Tercer binario
Rust grande (gix, árbol gigante) que completa con paciencia tras el 'deadlock' = mito:
broot/pueue/starship los tres construyen, sólo eran lentos por codegen. Publicado al
repo firmado (88). Cola: 27 staged para la próxima granja.
2026-06-21 17:29:18 -04:00
sergio 078a4a0d7d Etapa G: recarga la cola — tanda Rust #3 importada (28 staged para la próxima granja)
import-batch sobre tandas/cli-rust-3.txt (30 entradas) -> 27/30 importadas en ~2min
(nix=25, alpine=2; fallaron yazi/rip/lln por src no-clasificable). pin ancló 24
tag->SHA. Dedup de 5 ya-en-corpus. Cola = 28 recetas listas (incl. helix/nushell/
gitoxide/ruff/uv/mdbook/jaq/bacon/... + los 6 staged previos). Aplica la lección:
el import recarga en minutos; el build es trabajo de granja (build-farm.sh, paciencia
con los binarios grandes — no son deadlocks).
2026-06-21 17:16:03 -04:00
sergio edda3a742a Etapa G: broot + pueue al corpus (85->87) — NO había deadlock de link, era lento + impaciencia
Investigué la hipótesis del "deadlock de link de zig-cc" en binarios Rust grandes
(broot/pueue/starship). RESULTADO: NO HAY DEADLOCK. La evidencia:

- pueue construye+corre con zig-cc PURO (sin gcc): selló dc735889, pueue 4.0.4. En la
  granja lo había matado a los 192s creyéndolo colgado — era rustc al 99% en codegen
  del crate final (cargo no imprime durante el codegen de una sola crate grande), +
  contención de 4 workers en 8 cores. Con paciencia y sin contención, completa.
- broot construye+corre (broot 1.57.0, static). Necesita compiler=gcc SÓLO por su
  libgit2-sys (cc-rs compila C que zig rechaza — el gueto gcc ya commiteado); el LINKER
  zig anda bien, sólo es lento por el codegen del binario grande.

Probé además linker=gcc (la hipótesis) y SÍ funcionaba, pero lo REVERTÍ: (1) estaba
basado en un diagnóstico equivocado (no hay deadlock); (2) era DAÑINO para la
reproducibilidad — delta/gitui se publicaron con linker=zig, y el linker NO entra al
artifact_hash (es código del lab, no de la receta) => un binario distinto bajo el mismo
hash => cache-hit que enmascara la divergencia. Borré el broot construido con
gcc-linker del store y lo reconstruí con el código commiteado (linker=zig) => el broot
publicado (257415a8) ahora ES reproducible con el lab tal como está en git.

recetas: broot (compiler=gcc+zlib por libgit2-sys, linker zig) y pueue (zig puro)
promovidas incoming/->recipes/. Publicadas al repo firmado (87). El lab queda INTACTO.

LECCIÓN para la granja: subir el timeout/no matar builds de binarios Rust grandes
(>192s de codegen es NORMAL, no deadlock); distinguir colgado de lento por CPU del
rustc (0% = problema, 99% = trabajando), no por silencio del log de cargo.
2026-06-21 17:12:49 -04:00
sergio 640198dab4 Etapa G: cosecha de la cola tras el gueto gcc — xsv al corpus, triage final de los 8 staged
Opcion 1 (cosechar lo que el fix ya destraba). De los 9 staged:
- xsv  PROMOVIDO (85): receta Cargo limpia + el fix del importador Alpine (filtra
  el toolchain cargo/cargo-auditable de las deps). Construye+corre estatico.
- broot: el gueto gcc SI resolvio su dep-C (libgit2-sys compilo con gcc, paso las 133
  deps y llego al crate broot), PERO se cuelga en el LINK final (192s frozen, mismo
  patron que antes) -> bloqueo ortogonal = DEADLOCK DE LINK de zig-cc (frente opcion 3).
- zellij: reescrito limpio (gcc+zlib), openssl compilo, pero MSRV rustc 1.92 > 1.91.1.
- ouch (rustc 1.93), watchexec (feature nightly E0658): MSRV/nightly, bloqueo real.
- jless: libxcb/X11 (lib faltante, no toolchain).
- dog: import del paquete equivocado (un dog.c, no el cliente DNS Rust).
- pueue, starship: deadlock de link (como broot).

CONCLUSION del triage: el gueto gcc (commit previo) resolvio el frente crate+dep-C
por completo (delta/gitui , y broot/zellij pasan su C). Los 8 que quedan staged NO
son dep-C: son MSRV>1.91.1 (zellij/ouch/watchexec), DEADLOCK de link de zig-cc en
binarios grandes (broot/pueue/starship), lib faltante (jless=X11) o import roto (dog).
El proximo leverage real = atacar el deadlock de link (recuperaria broot/pueue/starship
+ vale para cualquier binario Rust grande).
2026-06-21 16:03:02 -04:00
sergio bd0b9db11f Etapa G: importador Alpine filtra el toolchain de deps + xsv limpio (84→85)
Bug que la granja destapó: el import de Alpine de crates Rust emitía cargo/cargo-
auditable como [deps] build (el path nix ya los filtra, el Alpine no) -> la receta
abortaba buscando cargo.toml. Fix raíz en alpine_import.rs: normalize() filtra el
TOOLCHAIN (cargo/cargo-auditable/rust/rustc/go/make/cmake/meson/ninja) — lo provee
el lab (BuildSys::Cargo + detectores), no es un paquete a materializar.

xsv 0.13.0 reescrito como receta Cargo LIMPIA (sin las fases 'cargo auditable build'
del abuild que pelean con el flujo del lab, sin deps de toolchain): el lab autodetecta
Cargo. Construye+corre estático (computa stats CSV). Publicado al repo (85).
2026-06-21 15:39:01 -04:00
sergio 7eef332a9d Etapa G: gitui via gueto gcc + zlib — 2da prueba del frente crate+dep-C (83→84)
gitui 0.28.1 construye+corre estatico. openssl-src (vendorea+compila openssl 3.4
desde C) compilo con gcc (CC=gcc del fix anterior) + dep zlib para -lz. Segunda
validacion del gueto gcc para build-scripts: generaliza de libgit2-sys (delta) a
openssl-sys (gitui) — el frente crate+dep-C esta resuelto con el patron
compiler=gcc + deps.build=[libs externas]. Publicado al repo firmado (84 paquetes).
2026-06-21 15:13:51 -04:00
sergio 7c1a2ac8d5 Etapa G: gueto gcc para build-scripts de crates Rust con dep-C (frente sistematico)
La granja revelo una clase entera de fallos Rust: crates con dep-C cuyo build-script
(cc-rs) compila C con zig-cc, que lo RECHAZA/miscompila (delta=libgit2-sys,
gitui=openssl-sys, jless=libc-stdhandle). Mismo frente que file/jq en C puro -> misma
solucion: el GUETO gcc.

FIX (hammer-build/lib.rs, camino Cargo nativo): cuando la receta declara compiler="gcc",
cc-rs usa CC=gcc (el Alpine musl gcc del sandbox, probado en C) para compilar el C de
las deps; el LINKER sigue siendo el wrapper zig-cc. Los .o/.a de gcc-musl y el Rust
zig-musl son ABI-compatibles (ambos musl, mismo ELF x86-64). ADITIVO: una receta Rust
sin compiler= queda en ZigCc -> baseline (ripgrep/fd/...) intacto. 2 tests nuevos.

PROBADO END-TO-END: delta 0.19.2 construye+corre ELF estatico (libgit2-sys vendorea y
compila libgit2 desde decenas de .c con gcc; + dep zlib para -lz que libgit2/libz-sys
enlazan). Publicado al repo firmado (83 paquetes). Corpus 82->83.

LEVERAGE: libgit2-sys/openssl-sys/onig_sys/libc-stdhandle aparecen en CIENTOS de crates
-> el gueto gcc (+ resolver libs externas via deps.build) destraba esa clase entera, no
solo delta. jless queda staged (su feature de clipboard pide libxcb/X11, fuera de
alcance, NO toolchain). gitui (openssl-src vendoreado) deberia construir con el mismo
patron (compiler=gcc), pendiente de correr.
2026-06-21 14:27:16 -04:00
sergio 70be258ccd Etapa G: GRANJA de build paralela — drena la cola, 11/22 al corpus (71→82)
La pieza que escala a miles: scripts/build-farm.sh construye N recetas a la vez
(worker pool xargs -P) sobre recipes/incoming/, y lo que CONSTRUYE+sella lo promueve
incoming/->recipes/ + publica al repo firmado (en serie: el index.json es mutable
compartido); lo que falla queda staged con su motivo. Idempotente (cache-hit del store).

Corrida sobre las 22 del lote Rust #2, JOBS=4 en la laptop libre (8 cores/19GB):
BUILD-YIELD 11/22 promovidos, los 11 corren static-musl (bandwhich/difftastic/fclones/
gping/grex/mcfly/miniserve/navi/onefetch/pastel/viu). Corpus 71->82, repo 82.

Los 11 fallos, FLAGEADOS por la granja (esto es el valor: triage automatico, no
adivinanza) y staged en incoming/ para revision:
- crate+dep-C bajo zig-cc (frente conocido, mismo family que el gueto gcc): delta
  (libgit2-sys), gitui (openssl-sys), jless (libc-stdhandle).
- MSRV > 1.91.1 (techo del sandbox): ouch (1.93). watchexec: feature nightly E0658.
- LINK colgado con zig-cc en binarios Rust grandes (deadlock, hubo que matarlos):
  broot, pueue, starship. Patron a investigar (zig cc + lld en binarios pesados).
- import roto (no build): xsv/zellij 'No such file' (la fuente no clasifico),
  dog (importo un dog.c ajeno, no el cliente DNS Rust).

GOTCHA infra: builds Rust grandes pueden COLGARSE en el link final con zig-cc
(broot 7min frozen, pueue/starship idem); la granja deja matar el slot
(pkill -f 'build recipes/incoming/<n>.toml') y sigue con los demas.
2026-06-21 13:36:21 -04:00
sergio 777724c036 Etapa G: promueve tealdeer/choose; muestra build-yield 5/6 (69→71)
Muestra del lote Rust #2 cerrada: eza/lsd/just/tealdeer/choose construyen+corren
(static-musl) -> 5 al corpus validado + repo firmado (71 paquetes). ouch FALLA por
MSRV (pide rustc 1.93.0; sandbox topa en 1.91.1, techo conocido) -> queda staged.
build-yield muestra = 5/6 = 83% (1 solo fallo, y por MSRV, no por toolchain musl).
2026-06-21 12:34:55 -04:00
sergio d77e629935 Etapa G: promueve eza/lsd/just del lote staging al corpus validado (66→69)
Flujo staging->corpus en accion: del lote Rust #2, los 3 primeros de la muestra
construyen+corren (ELF static-musl) -> promovidos incoming/->recipes/ y publicados
al repo firmado (69 paquetes). eza (ls moderno), lsd (ls+iconos), just (task runner).
Quedan 24 staged; se promueven a medida que la granja los construye.
2026-06-21 12:30:43 -04:00
sergio 630260f121 Etapa G: tanda Rust #2 a ESCALA — 27 recetas importadas a la cola de staging
Respuesta a "asi de a poquitos no cubrimos miles": el grueso va por LOTE, no a mano.
import-batch sobre tandas/cli-rust-2.txt (30 CLIs) -> yield import 29/30 en ~2 min
(nix=27, alpine=2; solo rargs fallo). pin-recipes anclo 26 tag->SHA. A esta tasa,
1000 paquetes ~ 1-2h de import desatendido.

ESTRUCTURA: recipes/incoming/ = COLA DE STAGING (el import vuelca en masa); recipes/
= corpus VALIDADO (construye+corre) del que build-repo.sh arma el repo firmado. La
granja/CI promueve incoming->recipes a medida que cada uno construye. Asi el corpus
mantiene su invariante sin frenar la importacion masiva.

27 recetas staged (todas parsean): eza lsd zellij starship just delta difftastic
gitui broot choose dog gping grex jless miniserve navi onefetch pastel pueue tealdeer
watchexec xsv bandwhich fclones mcfly viu ouch.

Build-yield (muestra en curso): eza OK, lsd OK (static-musl ELF). El resto se ancla
progresivamente. Las recetas a mano de las tandas previas (libs/gueto/lib+bin) fueron
para endurecer el importador en los casos duros; el largo tail navega por este lote.
2026-06-21 12:27:30 -04:00
sergio 8458602687 Etapa G: nano — editor de texto al userland (65→66)
nano 9.0: editor de terminal real, segundo consumidor de ncurses tras htop/less
(API curses widec). deps.build=[ncurses, linux-headers]; gueto gcc; sale static-pie
y corre. Redondea el userland con un editor de verdad. --disable-libmagic/-nls
(libmagic/gettext no en corpus, sólo autodetección/i18n). Publicado al repo (66).
2026-06-21 12:07:50 -04:00
sergio f73e226836 Etapa G: 4 init helpers de arje — userland de arranque (61→65)
Pueblo el userland de ARRANQUE real del distro con los helpers del init arje
(hermanos de arje-zero PID 1), patrón Cargo commit 9967b02c --locked estático:
- arje-getty-stub: agetty mínimo (ciclo de vida del login).
- arje-net-bring-up: oneshot que sube el enlace de la primera interfaz (corre: eth0 up).
- arje-installer: copia kernel+initramfs+seed a una ESP / arma USB GPT booteable.
- arje-absorb: traduce la config de otro init a una Semilla brahman (migración a arje).

Los 4 construyen+corren estáticos, publicados al repo firmado (65 paquetes).

GOTCHA recetas Cargo con lib+bin: arje-installer tiene [lib]+[[bin]]; el lab hace
'cargo rustc -p X -- <crt-static>' y cargo exige UN solo target tras '--' => agregar
'--bin <name>' a flags. arje-loader DESCARTADO: bootloader EFI (no_std, target uefi),
no static-musl userland.
2026-06-21 12:06:07 -04:00