1295 Commits
Author SHA1 Message Date
sergioandClaude Opus 4.8 aeef6fe7e4 Etapa G: 2da cosecha del worker VPS — 9 promovidos (corpus 211→220)
Construidos en el VPS Hetzner, cosechados al hub (rsync store↓ + cache-hit):
atac (API TUI), cargo-mutants, cargo-readme, cargo-semver-checks, cargo-sort,
ddh (dup finder), fcp (cp rápido), git-igitt (git TUI), git-quick-stats.
8 ELF static-musl + git-quick-stats (script bash, portable). El laptop no
compiló nada de esto.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 06:23:12 -04:00
sergioandClaude Opus 4.8 b61815a602 Etapa G: worker auto-escala JOBS a nproc (resize del VPS sin tocar config)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 06:11:30 -04:00
sergioandClaude Opus 4.8 d1e4daccff Etapa G: PRIMERA cosecha del worker VPS — 5 promovidos (corpus 206→211)
cargo-careful, cargo-cyclonedx, cargo-feature, cargo-flamegraph, cargo-insta:
construidos ÍNTEGRAMENTE en el VPS Hetzner, cosechados al hub (rsync store↓ +
build-farm cache-hit → promote + firma). El laptop NO compiló nada de esto.
Todos ELF static-musl. Pipeline distribuido trustless validado end-to-end.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 05:40:46 -04:00
sergioandClaude Opus 4.8 7b7cf0a996 Etapa G: cosecha cli-rust-10 — 11 promovidos estáticos (corpus 195→206)
Granja laptop sobre cli-rust-10: build-yield 11/18, todos ELF static-musl:
cargo-component, cargo-dist, cargo-llvm-cov, cargo-make, cocogitto, committed,
dotenv-linter, git-branchless, jujutsu (jj), netscanner, systemctl-tui.
7 staged (cargo-release/convco/dnspeep/feroxbuster/git-stack/git-trim/selene).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 05:05:03 -04:00
sergioandClaude Opus 4.8 5486dbab6f Etapa G: fuel-1 — cola profunda para el worker VPS (incoming +48 pineadas)
import-batch fuel-1 (95 candidatos): yield 65/95, dedup vs corpus/deferred →
~57 nuevas pineadas a incoming/. Empujadas al worker Hetzner (rsync aditivo);
69 recetas en su cola = ~1 día de molienda a 2 cores sin idle.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 04:50:03 -04:00
sergioandClaude Opus 4.8 f9a60ed469 Etapa G: fixes del kit de granja distribuida (validados en VPS Hetzner real)
Tres frentes que aparecieron al provisionar un CCX13 (Ubuntu 24.04) de verdad:
- bootstrap-devfs §3b: el loader musl-256-keys ahora DETECTA la versión del
  rootfs (apk db) en vez de hardcodear 1.2.5. Alpine edge avanzó a musl 1.2.6 ⇒
  un loader 1.2.5 vs coreutils 1.2.6 da `renameat2: symbol not found` → chmod
  roto en el sandbox → el wrapper zig-cc no queda +x → EACCES. case con sha de
  1.2.5 y 1.2.6, die si aparece una nueva.
- vps-setup §2b: compila bubblewrap 0.11.2 si el de la distro no soporta
  --overlay-src (Ubuntu 24.04 trae 0.9.0 sin overlayfs; el sandbox lo necesita).
- farm-sync: excluye /.scratch (44G de fuentes mrustc/rustc) + *.png/content*
  del rsync al worker (casi copia 44G de más).

Smoke test en el VPS: builds compilan código real (pasan cc/chmod), rustc 2
cores al 93%, RAM holgada. Worker funcional.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 04:35:57 -04:00
sergioandClaude Opus 4.8 d949d10dcd Etapa G: kit de granja distribuida (worker VPS hub-and-spoke)
Paraleliza el build a un/varios VPS sin exponer gitea ni la clave de firma.
Modelo: el laptop es el HUB (firma + gitea); el worker sólo construye la cola
incoming/ y sella al store local (PROMOTE=0). Reproducibilidad bit-a-bit +
content-addressing ⇒ el store del worker es byte-idéntico, se rsync-ea de vuelta
y el hash valida solo (no hay que confiar en el VPS).

- vps-setup.sh: provisiona Debian/Ubuntu (deps, userns p/bwrap, swap 16G,
  rustup, build hammer, bootstrap-devfs rootfs Alpine edge, systemd unit).
- farm-worker-loop.sh: loop autónomo 24/7, PROMOTE=0, watchdog de disco
  integrado; muele lo que haya sin esperar al hub.
- hammer-farm.service: systemd, JOBS=2 (CCX13 = 2 vCPU dedicado), Nice/idle-io.
- farm-sync.sh (hub): rsync código+cola arriba, store sellado abajo,
  promote+firma+commit+push. Acceso único laptop->VPS por SSH.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 03:50:43 -04:00
sergioandClaude Opus 4.8 97118483d0 Etapa G: triage cli-rust-9 — 5 wins de los fallos (corpus 190→195)
Recuperados de los 16 fallos de la tanda nocturna con fixes documentados:
- rink 0.9, cargo-udeps: openssl-sys "Could not find OpenSSL" → dep openssl
  (dispara OPENSSL_DIR/OPENSSL_NO_VENDOR; el lab linkea la openssl del corpus).
- cargo-cache 0.8.3: git2/libgit2-sys C vendored → compiler=gcc + deps openssl/zlib.
- gptman 1.1: el bin requería la feature `cli` → flags --features cli.
- amp: faltaba -lz → dep zlib (en corpus).
Todos ELF static-musl verificados (`file ... statically`).

Diferidos a .deferred (frontera): tabiew (polars compila >1h a codegen-units=1,
construible pero lentísimo), websocat (E0119 trait impls), zee (E0080 const-eval),
+ misimports amber/flamegraph(Perl)/yj(Go)/ncdu(Zig), cargo-spellcheck (hunspell
C++), sfz (open64 glibc≠musl), tickrs (Cargo.lock), cargo-license (crates.io 403).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 01:32:30 -04:00
sergioandClaude Opus 4.8 71e43c5e42 Etapa G: tanda nocturna cli-rust-9 — 20 promovidos estáticos (corpus 170→190)
Granja nocturna JOBS=4 + watchdog de disco (drena work/sources no-activas
cada 3 min ⇒ disco acotado, no se llenó). import 38/45 → 36 a cola →
build-yield 20/36. Todos ELF static-musl que corren:
bingrep 0.12, cargo-deb 3.7, cargo-llvm-lines 0.4, cargo-modules 0.26,
cargo-wipe, cargo-zigbuild 0.22, cpc 3.0, csview 1.3, dufs 0.46,
fastmod 0.4, git-graph 0.7, jql 8.0, kibi 0.3, ox 0.7, ruplacer 0.10,
rustic 0.11, simple-http-server 0.8, ttyper 1.6, xan 0.59, zenith 0.15.

16 fallos quedan staged en incoming/ para triage (frontera de libs C /
imports rotos). Verificado `file ... statically linked` en los 20.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 00:31:08 -04:00
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