Commit Graph
1008 Commits
Author SHA1 Message Date
Sergio 953706909d estado: cosecha granja 2026-09-11T02:32:11Z — avance del árbol KDE 2026-09-11 02:32:11 +00:00
SergioandClaude Opus 5 9a31857eaa targets: zstd en base — un takana recién instalado no podía desempacar su propio laboratorio
La distro comprime TODO con zstd: la imagen del lab (`lab-image.tar.zst`), el respaldo al Storage
Box, el `dd` remoto de una instalación. Y la imagen no traía el binario.

Medido sembrando el lab en la caja de producción: el `tar` del rootfs es el de busybox y contesta
`tar: unrecognized option: zstd`, así que hubo que extraer por tubería desde el hub
(`zstd -dc … | ssh caja 'tar -xf -'`). Un hub que se instala solo no puede depender de que otro hub
le descomprima las cosas.

La receta ya existía y está sellada (`b3:1ceb6215…`): sólo faltaba declararla.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RomoxEGZUhaT4pob1QSX5x
2026-09-11 02:04:55 +00:00
Sergio 7bdb781352 estado: cosecha granja 2026-09-11T02:01:57Z — avance del árbol KDE 2026-09-11 02:01:57 +00:00
SergioandClaude Opus 5 7e41ffd0e6 SDD 28 §6.5: el muro derribado — de 23 binarios inertes a 1, y sin mover un ArtifactHash
Elegidas las salidas 1 y 2 del §6.4; hecha la 1, que resultó más barata de lo que parecía y desbloquea
la 2 en vez de competir con ella.

`musl-shared` publica `/usr/lib/libc.so` + `/lib/ld-musl-x86_64.so.1`. Como variante y no tocando la
canónica: `musl` es Stage 1 y su `of_tree` es el baseline del selfhost. Control: `takana hash
recipes/musl.toml` sigue en `b3:ce952f72…`. Y `musl` no es dep de nadie ⇒ cero re-hasheo del corpus.

En la caja: `sh: python3: not found` → `Python 3.12.10`. De 23 inertes quedó **1**, `sqlite3`, que
pedía `libz.so.1`; `zlib-shared` ya estaba sellado y sólo faltaba declararla en `base`.

La salida 2 (python/perl estáticos) sigue viva pero deja de ser urgente: con el cargador publicado el
sistema ya no cuelga del rootfs del lab.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RomoxEGZUhaT4pob1QSX5x
2026-09-11 02:00:51 +00:00
SergioandClaude Opus 5 7e86459738 musl-shared: el corpus publica su propio CARGADOR — 23 binarios dejan de ser inertes
La imagen del perfil servidor traía 23 binarios de 726 que no podían ejecutarse:

    $ python3 -c "print(1)"
    sh: python3: not found        <- y `command -v python3` decía /usr/bin/python3

No faltaban: eran ELF dinámicos pidiendo `/lib/ld-musl-x86_64.so.1`, y **ningún artefacto del corpus
publicaba ese fichero**. Funcionaban en el hub sólo porque el rootfs Alpine del LAB lo presta — la
misma fuga que documentan `zlib-shared` y `expat-shared`, un piso más abajo, y peor: el lab no entra
en `hash_inputs`, así que la dependencia era invisible para el store.

Los 23 son la suite binutils entera + perl, python3, sqlite3, flex y nft. Entre ellos, TODO el
instrumental del proyecto, que es Python.

**Variante y no `--enable-shared` en la canónica**: `musl` es componente de Stage 1 y su `of_tree` es
el baseline de `selfhost-verify`. Re-hashearlo obliga a rehacer ese baseline a propósito, y eso es su
propia unidad de trabajo. Con el patrón `*-shared` (ya hay 23 en el corpus) la canónica no se mueve —
control: `takana hash recipes/musl.toml` sigue dando `b3:ce952f72…`, el mismo sellado de Stage 1. Y
además `musl` no es dep de NADIE (medido: sólo de sí misma; el enlace estático lo resuelve el musl de
zig), así que esto suma sin mover un solo ArtifactHash del corpus.

**⚠ `compiler = "gcc"` y no `zig-cc`, medido.** Con zig cc el `libc.so` sale con 1586 símbolos
dinámicos contra los 1654 de Alpine, y los 68 que faltan son EXACTAMENTE los que musl implementa en
ensamblador x86_64 (`memset memcpy memmove memcmp strlen` y toda la familia matemática) más los
`__stack_chk_*`. No es que no se compilen —en el `libc.a` canónico están—: zig los resuelve con su
propio musl y los deja `FUNC LOCAL HIDDEN` de tamaño 0, fuera de la tabla dinámica. El síntoma es un
cargador que arranca, reloca y muere con `memset: symbol not found`, que se lee como "el binario está
roto" y no como "a la libc le faltan símbolos". Con gcc: **1651 símbolos**, `memset` y `ceil`
presentes, y `python3 3.12.10` CORRE con el cargador del corpus.

