El usuario señaló que «perfil» suena a preset exclusivo y preguntó lo que hay que preguntar: si no va a poder instalar KDE, GNOME y mirada a la vez y elegir en un greeter. MEDIDO, comparando los dos rootfs hidratados que hay en disco (kde-rootfs 78.934 ficheros, gnome-rootfs 19.955): 14.455 rutas están en LOS DOS, y de ésas **12.766 comparten INODO** — o sea que son el mismo artefacto del store, no un conflicto. Sólo **1.689 (12 %) colisionan de verdad**. ⇒ Lo que impide instalar dos escritorios NO es el store, que ya los tiene conviviendo: es proyectarlos al MISMO /usr. Y las colisiones no son misteriosas —libuuid.so.1.3.0, dbus-daemon, gdbus, gapplication, /etc/dbus-1/*.conf— salen de que cada cola tiene su propia glib y su propio dbus. Es el mismo cuadro de las dos poppler que targets.toml ya documenta, y el de gmp/mpfr que dejó 28 .hammer-tmp al hidratar KDE hoy. Dos caminos, no excluyentes: bajar las colisiones unificando lo duplicado (una glib, un dbus), o no proyectar a un /usr único — que es literalmente lo que el SDD 18 ya propone («activar un nodo = montar su composefs como /usr»). Con vistas, las 1.689 dejan de existir por construcción. El greeter encaja solo: el arranque por grafo del ADR 0010 ya elige qué clausura activar. Y queda anotado el corolario de orden: el paso 5 del plan (unificar imagen e instalador) construiría sobre el supuesto de un solo escritorio a la vez. Hay que decidir FHS plano vs vista composefs ANTES de unificarlos, porque es la diferencia entre «instalás uno» y «instalás los tres». Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LCt3ettR4Z7b6wPCBmbvEV
11 KiB
SDD 27 — Metapaquetes instalables: del rootfs hidratado al takana install escritorio-kde
Estado: PROPUESTA. Nada de lo de acá está implementado. Lo que sí está medido es el punto de partida, y las mediciones llevan fecha 2026-09-09. Escrito a pedido del usuario mientras se cerraban los huecos de la imagen KDE.
0. La pregunta
Hoy sabemos construir. Sabemos hidratar un rootfs y meterlo en una imagen que arranca. Lo que no existe es instalar un escritorio como una unidad: hoy «KDE» es una lista dentro de un fichero del repo, no algo que un usuario pueda pedir.
Y hay una pregunta previa que el usuario formuló mejor de lo que estaba escrito en ningún lado:
el toolbox CLI es general, que sea piso userland del sistema siempre. los extras son igual instalaciones, depende de quién instale qué.
Eso son tres capas distintas, y hoy el repo las mezcla en una sola lista por escritorio.
1. Lo medido: hoy los escritorios NO heredan la base
docs/state/targets.toml declara un perfil base de 27 paquetes: bash, git, sudo, doas,
util-linux, shadow, kbd, procps-ng, iproute2, iputils, dhcpcd, e2fsprogs,
dosfstools, gnupg, ca-certificates… El fichero ya avisa que «kde/gnome/cosmic NO heredan
base», pero la consecuencia no estaba escrita. Medida:
De los 27 paquetes de
base, la clausura deescritorio-kdealcanza 2.
Y comprobado contra el rootfs real de la imagen KDE (kde-qemu-rootfs):
| se busca | está |
|---|---|
bash, git, sudo, doas, dhcpcd, useradd, gpg |
NO |
ip, mount, fsck |
sí, pero son applets de busybox (/sbin/ip → ../bin/busybox) |
ssh, curl |
sí, de rebote: entran por la clausura de KDE, no por base |
⇒ Sí: abrís el escritorio y es como si base no existiera. No hay shell de verdad (busybox sh,
no bash), no hay sudo ni doas, no hay git, y no hay dhcpcd — o sea que la imagen no sabe
pedir una IP salvo lo que haga busybox. Lo que sí hay es el otro base: arje-zero como PID1 más
busybox, que es lo mínimo para arrancar. Son dos cosas distintas con el mismo nombre coloquial:
- base de arranque (
metal-rootfs): arje-zero + busybox + kernel. La imagen la funde por hardlinks. Existe. - base de userland (
[perfil.base]): las 27. No la funde nadie.
Esto no es un bug de una imagen: es que la composición entre perfiles no está definida.
2. Las tres capas que hay que separar
| capa | qué es | quién decide | hoy |
|---|---|---|---|
| piso | userland siempre presente: shell, red, usuarios, paquetes, git |
la distro | existe como [perfil.base], no lo hereda nadie |
| escritorio | KDE / GNOME / COSMIC / sway y lo que los hace ser ellos | la distro | existe como perfil, es lo único que se materializa |
| extras | lo que cada quien instala encima | el usuario | no existe como operación |
Y hay una cuarta que el usuario nombró y conviene no perder: el toolbox CLI. Hoy hay 652 recetas selladas que ninguna imagen alcanza — 361 Go, 214 Rust, 67 C — y son casi todas herramientas de línea de comandos. Ya construidas, ya reproducibles: coste de build cero, sólo declararlas. Si el toolbox es piso, va en la capa 1 y no en cada escritorio.
3. Un «metapaquete» ya existe, y se llama perfil
[perfil.escritorio-kde] con sus 49 raíces es el metapaquete: una lista de nombres cuya
clausura define qué entra. Lo que le falta para ser instalable son tres cosas concretas:
- Herencia. Un perfil tiene que poder decir
hereda = ["base"]en vez de repetir la lista. Hoy los cuatro escritorios repitendejavu-fonts,desktop-file-utilsy las*-sharedde runtime, y ya se vio lo que pasa: se añade a uno y se olvida en los otros. - Publicación.
targets.tomlvive en el repo y es de tiempo de build. Para que el instalador lo use tiene que salir al repositorio firmado como un objeto más, igual que un.swm. - Un verbo.
takana install escritorio-kdeno existe:installresuelve un paquete por nombre en el índice. Instalar un perfil es resolver una LISTA y aplicar su clausura.
4. La decisión de fondo del instalador: reproducir o hidratar
Ésta es la única pregunta que no es de implementación, y conviene decidirla antes de escribir código.
Hoy el canal de paquetes NO distribuye binarios. pack produce un .swm —una receta de
transformación sobre fuente pública— e install reproduce construyendo, con cache-hit del
corpus. Es coherente con todo el diseño: lo que viaja es la receta, no el binario.
- Reproducir un escritorio entero en la máquina del usuario son horas de compilación (KDE son 301 nodos; Qt y Firefox solos ya son la mayor parte de una tarde). Coherente y honesto, pero inaceptable como experiencia de instalación.
- Hidratar desde artefactos firmados es lo que ya hace
hydrate-profile.py: segundos, porque son hardlinks contra el store. Pero eso es entregar binarios, y activa entera la obligación de licencias que se cerró el 2026-09-09 (scripts/licencias-rootfs.sh, que veta si un paquete no declara licencia). También activa la pregunta de confianza: el ADR 0014 ya dice que el cuerpo es inmutable y direccionado por contenido, así que el origen no necesita confianza — lo que se firma es la raíz, no el servidor.
La salida no es elegir una: es que las dos existan y el usuario elija, igual que el ADR 0014 hizo
con los orígenes. Instalar por hidratación es el camino normal; reproducir es el camino auditable, y
que exista es lo que hace verificable al primero. Lo que hay que definir es el default — y ahí la
respuesta razonable es hidratar, porque el que quiere auditar puede reproducir cuando quiera y
comparar hashes, que es exactamente lo que selfhost-verify ya hace.
5. La imagen y el instalador son el mismo problema con dos salidas
Hoy hay dos caminos que hacen casi lo mismo y no se hablan:
- Imagen: perfil →
hydrate-profile.py→ rootfs →install-image-efi.sh→.imgque arranca. - Instalador: TUI +
base-system, que instala sobre un disco.
Si un perfil es publicable e instalable, los dos son el mismo verbo con distinto destino: uno
escribe a una imagen, el otro a una partición. Vale la pena unificarlos antes de que diverjan más:
hoy ya divergieron una vez —los hydrate-*.sh por escritorio contra targets.toml, con 21 paquetes
declarados que no llegaban a la imagen de GNOME y 17 a la de COSMIC— y costó encontrarlo.
6. Sobre el nombre del paquete (.swm vs .tkn)
.swm no es residuo del renombre: significa «Software Mutación» y describe lo que el fichero
es —una mutación reproducible sobre una fuente—, no la marca. Renombrarlo a .tkn sería alinear
marca y formato, y es defendible, pero no lo pide ninguna inconsistencia técnica. Si se hace,
es una decisión de ADR y con la misma disciplina que el renombre de hoy: hay que mirar si la
extensión entra en algún hash o en el índice del repo antes de tocarla.
El verbo, en cambio, ya es el correcto: takana install.
7. Orden propuesto
- Herencia entre perfiles (
hereda = [...]) y hacer que los cuatro escritorios heredenbase. Es lo más barato y arregla un fallo real: hoy los escritorios no traen shell ni red. - Decidir el piso: qué del toolbox CLI de 652 entra en
base. Coste de build cero. - Publicar perfiles al repositorio firmado.
takana install <perfil>, hidratando por defecto y con--reproducecomo camino auditable.- Unificar imagen e instalador sobre ese verbo.
Los pasos 1 y 2 se pueden hacer ya y no dependen de ninguna decisión de arquitectura.
8. «Metapaquete», no «perfil» — y el problema real que destapa el nombre
El usuario lo dijo mejor: «perfil» suena a preset exclusivo, y eso arrastra una suposición que nadie decidió. La pregunta que lo destapa es concreta:
¿no voy a poder instalar KDE y mirada y GNOME al mismo tiempo, y cambiar entre ellas con un greeter?
En el STORE ya conviven, y no en teoría. Medido el 2026-09-09 comparando los dos rootfs
hidratados que hay en disco (kde-rootfs 78.934 ficheros, gnome-rootfs 19.955):
| rutas presentes en LOS DOS | 14.455 |
| …de ésas, mismo inodo (el MISMO artefacto del store) | 12.766 (88 %) |
| …inodo distinto = colisión real | 1.689 (12 %) |
O sea que el 88 % de lo compartido no es un conflicto: es literalmente el mismo fichero, porque el
store es direccionado por contenido y los dos escritorios lo enlazan. Lo que impide instalar dos
escritorios no es el store: es PROYECTARLOS AL MISMO /usr. 1.689 ficheros quieren la misma ruta
con contenido distinto y gana el último que se proyecte — el mismo cuadro que targets.toml ya
documenta para las dos poppler y que se vio hoy con gmp/mpfr dejando 28 .hammer-tmp.
Y las colisiones no son misteriosas: libuuid.so.1.3.0, dbus-daemon, gdbus, gapplication,
/etc/dbus-1/*.conf… Salen de que cada cola tiene su propia glib y su propio dbus. Son
recetas distintas con el mismo soname.
⇒ Hay dos caminos, y no son excluyentes:
- Bajar las colisiones: unificar lo que no tiene por qué estar duplicado (una sola
glib, un solodbus). Ataca la causa y además hace más chicas las imágenes. Es trabajo de catálogo. - No proyectar a un
/usrúnico, que es lo que el SDD 18 ya propone: «activar un nodo = montar su composefs como/usr». Con eso cada escritorio es una VISTA compuesta y las 1.689 colisiones dejan de existir por construcción — no hay un/usrcompartido que aplastar.
El greeter encaja solo: el arranque por GRAFO del ADR 0010 ya elige qué clausura activar, y
mirada-greeter existe. Elegir escritorio en el greeter = elegir qué vista montar.
Corolario para el nombre: si un escritorio es una vista montable y no un preset del sistema,
entonces metapaquete es la palabra correcta y perfil la equivocada — instalás tres y elegís al
arrancar, igual que en cualquier distro. Renombrar la clave de targets.toml es barato en concepto
y caro en llamadores (build-state, drenar, hydrate-profile, vigia-imagen, seed-graph); vale como
decisión de ADR, con el mismo cuidado que el renombre de hammer→takana: mirar antes si la
palabra entra en algún hash o en el índice del repo.
⚠ Y una consecuencia de orden: el punto 1 del plan (herencia) no cambia por esto, pero el punto 5
sí. Unificar imagen e instalador sobre un /usr proyectado es construir sobre el supuesto de que
sólo hay un escritorio a la vez. Antes de unificarlos conviene decidir si el destino es un FHS
plano o una vista composefs, porque es la diferencia entre «instalás uno» y «instalás los tres».