Commit Graph
1602 Commits
Author SHA1 Message Date
Sergio c020c2af19 merge: trabajo concurrente del otro frente 2026-09-21 21:34:58 +00:00
SergioandClaude Opus 5 466972e301 busybox: 79 → 69 applets sin otro dueño, y ninguno de los diez costó escribir userland
Cuatro artefactos sellados y el paso 2 del plan cerrado. Los diez applets que
dejan de depender de busybox salieron de arreglar recetas, no de escribir código:

  xz unxz xzcat lzma unlzma lzcat  → recipes/xz-tools.toml (nueva, b3:194c7d69…)
  vi                               → un symlink en recipes/vim.toml
  cpio                             → un symlink en recipes/libarchive.toml
  arch hostname                    → los trajo el feature de uutils (b3:614ff653…)

xz-tools es el TERCER caso de la familia de zstd-cli, y eso ya estaba escrito en
targets.toml: «la receta canónica construye sólo lib/ y su artefacto no tiene
usr/bin; declararla no habría arreglado nada». Igual que musl-shared, zlib-shared
y libffi-shared. Cuatro veces la misma forma — la receta publica la lib, la
imagen declara el paquete, y el binario no está. Va como variante porque ampliar
la canónica re-hashearía a sus 14 consumidores.

⚠ xz-tools selló DINÁMICO en la primera corrida pese al link = "static", y
funcionaba: comprimía y descomprimía sin una queja. Es el relink de libtool, que
libarchive.toml y bluez.toml ya documentan — hace falta LDFLAGS=-all-static en
compile Y en install. Lo delató el `file` del binario, no una prueba que fallara.

Paso 2 del plan: uutils, findutils, findutils-xargs, diffutils, gzip, grep y
xz-tools declarados en el perfil `base` — seis recetas que llevaban meses
`sealed` con `perfiles: []`. Hasta hoy, `find`, `xargs`, `diff`, `cmp`, `gzip`,
`zcat` y `grep` en una imagen de takana eran el applet de busybox, no porque
faltara escribirlos sino porque nadie los declaró. `grep` entra como PUENTE
declarado: ripgrep ya viaja pero publica `rg` y no es grep POSIX.

El censo gana modo --guardian, y vigila PÉRDIDAS, no un umbral: un umbral hay
que subirlo cada vez que se retira un applet y a la tercera nadie lo sube con
criterio; que un applet con proveedor medido deje de tenerlo es siempre una
regresión. Probado en los dos sentidos — rc=0 contra /store, rc=1 contra un store
mutilado, nombrando applet y proveedor perdido.

Los cuatro sellaron con el mismo hash en el store tirable y en /store: dos
work_root distintos, bytes idénticos.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 21:34:46 +00:00
Sergio 077e5acc21 estado: cosecha granja 2026-09-21T21:32:11Z — avance del árbol KDE 2026-09-21 21:32:11 +00:00
Sergio 3573fb0057 merge: cosecha de la granja 21:02Z 2026-09-21 21:02:47 +00:00
SergioandClaude Opus 5 64005efcbd busybox: los 23 applets sin dueño eran 79 — el reparto era juicio, y medido no da
El plan de botar busybox decía de sí mismo que el reparto applet→dueño era
«juicio, no medida». Medido contra los 1407 artefactos del store: de los 277
applets vivos, 167 los provee el dueño que el TSV nombra, 31 los provee OTRO
paquete, y 79 no los provee NADIE salvo busybox — 56 más de los 23 previstos.

El hallazgo transversal es que una receta de LIBRERÍA no es un paquete de
HERRAMIENTAS, y build-state no distingue: `xz` figura en SEIS perfiles con el
`usr/bin` VACÍO (su receta pasa --disable-xz --disable-xzdec --disable-scripts,
o sea liblzma y nada más), y `ncurses` instala sólo install.libs/install.includes
⇒ ni clear, ni reset, ni tput. Las dos viajan, las dos dicen `sealed`, y el único
binario que hay adentro de la imagen es el applet de busybox.

