DOS ERRORES MÍOS, uno de dirección y otro técnico, los dos en la cosecha automática:
1. DIRECCIÓN: declaró `busybox` como dep en 29 recetas — cuando la Etapa C lo está
ELIMINANDO (USERLAND_COMPONENTS=[uutils,findutils,…], ya cerrada; joyas-reusables
§5 lo confirma: "uutils… Ubuntu 25.10 los envía como default"). Estaba cimentando
la deuda que el roadmap borra.
2. TÉCNICO: busybox YA está en el runtime base de harkaq (`ro /bin/busybox`, `ro
/bin/sh` — el sandbox corre `sh -c` y /bin/sh→/bin/busybox). Es CONTRATO, no dep.
Declararlo apila el busybox de hammer sobre el de Alpine y ROMPE el build:
binutils daba "cannot run C compiled programs" en las DOS máquinas. Verificado:
sin busybox declarado, binutils construye (b3:f4507dcd…). Y la cadena se explica:
binutils roto ⇒ zlib (que lo declara) tampoco construía.
Auditoría de la cosecha (diff real, no la línea completa del +): añadió sólo 5 deps
distintas — make ×73, busybox ×29, perl ×8, pkgconf ×5, binutils ×1. Sólo busybox
estaba mal; las otras 4 son deps reales medidas. busybox revertido de 30 recetas
(queda sólo en busybox.toml, pre-existente).
Es el mismo error que ya me habían señalado con otro disfraz: MEDIR BIEN Y ACCIONAR
MAL. harkaq midió correcto (el build toca /bin/busybox: es el shell); la acción
correcta no era declararlo sino reconocerlo como contrato.
+ COORDINACIÓN del §3 con Fable 5 (mismo diseño, tareas repartidas):
- Su lección casper queda CONFIRMADA y REFORZADA: la clausura de build no sólo le
FALTAN las clases del mundo (offline) — también le SOBRA casi todo (headers, gcc).
Medido: htop (estático, 0 NEEDED) no toca NADA al correr ⇒ política = su binario.
- Su "la clase viaja como campo de la ConcesionCapacidad, sin formato nuevo" se
cumple LITERALMENTE: lo firmado es format::Permisos = u32 bitmask en 36 bytes
canónicos (Ring 0) ⇒ las clases SON los bits. La cripto no se toca.
- Diseño unificado: frontera (clases, u32, declaradas) + detalle (paths, Landlock,
medidos). D3 rige en ambos.
- Reparto: clases→Fable 5; medición/harness→Opus. CONTACTO: runtime-policy.sh ahora
emite la CLASE detectada (/etc/resolv.conf→dns, /etc/ssl/certs→tls-certs, …), no
sólo el path: la medición alimenta la tabla, la tabla decide el bit.
- Consumidor esperando: plan-jaula-juegos F1 (Steam que no puede leer ~/.ssh).
+ juez.sh (§10): nombre único por corrida (con uno fijo pega en caché ⇒ falso
"sin evidencia"). Fue el juez quien destapó todo esto en su primera corrida real.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Cierra el userland foundational: foot (terminal Wayland) + su cadena de libs → canónicas + repo
firmado. incoming-clib queda VACÍO (todo el base-system promovido). Front (d) COMPLETO a nivel build.
b3:2e8e1b2d. Cierra el userland foundational. Patrón meson estilo fcft, -Dprefer_static=true
(fontconfig.a arrastra expat), -Dgrapheme-clustering=enabled (utf8proc). link=dynamic (pixman
canónica es .so-only, la misma de mirada). Trampa real: zig 0.16/clang21 daba un binario que
SIGSEGV antes de main (relro→NULL) → zig_version=0.13.0 como pixman/wayland. foot+footclient
--version OK. Runtime: necesita compositor Wayland (frente mirada) + TERM/terminfo aparte.
b3:9cdb6274. Patrón meson --default-library=static -Ddocs=disabled -Dsvg-backend=none. deps:
tllist+utf8proc+freetype+fontconfig+harfbuzz+pixman (+libpng/zlib/expat por .pc transitivos).
Todas las deps de foot ya existen.
b3:f9de6d2a. deps = cadena canónica sellada (libgpg-error/libgcrypt/libassuan/libksba/npth/zlib).
Fase configure explícita --disable-{tofu,scdaemon,dirmngr,doc,bzip2} + --with-*-prefix=/usr. gpg+gpgv
estáticos; round-trip cifrado simétrico -c/-d + --print-md SHA512 verificados. Nota: NO apareció el
ubsan de libz.a (el zlib limpio de este mismo commit-set ya se materializa). base-system-3 completo.
b3:a141de41. Patrón meson -Dprefer_static=true (sin él meson enlaza libudev.so → link estático falla).
deps: libusb (nueva) + libudev-zero (stub del catálogo, satisface la dep dura de libudev>=196 en
meson.build; hwdb name-lookup queda stub pero lsusb corre). Cierra el chain libusb→usbutils.
b3:14ab12e0. Lib 3/3 de la cadena gnupg. Fase configure explícita --with-libgpg-error-prefix=/usr
--enable-static. deps: libgpg-error+linux-headers+pkgconf. La cadena crypto de gnupg está completa.
b3:f6a4fa5f. Fase configure explícita --disable-udev (backend netlink/sysfs) --enable-static.
Deja libusb-1.0.a + .pc + header para que usbutils la halle.
b3:d4aa8f26. deps→linux-headers; fase configure explícita --enable-mpers=no --without-{libunwind,
libdw,libselinux}; make -C src (tests/ rompe con zig cc -E - por -mcpu= vacío). Deuda menor: zig
FUERZA sus headers UAPI por delante de -I (io_uring zcrx tiene 2 campos más nuevos que zig) → quité
esas 2 líneas de decode; strace traza todo lo demás igual.
b3:a07b7b14. Suite completa estática. Fase configure explícita --without-{libbsd,libpam,fcaps}
(libbsd ausente→usa readpassphrase de fábrica; fcaps→setcap falla en sandbox); make LDFLAGS=-all-static
(libtool ignora -static, gotcha util-linux); limpié install de pam.d de aports. Habilita usuarios
reales (antes sólo root).
b3:a7b8a634. Quité shared-libmandoc.patch (forzaba .so); fase configure explícita que escribe
configure.local (PREFIX=/usr, LDFLAGS=-static, CC='zig cc'). 3er caso del libz.a-UBSan: acá se
resuelve fijando CC=zig cc (su compiler-rt trae __ubsan_handle_*). TODO durable: rebuildear zlib
sin instrumentación UBSan (afecta a todo lo que linkee libz.a estático).
b3:b87f0307. deps→linux-headers (perl/bash eran el fallo de carga). El tarball trae el Configure
viejo (sh, no autotools) → ./Configure -n linux + make CC='cc -static' (Configure genera su propia
línea de link que ignora los LDFLAGS del lab).
b3:e6f71fc4 (procps-ng 4.0.6). compiler=gcc gueto + ncursesw + -no-pie (patrón vim), fase configure
explícita --without-systemd --enable-static. Gotcha: patch a un .am dispara regeneración automake
(ausente) → reordené timestamps de fuentes en configure para saltarla. Herramientas de proceso base.
b3:e9b90fe2 (kbd 2.8.0). deps→flex+linux-headers; fase configure explícita --disable-vlock/tests.
Gotcha del incoming-clib compartido: patches con nombres genéricos (busybox.patch/tests.patch) eran
de STRACE, no de kbd, y rompían el build → patches reducido a [lex.patch]. Cierra el lazo del keymap
que el instalador interactivo ya recogía pero no podía aplicar.
b3:b6ac56cf. make ZLIB=no SHARED=no (sin autotools). Nota recurrente: el libz.a canónico está
instrumentado con UBSan → link estático falla con __ubsan_handle_* (mismo issue que mordió a git);
acá zlib es opcional (pci.ids sin comprimir) → ZLIB=no. TODO durable: rebuildear zlib sin ubsan.
Los 17 que construyen de la tanda base-system-1 pasan de recipes/incoming-clib a recipes/
canónicas y al índice firmado (dist/repo, artefacto local): bash git sudo doas util-linux
rsync sed tzdata dbus dhcpcd iproute2 iputils dosfstools e2fsprogs parted vim ca-certificates.
Sólo foot queda staged (stack Wayland, diferido). Cierra el grueso del hueco 'userland
foundational' hacia la distro completa: shell real + VCS + privilegios + red + disco + TLS.
b3:d0d0ebaa (util-linux 2.42.2). De-Alpinizado (deps→linux-headers), fase configure explícita
--without-{python,systemd,udev,ncurses,...}. Bug real del lab parcheado: zig cc -mcpu=baseline
traduce a -mcpu= VACÍO en modo preprocesador (-dM -E -) que zig rechaza; sed filtra ese flag sólo
en tools/all_{errnos,syscalls}. Estáticos vía --enable-static-programs=blkid,fdisk,mount,umount;
lsblk/lscpu quedan musl-dinámicos (libtool ignora -static). Utilería base del sistema.
b3:64b797d2. Reescribí las fases garabateadas (compile hacía _perl_config; install compilaba la
suite de tests) a make all/install limpios con NO_GETTEXT/TCLTK/PYTHON. deps zlib/openssl/curl/
pcre2. Gotchas: FUZZ_PROGRAMS= (oss-fuzz usa --allow-multiple-definition que ld.lld rechaza);
-fsanitize=undefined en compile+install IDÉNTICO (libz.a trae refs __ubsan_* + git relinkea si
GIT-CFLAGS difiere entre fases). El hueco más grande del userland, cerrado.
b3:3d7bb8a7. --disable-device-mapper (sin lvm2) --enable-static; make LDFLAGS=-all-static
(libtool ignora el -static del lab → binario musl-dinámico que segfaultea fuera del sandbox).
parted EXIGE libuuid (uuid_generate p/ GUIDs GPT) y util-linux está roto → horneé una libuuid
mínima (UUID v4 desde /dev/urandom) en la fase configure. Probado: mklabel gpt + mkpart reales.
TODO: reapuntar a la libuuid real de util-linux cuando ésta compile.
b3:d0b9752d. URL/sha256 arreglados (var abuild sin expandir); fase configure explícita;
--without-pam/sssd/skey + --with-secure-path. Clave del link: --disable-shared
--enable-static-sudoers --disable-log-{server,client} (sin eso ld.lld falla por símbolos
versionados sudo_*_v1 de libsudo_util). Install con INSTALL_OWNER= (setuid lo re-aplica la
hidratación). Con doas cubre el escalado de privilegios.
b3:c5a52051. Un solo cambio: [deps] build=[openssl]. La premisa era falsa: c_rehash es un binario
C (no el script perl) que sólo faltaba -lcrypto; perl SÍ está en la dev-fs (mk-ca-bundle.pl corre).
ca-certificates.crt con 119 certs + update-ca-certificates. Sin esto curl/wget HTTPS no validan.
b3:1fdc6fdd. Console-only (--disable-gui --without-x, sin intérpretes). Gotchas: zig-cc
miscompila vim → compiler=gcc (como nano/htop); ncurses del corpus es widec-only (--with-tlib=
ncursesw); termcap usa reubicaciones R_X86_64_32 sobre _nc_globals que no entran en static-PIE →
-fno-pie/-no-pie; vim_cv_* cacheadas para no colgar en musl estático; fase configure explícita.
b3:e2d2244d. configure --without-pam ya andaba (bison=yacc para parse.y); el fallo era el install
(chown root:root falla en el sandbox + doas.conf de aports ausente) → copia manual del binario.
b3:6b4f0397. Raíz del fallo: el tarball IANA tzcode NO trae los datos de zona (y el combinado
es .tar.lz sin lzip acá). Cambié [source] a git github.com/eggert/tz @ tag 2026b (código+datos
juntos, commit fijo ADR 0006), quité los patches de posixtz (no lo construimos), fases = zic →
DESTDIR posix_only. Habilita la zona horaria real del instalador interactivo.
iputils 20250605 estático (b3:669520e9). Migré de la shell abuild al patrón meson estándar
(samurai=ninja + meson canónicos), docs off (BUILD_MANS=false) para no arrastrar docbook-xsl,
LTO off. libcap:yes.
dhcpcd 10.3.2 (b3:aaeda08e), INET/IPv6/DHCPv6/PRIVSEP. Sólo sobraba bsd-compat-headers
(dhcpcd trae su propio compat/) + una línea install de dhcpcd.initd de aports. Con iproute2
completa el bring-up de red del sistema.
e2fsprogs 1.47.4 (b3:3cf73aea): mke2fs, e2fsck, mkfs.ext2/3/4. Quité fuse3, --disable-elf-shlibs
+ --enable-static + --disable-fuse2fs. Junto a dosfstools completa el herramental de disco real
que hoy el instalador cubre con busybox mke2fs.
rsync 3.4.4 estático (b3:40dbac6f). Gotcha: sin fase [build.phases] configure propia,
hammer autogenera su ./configure e ignora los --disable-* de la receta ⇒ hay que declararla.
Flags: --disable-{acl,xattr,xxhash,zstd,lz4,openssl} --with-included-{popt,zlib}. Quité las
build-deps ausentes y las líneas install de ficheros de servicio Alpine (rsyncd.initd/conf).
b3:a03c1ad5. Arreglé el tarball (URL con vars abuild sin expandir → bash-5.3.tar.gz
limpio + sha256), readline embebido (--without-installed-readline), quité --with-curses
(link estático) y las líneas install de bashrc/profile inexistentes. deps: ncurses+readline
+linux-headers. Primer shell POSIX completo del userland (hasta ahora sólo busybox sh).
iproute2-7.1.0 (b3:f05e947f). Quité build-deps ausentes (iptables/libmnl/elfutils/
libcap/bash) y desactivé sus features (HAVE_MNL=n HAVE_ELF=n HAVE_CAP=n HAVE_SELINUX=n)
para el 'ip'/'ss' base de la red del sistema.
mkfs.vfat/fsck.fat 4.2 estático (b3:6fdabec4) para la ESP del instalador. La receta
ya usaba ./configure directo; sólo sobraban las build-deps de regeneración autotools.
Primer esencial del userland foundational que compila real: GNU sed 4.10 estático
musl (b3:f237dd4b), quitando el build-dep espurio 'perl' (sólo tests/docs de Alpine)
y el -flto=auto que zig-cc rechaza. Valida el patrón de de-Alpinización de la tanda
base-system-1 (imports Alpine punto-de-partida → recetas limpias).
Los huecos reales para una distro completa (el sistema ya está: bootstrap/
self-host/kernel/init/EFI/paquetería). Cola aislada en incoming-clib:
git rsync bash ca-certificates sudo doas util-linux sed tzdata e2fsprogs
dosfstools parted iproute2 iputils dhcpcd vim dbus foot. Import 18/18
(17 alpine + 1 nix), deps ya-canónicas podadas. Patches musl viajan.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Las 4 recetas que dependen de curl (libadwaita + adwaita-hello/hammer-edit/sourceview-hello)
declaraban curl+zlib pero no openssl; libcurl.pc trae Requires.private: openssl (y libcurl.pc
sin openssl.pc en el sandbox ⇒ meson falla 'Dependency lookup for libcurl failed: openssl not
found'). Mismo patrón que harfbuzz/fontconfig. openssl ya está en el catálogo (recipes/openssl.toml).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sus deps foundational ya publicadas ⇒ el orden de dependencias resolvió y packean+firman.
Sin colisión con canónicas. Quedan en incoming-clib las 8 GUI meson pesadas (gtk4/pango/
libadwaita/gtksourceview + demos) y las 13 variantes colisionantes.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Cierra el desfase receta/repo: 15 recetas que ya construyen y están publicadas+firmadas
en dist/repo pero seguían en la cola de staging. Sin colisión con canónicas (guarda de
build-farm). Los .patch viajan con su receta. Quedan en incoming-clib las 13 variantes
colisionantes (build-deps del stack GUI) y las 14 GUI deep-dep sin publicar aún.
brotli fribidi gettext-tiny giflib glib gperf graphene harfbuzz itstool
libjpeg-turbo libsass libtiff libxmlb lz4 sassc
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
brotli fallaba con 'cmake: not found' porque no declaraba cmake en [deps].build
(patrón libjpeg-turbo/libtiff que sí materializa el tool). bzip2 en incoming-clib
era un duplicado del ya-promovido recipes/bzip2.toml (sellado en dist/repo).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Abrir/guardar/guardar-como (GtkFileDialog async), resaltado por extensión, números de línea, línea
actual, auto-indent, apertura de archivos desde CLI (G_APPLICATION_HANDLES_OPEN). Link 100% estático:
157MB ELF 'not a dynamic executable', --help responde. App instalable y usable, no una demo.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
giflib: quita xmlto (solo docs). xz: fuente release (trae ./configure; el archive del tag no) + quita
autoconf/automake/libtool. libwebp construye al destrabarse giflib. Limpia los fallos recurrentes del loop.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Link 100% estático: gtk4+libadwaita+gtksourceview → 154MB ELF estático, corre. Esqueleto de un editor
real para el distro; valida los 3 stacks juntos.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
meson static; introspection/vapi/docs/sysprof off; sed elimina subdir tests/testsuite (linkean gtk4
estático y fallan por privadas, pero la lib sí construye).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Linkeado 100% estático contra libadwaita-1.a: binario 152MB, ELF 'not a dynamic executable', corre.
Prueba que el stack Adwaita del lab es usable por apps reales.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
libadwaita-1.a archive GORDO (meson library() normal, sin el split de GTK) + libadwaita-1.pc + adwaita.h.
Cierra el stack GUI de alto nivel del lab: ya se pueden construir apps Adwaita.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
appstream 1.0.5 lean (compose/svg/stemming/gir/systemd off) destrabado con: gettext-tiny (msgfmt
p/ i18n de meson), itstool stub (copia el join-source, sin traducciones), curl mínimo (sin TLS, solo
satisface el link), libxmlb+libyaml, y sed que elimina subdir('docs/') incondicional (xsltproc+docbook).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>