Commit Graph
224 Commits
Author SHA1 Message Date
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
sergio 3ec01bf788 Etapa G: tinkuy-sim + mirada-ctl — más apps tawasuyu (59→61)
Sigo poblando con apps propias de tawasuyu (patrón Cargo, commit 9967b02c --locked,
estático zig-cc, bin==package, reusan el árbol fuente):
- tinkuy-sim: simulador de dinámica molecular Lennard-Jones; corre 200 steps de 343
  partículas con reporte BLAKE3 por step (cómputo puro determinista).
- mirada-ctl: control CLI del compositor mirada (estilo swaymsg/hyprctl, cliente IPC).

Ambos construyen+corren estáticos, publicados al repo firmado (61 paquetes).

uya-cli DESCARTADO: requiere la lib de audio alsa (alsa-sys/libasound C), no en el
corpus -> fuera de alcance hasta portar esa lib. Texture honesta: no toda app
tawasuyu es static-musl pura; las que tocan audio/GPU/p2p necesitan libs o no aplican.
2026-06-21 11:54:27 -04:00
sergioandClaude Opus 4.8 a14d888321 Etapa F: cierra el hilo userland — el producto arma su userland desde el repo FIRMADO
Hasta hoy el bootstrap del producto hidrataba el userland desde recetas locales
hardcodeadas (build_components sobre USERLAND_COMPONENTS/SERVICE_COMPONENTS). Cierre
del dogfood: la IMAGEN ahora puede armar su userland por la CADENA DE SUMINISTRO de
paquetes — verifica la firma del release y REPRODUCE cada componente desde su .swm.

hammer-bootstrap:
- product_from_repo(base, repo, trust, ...): igual que product() pero el userland +
  servicios salen de install_components_from_repo en vez de build_components.
- install_components_from_repo: verifica firma del release (exige TRUSTED), por cada
  componente resuelve el cierre de deps + puebla el catalogo dep.toml + reproduce el
  source_patch con build_source_patch (chequea el expected_hash anclado). Devuelve los
  mismos (nombre,hash) que build_components.
- seal_product_rootfs: pasos 2-3 comunes extraidos (seed+hash+ensamblado+sellado).

hammer-cli: bootstrap product --from-repo DIR --trust DIR.

PROPIEDAD CLAVE VERIFICADA E2E: como el hash es por-CONTENIDO, reproducir desde el
.swm da los mismos (nombre,hash) que construir la receta -> el product-rootfs via
repo firmado es BIT-IDENTICO al hardcodeado (ambas vias -> ba351f1b). Firma del
release verificada (TRUSTED by release) antes de tocar nada. "Verificar, no confiar"
aplicado al propio ensamblado de la imagen. 40 tests bootstrap verde.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 11:46:11 -04:00
sergio 3429bcf1d4 Etapa G: agora-cli + cosmos-cli — más apps tawasuyu al catálogo (57→59)
Sigo poblando con apps propias de tawasuyu (mismo patrón Cargo, commit 9967b02c
--locked, estático zig-cc, bin==package, reusan el árbol fuente fetcheado):
- agora-cli: shell del ágora (identidad/atestaciones/grafo firmado), deps livianas.
- cosmos-cli: cliente del servicio de cómputo astronómico (usa tokio, build sano musl).

Ambos construyen+corren estáticos y publicados al repo firmado (59 paquetes).
2026-06-21 11:37:51 -04:00
sergio 4eea475bab Etapa G: dominium-cli — primera app propia de tawasuyu poblada (corpus 56→57)
Poblar el catálogo no es sólo CLI de terceros (Rust/C): tambien las APPS PROPIAS
del monorepo tawasuyu. dominium-cli es el runner headless del simulador físico de
dominium — patrón Cargo igual que arje-zero/llimphi-counter: source = tawasuyu a
commit fijado 9967b02c (con Cargo.lock committeado -> build --locked reproducible),
-p dominium-cli, estático zig-cc. bin==package (sin mismatch de workspace). Cómputo
puro (clap+serde+physics), sin GPU/red. Comparte commit con arje-zero -> reusa el
árbol fuente fetcheado.

Construye+corre: simulación de 100 ticks a 62k tps con métricas Gini/Moran.
Dogfood e2e: publicado al repo firmado (57 paq) -> install --require-signed ->
trusted -> reproduce desde fuente (hash casa) -> hidrata -> corre.
2026-06-21 11:24:01 -04:00
sergio a9cba5002e Etapa F dogfood: fix bug de patch en install (.swm con patch + build-dep)
Dogfoodear el corpus entero (build-repo.sh: 55/56 con expected_hash anclado, repo
firmado Ed25519) destapó un bug latente en la reconstruccion desde .swm: el path
del patch se prefijaba con el catalogo (swm-recipes/) TRES veces, y el install
abortaba con 'No such file'. jq es el PRIMER paquete con patch + build-dep que se
instala (fd/bwrap no tienen patch) -> nunca se habia ejercido ese camino.