Y al revés: `switch_root` y `sulogin` los trae util-linux, `partprobe` lo trae
parted, y `getty` tiene sustituto — `agetty` de util-linux, en los 7 perfiles ⇒
deja de ser ESCRIBIR y pasa a ser migrar el exec de la card. Seis de los 18
huecos de iproute2 (ipaddr iplink ipneigh iproute iprule iptunnel) no son
comandos de nadie: son nombres internos de busybox y se borran del defconfig.

uutils traía 78 applets, no los 90 que el plan le atribuía: el multicall
contestaba `coreutils: unknown program 'chmod'`. Construía con las default
features (feat_common_core) y el resto vive detrás de feat_os_unix_musl, que
cubre exactamente los 25 que faltaban. Construido y verificado contra un store
tirable: 79 → 106 applets, 27 nuevos y CERO perdidos, chmod/uname/id ejecutan, y
`stdbuf` correctamente ausente (por eso la variante _musl y no feat_os_unix:
upstream lo excluye en musl porque necesita un cdylib).

Importaba más de lo que parece: USERLAND_COMPONENTS hidrata uutils DESPUÉS de
busybox para ensombrecerlo, y lo que no existe no ensombrece nada — chmod, chown,
id, uname y stat los seguía dando busybox con el userland Rust instalado encima.

⚠ Dicho en la receta y en el documento: who/users/uptime/pinky compilan contra
los stubs de utmpx de musl y contestan vacío. No es regresión, tampoco es
sustitución.

El censo queda como script (scripts/busybox-censo-proveedores.py) y como dos
columnas del TSV, no como una tabla escrita a mano que vuelva a envejecer.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 21:02:07 +00:00
Sergio 8f0391dbc0 estado: cosecha granja 2026-09-21T21:02:05Z — avance del árbol KDE 2026-09-21 21:02:05 +00:00
Sergio d154ce02a2 simi: REPRODUCE bit a bit — y dos trampas operativas que costaron dos corridas
scripts/verificar-repro.sh simi en el worker: «✓ simi REPRODUCE», 0
no-determinismos. Queda anotado en docs/state/repro-verificado.tsv con su hash,
que es la clave del libro: si la receta o alguna dep cambia, la entrada deja de
casar y hay que volver a verificar.

Las dos trampas, anotadas en el SDD porque las dos fallan en silencio:

1. --store <tirable> NO sirve para verificar reproducibilidad. Un store vacío da
   «Error: io: No such file or directory» a secas —sin decir qué falta— porque las
   deps del build no están ahí. El método correcto ya estaba escrito: apartar el
   artefacto dentro del MISMO store y reconstruir. Dos corridas perdidas por
   inventar un instrumento en vez de leer el que existía.

2. La cosecha BORRA una receta sembrada a mano: siembra hub→worker con
   rsync --delete, y el hub del que siembra es gioser, no el clon donde se
   trabaja. El worker perdió recipes/simi.toml entre el build y la verificación
   (el artefacto sellado sobrevivió, la receta no) y el verificador informó
   «REPRODUCEN: 0 · sin artefacto: 0» — o sea nada, porque su primer [ -f ] falla
   y salta en silencio.