De paso: el comentario de `musl.toml` decía que el artefacto aportaba «el loader, para uso dinámico
futuro». Era falso —`--disable-shared` no construye ninguno— y es justo la etiqueta que hizo que
nadie buscara el agujero. Corregido (los comentarios no entran en `hash_inputs`; verificado).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RomoxEGZUhaT4pob1QSX5x
2026-09-11 01:47:54 +00:00
Sergio ef6164861e estado: cosecha granja 2026-09-11T01:32:07Z — avance del árbol KDE 2026-09-11 01:32:07 +00:00
Sergio 7039afdccf estado: cosecha granja 2026-09-11T01:02:16Z — avance del árbol KDE 2026-09-11 01:02:16 +00:00
Sergio 38338913eb estado: cosecha granja 2026-09-10T23:31:52Z — avance del árbol KDE 2026-09-10 23:31:52 +00:00
Sergio 2f930322cc estado: nftables verificada — REPRODUCE (el sello de tiempo lo neutraliza el parche) 2026-09-10 23:19:08 +00:00
Sergio 9ef875005d estado: cosecha granja 2026-09-10T23:01:57Z — avance del árbol KDE 2026-09-10 23:01:58 +00:00
Sergio 6704ebe033 estado: cosecha granja 2026-09-10T22:32:06Z — avance del árbol KDE 2026-09-10 22:32:06 +00:00
Sergio e063fc16e9 estado: cosecha granja 2026-09-10T22:01:45Z — avance del árbol KDE 2026-09-10 22:01:45 +00:00
Sergio 5beb3aa461 estado: cosecha granja 2026-09-10T21:31:53Z — avance del árbol KDE 2026-09-10 21:31:53 +00:00
Sergio 3ff7585aa2 estado: cosecha granja 2026-09-10T21:02:45Z — avance del árbol KDE 2026-09-10 21:02:45 +00:00
Sergio ca7d228512 estado: cosecha granja 2026-09-10T20:35:24Z — avance del árbol KDE 2026-09-10 20:35:25 +00:00
SergioandClaude Opus 5 2613fe3951 servidor-image.sh: la imagen del perfil servidor, armada por script — y netup pasa a ser raíz
El ensamblado dejaba de ser reproducible en cuanto se cerraba la terminal: cuatro pasos, tres de
ellos con una trampa que no se ve. Ahora es un script, con las trampas escritas en su cabecera:

1. **El kernel.** `linux.toml` NO sirve para hcloud (apaga SCSI y el disco de Hetzner es virtio-SCSI).
   Va `linux-generic`, que sí trae `CONFIG_SCSI_VIRTIO=y` — dato que no está en la receta, lo pone
   `make defconfig`, y sólo se ve en el `.config` que el artefacto publica.
2. **El init se pisa.** La clausura del perfil trae busybox y su `/sbin/init` gana por hidratarse
   después. El script lo restaura e IMPRIME la reparación (`../bin/busybox → /usr/bin/arje-zero`),
   que es la diferencia entre arreglarlo y creer que estaba bien.
3. **EXDEV.** Comprueba con `findmnt` que STORE y WORKDIR estén en el MISMO montaje y aborta con un
   mensaje que dice qué hacer, en vez de fallar fichero por fichero a mitad de un `cp -al`.
4. **La clave es obligatoria.** Sin `AUTHKEYS` no arma nada: una instalación remota sin
   `authorized_keys` deja una máquina viva e INALCANZABLE, que es peor que una que no arrancó.

Y el cmdline va SIN `init=`, a propósito: así corre el wrapper que escribe `install-image.sh`, que
es quien monta `/store` y `/var/lib/hammer`.

**`netup` entra como raíz de `perfil.servidor`** aunque su binario ya venga dentro del
`product-rootfs`. La razón es concreta y se pagó hoy: el del producto está congelado en el artefacto
sellado del bootstrap, así que el arreglo de la ruta on-link NO llegaba a la imagen. Declarado como
raíz, la hidratación lo proyecta encima y la imagen lleva el vigente — verificado por sha256: la
imagen trae `a23df20e…` y el product-rootfs `a84b0a0d…`.