Causa: recipe_from_source_patch metia catalog_dir en el path Y synthesize_recipe lo
re-unia a base_dir, redundante con el base_dir.join(p) que el lab hace al construir
(fetch::apply_patches / Recipe::hash). Fix: source.patches guarda solo el NOMBRE
relativo a base_dir; un unico join lo resuelve. El hash usa el CONTENIDO del patch,
no el string del path -> el expected_hash anclado sigue casando.

Verificado e2e: install jq desde el repo firmado -> trusted -> reproduce desde
fuente (hash e770e04d = el anclado) -> patch aplicado -> 18 ficheros hidratados ->
registrado en DB -> jq corre. + test de regresion inline_patch_resuelve_con_un_solo_join.
2026-06-21 11:12:52 -04:00
sergio 371d2f7cce Etapa G: htop — consumidor TUI canónico de ncurses (55→56)
htop 3.5.1 ejerce la API curses real de ncurses (ventanas/teclado/colores widec),
no sólo el lookup de terminfo de less. deps.build=[ncurses, linux-headers]; sale
static-pie y corre (--version). Valida ncurses como lib TUI completa del corpus.

Ajustes sobre el import: quito lm-sensors (opcional, no en corpus) con
--disable-sensors; gueto gcc (zig-cc miscompila); auto-detecta ncursesw widec.
2026-06-21 10:59:32 -04:00
sergio cbca6143f0 Etapa G: ncurses + less — lib TUI/terminfo al corpus (53→55)
ncurses es la lib fundacional del userland TUI (destraba less/htop/top/nano/ncdu).
La importo de Alpine pero RE-ANCLADA al release ESTABLE 6.5 de GNU (pineable; el
import traia el snapshot semanal de invisible-mirror, no reproducible) y
SIMPLIFICADA a estatico widec (--without-shared --enable-widec), sin el binding
C++ (rompe contra el libstdc++ del host) ni la maraña .so del APKBUILD. El install
crea los symlinks libncurses/libtinfo/libcurses -> libncursesw para que un
consumidor que enlaza -lncurses/-ltinfo resuelva.

less 704 es el primer CONSUMIDOR que lo valida: deps.build=[ncurses], enlaza
-ltinfo, sale static-pie y pagina. Confirma ncurses usable como lib del corpus.

Notas: gcc del lab = Alpine musl gcc (x86_64-alpine-linux-musl, no glibc) -> mezcla
limpia con objetos zig-cc/musl. gueto gcc en ambos (el build de ncurses corre tic
para generar terminfo; zig-cc lo miscompila). Corpus 53->55.
2026-06-21 10:57:59 -04:00
sergio 74baaf3130 Etapa G: oniguruma + jq destrabados — lib de regex al corpus (51→53)
jq estaba bloqueado por su lib de regex faltante. Importo oniguruma de Alpine
(lib build-dep como zlib/libcap: el lab apila libonig.a + oniguruma.pc en /usr)
y cableo jq con deps.build=[oniguruma].

Fricciones C resueltas, documentadas en las recetas:
- oniguruma: el archive/ de GitHub no trae configure (Alpine corre autoreconf,
  pide autoconf/automake/libtool ausentes del corpus); uso el tarball de RELEASE
  que sí trae configure pregenerado -> sin autoreconf.
- jq: gueto gcc (zig-cc lo miscompila -> segfault, igual que file). Estático vía
  libtool requiere -all-static en make Y en make install (libtool relinkea al
  instalar y descartaba el flag -> binario dinámico). Ahora jq sale static-pie.
- el import emitia sed como build-dep; es herramienta del sandbox, no lib -> la quito.

Ambos construyen+corren: jq-1.8.1 static-pie evalua JSON. Corpus 51->53.
2026-06-21 10:52:45 -04:00
sergioandClaude Opus 4.8 89061cac03 Etapa G: tanda C tier-2 construye+corre — 6 al corpus (45->51) + wrap abuild local
BUILD-YIELD C MEDIDO (no especulacion): 6/8 de la tanda construyen+corren como ELF
estatico musl. Promovidos: file 5.47, gawk 5.3.2, gzip 1.14, tar 1.35, tree 2.3.2,
which 2.23 (+ sus parches musl de Alpine).

Texture honesta del tier-2 C (la friccion que el tier-1 Rust no tiene):
- gawk/tar/tree/which: zig-cc directo, sin tocar nada.
- file: zig-cc MISCOMPILA -> el `file` recien hecho segfaultea generando magic.mgc
  (mismo sintoma que binutils). Escape compiler="gcc" -> construye.
- gzip: (1) configure "C compiler cannot create executables" con zig-cc -> compiler="gcc";
  (2) luego el install fallaba por `local i;` de la package() de Alpine.