Comprobado de paso: editar los comentarios de la receta NO cambia el hash
(hash_inputs es una lista explícita de campos). Y el artefacto vive sólo en el
store del worker: sella con PROMOTE=0 y la cosecha baja el manifiesto, no el
store. Promoverlo es otro paso.
2026-09-21 20:35:53 +00:00
Sergio c2586b131c estado: cosecha granja 2026-09-21T20:31:34Z — avance del árbol KDE 2026-09-21 20:31:34 +00:00
Sergio 07867ba23e estado: cosecha granja 2026-09-21T20:01:39Z — avance del árbol KDE 2026-09-21 20:01:39 +00:00
Sergio 76885a93fe estado: cosecha granja 2026-09-21T19:31:38Z — avance del árbol KDE 2026-09-21 19:31:38 +00:00
Sergio 7de281a79f estado: cosecha granja 2026-09-21T19:01:40Z — avance del árbol KDE 2026-09-21 19:01:40 +00:00
Sergio 8f8c105e7d estado: cosecha granja 2026-09-21T18:31:39Z — avance del árbol KDE 2026-09-21 18:31:39 +00:00
SergioandClaude Opus 5 c5a27d9b4c busybox recortado: 401 -> 277 applets, con vigía y cinco indultos medidos
Paso 1 de docs/plan-botar-busybox.md. 124 applets fuera del defconfig: los 105 que
no se reemplazan (dpkg, rpm, httpd, telnetd, ubi*, nand*, i2c*) y 19 cuya función ya
hace otro componente (init/runit -> arje-zero, syslogd/klogd/logread -> hammerd).
Binario de 1.230.976 a 977.096 bytes.

CORRIGE UN ERROR DEL PLAN: arje-zero y hammerd reemplazan la FUNCIÓN, no el COMANDO
-- son un binario cada uno. Por eso 5 indultos: setuidgid (la card de gitea lo
ejecuta), switch_root (el /init del instalador, antes de que arje exista) y
poweroff/halt/reboot (nada más en el corpus apaga la máquina).

scripts/busybox-vigia.py falla si alguien invoca un applet retirado; lee la lista de
la propia receta para que no haya dos que se desincronicen. Su primera versión daba
91 hits y ninguno real: las cuatro reglas que lo bajaron a 0 están documentadas.

El mapa applet->símbolo sale de las líneas //applet: del fuente, no de poner el
nombre en mayúsculas: eso falla en 6 casos medidos, dos de ellos en la lista.

Verificado: 277 applets exactos, los 5 indultados presentes, y zlib-ng, jq y
logrotate reconstruidas y selladas con el busybox recortado -- el sandbox sigue en
pie. Son 3 de las 24 dependientes, no las 24, y el boot de la imagen no se probó.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 18:26:01 +00:00
Sergio 58e7972977 estado: cosecha granja 2026-09-21T18:02:09Z — avance del árbol KDE 2026-09-21 18:02:09 +00:00
Sergio 0a82d3f701 estado: cosecha granja 2026-09-21T17:32:20Z — avance del árbol KDE 2026-09-21 17:32:20 +00:00
Sergio 9defa8686f estado: cosecha granja 2026-09-21T17:02:02Z — avance del árbol KDE 2026-09-21 17:02:02 +00:00
Sergio c7097e4a91 atuq §7.duodecies: el sembrador entra a las cuatro imágenes — y cifraba la seed de todos con una palabra pública
El §7.undecies dejó la bóveda declarada y a NADIE capaz de abrirla: ninguna
imagen traía un binario que sembrara `pacha_llavero::SEED_IDENTIDAD`. Esta es
esa unidad.

De las dos formas posibles entra `agora-cli`, y el motivo no es que sea mejor:
el wizard `churay-welcome-llimphi` SÍ tiene binario (medido: `src/main.rs` sin
`[[bin]]`, o sea que cargo lo descubre), pero decide además backend de IA,
dotfiles, fondo de pantalla y chasqui — la experiencia de primer arranque
entera, que no se decide dentro de una unidad del navegador.

⚠ Y antes de poder declararlo apareció lo que lo volvía imposible: sin
`AGORA_PASSPHRASE`, `Sesion::abrir()` caía en la frase de desarrollo
"agora-dev" con un aviso por stderr y un ✓ en pantalla. La cadena que eso toca:
frase → Argon2id → ChaCha20-Poly1305 que cifra la seed → la clave con la que
`boveda` descifra su base. O sea, en una imagen de escritorio, la bóveda de
todo el mundo cerrada con una palabra escrita en el fuente, y nada que falle.