`recipes/netup.toml` re-pineado a `be383ea4` (el commit del arreglo).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RomoxEGZUhaT4pob1QSX5x
2026-09-10 20:15:39 +00:00
Sergio 8db076bf3e estado: cosecha granja 2026-09-10T20:03:03Z — avance del árbol KDE 2026-09-10 20:03:03 +00:00
Sergio 9a1573e0cb estado: cosecha granja 2026-09-10T16:02:11Z — avance del árbol KDE 2026-09-10 16:02:11 +00:00
Sergio f9dae780fa estado: cosecha granja 2026-09-10T15:32:35Z — avance del árbol KDE 2026-09-10 15:32:35 +00:00
Sergio 9fbbb775a9 estado: cosecha granja 2026-09-10T15:01:48Z — avance del árbol KDE 2026-09-10 15:01:48 +00:00
Sergio f3236ef74a estado: cosecha granja 2026-09-10T14:32:10Z — avance del árbol KDE 2026-09-10 14:32:11 +00:00
Sergio 655a682aa6 estado: cosecha granja 2026-09-10T14:01:58Z — avance del árbol KDE 2026-09-10 14:01:58 +00:00
Sergio 8c23062e1b estado: cosecha granja 2026-09-10T11:31:44Z — avance del árbol KDE 2026-09-10 11:31:44 +00:00
Sergio e9633ba51e estado: cosecha granja 2026-09-10T11:01:55Z — avance del árbol KDE 2026-09-10 11:01:55 +00:00
Sergio 2f993baed5 estado: cosecha granja 2026-09-10T10:32:22Z — avance del árbol KDE 2026-09-10 10:32:22 +00:00
Sergio 2206b90223 estado: cosecha granja 2026-09-10T10:02:18Z — avance del árbol KDE 2026-09-10 10:02:18 +00:00
Sergio d52a394ab1 estado: cosecha granja 2026-09-10T09:31:57Z — avance del árbol KDE 2026-09-10 09:31:57 +00:00
Sergio 99eca62322 estado: cosecha granja 2026-09-10T09:02:20Z — avance del árbol KDE 2026-09-10 09:02:20 +00:00
Sergio 211018b496 estado: cosecha granja 2026-09-10T08:31:52Z — avance del árbol KDE 2026-09-10 08:31:52 +00:00
Sergio f1b758b77c estado: cosecha granja 2026-09-10T08:02:15Z — avance del árbol KDE 2026-09-10 08:02:15 +00:00
Sergio 7727fa0172 estado: cosecha granja 2026-09-10T07:31:55Z — avance del árbol KDE 2026-09-10 07:31:55 +00:00
Sergio cbfa60a7f0 estado: cosecha granja 2026-09-10T07:01:53Z — avance del árbol KDE 2026-09-10 07:01:53 +00:00
Sergio 97c0e62062 estado: cosecha granja 2026-09-10T06:31:54Z — avance del árbol KDE 2026-09-10 06:31:54 +00:00
Sergio 7e137edde3 estado: cosecha granja 2026-09-10T06:02:22Z — avance del árbol KDE 2026-09-10 06:02:22 +00:00
Sergio 6a1d1ac239 estado: cosecha granja 2026-09-10T05:33:22Z — avance del árbol KDE 2026-09-10 05:33:22 +00:00
Sergio b1a1f92592 estado: cosecha granja 2026-09-10T05:03:25Z — avance del árbol KDE 2026-09-10 05:03:25 +00:00
Sergio 476fb74a5a estado: cosecha granja 2026-09-10T04:33:31Z — avance del árbol KDE 2026-09-10 04:33:31 +00:00
Sergio b32c80eb5d estado: cosecha granja 2026-09-10T04:03:46Z — avance del árbol KDE 2026-09-10 04:03:46 +00:00
Sergio a00debe182 estado: cosecha granja 2026-09-10T03:32:07Z — avance del árbol KDE 2026-09-10 03:32:07 +00:00
Sergio 3441a6129f estado: cosecha granja 2026-09-10T02:02:17Z — avance del árbol KDE 2026-09-10 02:02:17 +00:00
Sergio e3d984475a estado: cosecha granja 2026-09-10T01:32:00Z — avance del árbol KDE 2026-09-10 01:32:00 +00:00
Sergio 1d2d636bba estado: cosecha granja 2026-09-10T00:32:07Z — avance del árbol KDE 2026-09-10 00:32:08 +00:00
Sergio fb748370e1 estado: cosecha granja 2026-09-10T00:02:52Z — avance del árbol KDE 2026-09-10 00:02:53 +00:00
Sergio cf574c5bc4 estado: cosecha granja 2026-09-09T23:32:00Z — avance del árbol KDE 2026-09-09 23:32:00 +00:00
SergioandClaude Opus 5 7b38e2ef16 kde: los portales — segundo hueco cerrado, y OBS ya tiene con quién hablar
Medido recorriendo los `.service` de D-Bus de TODO el store: los únicos backends de portal sellados
eran los de COSMIC y GNOME. Ninguno de KDE, y la cola `incoming-kde` no tenía ni el frontend.
Consecuencia concreta: la imagen KDE trae `obs-studio` con su plugin linux-pipewire, que captura
pantalla POR EL PORTAL — o sea que en Plasma no tenía con quién hablar mientras en los otros dos
escritorios ese frente estaba cerrado. Sin portal tampoco hay diálogo de fichero ni compartir
pantalla para nada que los use.