- jq (oniguruma), sed (perl): NO build-friction sino dep faltante en el corpus
  (completitud) -> quedan pendientes hasta importar esas libs.

Fix generico que destrabo gzip (y futuros): el importador Alpine ENVUELVE el cuerpo de
build()/package() en una funcion shell. abuild los corre COMO funciones (donde `local`
es valido); el lab corre la fase plana bajo sh -c, donde `local` fuera de funcion es
error. Envolver restaura el contexto de abuild sin tocar el sandbox ni las fases planas
del corpus (solo lo importado). test translate_wraps_body_in_function_for_local.

Confirmado: los 6 binarios corren (--version). file/gzip llevan compiler="gcc" en su
receta (escape declarativo, gueto conocido).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 10:07:08 -04:00
sergioandClaude Opus 4.8 db84ee6647 Etapa G: tanda C tier-2 — import-batch PREFER=alpine + importador separa runtime depends
Arranca el tier-2 de la escalera (C clasico via Alpine, que trae los parches musl):

- import-batch.sh: env PREFER=nix|alpine. Para tandas C, PREFER=alpine antepone Alpine —
  el import de nix de un C tiene exito (tarball) pero SIN parches musl => romperia al
  construir. Refactor a 'tiers' ordenados (misma escalera, dos sentidos).
- tandas/cli-c.txt: primera tanda C (tree/which/sed/gawk/gzip/tar/jq/file).
- importador Alpine: build-deps = SOLO makedepends. El depends de abuild es RUNTIME
  (gzip depends=less para zless) — no hace falta para compilar y rompia hammer build
  (buscaba recipes/less.toml). Ahora va como comentario de provenance. Mismo patron que
  el fix de buildInputs-de-nix en recetas Rust.

VALIDADO: import C 8/8 desde Alpine/main con parches musl bajados; gzip pierde el less
espurio. test extracts_source_patches_deps_phases actualizado (depends != build-dep).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 10:00:35 -04:00
sergioandClaude Opus 4.8 e83542a4a9 Etapa G: primera tanda a escala — 11 CLI Rust construyen+corren (corpus 34→45)
Arranca el escalado del catálogo con la tanda tier-1 (tandas/cli-rust.txt) por el
pipeline completo: import-batch (escalera) → pin (tag→SHA) → build (medir) → promover.

BUILD-YIELD MEDIDO (no especulación): 11/12 de la tanda construyen+corren como ELF
estático musl en el lab. Los 11 promovidos al corpus:
  bat 0.26.1, bottom 0.12.3, dust, fd 10.4.2, hexyl, hyperfine, procs, sd, tokei,
  xh 0.25.3 (rustls, no openssl), zoxide.
(ripgrep ya estaba en el corpus con su patch jemalloc; no se duplica.)

El primer corte dio 8/12: los 4 con deps fallaban por buildInputs espurias de nix
(bat→zlib, fd→jemalloc, ripgrep→pcre2, xh→openssl) — backends C que el build Rust por
defecto NO usa. Arreglado en el importador (commit anterior): re-importados bat/fd/xh
SIN [deps] → los 3 construyen (bat 372s, fd 251s, xh 413s). Sube 8/12 → 11/12.

Verificado: los binarios CORREN (fd/bat/xh --version), estáticos musl stripped.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 09:47:52 -04:00
sergioandClaude Opus 4.8 8913eae26b Etapa G: el importador nix NO emite buildInputs como [deps] en recetas Rust
Hallazgo al escalar la primera tanda (12 CLI Rust): `hammer build` resuelve las deps
relativas al dir de la receta y aborta si falta `recipes/<dep>.toml`. Las recetas Rust
importadas arrastraban los buildInputs de nix como `[deps]` activas — pero nix lista el
closure MAXIMAL (todos los backends C opcionales: zlib/pcre2/openssl/jemalloc), mientras
el build Rust del lab usa las features DEFAULT de cargo (backend Rust puro: miniz_oxide
vs zlib, rustls vs openssl) o las deja opt-in (pcre2). bat→zlib, fd→jemalloc,
ripgrep→pcre2, xh→openssl fallaban al instante por deps espurias.

Las recetas Rust validadas del corpus (ripgrep/uutils) NO declaran `[deps]`: cargo
resuelve el grafo por vendoring; un sys-lib C que SÍ haga falta es adaptación per-paquete
(patch/feature, p.ej. ripgrep-no-jemalloc), no una dep de corpus.

- is_rust ⇒ los buildInputs quedan como COMENTARIO de provenance (no se pierden: señalan
  qué C podría necesitarse), no como `[deps]`. Imports C (no-Rust) intactos.
- test rust_buildinputs_are_not_active_deps; filters_nix_stdenv_noise (C) sigue válido.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 09:09:19 -04:00