Arreglado en tawasuyu (`fd08dc03a`): variable > terminal (se pregunta, sin eco,
y DOS veces en la génesis, donde un error de tipeo no se nota hasta que la seed
ya no se recupera) > desarrollo sólo si no hay a quién preguntarle. La decisión
vive en una función pura con cuatro tests, probada AL REVÉS: con el brazo
`Preguntar` borrado falla con `left: Desarrollo / right: Preguntar`.

Pin `9967b02c` → `da5fb8968` ⇒ `b3:46529e14`, 1,9 M, sellado en el worker con
la guarda PEGADA al build. Mirado por dentro (regla 3) y probado como
artefacto, con control negativo: `identity new` + `unlock` deja
`user pacha:id:default: 32` en `/proc/keys`, y con la frase equivocada contesta
«autenticación fallida» y NO re-siembra.

El muro del `Cargo.lock` por cuarta vez, con la causa cambiada: esta vez no la
puso quien tocó el lock sino otro agente que metió `shuma-taller` en un
`Cargo.toml`. Cerrado en el worker, donde el registro está completo: +1 línea.
Y el lock del árbol compartido traía otra vez el malo (índice y árbol con dos
versiones distintas, las dos rotas), así que el commit se armó con
`commit-tree` sin pasar por el índice.

Corrección al §7.undecies: el verbo es `agora-cli unlock`, no
`agora-cli identity unlock`.

El guardián de coherencia pasa de SEIS lugares a SIETE, con su cuarto control
negativo; los cuatro, en verde.

Queda: la herencia del llavero de SESIÓN entre procesos hermanos (sin medir —
y `/proc/keys` como root no la mide), y `pacha`/`pacha-secretos` en
`perfil.servidor` con el mismo hueco.
2026-09-21 16:40:46 +00:00
Sergio 384eccf060 estado: cosecha granja 2026-09-21T16:32:10Z — avance del árbol KDE 2026-09-21 16:32:10 +00:00
Sergio 146dd15b39 estado: cosecha granja 2026-09-21T16:04:56Z — avance del árbol KDE 2026-09-21 16:04:56 +00:00
SergioandClaude Opus 5 63397e278a plan: botar busybox — 401 applets repartidos, y el trabajo real son 23
Medido contra el artefacto sellado (401 symlinks) cruzado con build-state.json:
148 applets ya tienen dueño sellado Y en perfil, 125 tienen dueño sellado que no
viaja en ninguna imagen (uutils, brush, findutils, diffutils, arje-zero, hammerd),
y de los 128 sin dueño 105 son basura que se borra.

Dos hallazgos que cambian el plan: busybox entra a los 7 perfiles como dep de BUILD
de 24 recetas, no como raíz de producto en targets.toml; y brush (shell Rust) ya
está sealed, sin validar y sin perfil.

