Misma divergencia que se encontró ayer en GNOME, medida igual: `hydrate-cosmic.sh` nombra 25 raíces escritas a mano dentro del script, el perfil `escritorio-cosmic` declara 43, y **17 paquetes declarados no llegaban al rootfs**: adwaita-cursors · xkeyboard-config · bash · atuq (el navegador) · mpv · swayimg zathura + zathura-pdf-poppler · dejavu-fonts y dejavu-fonts-nerd · libnotify desktop-file-utils · hicolor-icon-theme · y las cinco *-shared de runtime ⚠ EL PRIMERO NO ES UNA COINCIDENCIA: `adwaita-cursors` es EXACTAMENTE el ejemplo con el que la cabecera de `scripts/hydrate-profile.py` advirtió de esto el 2026-09-04 — «se añadió a las raíces de cosmic y sway, y los scripts de hidratación, que no la conocen, habrían seguido armando un rootfs sin cursores». No era hipotético: seguía pasando hoy, cinco días después. Y `xkeyboard-config` es la cicatriz de sway repitiéndose: sin él el compositor arranca sin mapa de teclado. Y AL REVÉS NO SE PIERDE NADA, que es lo que hace el cambio barato y lo separa del caso GNOME (donde primero hubo que mover 11 raíces de runtime al perfil): de las 25 del script, la única que el perfil no declara es `zlib-shared`, y la clausura del perfil la alcanza igual. O sea que el motivo que justificaba la lista a mano —los componentes que `cosmic-session` lanza por PATH, que ningún grafo de build ve— YA ESTÁ RESUELTO en el perfil, que los declara todos como raíces. La lista quedó redundante sin que nadie lo notara. VERIFICADO HIDRATANDO, no leyendo: `hydrate-profile.py escritorio-cosmic` proyecta 162/162 nodos (24166 ficheros, 4,8 G) y ahí están los 17. (Ojo con la sonda: `bash` instala en `/bin/bash`, no en `/usr/bin` — mi primer chequeo lo dio por ausente y era el chequeo el que miraba mal.) ⚠ Y UN DATO QUE MATIZA EL DIAGNÓSTICO Y LO EMPEORA. El rootfs que hay en disco (`escritorios/cosmic-rootfs`, 3,9 G) SÍ tiene cursores, xkb y mpv — o sea que no se armó con la lista por defecto, alguien le pasó raíces a mano. Y aun así le falta `atuq`. El problema real no es que la lista esté mal: es que **lo que llega a la imagen depende de lo que alguien se acuerde de teclear**. Derivarlo del perfil quita esa variable. El script se deja porque su cabecera documenta por qué COSMIC necesita raíces de runtime explícitas —sigue siendo cierto sobre la naturaleza de cosmic-session—; lo que ya no es cierto es que su lista sea la verdad. Los dos armadores de imagen (qemu y metal) ahora apuntan a `hydrate-profile.py`. ── Y de paso, una nota vieja de targets.toml corregida ──────────────────────────────────────────── Decía que el perfil de KDE «son 13 raíces de ARRANQUE EN METAL, no la imagen completa», con konsole/kate/dolphin y otras 19 apps selladas y sin declarar. Ya no: hoy son 48 raíces, con esas apps, las fuentes y las *-shared declaradas — el frente KDE lo reordenó y la nota quedó atrás. De su cola quedan 8 recetas fuera del perfil y son las que corresponde: libICE, libSM, libXtst y los cinco eslabones huérfanos de xwayland desde que se retiró su receta. Lo que a KDE le queda es OTRO problema, también medido hoy: su imagen no se hidrata del perfil sino de un rootfs YA ARMADO (8,4 G) que nadie re-deriva. De las 18 hojas del perfil están 15 — faltan `obs-studio` y `atuq`, justo las dos añadidas después de esa hidratación. Re-hidratarlo es decisión del frente KDE. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LCt3ettR4Z7b6wPCBmbvEV
827 lines
68 KiB
TOML
827 lines
68 KiB
TOML
# targets.toml — el MANIFIESTO DE OBJETIVO: qué paquetes debe tener la distro.
|
||
#
|
||
# POR QUÉ EXISTE. `build-state.json` es el grafo de lo que EXISTE (768 recetas, cierra sin huérfanas).
|
||
# Lo que la distro DEBE tener no estaba en ningún lado: vivía en dos strings de shell de
|
||
# `product-userland-from-repo.sh`, otro de `mirada-usb.sh`, 55 listas planas en `tandas/` y una cola
|
||
# de 206 recetas KDE. Por eso "¿cuánto falta?" no tenía respuesta: el mapa cerraba perfecto, pero
|
||
# sólo cubría el territorio ya conquistado. Este fichero es el destino. (Plan: docs/plan-catalogo-objetivo.md)
|
||
#
|
||
# LA INVERSIÓN. `paquetes` lista sólo las RAÍCES — lo que un usuario pide POR NOMBRE. La clausura
|
||
# (las libs de las que cuelgan) la calcula el grafo siguiendo las aristas de deps, no la escribe un
|
||
# humano. Al revés de `tandas/base-system-3-libs.txt`, que enumera a mano miembros de la clausura.
|
||
#
|
||
# Un `perfil` = una imagen enviable. `hereda` compone (transitivo, sin ciclos). `cola` dice en qué
|
||
# árbol de recetas viven sus raíces: `corpus` = `recipes/`; otra cosa = `recipes/incoming-<x>/`, que
|
||
# `build-state.py` sólo carga con su flag (`--kde`) ⇒ los perfiles de una cola no cargada se saltan
|
||
# en vez de reportar raíces fantasma.
|
||
#
|
||
# Consumidores: `scripts/targets.py <perfil>` (expande a lista de nombres) y `scripts/build-state.py`
|
||
# (marca los nodos `wanted` y calcula la membresía de perfil de cada receta).
|
||
schema = "hammer-targets/1"
|
||
|
||
[perfil.base]
|
||
descripcion = "userland foundational C: la distro arranca y se usa (shell, VCS, privilegios, red, disco, TLS, proceso, editor, docs)"
|
||
# Lift verbatim de BASE_SYSTEM_PKGS (scripts/product-userland-from-repo.sh). De-Alpinizado y firmado,
|
||
# tandas base-system-1..3.
|
||
paquetes = [
|
||
# `bash-completion` (2026-09-09): el tabulador de las herramientas del sistema. Entra como raíz
|
||
# porque NADIE lo alcanza por deps de build — los paquetes que instalan completados sólo preguntan
|
||
# por su `.pc` y, si no está, se saltan la instalación en silencio. Es un hueco de RUNTIME puro,
|
||
# de los que ninguna métrica de deuda puede ver. Salió del triaje de la frontera con 5 consumidores.
|
||
"bash", "bash-completion", "git", "sudo", "doas", "util-linux", "shadow", "kbd", "procps-ng",
|
||
"iproute2", "iputils", "dhcpcd", "e2fsprogs", "dosfstools", "parted", "rsync",
|
||
"sed", "tzdata", "vim", "dbus", "ca-certificates", "gnupg", "lsof", "strace",
|
||
"pciutils", "usbutils", "mandoc",
|
||
]
|
||
|
||
[perfil.cli]
|
||
descripcion = "la capa CLI moderna (Rust) encima de base — el userland real del producto"
|
||
hereda = ["base"]
|
||
# Lift verbatim de CLI_RUST_PKGS (scripts/product-userland-from-repo.sh).
|
||
paquetes = [
|
||
"bat", "fd", "ripgrep", "jq", "zoxide", "dust", "procs", "htop", "less", "tree",
|
||
"hyperfine", "delta", "eza", "sd", "tokei", "fzf", "skim", "git-cliff", "gitui",
|
||
"starship",
|
||
]
|
||
|
||
[perfil.escritorio-mirada]
|
||
descripcion = "rootfs slim del USB mirada: compositor Wayland propio sobre mesa software"
|
||
# NO hereda base: es una imagen slim a propósito. El ORDEN importa (libs primero, binarios mirada
|
||
# al final) y se preserva. `scripts/mirada-usb.sh` deriva su PKGS de acá (`targets.py
|
||
# escritorio-mirada`), así que esta lista ES la del USB — no una copia que pueda divergir.
|
||
#
|
||
# ── Las tres `-shared` (2026-09-05) ──────────────────────────────────────────────────────────────
|
||
# Cazadas por `scripts/vigia-sonames.py`: `mesa-swrast` y `wayland` salen con `NEEDED libexpat.so.1`,
|
||
# `libz.so.1` y `libffi.so.8`, y las recetas canónicas de expat/zlib/libffi son `--disable-shared`.
|
||
# Ningún artefacto del cierre publicaba esos SONAME ⇒ el rootfs los resolvía contra el sysroot Alpine
|
||
# DEL LAB y la imagen sólo arrancaba donde hubiera Alpine debajo.
|
||
#
|
||
# Es la MISMA fuga que los otros cuatro perfiles ya cerraron el 2026-09-03; mirada quedó fuera porque
|
||
# su lista nació como copia literal del script y nadie la revisó. Van de raíces —y no de `[deps]`—
|
||
# porque son data de RUNTIME: nadie las declara como dep de BUILD, así que la clausura no las alcanza
|
||
# por ninguna arista. Las tres viven en `corpus`, la misma cola, y ya están selladas ⇒ CERO rebuilds.
|
||
#
|
||
# NO se suman `bzip2-shared` ni `ncurses-shared`, que sí llevan los otros perfiles: acá esos sonames
|
||
# los pide sólo `python3`, que es HERRAMIENTA DE BUILD y no viaja en la imagen. Lo accionable del
|
||
# vigía es lo que pide un componente de runtime, y por eso imprime siempre quién pide cada cosa.
|
||
paquetes = [
|
||
"expat-shared", "zlib-shared", "libffi-shared",
|
||
"mesa-swrast", "wayland", "libdrm", "seatd", "libinput", "libudev-zero",
|
||
"libxkbcommon", "pixman", "linux-pam", "mtdev", "libevdev",
|
||
"mirada-compositor", "mirada-greeter", "mirada-ctl",
|
||
]
|
||
|
||
[perfil.escritorio-kde]
|
||
descripcion = "escritorio KDE Plasma 6 desde fuente"
|
||
cola = "incoming-kde"
|
||
# Raíces del rootfs de metal (docs/HANDOFF-noche-kde-2026-07-14.md:135). El resto del escritorio
|
||
# —137 artefactos hidratados— es CLAUSURA de estas 7, no lista a mano.
|
||
paquetes = [
|
||
# `desktop-file-utils` (2026-09-09): `update-desktop-database` construye la caché
|
||
# MIME→APLICACIÓN. Con `shared-mime-info` el escritorio ya sabe QUÉ TIPO es un fichero; sin
|
||
# ésta sigue sin saber CON QUÉ abrirlo — el menú «abrir con» sale vacío y no hay aplicación
|
||
# por defecto para ningún tipo. Va como RAÍZ en los CUATRO escritorios y no en `base`,
|
||
# porque kde/gnome/cosmic NO heredan base: declararla acá funciona con cualquiera de las dos
|
||
# lecturas del modelo de composición.
|
||
"desktop-file-utils",
|
||
"plasma-workspace", "kwin", "kscreenlocker", "breeze", "frameworkintegration",
|
||
"qqc2-desktop-style", "plasma-integration",
|
||
# Huecos de RUNTIME confirmados por el triaje de la frontera (2026-07-22). Ninguno bloquea un
|
||
# build —todas las recetas que los piden ya están selladas— pero sin ellos el escritorio arranca
|
||
# roto: sin tipos de fichero, sin apps X11, sin diálogos de autorización y con los controles QML
|
||
# en un estilo genérico. Ver docs/state/frontera-triaje.toml para el porqué de cada uno.
|
||
"shared-mime-info", "xwayland", "polkit-qt-1", "qqc2-breeze-style",
|
||
# ⚠ Añadido el 2026-09-03 arrancando la imagen en QEMU. NO sale de la clausura de las 7 raíces
|
||
# porque no es dep de BUILD de nada: es dep de RUNTIME de plasmashell, que lo pide por D-Bus y
|
||
# **ABORTA** si no contesta —`kde.plasmashell: Aborting shell load: The activity manager daemon
|
||
# (kactivitymanagerd) is not running.`— dejando kwin vivo y la pantalla EN NEGRO. El síntoma miente:
|
||
# `STATUS: kwin=1 plasmashell=1` durante minutos, con los dos procesos vivos y nada pintado.
|
||
# `plasma-start-qemu.sh` ya lo lanzaba (línea 188); lo que faltaba era que el paquete ENTRARA.
|
||
# Misma figura que las raíces de runtime de GNOME (imports.gi.*): el cierre de BUILD no es el
|
||
# cierre de RUNTIME, y lo que se invoca por bus es invisible al grafo de deps.
|
||
"kactivitymanagerd",
|
||
# ── CAPA 2: EL ESCRITORIO USABLE ─────────────────────────────────────────────────────────────
|
||
# ⚠ Añadidas el 2026-09-03. **Las 22 ya estaban SELLADAS en esta cola y no las declaraba nadie**,
|
||
# así que no cuestan un build: sólo entran a la clausura. Se descubrió listando los `(cola,nombre)`
|
||
# cuyo artefacto instala un `usr/share/applications/*.desktop` y que `yupana.membresia()` no
|
||
# asigna a ningún perfil — salieron 23, y 22 son de acá.
|
||
#
|
||
# POR QUÉ FALTABAN, que no es lo mismo que «se decidió que no fueran». Las 7 raíces de arriba son
|
||
# el set MÍNIMO del arranque en metal, tomado de `docs/HANDOFF-noche-kde-2026-07-14.md:135`. Ese
|
||
# mismo documento nombra lo que faltaba como el trabajo siguiente: *«Capa 2 KF6 / apps núcleo:
|
||
# importar+construir konsole/dolphin/kate vía granja (extiende el escritorio usable)»*. Se
|
||
# construyeron y se sellaron; lo que nunca ocurrió fue DECLARARLAS. La métrica no lo podía ver
|
||
# porque mide lo declarado — la misma figura que dejó a sway en 121/121 sin emulador de terminal.
|
||
#
|
||
# Sin esto la imagen es compositor + shell + tema y nada más: **sin terminal no se puede salir de
|
||
# un fallo, y sin plasma-nm/plasma-pa/powerdevil no hay red, ni audio, ni gestión de energía.**
|
||
#
|
||
# Plomería de escritorio — esto no son "apps", es lo que hace que Plasma funcione:
|
||
"plasma-desktop", "plasma-nm", "plasma-pa", "powerdevil", "kscreen",
|
||
"systemsettings", "kinfocenter", "kmenuedit", "kwalletmanager",
|
||
# Núcleo usable: terminal, ficheros, editor, documentos, archivos comprimidos, captura, imágenes.
|
||
# `konsole` es el que cierra el agujero de «no hay terminal».
|
||
"konsole", "dolphin", "kate", "okular", "ark", "spectacle", "gwenview",
|
||
# Accesorios que ya estaban construidos; entran porque no cuesta nada y completan el menú.
|
||
"kcalc", "kfind", "filelight", "kcharselect", "kruler", "kdf",
|
||
# ── FUENTES ──────────────────────────────────────────────────────────────────────────────────
|
||
# Añadida el 2026-09-03 por el mismo recuento que destapó el hueco de GNOME: contando
|
||
# `.ttf/.otf/.ttc/.pfb` sobre los artefactos del cierre, este perfil tenía **UNA sola**, y de
|
||
# rebote — viene dentro de `qtbase`, no porque nadie la haya pedido. `fontconfig` estaba, pero
|
||
# fontconfig es el MOTOR que busca fuentes, no una fuente.
|
||
# Depender de la que trae qtbase es apoyarse en un detalle de empaquetado de Qt que puede
|
||
# desaparecer en cualquier versión, y encima deja a todo lo que NO es Qt sin nada.
|
||
"dejavu-fonts",
|
||
# `dejavu-fonts-nerd` es la MISMA DejaVu Sans Mono parcheada con Nerd Fonts (~10.000 glifos de
|
||
# iconos: Powerline, Font Awesome, Devicons…) que usan starship, lsd, eza, neovim y las
|
||
# statuslines; sin ellos dibujan cuadraditos. Se AÑADE, no reemplaza: la licencia de Bitstream
|
||
# Vera obliga a renombrar una fuente modificada, así que la parcheada se llama
|
||
# «DejaVuSansM Nerd Font Mono» y NO puede responder a «DejaVu Sans Mono» — sustituirla rompería
|
||
# a todo lo que la pide por nombre, empezando por foot. Se enchufa por fontconfig: su
|
||
# `59-nerd-monospace.conf` hace que el alias `monospace` la prefiera. Ver su receta.
|
||
"dejavu-fonts-nerd",
|
||
# ⚠ `xwayland` sigue acá como RAÍZ pero su receta NO se va a escribir: lo provee una imagen ajena
|
||
# enjaulada, declarado en ../state/qorpa-ajenos.toml (ADR 0015 D5 capa 3, qorpa). El Xwayland vive
|
||
# DENTRO de la imagen —Arch y Fedora ya lo traen y se cuelga de kwin por el socket— así que el
|
||
# hueco se disuelve sin receta y sin tocar la postura Wayland-only. Queda como raíz A PROPÓSITO:
|
||
# la imagen lo NECESITA, y sacarlo de acá lo volvería invisible en vez de contado aparte. El grafo
|
||
# ya lo reporta con clase `ajeno` («+ 1 ajenas»), nunca sumado a las nativas. Los otros tres ya
|
||
# están sellados (2026-09-02/03).
|
||
# ── LA PRIMERA APP DE USUARIO FINAL QUE COMPARTEN LOS CUATRO ESCRITORIOS ──────────────────────
|
||
# `mpv` vive en el CORPUS, no en esta cola, justamente para poder listarse en las cuatro: una
|
||
# receta resuelve sibling-first y después el catálogo padre, así que desde acá se alcanza.
|
||
# Va de raíz por la lección que este mismo fichero ya aprendió con `foot` en el perfil de sway:
|
||
# una receta sellada que ningún perfil declara NO ESTÁ EN NINGUNA IMAGEN, y la métrica de
|
||
# clausura no lo puede ver porque mide lo declarado. Sellado ≠ instalado.
|
||
# Los tres huecos con que entró (ALSA sin PipeWire, sin Lua/OSC, sin vaapi) están CERRADOS al
|
||
# 2026-09-04: pipewire nativo con ALSA de respaldo, `-Dlua=lua5.2`, y `-Dvaapi=enabled` con `libva`
|
||
# subida al corpus. Además su ffmpeg ya va con x86asm ⇒ decodifica con SIMD.
|
||
"mpv",
|
||
# ── EL NAVEGADOR (SDD 26) ────────────────────────────────────────────────────────────────────
|
||
# `atuq` vive en el CORPUS por el mismo motivo que mpv: se resuelve sibling-first y después el
|
||
# catálogo padre, así que desde las cuatro colas se alcanza. Va de raíz por la lección de `foot`
|
||
# que este fichero ya aprendió: una receta sellada que ningún perfil declara NO ESTÁ EN NINGUNA
|
||
# IMAGEN, y la clausura no lo puede ver porque mide lo declarado.
|
||
# Arrastra la cadena GTK3 en sus variantes `-shared` — pango/cairo/gdk-pixbuf/harfbuzz—: con las
|
||
# estáticas, libgtk-3 y libgdk-3 se llevaban cada una su copia y el navegador no llegaba a pintar.
|
||
"atuq",
|
||
# `libnotify` va PEGADO a atuq y por eso mismo: `libxul.so` la abre por `dlopen("libnotify.so.4")`
|
||
# cuando una página pide permiso para notificar, y como no es un `NEEDED` de ningún ELF, ninguna
|
||
# herramienta del repo la reclamaba — ni el vigía de sonames, que da CERO. La encontró
|
||
# `scripts/test-atuq-rootfs.py --dlopen` (SDD 26 §6.10). Sin esta línea la receta está sellada y
|
||
# en ninguna imagen, que es la lección de `foot` escrita cuatro renglones más arriba.
|
||
# ⚠ Resuelve la mitad: libnotify no trae daemon, manda `org.freedesktop.Notifications` por D-Bus,
|
||
# así que la imagen necesita además a alguien escuchando ese nombre.
|
||
"libnotify",
|
||
# ── CAPTURA Y STREAMING ──────────────────────────────────────────────────────────────────────
|
||
# `obs-studio` (2026-09-04). A diferencia de mpv, ésta vive en ESTA COLA y no en el corpus, y no
|
||
# es preferencia: su frontend es Qt6 y las 13 recetas Qt viven sólo en `incoming-kde`. Un qtbase
|
||
# de corpus tendría otro hash con el MISMO nombre de artefacto ⇒ dos Qt peleando por
|
||
# `/usr/lib/libQt6Core.so`. ⇒ **por ahora OBS es de KDE y de nadie más**; el día que exista un Qt
|
||
# de corpus (`yupana radio qtbase` = 119, campaña propia) puede subir y listarse en las cuatro.
|
||
#
|
||
# Su renderer va PORTADO a EGL (`obs-glad-egl-loader.patch`): el glad de upstream hacía
|
||
# `dlopen("libGL.so.1")` + `dlsym("glXGetProcAddressARB")`, o sea GLX en runtime, que esta distro
|
||
# no tiene ni quiere.
|
||
#
|
||
# ⚠ Entra con tres huecos escritos en su receta: sin webcam (`ENABLE_V4L2=OFF`, `libv4l2` no lo
|
||
# publica ninguna cola), sin salida MPEG-TS (SRT/RIST ausentes) y sin scripting (falta `swig`).
|
||
# Grabar, capturar la pantalla y publicar por RTMP —el uso real— no pasan por ninguno de los tres.
|
||
"obs-studio",
|
||
# ── VISOR DE IMÁGENES, TAMBIÉN EN LAS CUATRO ─────────────────────────────────────────────────
|
||
# `swayimg` y no `imv`, que era lo que proponía `docs/plan-apps-usuario-final.md`: imv dibuja con
|
||
# OpenGL de función fija (`glBegin`/`glOrtho`) y esta distro NO tiene proveedor de GL de
|
||
# escritorio — las tres mesa van `-Dglx=disabled -Dglvnd=false` ⇒ no hay `libGL.so` ni `gl.pc` en
|
||
# ninguna cola. swayimg rasteriza a `wl_shm` y no toca GL; el porqué largo está en su receta.
|
||
# Trae de yapa backend DRM: muestra imágenes en una TTY pelada, sin compositor.
|
||
"swayimg",
|
||
# ── LAS `.so` QUE mesa Y wayland PIDEN EN RUNTIME Y NINGÚN ARTEFACTO DEL CIERRE PROVEE ────────
|
||
# Medido el 2026-09-03 recorriendo los NEEDED de todo el cierre de esta imagen contra los SONAME
|
||
# que ese mismo cierre publica: `libEGL.so.1` pide `libexpat.so.1` y `libwayland-client.so.0` pide
|
||
# `libffi.so.8`, y las recetas canónicas de expat y libffi son `--disable-shared`. O sea que el
|
||
# rootfs hidratado los resolvía contra el **sysroot Alpine DEL LAB**.
|
||
# Es peor que una dep faltante: el lab NO entra en `hash_inputs`, así que la fuga es invisible para
|
||
# el store — el artefacto se da por bueno y sólo arranca en una máquina con Alpine debajo.
|
||
# No es un descubrimiento nuevo: es EXACTAMENTE lo que el perfil `escritorio-sway` ya documentó
|
||
# para `sway`, sólo que ahí se encontró a mano al armar la imagen y estas tres nunca se revisaron.
|
||
# Van de raíces (y no de `[deps]`) por lo mismo que las fuentes y el XKB: son data de RUNTIME y
|
||
# nadie las declara como dep de BUILD, así que la clausura no puede alcanzarlas por ninguna arista.
|
||
# `bzip2-shared` se suma el 2026-09-03, cazada por `scripts/vigia-sonames.py` en los TRES perfiles
|
||
# a la vez: `freetype-shared` sale con `NEEDED libbz2.so.1` y el `bzip2` canónico del corpus es
|
||
# `.a`. Es la misma fuga al sysroot del lab que expat y libffi, y venía de antes que zathura —
|
||
# sólo que hasta ahora nadie cargaba freetype-shared en RUNTIME. Se vio de verdad al probar el
|
||
# visor: el plugin de PDF no hacía dlopen («Error relocating /usr/lib/libbz2.so.1»). La receta
|
||
# existía sólo en `incoming-kde`; promovida al corpus con el mismo hash (b3:1e404254 desde las dos
|
||
# partes ⇒ un solo artefacto, cero rebuilds).
|
||
# `ncurses-shared` se suma el 2026-09-03 por el ÚLTIMO soname sin proveedor que quedaba pedido por
|
||
# un componente de RUNTIME: `pw-top` (pipewire) sale con `NEEDED libncursesw.so.6` y el `ncurses`
|
||
# canónico del corpus es `--without-shared`. La receta de pipewire AFIRMA que quitando la dep
|
||
# «meson saltea pw-top» — es falso y llevaba así desde agosto: el guardián de upstream es
|
||
# `if ncurses_dep.found()` y meson lo encontró en el sysroot Alpine DEL LAB. Reproducido: sin esto
|
||
# el binario muere en el loader con `__vfprintf_chk: symbol not found` (símbolo de
|
||
# _FORTIFY_SOURCE de glibc que musl no tiene); con esto carga y corre.
|
||
# ⚠ Esto tapa el SÍNTOMA en runtime, no la causa: pipewire sigue enlazando contra el lab en BUILD.
|
||
# Arreglarlo de verdad pide re-sellar pipewire, que arrastra 7 artefactos —entre ellos dos Rust
|
||
# que ya murieron por OOM— así que se paga el día que pipewire se re-selle por otro motivo.
|
||
"expat-shared", "libffi-shared", "bzip2-shared", "ncurses-shared",
|
||
# ── TEMA DE ICONOS ───────────────────────────────────────────────────────────────────────────
|
||
# Añadido el 2026-09-03 releyendo la captura que dio el arranque por bueno
|
||
# (`docs/evidencia/plasma6-qemu-2026-09-03-kactivitymanagerd.png`): el panel salía con el reloj y
|
||
# NADA MÁS, y se leyó como «el panel arranca». No era el panel — era que ninguno de sus applets
|
||
# tenía icono que dibujar. `kickoff`, `systemtray`, `showdesktop` y `trash` SON un icono y poco
|
||
# más, así que sin tema quedan de ancho cero; el reloj se ve porque dibuja TEXTO. Los `.so` de los
|
||
# applets estaban todos instalados (`/usr/lib/qt6/plugins/plasma/applets/`), o sea que el síntoma
|
||
# no distingue «no cargó» de «cargó y no tiene qué pintar».
|
||
# El log lo decía en UNA línea que nadie leyó: `kf.iconthemes: Icon theme "breeze" not found.`
|
||
#
|
||
# `breeze`, que ya estaba de raíz, es el tema de WIDGETS y de CURSORES: instala
|
||
# `usr/share/icons/Breeze_Light` y `usr/share/icons/breeze_cursors`, que son punteros de ratón, no
|
||
# iconos de aplicación. Los ~11.000 iconos viven en `breeze-icons`, receta APARTE que estaba
|
||
# sellada desde siempre y que no declaraba NINGÚN perfil. Misma figura que las fuentes y que
|
||
# `foot`: es data de RUNTIME, no la alcanza ninguna arista de BUILD, y la clausura no la puede
|
||
# echar de menos porque mide lo declarado.
|
||
#
|
||
# `hicolor-icon-theme` es el FALLBACK obligatorio del estándar freedesktop: cada aplicación
|
||
# instala sus iconos en `usr/share/icons/hicolor/...` y todo buscador termina ahí cuando el tema
|
||
# activo no tiene lo pedido. Sin su `index.theme` el directorio existe pero NO es un tema y la
|
||
# búsqueda no lo recorre. Vive en el corpus desde hoy (promovida con hash IDÉNTICO
|
||
# b3:98ad44a5 desde `incoming-gnome`/`incoming-cosmic`, 0 rebuilds en sus 4 consumidores) para que
|
||
# la alcancen las cuatro imágenes.
|
||
"breeze-icons", "hicolor-icon-theme",
|
||
]
|
||
|
||
[perfil.escritorio-gnome]
|
||
descripcion = "escritorio GNOME (Wayland-nativo) desde fuente — 3er escritorio, X11 al tacho"
|
||
cola = "incoming-gnome"
|
||
# Raíces de una sesión GNOME que bootea a un shell usable. El resto es CLAUSURA. Hoy son HUECOS
|
||
# (cero recetas en incoming-gnome): build-state SALTA este perfil hasta que su cola se cargue
|
||
# (--gnome), así que declararlo NO reporta raíces fantasma — sólo lo hace un objetivo de primera
|
||
# clase que el sistema conoce. La frontera de autoría se descubre con `seed-gnome.py` (bootstrap por
|
||
# metadata mientras no haya recetas); OJO: ese cierre SOBREESTIMA ~5-10× (ver docs/state/seed-gnome.json
|
||
# y la memoria frente-gnome). El palo largo / keystone es spidermonkey(mozjs) → gjs → gnome-shell.
|
||
#
|
||
# ── SIN gnome-session / gnome-settings-daemon / gdm: APARCADAS POR DISEÑO (2026-08-07) ───────────
|
||
# Estaban acá y hacían que el perfil reportara 124/127 con 3 en `never` PARA SIEMPRE, que se lee
|
||
# como trabajo pendiente. No lo es: las tres mueren en GTK3, y GTK3 es una de las tres deudas que
|
||
# el frente GNOME aparcó a propósito (GTK3 / X11 / PAM). El diagnóstico completo, verificado contra
|
||
# el `meson.build` de cada tag, está en el encabezado de cada receta — que sigue en el repo, con su
|
||
# análisis intacto, por si algún día se autora el stack GTK3.
|
||
#
|
||
# NO son tres problemas, es UNO. Y no bloquean el escritorio: gnome-shell NO depende de
|
||
# gnome-session ni de g-s-d, ni en build ni para arrancar. El camino vivo es mutter → gnome-shell,
|
||
# lanzado por arje. El único que pedía gnome-session era gdm.
|
||
#
|
||
# ⚠ La contradicción costó: `targets.toml` las reclamaba como raíces mientras las recetas decían
|
||
# «aparcadas», así que el grafo reportaba deuda fantasma y el worker las reintentaba en cada ciclo.
|
||
# Dos documentos del repo diciendo cosas opuestas, y el que se mira primero es el grafo.
|
||
# Si algún día se autora GTK3, se vuelven a añadir acá y el objetivo reaparece solo.
|
||
paquetes = [
|
||
# `desktop-file-utils` (2026-09-09): `update-desktop-database` construye la caché
|
||
# MIME→APLICACIÓN. Con `shared-mime-info` el escritorio ya sabe QUÉ TIPO es un fichero; sin
|
||
# ésta sigue sin saber CON QUÉ abrirlo — el menú «abrir con» sale vacío y no hay aplicación
|
||
# por defecto para ningún tipo. Va como RAÍZ en los CUATRO escritorios y no en `base`,
|
||
# porque kde/gnome/cosmic NO heredan base: declararla acá funciona con cualquiera de las dos
|
||
# lecturas del modelo de composición.
|
||
"desktop-file-utils",
|
||
"mutter", "gnome-shell", "gjs",
|
||
"gsettings-desktop-schemas", "gnome-desktop", "xdg-desktop-portal-gnome",
|
||
# ── LA PRIMERA APP DE USUARIO FINAL QUE COMPARTEN LOS CUATRO ESCRITORIOS ──────────────────────
|
||
# `mpv` vive en el CORPUS, no en esta cola, justamente para poder listarse en las cuatro: una
|
||
# receta resuelve sibling-first y después el catálogo padre, así que desde acá se alcanza.
|
||
# Va de raíz por la lección que este mismo fichero ya aprendió con `foot` en el perfil de sway:
|
||
# una receta sellada que ningún perfil declara NO ESTÁ EN NINGUNA IMAGEN, y la métrica de
|
||
# clausura no lo puede ver porque mide lo declarado. Sellado ≠ instalado.
|
||
# Los tres huecos con que entró (ALSA sin PipeWire, sin Lua/OSC, sin vaapi) están CERRADOS al
|
||
# 2026-09-04: pipewire nativo con ALSA de respaldo, `-Dlua=lua5.2`, y `-Dvaapi=enabled` con `libva`
|
||
# subida al corpus. Además su ffmpeg ya va con x86asm ⇒ decodifica con SIMD.
|
||
"mpv",
|
||
# ── EL NAVEGADOR (SDD 26) ────────────────────────────────────────────────────────────────────
|
||
# `atuq` vive en el CORPUS por el mismo motivo que mpv: se resuelve sibling-first y después el
|
||
# catálogo padre, así que desde las cuatro colas se alcanza. Va de raíz por la lección de `foot`
|
||
# que este fichero ya aprendió: una receta sellada que ningún perfil declara NO ESTÁ EN NINGUNA
|
||
# IMAGEN, y la clausura no lo puede ver porque mide lo declarado.
|
||
# Arrastra la cadena GTK3 en sus variantes `-shared` — pango/cairo/gdk-pixbuf/harfbuzz—: con las
|
||
# estáticas, libgtk-3 y libgdk-3 se llevaban cada una su copia y el navegador no llegaba a pintar.
|
||
"atuq",
|
||
# `libnotify` va PEGADO a atuq y por eso mismo: `libxul.so` la abre por `dlopen("libnotify.so.4")`
|
||
# cuando una página pide permiso para notificar, y como no es un `NEEDED` de ningún ELF, ninguna
|
||
# herramienta del repo la reclamaba — ni el vigía de sonames, que da CERO. La encontró
|
||
# `scripts/test-atuq-rootfs.py --dlopen` (SDD 26 §6.10). Sin esta línea la receta está sellada y
|
||
# en ninguna imagen, que es la lección de `foot` escrita cuatro renglones más arriba.
|
||
# ⚠ Resuelve la mitad: libnotify no trae daemon, manda `org.freedesktop.Notifications` por D-Bus,
|
||
# así que la imagen necesita además a alguien escuchando ese nombre.
|
||
"libnotify",
|
||
# ── VISOR DE IMÁGENES, TAMBIÉN EN LAS CUATRO ─────────────────────────────────────────────────
|
||
# `swayimg` y no `imv`, que era lo que proponía `docs/plan-apps-usuario-final.md`: imv dibuja con
|
||
# OpenGL de función fija (`glBegin`/`glOrtho`) y esta distro NO tiene proveedor de GL de
|
||
# escritorio — las tres mesa van `-Dglx=disabled -Dglvnd=false` ⇒ no hay `libGL.so` ni `gl.pc` en
|
||
# ninguna cola. swayimg rasteriza a `wl_shm` y no toca GL; el porqué largo está en su receta.
|
||
# Trae de yapa backend DRM: muestra imágenes en una TTY pelada, sin compositor.
|
||
"swayimg",
|
||
# ── LECTOR DE DOCUMENTOS ─────────────────────────────────────────────────────────────────────
|
||
# ⚠ NO ESTÁ EN `escritorio-kde`, y no es un olvido. `zathura-pdf-poppler` necesita `poppler-glib`,
|
||
# que es una receta NUEVA del corpus (la que ya existía va `-DENABLE_GLIB=OFF` y vive en la cola
|
||
# de KDE). Las dos instalan `/usr/lib/libpoppler.so.146` y son artefactos DISTINTOS ⇒ una imagen
|
||
# que hidrate las dos pone dos ficheros en la misma ruta y gana el que se proyecte último, que es
|
||
# el cuadro de las dos glib. KDE ya trae `okular`, que arrastra la poppler de Qt6.
|
||
# Si alguna vez se quiere zathura en KDE, la salida NO es listarla acá: es jubilar una de las dos
|
||
# popplers. Escrito también en `recipes/poppler-glib.toml` y `recipes/zathura.toml`.
|
||
# El plugin va de raíz APARTE del visor a propósito: `zathura` no lo declara en `[deps]` de
|
||
# runtime —lo carga con dlopen— así que sin esta línea la imagen traería un visor que abre la
|
||
# ventana y dice «unknown file type». Sellado ≠ instalado, otra vez.
|
||
"zathura", "zathura-pdf-poppler",
|
||
# ── LAS `.so` QUE mesa Y wayland PIDEN EN RUNTIME Y NINGÚN ARTEFACTO DEL CIERRE PROVEE ────────
|
||
# Medido el 2026-09-03 recorriendo los NEEDED de todo el cierre de esta imagen contra los SONAME
|
||
# que ese mismo cierre publica: `libEGL.so.1` pide `libexpat.so.1` y `libwayland-client.so.0` pide
|
||
# `libffi.so.8`, y las recetas canónicas de expat y libffi son `--disable-shared`. O sea que el
|
||
# rootfs hidratado los resolvía contra el **sysroot Alpine DEL LAB**.
|
||
# Es peor que una dep faltante: el lab NO entra en `hash_inputs`, así que la fuga es invisible para
|
||
# el store — el artefacto se da por bueno y sólo arranca en una máquina con Alpine debajo.
|
||
# No es un descubrimiento nuevo: es EXACTAMENTE lo que el perfil `escritorio-sway` ya documentó
|
||
# para `sway`, sólo que ahí se encontró a mano al armar la imagen y estas tres nunca se revisaron.
|
||
# Van de raíces (y no de `[deps]`) por lo mismo que las fuentes y el XKB: son data de RUNTIME y
|
||
# nadie las declara como dep de BUILD, así que la clausura no puede alcanzarlas por ninguna arista.
|
||
# `bzip2-shared` se suma el 2026-09-03, cazada por `scripts/vigia-sonames.py` en los TRES perfiles
|
||
# a la vez: `freetype-shared` sale con `NEEDED libbz2.so.1` y el `bzip2` canónico del corpus es
|
||
# `.a`. Es la misma fuga al sysroot del lab que expat y libffi, y venía de antes que zathura —
|
||
# sólo que hasta ahora nadie cargaba freetype-shared en RUNTIME. Se vio de verdad al probar el
|
||
# visor: el plugin de PDF no hacía dlopen («Error relocating /usr/lib/libbz2.so.1»). La receta
|
||
# existía sólo en `incoming-kde`; promovida al corpus con el mismo hash (b3:1e404254 desde las dos
|
||
# partes ⇒ un solo artefacto, cero rebuilds).
|
||
# ── ⚠ TERMINAL Y EDITOR: ESTA IMAGEN NO TENÍA NI UNO NI OTRO ─────────────────────────────────
|
||
# Medido el 2026-09-03 cruzando la membresía de los cuatro perfiles contra una lista de emuladores
|
||
# de terminal, editores y gestores de ficheros:
|
||
#
|
||
# escritorio-cosmic term=cosmic-term editor=cosmic-edit archivos=cosmic-files
|
||
# escritorio-sway term=foot editor=vim archivos=—
|
||
# escritorio-gnome term=— editor=— archivos=—
|
||
# escritorio-kde term=— editor=— archivos=—
|
||
#
|
||
# Es la lección de `foot` otra vez y a mayor escala: sway llegó a 121/121 SIN emulador de terminal
|
||
# porque nadie lo declaraba. Un escritorio sin terminal no es uno incompleto: es uno del que no se
|
||
# puede salir cuando algo falla.
|
||
#
|
||
# `foot` y `helix` viven en el CORPUS —no en una cola—, así que desde acá se alcanzan y no hacen
|
||
# falta recetas nuevas: las dos ya estaban selladas y sin declarar por NADIE. foot es Wayland puro
|
||
# sobre `xdg-shell` (no pide protocolos de wlroots), así que corre bajo mutter igual que bajo sway;
|
||
# su único NEEDED es `libc.so`. helix es TUI y corre dentro de la terminal.
|
||
#
|
||
# ⚠ ESTO ESTABA VIEJO, corregido el 2026-09-09. Decía que KDE quedaba fuera del arreglo y que «su
|
||
# perfil son 13 raíces de ARRANQUE EN METAL, no la imagen completa», con konsole/kate/dolphin y
|
||
# otras 19 apps selladas y sin declarar. Ya no: el frente KDE lo reordenó y hoy su perfil son **48
|
||
# raíces** con konsole, dolphin, kate, okular, ark, spectacle, gwenview, kcalc, las fuentes y las
|
||
# `*-shared` de runtime declaradas. De su cola quedan 8 recetas fuera del perfil, y son las que
|
||
# corresponde: libICE, libSM, libXtst y los cinco eslabones que sólo servían a xwayland
|
||
# (libfontenc, libXfont2, libxkbfile, libxshmfence, xkbcomp), huérfanos desde que la receta se
|
||
# retiró.
|
||
#
|
||
# Lo que a KDE le queda no es este arreglo sino OTRO, medido el mismo día: su imagen no se hidrata
|
||
# desde el perfil sino de un rootfs YA ARMADO (`kde-qemu-rootfs`, 8,4 G) que nadie re-deriva, así
|
||
# que se queda atrás a medida que el perfil crece. Comprobado contra ese rootfs: de las 18 hojas
|
||
# que el perfil declara están 15 — faltan `obs-studio` y `atuq`, justo las dos que se añadieron
|
||
# después de aquella hidratación. Re-hidratarlo con `scripts/hydrate-profile.py escritorio-kde`
|
||
# es decisión del frente KDE, no de éste.
|
||
"foot", "helix",
|
||
# ── FUENTES ──────────────────────────────────────────────────────────────────────────────────
|
||
# ⚠ Añadida el 2026-09-03 porque este perfil no traía NI UN FICHERO DE FUENTE. Medido recorriendo
|
||
# los artefactos del cierre y contando `.ttf/.otf/.ttc/.pfb`: **gnome=0**, sway=22 (dejavu),
|
||
# kde=1 (una que viene dentro de qtbase). `fontconfig` estaba, pero fontconfig es el MOTOR que
|
||
# busca fuentes, no una fuente — tenerlo y creer que hay tipografía es el mismo error que
|
||
# confundir un directorio vacío con un artefacto.
|
||
# Se descubrió con `poppler-render-check`: un PDF con fuentes base-14 (Helvetica, Times…) NO
|
||
# trae la tipografía adentro, la sustituye el visor por fontconfig, así que sin fuentes el
|
||
# documento se ve VACÍO — y el visor no da error, que es lo peor.
|
||
# `dejavu-fonts` es la única receta de fuentes del catálogo entero. Que KDE esté igual (1 fuente
|
||
# de rebote, dentro de qtbase) es un hallazgo aparte y NO se toca acá: ese perfil no lleva zathura
|
||
# y su árbol lo está trabajando otro frente.
|
||
"dejavu-fonts",
|
||
# `dejavu-fonts-nerd` es la MISMA DejaVu Sans Mono parcheada con Nerd Fonts (~10.000 glifos de
|
||
# iconos: Powerline, Font Awesome, Devicons…) que usan starship, lsd, eza, neovim y las
|
||
# statuslines; sin ellos dibujan cuadraditos. Se AÑADE, no reemplaza: la licencia de Bitstream
|
||
# Vera obliga a renombrar una fuente modificada, así que la parcheada se llama
|
||
# «DejaVuSansM Nerd Font Mono» y NO puede responder a «DejaVu Sans Mono» — sustituirla rompería
|
||
# a todo lo que la pide por nombre, empezando por foot. Se enchufa por fontconfig: su
|
||
# `59-nerd-monospace.conf` hace que el alias `monospace` la prefiera. Ver su receta.
|
||
"dejavu-fonts-nerd",
|
||
# `ncurses-shared` se suma el 2026-09-03 por el ÚLTIMO soname sin proveedor que quedaba pedido por
|
||
# un componente de RUNTIME: `pw-top` (pipewire) sale con `NEEDED libncursesw.so.6` y el `ncurses`
|
||
# canónico del corpus es `--without-shared`. La receta de pipewire AFIRMA que quitando la dep
|
||
# «meson saltea pw-top» — es falso y llevaba así desde agosto: el guardián de upstream es
|
||
# `if ncurses_dep.found()` y meson lo encontró en el sysroot Alpine DEL LAB. Reproducido: sin esto
|
||
# el binario muere en el loader con `__vfprintf_chk: symbol not found` (símbolo de
|
||
# _FORTIFY_SOURCE de glibc que musl no tiene); con esto carga y corre.
|
||
# ⚠ Esto tapa el SÍNTOMA en runtime, no la causa: pipewire sigue enlazando contra el lab en BUILD.
|
||
# Arreglarlo de verdad pide re-sellar pipewire, que arrastra 7 artefactos —entre ellos dos Rust
|
||
# que ya murieron por OOM— así que se paga el día que pipewire se re-selle por otro motivo.
|
||
"expat-shared", "libffi-shared", "bzip2-shared", "ncurses-shared",
|
||
# `xz-shared` se suma el 2026-09-05, cazada por `scripts/vigia-sonames.py`. Y es la MÁS grave de
|
||
# todas las de esta clase encontradas hasta ahora: quien pide `liblzma.so.5` no es una herramienta
|
||
# ni un binario suelto, es **`libadwaita-1.so.0`** — la librería contra la que enlaza TODA app
|
||
# GTK4/GNOME de la imagen. Sin proveedor, el loader falla en cada una de ellas, no en una.
|
||
# El `xz` canónico del corpus es `.a`; la receta `-shared` existía sólo en `incoming-kde`, y se
|
||
# promueve al corpus igual que `bzip2-shared`: mismo hash desde las dos partes
|
||
# (b3:174289d5) ⇒ un solo artefacto, cero rebuilds.
|
||
# Sólo va acá: en cosmic y sway ese soname lo pide únicamente `python3`, que no viaja en la imagen.
|
||
"xz-shared",
|
||
# ── TEMA DE ICONOS Y DE CURSORES ─────────────────────────────────────────────────────────────
|
||
# Añadido el 2026-09-03: medido sobre los artefactos del cierre, este perfil tenía **CERO** temas
|
||
# de iconos — ni siquiera `hicolor`. Se ve en `docs/evidencia/gnome-shell-qemu-2026-09-03-libs-
|
||
# compartidas.png`: la barra superior trae la fecha (texto) y el pill de espacios de trabajo, y la
|
||
# DERECHA está vacía — los indicadores de red, volumen y batería son iconos, y no había ninguno
|
||
# que dibujar. Mismo defecto que en KDE y por el mismo motivo: data de RUNTIME que no alcanza
|
||
# ninguna arista de BUILD.
|
||
#
|
||
# `adwaita-icon-theme` estaba escrita y SELLADA desde el frente GNOME y no la declaraba nadie. Su
|
||
# propia cabecera explica por qué la escribieron: mutter avisa `No cursor theme available` y **sin
|
||
# tema de cursor no hay puntero visible** con el cursor por software que obliga virtio-gpu. Los
|
||
# XCursor viven ahí adentro (`Adwaita/cursors/`), no en un paquete aparte.
|
||
# `hicolor-icon-theme` va explícito aunque Adwaita lo declare `Inherits=hicolor`: la herencia se
|
||
# resuelve en RUNTIME leyendo el `index.theme` del padre, así que el padre tiene que estar
|
||
# INSTALADO. Desde hoy se resuelve contra el corpus (misma receta, mismo hash).
|
||
"adwaita-icon-theme", "hicolor-icon-theme",
|
||
# ── EXTENSIONES DEL SHELL ────────────────────────────────────────────────────────────────────
|
||
# ⚠ Añadida el 2026-09-09: esta imagen traía la CÁSCARA de GNOME y ni una extensión. No es un
|
||
# detalle estético — GNOME manda un shell deliberadamente mínimo y el ecosistema lo completa por
|
||
# acá; sin ninguna, el escritorio es lo que el proyecto entrega y nadie usa tal cual.
|
||
# El shell SÍ sabe cargarlas sin nada más: `ui/extensionSystem.js` va en el gresource sin opción
|
||
# que lo apague y su gschema sellado trae `enabled-extensions`. Lo que faltaba era que hubiera
|
||
# alguna, y va de RAÍZ por la lección de `foot` que este fichero ya aprendió tres veces.
|
||
# ⚠ NO hace falta glib-networking ni TLS: eso sólo lo pide BAJARLAS desde extensions.gnome.org
|
||
# con el descargador del shell. Empaquetada, se instala como cualquier receta.
|
||
# La receta se construye desde el REPO del autor (tag v72), no desde el zip de EGO: hammer extrae
|
||
# con `tar -x` y GNU tar no lee zip, y además el zip es un artefacto que construye EGO a partir
|
||
# de ese mismo repo. El layout instalado se verificó CONTRA ese zip: idéntico, sin sobras ni
|
||
# faltantes.
|
||
# ⚠ La LISTA de activas no vive en ninguna receta: `enabled-extensions` es un ARRAY y un override
|
||
# de GSettings lo escribe entero, así que dos recetas con el suyo no se suman — ganaría la última
|
||
# y las otras quedarían instaladas y MUERTAS, sin error. La arma `scripts/gnome/gnome-start-qemu.sh`
|
||
# enumerando los uuid presentes en /usr/share/gnome-shell/extensions antes de compilar los
|
||
# esquemas. Una receta no puede ser ese sitio: hammer exige `[source]` en toda receta.
|
||
"gnome-shell-extension-blur-my-shell",
|
||
# `dash-to-panel` es la que más cambia el uso diario: junta dash, ventanas y bandeja en una barra.
|
||
# `appindicator` devuelve los ICONOS DE BANDEJA que GNOME quitó — sin ella, las apps que usan
|
||
# StatusNotifierItem corren y no tienen dónde mostrarse.
|
||
"gnome-shell-extension-dash-to-panel", "gnome-shell-extension-appindicator",
|
||
# ── Y LA APP QUE GNOME NO INSTALA Y TODO EL MUNDO NECESITA ───────────────────────────────────
|
||
# `gnome-tweaks`: tema, iconos, cursor, tipografías, los botones de minimizar/maximizar que GNOME
|
||
# esconde, y el interruptor de las extensiones. Es una app de PYTHON, así que su receta declara
|
||
# `python3` y `py3-gobject` como deps de RUNTIME: sin ellas en la imagen se instala y no arranca,
|
||
# y ningún build puede delatarlo.
|
||
"gnome-tweaks",
|
||
# ── RAÍCES DE RUNTIME QUE EL GRAFO NO PUEDE VER (traídas acá el 2026-09-09) ───────────────────
|
||
# ⚠ Estas once vivían SÓLO dentro de `scripts/gnome/hydrate-gnome.sh`, en una lista escrita a
|
||
# mano. O sea DOS fuentes de verdad para «qué lleva la imagen de GNOME», y habían divergido en
|
||
# los DOS sentidos: el script no conocía 21 paquetes que este perfil declara —entre ellos el
|
||
# navegador, la terminal, el editor, el visor de PDF, las fuentes y las tres extensiones— y este
|
||
# perfil no conocía estas once, sin las cuales el shell no arranca. Es exactamente el modo de
|
||
# fallo que la cabecera de `scripts/hydrate-profile.py` describe y que `vigia-imagen.py` existe
|
||
# para cazar.
|
||
# Ninguna es dep de BUILD de nadie: el shell las carga por `imports.gi.*` al arrancar, y eso es
|
||
# invisible para la clausura de deps. La justificación de cada una la traía el script:
|
||
"accountsservice", # imports.gi.AccountsService
|
||
"gi-foreign-typelibs", # DBus-1.0 / cairo-1.0, que Gdk y Atspi incluyen
|
||
"gi-girepository-typelib", # lo pide el propio gjs desde su JS embebido
|
||
"libgdm", # imports.gi.Gdm — el shell lo importa SIN condición al arrancar
|
||
"geoclue", # imports.gi.Geoclue
|
||
"libgweather", # imports.gi.GWeather
|
||
"upower", # imports.gi.UPowerGlib
|
||
"librsvg", # imports.gi.Rsvg
|
||
"ibus", # imports.gi.IBus
|
||
# Ni typelib ni librería: los GSCHEMAS de gnome-settings-daemon. El demonio está aparcado
|
||
# (GTK3/X11) pero el shell lee sus esquemas al armar los quick settings, y si faltan la excepción
|
||
# ocurre DENTRO de Main.start() ⇒ el panel no se arma y la pantalla queda NEGRA.
|
||
"gsd-schemas",
|
||
# `wireplumber` es lo que le da DISPOSITIVOS a PipeWire (que ya entra por la clausura): sin él hay
|
||
# socket de audio y nada que suene.
|
||
"wireplumber",
|
||
]
|
||
|
||
[perfil.escritorio-cosmic]
|
||
descripcion = "escritorio COSMIC (System76, Rust sobre smithay/iced) desde fuente — 4º escritorio"
|
||
cola = "incoming-cosmic"
|
||
# Las raíces son EXACTAMENTE lo que `cosmic-session/src/main.rs` levanta, más el gestor mismo y los
|
||
# datos que ningún `[deps]` alcanza. El resto es CLAUSURA.
|
||
#
|
||
# ── POR QUÉ ESTE PERFIL NO ES BUROCRACIA ────────────────────────────────────────────────────────
|
||
# Sin él, `yupana radio` sobre cualquier receta COMPARTIDA —libinput, libxkbcommon, libudev-zero,
|
||
# mesa, wayland— devuelve «IMÁGENES afectadas: (ninguna declarada)» para COSMIC, y el próximo que las
|
||
# toque MIDE DE MENOS. La campaña existe en el store y en el runbook, pero el ábaco no la ve: el radio
|
||
# de un re-hash es justo lo que el perfil convierte en dato.
|
||
#
|
||
# Nota de nombres, que acá no coinciden y ya costó una vez: el repo `cosmic-workspaces-epoch` produce
|
||
# el binario `cosmic-workspaces`, y el AppID tampoco lleva el sufijo. Se lista por el nombre de la
|
||
# RECETA, que es el del repo.
|
||
paquetes = [
|
||
# `desktop-file-utils` (2026-09-09): `update-desktop-database` construye la caché
|
||
# MIME→APLICACIÓN. Con `shared-mime-info` el escritorio ya sabe QUÉ TIPO es un fichero; sin
|
||
# ésta sigue sin saber CON QUÉ abrirlo — el menú «abrir con» sale vacío y no hay aplicación
|
||
# por defecto para ningún tipo. Va como RAÍZ en los CUATRO escritorios y no en `base`,
|
||
# porque kde/gnome/cosmic NO heredan base: declararla acá funciona con cualquiera de las dos
|
||
# lecturas del modelo de composición.
|
||
"desktop-file-utils",
|
||
"cosmic-comp", "cosmic-session", "cosmic-settings-daemon",
|
||
"cosmic-panel", "cosmic-launcher", "cosmic-app-library", "cosmic-workspaces-epoch",
|
||
"cosmic-notifications", "cosmic-osd", "cosmic-bg", "cosmic-idle",
|
||
# Los applets del panel. No es un componente que la sesión lance: lo spawnea el PANEL, por AppID,
|
||
# y sin ellos arranca y no se dibuja. Un binario multiplexor con veinte symlinks.
|
||
"cosmic-applets",
|
||
# El MOTOR del lanzador, de otro repo y fuera del pin `epoch-N`: `cosmic-launcher` sólo dibuja y
|
||
# lanza a `pop-launcher` como proceso hijo por PATH. Sin él, `Super` no abre nada.
|
||
"pop-launcher",
|
||
# Y el `qalc` al que el plugin `calc` le pasa la expresión: tercer nivel de hijo por PATH. Es la
|
||
# primera raíz del perfil que existe para que una TECLA dé un resultado, no para que algo enlace.
|
||
"libqalculate",
|
||
# La primera APLICACIÓN con ventana del catálogo, y la primera entrada de la biblioteca que no es
|
||
# `NoDisplay`. Hasta acá el perfil listaba escritorio; desde acá lista también lo que se abre.
|
||
"cosmic-term",
|
||
# La segunda: el gestor de ficheros. Sin `gvfs` (no hay glib compartida) ⇒ navegación local sí,
|
||
# montajes remotos no.
|
||
"cosmic-files",
|
||
# La tercera: el panel de control. Habla con los daemons por zbus, así que NO arrastra
|
||
# NetworkManager/udisks/accountsservice — sólo libdrm y dav1d sobre el juego fijo.
|
||
"cosmic-settings",
|
||
# La cuarta: el editor de texto, y la más barata de las cuatro — su árbol ya estaba compilado (usa
|
||
# `cosmic-files` como crate, igual que la terminal). Su binario enlaza SÓLO `libxkbcommon` y
|
||
# `libc.so`: dos NEEDED, el mínimo de todos los clientes de la suite.
|
||
"cosmic-edit",
|
||
# La quinta: la tienda. Con el backend `pkgar` —el único de los cuatro que no pide ni una torre de
|
||
# C (flatpak) ni un demonio ausente (packagekit)— NAVEGA el catálogo instalado leyendo el AppStream
|
||
# del sistema, pero NO instala: nada está cableado al `.swm` de hammer.
|
||
"cosmic-store",
|
||
# La sexta: la captura de pantalla. Cero C —el único `[deps] build = []` de la campaña— pero HOY
|
||
# NO FUNCIONA: todo su trabajo es `Screenshot::request()` contra `org.freedesktop.portal.Desktop`,
|
||
# y en la imagen no hay portal. Se lista igual para que el hueco sea visible.
|
||
"cosmic-screenshot",
|
||
# La CADENA DEL PORTAL, dos raíces porque son dos procesos que se encuentran por D-Bus en runtime:
|
||
# el frontend registra `org.freedesktop.portal.Desktop` y enruta al backend, que implementa
|
||
# Access/FileChooser/Screenshot/Settings/ScreenCast. Sin ellos no hay captura, ni selector de
|
||
# ficheros de portal, ni compartir pantalla.
|
||
"xdg-desktop-portal", "xdg-desktop-portal-cosmic",
|
||
# Y la SONDA con que se mide esa cadena. No es escritorio: es el instrumento. Se lista como raíz
|
||
# porque nadie la declara como dep y sin ella el perfil no incluiría con qué verificarse a sí
|
||
# mismo — un handshake de portal sólo se puede ejercer DESDE la sesión, con bus y compositor vivos.
|
||
"portal-probe",
|
||
# El GESTOR DE SESIÓN de pipewire. Se lista como raíz porque ningún `[deps]` lo alcanza: es un
|
||
# CLIENTE del demonio, no una librería de nadie. Trae consigo la glib COMPARTIDA (`glib-shared`),
|
||
# que no es la estática que usa el resto de la cola — wireplumber produce `.so` y la estática del
|
||
# corpus no es PIC. Construido y corriendo; NO desbloqueó ScreenCast (ver el runbook).
|
||
"wireplumber",
|
||
# Datos, no binarios: el tema de iconos (y el hicolor del que hereda), las tablas de xkb y una
|
||
# tipografía. Ninguno es dep de build de nadie y sin ellos el escritorio arranca roto — sin puntero,
|
||
# sin teclado o con tofu.
|
||
"cosmic-icons", "hicolor-icon-theme", "xkeyboard-config", "dejavu-fonts",
|
||
# ⚠ «sin puntero» lo decía este comentario desde que se escribió y NO era cierto: `cosmic-icons`
|
||
# instala iconos de aplicación, no cursores, así que este perfil llegó a 43/43 con el puntero
|
||
# INVISIBLE. Lo cazó `vigia-imagen.py` el 2026-09-04. Los cursores son su propia raíz.
|
||
"adwaita-cursors",
|
||
# `dejavu-fonts-nerd` es la MISMA DejaVu Sans Mono parcheada con Nerd Fonts (~10.000 glifos de
|
||
# iconos: Powerline, Font Awesome, Devicons…) que usan starship, lsd, eza, neovim y las
|
||
# statuslines; sin ellos dibujan cuadraditos. Se AÑADE, no reemplaza: la licencia de Bitstream
|
||
# Vera obliga a renombrar una fuente modificada, así que la parcheada se llama
|
||
# «DejaVuSansM Nerd Font Mono» y NO puede responder a «DejaVu Sans Mono» — sustituirla rompería
|
||
# a todo lo que la pide por nombre, empezando por foot. Se enchufa por fontconfig: su
|
||
# `59-nerd-monospace.conf` hace que el alias `monospace` la prefiera. Ver su receta.
|
||
"dejavu-fonts-nerd",
|
||
# Lo que `start-cosmic` ejecuta y ningún `[deps]` pide: bash de verdad y el bus de sesión.
|
||
"bash", "dbus",
|
||
# ── LA PRIMERA APP DE USUARIO FINAL QUE COMPARTEN LOS CUATRO ESCRITORIOS ──────────────────────
|
||
# `mpv` vive en el CORPUS, no en esta cola, justamente para poder listarse en las cuatro: una
|
||
# receta resuelve sibling-first y después el catálogo padre, así que desde acá se alcanza.
|
||
# Va de raíz por la lección que este mismo fichero ya aprendió con `foot` en el perfil de sway:
|
||
# una receta sellada que ningún perfil declara NO ESTÁ EN NINGUNA IMAGEN, y la métrica de
|
||
# clausura no lo puede ver porque mide lo declarado. Sellado ≠ instalado.
|
||
# Los tres huecos con que entró (ALSA sin PipeWire, sin Lua/OSC, sin vaapi) están CERRADOS al
|
||
# 2026-09-04: pipewire nativo con ALSA de respaldo, `-Dlua=lua5.2`, y `-Dvaapi=enabled` con `libva`
|
||
# subida al corpus. Además su ffmpeg ya va con x86asm ⇒ decodifica con SIMD.
|
||
"mpv",
|
||
# ── EL NAVEGADOR (SDD 26) ────────────────────────────────────────────────────────────────────
|
||
# `atuq` vive en el CORPUS por el mismo motivo que mpv: se resuelve sibling-first y después el
|
||
# catálogo padre, así que desde las cuatro colas se alcanza. Va de raíz por la lección de `foot`
|
||
# que este fichero ya aprendió: una receta sellada que ningún perfil declara NO ESTÁ EN NINGUNA
|
||
# IMAGEN, y la clausura no lo puede ver porque mide lo declarado.
|
||
# Arrastra la cadena GTK3 en sus variantes `-shared` — pango/cairo/gdk-pixbuf/harfbuzz—: con las
|
||
# estáticas, libgtk-3 y libgdk-3 se llevaban cada una su copia y el navegador no llegaba a pintar.
|
||
"atuq",
|
||
# `libnotify` va PEGADO a atuq y por eso mismo: `libxul.so` la abre por `dlopen("libnotify.so.4")`
|
||
# cuando una página pide permiso para notificar, y como no es un `NEEDED` de ningún ELF, ninguna
|
||
# herramienta del repo la reclamaba — ni el vigía de sonames, que da CERO. La encontró
|
||
# `scripts/test-atuq-rootfs.py --dlopen` (SDD 26 §6.10). Sin esta línea la receta está sellada y
|
||
# en ninguna imagen, que es la lección de `foot` escrita cuatro renglones más arriba.
|
||
# ⚠ Resuelve la mitad: libnotify no trae daemon, manda `org.freedesktop.Notifications` por D-Bus,
|
||
# así que la imagen necesita además a alguien escuchando ese nombre.
|
||
"libnotify",
|
||
# ── VISOR DE IMÁGENES, TAMBIÉN EN LAS CUATRO ─────────────────────────────────────────────────
|
||
# `swayimg` y no `imv`, que era lo que proponía `docs/plan-apps-usuario-final.md`: imv dibuja con
|
||
# OpenGL de función fija (`glBegin`/`glOrtho`) y esta distro NO tiene proveedor de GL de
|
||
# escritorio — las tres mesa van `-Dglx=disabled -Dglvnd=false` ⇒ no hay `libGL.so` ni `gl.pc` en
|
||
# ninguna cola. swayimg rasteriza a `wl_shm` y no toca GL; el porqué largo está en su receta.
|
||
# Trae de yapa backend DRM: muestra imágenes en una TTY pelada, sin compositor.
|
||
"swayimg",
|
||
# ── LECTOR DE DOCUMENTOS ─────────────────────────────────────────────────────────────────────
|
||
# ⚠ NO ESTÁ EN `escritorio-kde`, y no es un olvido. `zathura-pdf-poppler` necesita `poppler-glib`,
|
||
# que es una receta NUEVA del corpus (la que ya existía va `-DENABLE_GLIB=OFF` y vive en la cola
|
||
# de KDE). Las dos instalan `/usr/lib/libpoppler.so.146` y son artefactos DISTINTOS ⇒ una imagen
|
||
# que hidrate las dos pone dos ficheros en la misma ruta y gana el que se proyecte último, que es
|
||
# el cuadro de las dos glib. KDE ya trae `okular`, que arrastra la poppler de Qt6.
|
||
# Si alguna vez se quiere zathura en KDE, la salida NO es listarla acá: es jubilar una de las dos
|
||
# popplers. Escrito también en `recipes/poppler-glib.toml` y `recipes/zathura.toml`.
|
||
# El plugin va de raíz APARTE del visor a propósito: `zathura` no lo declara en `[deps]` de
|
||
# runtime —lo carga con dlopen— así que sin esta línea la imagen traería un visor que abre la
|
||
# ventana y dice «unknown file type». Sellado ≠ instalado, otra vez.
|
||
"zathura", "zathura-pdf-poppler",
|
||
# ── LAS `.so` QUE mesa Y wayland PIDEN EN RUNTIME Y NINGÚN ARTEFACTO DEL CIERRE PROVEE ────────
|
||
# Medido el 2026-09-03 recorriendo los NEEDED de todo el cierre de esta imagen contra los SONAME
|
||
# que ese mismo cierre publica: `libEGL.so.1` pide `libexpat.so.1` y `libwayland-client.so.0` pide
|
||
# `libffi.so.8`, y las recetas canónicas de expat y libffi son `--disable-shared`. O sea que el
|
||
# rootfs hidratado los resolvía contra el **sysroot Alpine DEL LAB**.
|
||
# Es peor que una dep faltante: el lab NO entra en `hash_inputs`, así que la fuga es invisible para
|
||
# el store — el artefacto se da por bueno y sólo arranca en una máquina con Alpine debajo.
|
||
# No es un descubrimiento nuevo: es EXACTAMENTE lo que el perfil `escritorio-sway` ya documentó
|
||
# para `sway`, sólo que ahí se encontró a mano al armar la imagen y estas tres nunca se revisaron.
|
||
# Van de raíces (y no de `[deps]`) por lo mismo que las fuentes y el XKB: son data de RUNTIME y
|
||
# nadie las declara como dep de BUILD, así que la clausura no puede alcanzarlas por ninguna arista.
|
||
# `bzip2-shared` se suma el 2026-09-03, cazada por `scripts/vigia-sonames.py` en los TRES perfiles
|
||
# a la vez: `freetype-shared` sale con `NEEDED libbz2.so.1` y el `bzip2` canónico del corpus es
|
||
# `.a`. Es la misma fuga al sysroot del lab que expat y libffi, y venía de antes que zathura —
|
||
# sólo que hasta ahora nadie cargaba freetype-shared en RUNTIME. Se vio de verdad al probar el
|
||
# visor: el plugin de PDF no hacía dlopen («Error relocating /usr/lib/libbz2.so.1»). La receta
|
||
# existía sólo en `incoming-kde`; promovida al corpus con el mismo hash (b3:1e404254 desde las dos
|
||
# partes ⇒ un solo artefacto, cero rebuilds).
|
||
# `ncurses-shared` se suma el 2026-09-03 por el ÚLTIMO soname sin proveedor que quedaba pedido por
|
||
# un componente de RUNTIME: `pw-top` (pipewire) sale con `NEEDED libncursesw.so.6` y el `ncurses`
|
||
# canónico del corpus es `--without-shared`. La receta de pipewire AFIRMA que quitando la dep
|
||
# «meson saltea pw-top» — es falso y llevaba así desde agosto: el guardián de upstream es
|
||
# `if ncurses_dep.found()` y meson lo encontró en el sysroot Alpine DEL LAB. Reproducido: sin esto
|
||
# el binario muere en el loader con `__vfprintf_chk: symbol not found` (símbolo de
|
||
# _FORTIFY_SOURCE de glibc que musl no tiene); con esto carga y corre.
|
||
# ⚠ Esto tapa el SÍNTOMA en runtime, no la causa: pipewire sigue enlazando contra el lab en BUILD.
|
||
# Arreglarlo de verdad pide re-sellar pipewire, que arrastra 7 artefactos —entre ellos dos Rust
|
||
# que ya murieron por OOM— así que se paga el día que pipewire se re-selle por otro motivo.
|
||
"expat-shared", "libffi-shared", "bzip2-shared", "ncurses-shared",
|
||
]
|
||
|
||
[perfil.escritorio-sway]
|
||
descripcion = "WM Wayland ligero: sway sobre wlroots propio, sin X11 y sin systemd"
|
||
cola = "incoming-wlr"
|
||
hereda = ["cli"]
|
||
# Sellado entero el 2026-08-07. A diferencia de los otros tres escritorios, éste NO tiene una torre
|
||
# de C debajo: son una decena de binarios pequeños sobre wlroots, y por eso salió en una noche
|
||
# mientras KDE y GNOME fueron campañas de semanas.
|
||
#
|
||
# `hereda = ["cli"]` a propósito: un WM ligero sin userland debajo no se usa: hace falta la terminal
|
||
# y las herramientas.
|
||
#
|
||
# 2026-08-26: este comentario decía que `foot` «entra por la clausura de cli, así que no se lista
|
||
# acá». ERA FALSO y el grafo lo desmentía: `foot` está sellado en el corpus pero `perfil.cli` no lo
|
||
# lista entre sus raíces, así que ningún perfil lo arrastraba. El perfil daba 121/121 SIN EMULADOR DE
|
||
# TERMINAL — sellado completo y aun así inusable. Se detectó al hidratar la clausura para armar la
|
||
# imagen, no antes: la métrica de perfil mide la clausura de las raíces declaradas, y no puede ver lo
|
||
# que falta en la declaración. `foot` se lista ahora donde le toca, entre las raíces del escritorio.
|
||
#
|
||
# Sólo RAÍCES: la clausura —wlroots, mesa, wayland, libinput, seatd, cairo, pango, fcft…— la calcula
|
||
# el grafo siguiendo las aristas de deps. Escribirla a mano sería justo lo que targets.toml existe
|
||
# para no hacer.
|
||
paquetes = [
|
||
# `desktop-file-utils` (2026-09-09): `update-desktop-database` construye la caché
|
||
# MIME→APLICACIÓN. Con `shared-mime-info` el escritorio ya sabe QUÉ TIPO es un fichero; sin
|
||
# ésta sigue sin saber CON QUÉ abrirlo — el menú «abrir con» sale vacío y no hay aplicación
|
||
# por defecto para ningún tipo. Va como RAÍZ en los CUATRO escritorios y no en `base`,
|
||
# porque kde/gnome/cosmic NO heredan base: declararla acá funciona con cualquiera de las dos
|
||
# lecturas del modelo de composición.
|
||
"desktop-file-utils",
|
||
# el compositor y sus utilidades propias
|
||
"sway",
|
||
# lo que hace que se USE y no sólo arranque
|
||
"yambar", # barra de estado (yambar y no waybar: waybar exige gtkmm-3.0, o sea GTK3 + sus
|
||
# bindings C++, que es deuda aparcada por diseño. Medido, no supuesto.)
|
||
"foot", # emulador de terminal (misma familia que fcft/tllist, ya en la clausura)
|
||
"fuzzel", # lanzador de aplicaciones
|
||
# ── DATOS, no binarios: nadie los declara como dep de build, así que SÓLO entran como raíces ──
|
||
# Ninguna receta depende de una fuente ni de un mapa de teclado para COMPILAR, de modo que la
|
||
# clausura no puede alcanzarlos por más aristas que siga. Si no están acá, no están.
|
||
"dejavu-fonts", # sin UNA fuente, foot muere con «monospace::size=8: failed to match font»
|
||
# `dejavu-fonts-nerd` es la MISMA DejaVu Sans Mono parcheada con Nerd Fonts (~10.000 glifos de
|
||
# iconos: Powerline, Font Awesome, Devicons…) que usan starship, lsd, eza, neovim y las
|
||
# statuslines; sin ellos dibujan cuadraditos. Se AÑADE, no reemplaza: la licencia de Bitstream
|
||
# Vera obliga a renombrar una fuente modificada, así que la parcheada se llama
|
||
# «DejaVuSansM Nerd Font Mono» y NO puede responder a «DejaVu Sans Mono» — sustituirla rompería
|
||
# a todo lo que la pide por nombre, empezando por foot. Se enchufa por fontconfig: su
|
||
# `59-nerd-monospace.conf` hace que el alias `monospace` la prefiera. Ver su receta.
|
||
"dejavu-fonts-nerd",
|
||
"xkeyboard-config", # sin datos XKB: «xkbcommon: ERROR: failed to add default include path
|
||
# /usr/share/X11/xkb», y sway no completa el seat
|
||
# Cursores. Mismo caso que las fuentes y el XKB, y con el mismo modo de fallo silencioso: con el
|
||
# cursor por software el compositor dibuja lo que le da el TEMA, y sin tema el puntero se mueve
|
||
# invisible. Este perfil llegó a 173/173 sin uno. Trae además `/usr/share/icons/default`, que es
|
||
# lo que buscan libXcursor y wlroots cuando nadie fijó `XCURSOR_THEME` — o sea, siempre acá.
|
||
"adwaita-cursors",
|
||
# ── LAS TRES `.so` QUE sway PIDE Y EL CORPUS SÓLO PRODUCE COMO `.a` ─────────────────────────
|
||
# `sway` es `link = "dynamic"` a propósito (dlopea los drivers DRI de mesa) y sale con
|
||
# `NEEDED libz.so.1 / libexpat.so.1 / libffi.so.8`. Las canónicas son `--disable-shared`, así que
|
||
# ningún artefacto sellado producía esos `.so` y el rootfs hidratado los resolvía contra el
|
||
# sysroot Alpine DEL LAB. Peor que una dep faltante: el lab NO entra en `hash_inputs`, así que la
|
||
# fuga era invisible para el store — el artefacto se daba por bueno y sólo arrancaba en una
|
||
# máquina con Alpine debajo. Los otros nueve NEEDED de sway (pixman, drm, evdev, input, udev,
|
||
# wayland-server, wlroots, xkbcommon, libc) sí los cubre la clausura, porque esas recetas ya son
|
||
# `link = dynamic`. Como las tres son data de runtime y nadie las declara como dep de BUILD, van
|
||
# de raíces por la misma razón que las fuentes y el XKB de arriba.
|
||
# `bzip2-shared` se suma el 2026-09-03, cazada por `scripts/vigia-sonames.py` en los TRES perfiles
|
||
# a la vez: `freetype-shared` sale con `NEEDED libbz2.so.1` y el `bzip2` canónico del corpus es
|
||
# `.a`. Es la misma fuga al sysroot del lab que expat y libffi, y venía de antes que zathura —
|
||
# sólo que hasta ahora nadie cargaba freetype-shared en RUNTIME. Se vio de verdad al probar el
|
||
# visor: el plugin de PDF no hacía dlopen («Error relocating /usr/lib/libbz2.so.1»). La receta
|
||
# existía sólo en `incoming-kde`; promovida al corpus con el mismo hash (b3:1e404254 desde las dos
|
||
# partes ⇒ un solo artefacto, cero rebuilds).
|
||
# `ncurses-shared` se suma el 2026-09-03 por el ÚLTIMO soname sin proveedor que quedaba pedido por
|
||
# un componente de RUNTIME: `pw-top` (pipewire) sale con `NEEDED libncursesw.so.6` y el `ncurses`
|
||
# canónico del corpus es `--without-shared`. La receta de pipewire AFIRMA que quitando la dep
|
||
# «meson saltea pw-top» — es falso y llevaba así desde agosto: el guardián de upstream es
|
||
# `if ncurses_dep.found()` y meson lo encontró en el sysroot Alpine DEL LAB. Reproducido: sin esto
|
||
# el binario muere en el loader con `__vfprintf_chk: symbol not found` (símbolo de
|
||
# _FORTIFY_SOURCE de glibc que musl no tiene); con esto carga y corre.
|
||
# ⚠ Esto tapa el SÍNTOMA en runtime, no la causa: pipewire sigue enlazando contra el lab en BUILD.
|
||
# Arreglarlo de verdad pide re-sellar pipewire, que arrastra 7 artefactos —entre ellos dos Rust
|
||
# que ya murieron por OOM— así que se paga el día que pipewire se re-selle por otro motivo.
|
||
"zlib-shared", "expat-shared", "libffi-shared", "bzip2-shared", "ncurses-shared",
|
||
"swaybg", # fondo de escritorio
|
||
"swaylock", # bloqueo de pantalla (con PAM: linux-pam SÍ está en el corpus)
|
||
"swayidle", # apagado por inactividad
|
||
# el par de captura y el portapapeles, sin los cuales media docena de flujos no cierran
|
||
"grim", "slurp", "wl-clipboard",
|
||
# ── LA PRIMERA APP DE USUARIO FINAL QUE COMPARTEN LOS CUATRO ESCRITORIOS ──────────────────────
|
||
# `mpv` vive en el CORPUS, no en esta cola, justamente para poder listarse en las cuatro: una
|
||
# receta resuelve sibling-first y después el catálogo padre, así que desde acá se alcanza.
|
||
# Va de raíz por la lección que este mismo fichero ya aprendió con `foot` en el perfil de sway:
|
||
# una receta sellada que ningún perfil declara NO ESTÁ EN NINGUNA IMAGEN, y la métrica de
|
||
# clausura no lo puede ver porque mide lo declarado. Sellado ≠ instalado.
|
||
# Los tres huecos con que entró (ALSA sin PipeWire, sin Lua/OSC, sin vaapi) están CERRADOS al
|
||
# 2026-09-04: pipewire nativo con ALSA de respaldo, `-Dlua=lua5.2`, y `-Dvaapi=enabled` con `libva`
|
||
# subida al corpus. Además su ffmpeg ya va con x86asm ⇒ decodifica con SIMD.
|
||
"mpv",
|
||
# ── EL NAVEGADOR (SDD 26) ────────────────────────────────────────────────────────────────────
|
||
# `atuq` vive en el CORPUS por el mismo motivo que mpv: se resuelve sibling-first y después el
|
||
# catálogo padre, así que desde las cuatro colas se alcanza. Va de raíz por la lección de `foot`
|
||
# que este fichero ya aprendió: una receta sellada que ningún perfil declara NO ESTÁ EN NINGUNA
|
||
# IMAGEN, y la clausura no lo puede ver porque mide lo declarado.
|
||
# Arrastra la cadena GTK3 en sus variantes `-shared` — pango/cairo/gdk-pixbuf/harfbuzz—: con las
|
||
# estáticas, libgtk-3 y libgdk-3 se llevaban cada una su copia y el navegador no llegaba a pintar.
|
||
"atuq",
|
||
# `libnotify` va PEGADO a atuq y por eso mismo: `libxul.so` la abre por `dlopen("libnotify.so.4")`
|
||
# cuando una página pide permiso para notificar, y como no es un `NEEDED` de ningún ELF, ninguna
|
||
# herramienta del repo la reclamaba — ni el vigía de sonames, que da CERO. La encontró
|
||
# `scripts/test-atuq-rootfs.py --dlopen` (SDD 26 §6.10). Sin esta línea la receta está sellada y
|
||
# en ninguna imagen, que es la lección de `foot` escrita cuatro renglones más arriba.
|
||
# ⚠ Resuelve la mitad: libnotify no trae daemon, manda `org.freedesktop.Notifications` por D-Bus,
|
||
# así que la imagen necesita además a alguien escuchando ese nombre.
|
||
"libnotify",
|
||
# `dunst` es LA OTRA MITAD, y sólo hace falta acá: KDE la atiende con plasma-workspace, GNOME con
|
||
# gnome-shell y COSMIC con cosmic-notifications; sway no tenía a NADIE escuchando
|
||
# `org.freedesktop.Notifications`, así que una página que pedía notificar mandaba el mensaje al bus
|
||
# y se lo comía el silencio. Con el `.service` de D-Bus que trae la receta, el daemon lo levanta el
|
||
# propio bus la primera vez que alguien pide ese nombre — sin systemd y sin acordarse de lanzarlo
|
||
# en la config de sway.
|
||
# ⚠ No es `mako` —que es lo que usa media casa wlroots— porque ese nombre YA ESTÁ OCUPADO en el
|
||
# corpus por el motor de plantillas de Python de mesa: dos artefactos homónimos en la misma imagen
|
||
# es la colisión que la granja ya nos cobró. El porqué largo está en la receta.
|
||
"dunst",
|
||
# ── VISOR DE IMÁGENES, TAMBIÉN EN LAS CUATRO ─────────────────────────────────────────────────
|
||
# `swayimg` y no `imv`, que era lo que proponía `docs/plan-apps-usuario-final.md`: imv dibuja con
|
||
# OpenGL de función fija (`glBegin`/`glOrtho`) y esta distro NO tiene proveedor de GL de
|
||
# escritorio — las tres mesa van `-Dglx=disabled -Dglvnd=false` ⇒ no hay `libGL.so` ni `gl.pc` en
|
||
# ninguna cola. swayimg rasteriza a `wl_shm` y no toca GL; el porqué largo está en su receta.
|
||
# Trae de yapa backend DRM: muestra imágenes en una TTY pelada, sin compositor.
|
||
"swayimg",
|
||
# ── LECTOR DE DOCUMENTOS ─────────────────────────────────────────────────────────────────────
|
||
# ⚠ NO ESTÁ EN `escritorio-kde`, y no es un olvido. `zathura-pdf-poppler` necesita `poppler-glib`,
|
||
# que es una receta NUEVA del corpus (la que ya existía va `-DENABLE_GLIB=OFF` y vive en la cola
|
||
# de KDE). Las dos instalan `/usr/lib/libpoppler.so.146` y son artefactos DISTINTOS ⇒ una imagen
|
||
# que hidrate las dos pone dos ficheros en la misma ruta y gana el que se proyecte último, que es
|
||
# el cuadro de las dos glib. KDE ya trae `okular`, que arrastra la poppler de Qt6.
|
||
# Si alguna vez se quiere zathura en KDE, la salida NO es listarla acá: es jubilar una de las dos
|
||
# popplers. Escrito también en `recipes/poppler-glib.toml` y `recipes/zathura.toml`.
|
||
# El plugin va de raíz APARTE del visor a propósito: `zathura` no lo declara en `[deps]` de
|
||
# runtime —lo carga con dlopen— así que sin esta línea la imagen traería un visor que abre la
|
||
# ventana y dice «unknown file type». Sellado ≠ instalado, otra vez.
|
||
"zathura", "zathura-pdf-poppler",
|
||
# ── GRABADOR DE PANTALLA — sólo acá, y la razón es de PROTOCOLO, no de gusto ──────────────────
|
||
# `wf-recorder` captura por `wlr-screencopy`, que implementan los compositores wlroots. KWin y
|
||
# mutter NO lo implementan (usan el portal/ScreenCast), así que ponerlo en esas dos imágenes
|
||
# sería enviar una herramienta que no puede funcionar ahí — deuda fantasma con forma de app.
|
||
# En COSMIC habría que VERIFICAR si cosmic-comp expone el protocolo antes de listarlo.
|
||
# Es la app que cobra la promoción de pipewire al corpus (2026-09-03): antes grababa muda.
|
||
"wf-recorder",
|
||
# ── EL TEMA DE ICONOS BASE ───────────────────────────────────────────────────────────────────
|
||
# Añadido el 2026-09-03 por el barrido que destapó que KDE y GNOME corrían SIN tema de iconos.
|
||
# Acá el agujero es más chico y conviene decir exactamente cuánto: los cuatro programas gráficos
|
||
# de esta imagen —foot, swayimg, mpv, wf-recorder— no piden iconos de tema, y `zathura` es GTK4,
|
||
# que lleva sus iconos de UI COMPILADOS en el recurso de la librería. O sea que acá no hay una
|
||
# captura con la barra vacía como en las otras dos.
|
||
# Lo que sí falta es el FALLBACK del estándar: sin `hicolor/index.theme` instalado, los iconos que
|
||
# una aplicación instala en `usr/share/icons/hicolor/...` son invisibles para cualquier buscador,
|
||
# porque ese directorio no cuenta como tema. Es el piso, y cuesta un artefacto de datos.
|
||
# Un tema COMPLETO (Adwaita, Breeze) sería una decisión aparte y NO gratis: los dos viven en colas
|
||
# hermanas —`incoming-gnome` e `incoming-kde`— y desde acá no se alcanza una cola hermana, así que
|
||
# pedirlo es promover uno al corpus. Queda escrito para que se elija, no para que se descubra.
|
||
"hicolor-icon-theme",
|
||
]
|