Van los DOS paquetes porque la cadena es de tres:
  cliente → org.freedesktop.portal.Desktop [frontend] → org.freedesktop.impl.portal.* [backend]
El frontend se copia de la cola de COSMIC y **comparte artefacto**: hash idéntico (ecbe13f68eca6)
desde las dos colas ⇒ un solo directorio en el store, cero builds.

El backend es receta NUEVA, 6.7.2 — la MISMA versión que plasma-workspace, kwin y kscreenlocker de
esta cola, porque habla interfaces privadas de kwin para el ScreenCast y desalinear ahí es pedir que
dos mitades del mismo release se entiendan por casualidad. **Cero frontera nueva**: sus 22
dependencias (Qt6, KF6, KWayland, protocolos de Wayland, xkbcommon) ya estaban todas, verificadas
una por una antes de escribir la receta.

⚠ SIN EL PORTAL DE IMPRESIÓN, y la causa es más honda que el error. El build moría en
`src/print.cpp:27` con `'QtPrintSupport/private/qcups_p.h' file not found`, y la cadena está medida
entera: no hay NINGUNA receta de cups en el catálogo ⇒ qtbase 6.11.1 se construyó sin CUPS ⇒ su
`QtPrintSupport/private/` trae qpaintengine_alpha_p.h y qprintengine_pdf_p.h pero NO qcups_p.h.
No falta una cabecera: falta el subsistema. Un portal de impresión sin con qué imprimir no es
funcionalidad que se pierde, es código muerto que no enlaza.

Upstream no expone `option()` para portales —se compilan todos—, así que el parche va en TRES
sitios y no en uno: la fuente, la instanciación (desktopportal.cpp/.h) y **la lista de interfaces
que el backend ANUNCIA**. El tercero es el que se olvidaría y el que importa: anunciar
`impl.portal.Print` sin implementarlo hace que el frontend enrute a un portal que no contesta, que
es peor que no tenerlo. Cada `sed` lleva su `grep` de verificación al lado, para que el día que
upstream mueva esas líneas el parche falle RUIDOSO en vez de volverse inerte.

VERIFICADO sobre el artefacto sellado: publica `org.freedesktop.impl.portal.desktop.kde.service`,
y su `kde.portal` anuncia 17 interfaces con **0 apariciones de Print** e incluyendo ScreenCast,
Screenshot y RemoteDesktop, que es exactamente lo que OBS necesita. Y sobre el rootfs hidratado:
están el frontend (`org.freedesktop.portal.Desktop.service`), el backend y el `kde.portal`.

⚠ Y la licencia casi la firmo mal: leí la cabecera de UN fichero y generalicé. Contadas las
etiquetas SPDX del árbol entero: 88 `LGPL-2.0-or-later`, 23 de la fórmula de KDE e.V. y 1
`GPL-2.0-or-later`. El binario las enlaza a todas ⇒ la expresión es la CONJUNCIÓN.

El perfil pasa a 98 raíces, 361/361 listo, deuda 0.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LCt3ettR4Z7b6wPCBmbvEV
2026-09-09 23:17:42 +00:00
Sergio 894bfaf0f5 estado: cosecha granja 2026-09-09T23:02:09Z — avance del árbol KDE 2026-09-09 23:02:09 +00:00
SergioandClaude Opus 5 c599daa346 SDD 28: el servidor de producción — y perfil.servidor declarando la deuda que no se ve
El frente arranca con el inventario MEDIDO de gioser, no con un plan: PID 1 es `arje-zero` (nuestro
init ya gobierna un servidor real, aunque sobre userland Artix), Hetzner Cloud arranca por **BIOS**
—que es justo el layout que `takana-install.sh` ya escribe— y el kernel propio trae VIRTIO/EXT4 `=y`
con `netup` haciendo DHCPv4, que es exactamente el caso de una caja hcloud.