docs/state/busybox-applets.tsv es la tabla applet-por-applet (generada), con 24
parejas marcadas NO-drop-in.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 15:54:12 +00:00
Sergio 0bffb40923 estado: cosecha granja 2026-09-21T15:31:59Z — avance del árbol KDE 2026-09-21 15:31:59 +00:00
Sergio 9733e1a421 estado: cosecha granja 2026-09-21T15:03:05Z — avance del árbol KDE 2026-09-21 15:03:05 +00:00
Sergio cc425c5615 estado: cosecha granja 2026-09-21T14:32:33Z — avance del árbol KDE 2026-09-21 14:32:33 +00:00
Sergio 4699dd12aa estado: cosecha granja 2026-09-21T14:02:12Z — avance del árbol KDE 2026-09-21 14:02:12 +00:00
Sergio b72f695d18 estado: cosecha granja 2026-09-21T13:32:29Z — avance del árbol KDE 2026-09-21 13:32:29 +00:00
Sergio 53b933e3d9 estado: cosecha granja 2026-09-21T13:02:01Z — avance del árbol KDE 2026-09-21 13:02:01 +00:00
Sergio 97245dc7cf estado: cosecha granja 2026-09-21T12:31:55Z — avance del árbol KDE 2026-09-21 12:31:55 +00:00
Sergio 7d0065631e estado: cosecha granja 2026-09-21T12:02:15Z — avance del árbol KDE 2026-09-21 12:02:15 +00:00
Sergio 8d5d0bbb5d estado: cosecha granja 2026-09-21T11:31:54Z — avance del árbol KDE 2026-09-21 11:31:54 +00:00
Sergio f06fbcab7b estado: cosecha granja 2026-09-21T11:01:53Z — avance del árbol KDE 2026-09-21 11:01:53 +00:00
Sergio 2ccb6ae7ce estado: cosecha granja 2026-09-21T10:31:47Z — avance del árbol KDE 2026-09-21 10:31:47 +00:00
Sergio ccc612530c estado: cosecha granja 2026-09-21T10:01:50Z — avance del árbol KDE 2026-09-21 10:01:50 +00:00
Sergio 6a36f667f6 estado: cosecha granja 2026-09-21T09:31:58Z — avance del árbol KDE 2026-09-21 09:31:58 +00:00
Sergio 6802c6a1fc estado: cosecha granja 2026-09-21T09:01:49Z — avance del árbol KDE 2026-09-21 09:01:49 +00:00
Sergio 5e904dd9fb estado: cosecha granja 2026-09-21T08:31:54Z — avance del árbol KDE 2026-09-21 08:31:54 +00:00
Sergio 51ae554e98 estado: cosecha granja 2026-09-21T08:02:13Z — avance del árbol KDE 2026-09-21 08:02:13 +00:00
Sergio 7b0ad7805d estado: cosecha granja 2026-09-21T07:31:53Z — avance del árbol KDE 2026-09-21 07:31:53 +00:00
Sergio d1540f5146 estado: cosecha granja 2026-09-21T07:01:49Z — avance del árbol KDE 2026-09-21 07:01:49 +00:00
Sergio 42cb37509a estado: cosecha granja 2026-09-21T06:31:35Z — avance del árbol KDE 2026-09-21 06:31:35 +00:00
Sergio 45b32d46b9 estado: cosecha granja 2026-09-21T06:01:50Z — avance del árbol KDE 2026-09-21 06:01:50 +00:00
Sergio 8026ab8b49 estado: cosecha granja 2026-09-21T05:35:25Z — avance del árbol KDE 2026-09-21 05:35:25 +00:00
Sergio 94c6f6b607 estado: cosecha granja 2026-09-21T05:01:48Z — avance del árbol KDE 2026-09-21 05:01:48 +00:00
Sergio 665fae0595 estado: cosecha granja 2026-09-21T04:31:48Z — avance del árbol KDE 2026-09-21 04:31:48 +00:00
Sergio b4f5cddc6a estado: cosecha granja 2026-09-21T04:07:47Z — avance del árbol KDE 2026-09-21 04:07:47 +00:00
Sergio c33de60012 gnome: 6 raíces — shared-mime-info (sellada y en ninguna imagen), la sesión barata y nautilus+gvfs; g-c-c fuera con su porqué 2026-09-21 03:41:13 +00:00
Sergio 72fafd563c estado: cosecha granja 2026-09-21T03:33:07Z — avance del árbol KDE 2026-09-21 03:33:07 +00:00
Sergio 505745577d estado: cosecha granja 2026-09-21T03:02:11Z — avance del árbol KDE 2026-09-21 03:02:11 +00:00
Sergio b7e5467ac8 estado: cosecha granja 2026-09-21T02:31:40Z — avance del árbol KDE 2026-09-21 02:31:40 +00:00
Sergio 1b21969274 estado: cosecha granja 2026-09-21T02:01:30Z — avance del árbol KDE 2026-09-21 02:01:30 +00:00
Sergio bfd2827b40 estado: cosecha granja 2026-09-21T01:32:00Z — avance del árbol KDE 2026-09-21 01:32:00 +00:00