Dos hallazgos que cambian el trabajo:

- **La secuencia de arranque de gioser no está escrita en ningún lado.** `rc-status` dice `stopped`
  para caddy, gitea, sshd, cronie y act-runner y los cinco están VIVOS colgando de PID 1. Un
  `arje-absorb --from openrc` produciría una Semilla perfecta que no levanta el servidor.
- **La mitad del Caddyfile describe un servidor que ya no existe**: 4 de 19 dominios sin DNS y sin
  ficheros en `/var/www`, uno en 502. Una mudanza fiel copia también la basura ⇒ la regla queda
  escrita: no se muda lo que no responde.

`[perfil.servidor]` hereda `cli` (SDD 27 §7.1) y declara 5 raíces que existen (openssh, caddy, curl,
wget, tmux) y **5 que NO** (takana, chrony, nftables, cronie, logrotate). Quedan `wanted`, y `wanted`
no es `debt` ⇒ `drenaje.json` seguirá diciendo `deuda=0`. Se declaran igual: sin ellas el perfil
saldría N/N —completo y verde— describiendo un servidor sin hora, sin cortafuegos y sin latido. Es
la lección de `foot` en escritorio-sway, pagada por adelantado. Cuenta esperada: 5, verificada
resolviendo cada nombre contra el campo `name` de las 869 recetas.

La peor de esas cinco: **takana no tiene receta**. El corpus construye 869 y no la suya, así que el
host no puede instalar takana desde el repo de takana — el bloqueante de que el servidor se sirva a
sí mismo.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RomoxEGZUhaT4pob1QSX5x
2026-09-09 22:53:55 +00:00
Sergio 96c7d2dfc9 estado: cosecha granja 2026-09-09T22:31:57Z — avance del árbol KDE 2026-09-09 22:31:57 +00:00
SergioandClaude Opus 5 c20372597a targets: kde/gnome/cosmic heredan cli — las imágenes ya no salen sin shell ni red
Paso 1 del SDD 27. Resultó ser UNA LÍNEA POR PERFIL: el mecanismo `hereda` ya existía en
`scripts/targets.py` —transitivo, con detección de ciclos y orden preservado— y `escritorio-sway`
ya lo usaba desde el 2026-08-07. Los otros tres nunca lo declararon, y eso no era una decisión: era
composición no declarada.

LO QUE ARREGLA, medido antes: de los 27 paquetes del perfil `base`, la clausura de escritorio-kde
alcanzaba DOS. Contra el rootfs real: sin `bash`, sin `sudo`/`doas`, sin `git`, sin `useradd`, sin
`gpg` y **sin `dhcpcd`** —o sea sin con qué pedir una IP—; y lo que parecía estar (`ip`, `mount`,
`fsck`) eran applets de busybox (`/sbin/ip → ../bin/busybox`).

DESPUÉS, verificado hidratando de verdad y no leyendo el grafo: en el rootfs aparecen `bash`,
`sudo`, `doas`, `git`, `dhcpcd`, `useradd`, `gpg`, `rg`, `fd`, `bat`, y `/sbin/ip` pasa a ser el
BINARIO de iproute2 en vez del applet.

  raíces  kde 49→96 · gnome 39→86 · cosmic 43→88
  nodos   kde 301→356 · gnome 204→256 · cosmic 162→216
  deuda   0 en los tres — no hubo que construir NADA, ya estaba todo sellado
  colisiones nuevas al hidratar: CERO (los 28 .hammer-tmp son los de gmp/mpfr de antes)

⚠ `escritorio-mirada` NO hereda a propósito: es el rootfs *slim* del USB y sumarle 47 raíces
contradice su razón de ser. Si algún día se quiere, es la misma línea.

`kde-rootfs` en el volumen se rehidrató con la herencia (11 G) para que el nombre canónico no quede
viejo — que es el error que este mismo día costó encontrar en GNOME y COSMIC. El rootfs FUNDIDO y la
imagen siguen siendo los de antes: rehacerlos es un paso aparte.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LCt3ettR4Z7b6wPCBmbvEV
2026-09-09 22:31:12 +00:00
Sergio c4ebb9f5c7 estado: cosecha granja 2026-09-09T22:03:08Z — avance del árbol KDE 2026-09-09 22:03:08 +00:00