escritorios: KDE y GNOME corrían SIN tema de iconos — el panel vacío no era el panel

Medido sobre los artefactos del cierre de cada imagen, contando qué `usr/share/icons/*/`
trae un `index.theme` (que es lo que convierte un directorio en un tema):

    escritorio-kde      sólo Breeze_Light y breeze_cursors — que son CURSORES
    escritorio-gnome    CERO, ni siquiera hicolor
    escritorio-cosmic   Cosmic + hicolor            <- el único que estaba bien
    escritorio-sway     CERO

Las dos capturas de QEMU de hoy ya lo mostraban y se leyeron como «arranca»:

- `plasma6-qemu-2026-09-03-kactivitymanagerd.png`: panel con el reloj y nada más. Los `.so`
  de los applets estaban TODOS instalados; lo que faltaba era qué pintar. `kickoff`,
  `systemtray`, `showdesktop` y `trash` SON un icono, así que sin tema quedan de ancho cero
  — el reloj se ve porque dibuja TEXTO. El log lo decía en una línea:
  `kf.iconthemes: Icon theme "breeze" not found.`
- `gnome-shell-qemu-2026-09-03-libs-compartidas.png`: barra superior con la fecha y el pill
  de espacios, y la DERECHA vacía — red, volumen y batería son iconos.

`breeze` (ya declarado) es el tema de WIDGETS y CURSORES; los ~14.000 iconos viven en
`breeze-icons`, receta aparte, sellada desde siempre y declarada por NADIE. Igual
`adwaita-icon-theme` en GNOME, que además trae los XCursor (su cabecera dice por qué:
sin tema de cursor no hay puntero visible con el cursor por software de virtio-gpu).

Es la figura de las fuentes y de `foot` otra vez: data de RUNTIME, ninguna arista de BUILD
la alcanza, y la métrica de clausura no la echa de menos porque mide lo declarado.

`hicolor-icon-theme` —el fallback obligatorio de freedesktop— se promueve al corpus para que
lo alcancen las cuatro imágenes: hash IDÉNTICO desde la cola y desde el corpus
(b3:98ad44a5), y sus 4 consumidores (adwaita-icon-theme, cosmic-icons, cosmic-app-library,
cosmic-launcher) miden el mismo hash antes y después ⇒ un solo artefacto, CERO rebuilds.

Cierre tras declararlos, todo sellado y sin deuda:
  kde 263/263 (+2) · gnome 158/158 (+2) · sway 173/173 (+1) · cosmic 133/133 (igual)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YGXe6mShYYw6V8ea1dQ13u
This commit is contained in:
Sergio
2026-09-03 21:18:17 +00:00
co-authored by Claude Opus 5
parent 08d27f0e2f
commit d69c437051
8 changed files with 197 additions and 91 deletions
+12 -9
View File
@@ -17,11 +17,11 @@
"debt_by_class": {},
"by_queue": {
"corpus": {
"sealed": 818,
"sealed": 819,
"ajeno": 1
},
"incoming-cosmic": {
"sealed": 38
"sealed": 37
}
},
"by_profile": {
@@ -6883,15 +6883,18 @@
"pkgconf"
],
"cls": "c",
"queue": "incoming-cosmic",
"queue": "corpus",
"hash": "b3:98ad44a5c02059b4cac576bbbf24195a229cda1c807f1eb6c7e80424ceab1e16",
"state": "sealed",
"blocked_by": [],
"unblocks": 0,
"perfiles": [
"escritorio-cosmic"
"escritorio-cosmic",
"escritorio-gnome",
"escritorio-kde",
"escritorio-sway"
],
"dependientes_total": 0
"dependientes_total": 1
},
"hivemind": {
"iname": "hivemind",
@@ -10182,7 +10185,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 122
"dependientes_total": 121
},
"micro": {
"iname": "micro",
@@ -11809,7 +11812,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 383
"dependientes_total": 382
},
"plow": {
"iname": "plow",
@@ -12252,7 +12255,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 294
"dependientes_total": 293
},
"qrcp": {
"iname": "qrcp",
@@ -12807,7 +12810,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 256
"dependientes_total": 255
},
"sassc": {
"iname": "sassc",
+20 -13
View File
@@ -17,11 +17,11 @@
"debt_by_class": {},
"by_queue": {
"corpus": {
"sealed": 809,
"sealed": 810,
"ajeno": 1
},
"incoming-gnome": {
"sealed": 74
"sealed": 73
}
},
"by_profile": {
@@ -36,9 +36,9 @@
"sealed": 74
},
"escritorio-gnome": {
"raices": 18,
"clausura": 156,
"sealed": 156
"raices": 20,
"clausura": 158,
"sealed": 158
},
"escritorio-mirada": {
"raices": 14,
@@ -46,7 +46,7 @@
"sealed": 33
}
},
"sin_perfil": 660,
"sin_perfil": 658,
"orphan_deps": [],
"topo_ok": true,
"nodes": {
@@ -201,7 +201,9 @@
"state": "sealed",
"blocked_by": [],
"unblocks": 0,
"perfiles": [],
"perfiles": [
"escritorio-gnome"
],
"dependientes_total": 0
},
"age": {
@@ -7079,12 +7081,17 @@
"pkgconf"
],
"cls": "c",
"queue": "incoming-gnome",
"queue": "corpus",
"hash": "b3:98ad44a5c02059b4cac576bbbf24195a229cda1c807f1eb6c7e80424ceab1e16",
"state": "sealed",
"blocked_by": [],
"unblocks": 0,
"perfiles": [],
"perfiles": [
"escritorio-cosmic",
"escritorio-gnome",
"escritorio-kde",
"escritorio-sway"
],
"dependientes_total": 1
},
"hivemind": {
@@ -10846,7 +10853,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 122
"dependientes_total": 121
},
"micro": {
"iname": "micro",
@@ -12616,7 +12623,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 383
"dependientes_total": 382
},
"plow": {
"iname": "plow",
@@ -13126,7 +13133,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 294
"dependientes_total": 293
},
"qrcp": {
"iname": "qrcp",
@@ -13681,7 +13688,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 256
"dependientes_total": 255
},
"sassc": {
"iname": "sassc",
+41 -14
View File
@@ -1,14 +1,14 @@
{
"schema": "hammer-build-state/1",
"totals": {
"recipes": 999,
"nodes": 1000,
"sealed": 999,
"recipes": 1000,
"nodes": 1001,
"sealed": 1000,
"ajeno": 1
},
"by_class": {
"ajeno": 1,
"c": 364,
"c": 365,
"go": 362,
"gui": 38,
"kernel": 6,
@@ -17,7 +17,7 @@
"debt_by_class": {},
"by_queue": {
"corpus": {
"sealed": 802
"sealed": 803
},
"incoming-kde": {
"sealed": 197,
@@ -36,9 +36,9 @@
"sealed": 70
},
"escritorio-kde": {
"raices": 42,
"clausura": 262,
"sealed": 261,
"raices": 44,
"clausura": 264,
"sealed": 263,
"ajeno": 1
},
"escritorio-mirada": {
@@ -47,7 +47,7 @@
"sealed": 29
}
},
"sin_perfil": 646,
"sin_perfil": 645,
"orphan_deps": [],
"topo_ok": true,
"nodes": {
@@ -1247,7 +1247,9 @@
"state": "sealed",
"blocked_by": [],
"unblocks": 0,
"perfiles": [],
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 0
},
"broot": {
@@ -6974,6 +6976,31 @@
"perfiles": [],
"dependientes_total": 0
},
"hicolor-icon-theme": {
"iname": "hicolor-icon-theme",
"version": "0.18",
"link": "dynamic",
"compiler": "zig-cc",
"deps": [
"meson",
"samurai",
"python3",
"pkgconf"
],
"cls": "c",
"queue": "corpus",
"hash": "b3:98ad44a5c02059b4cac576bbbf24195a229cda1c807f1eb6c7e80424ceab1e16",
"state": "sealed",
"blocked_by": [],
"unblocks": 0,
"perfiles": [
"escritorio-cosmic",
"escritorio-gnome",
"escritorio-kde",
"escritorio-sway"
],
"dependientes_total": 1
},
"hivemind": {
"iname": "hivemind",
"version": "1.1.0",
@@ -14373,7 +14400,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 122
"dependientes_total": 121
},
"micro": {
"iname": "micro",
@@ -16336,7 +16363,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 383
"dependientes_total": 382
},
"plasma-activities": {
"iname": "plasma-activities",
@@ -17777,7 +17804,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 294
"dependientes_total": 293
},
"qcoro": {
"iname": "qcoro",
@@ -18925,7 +18952,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 256
"dependientes_total": 255
},
"sassc": {
"iname": "sassc",
+37 -12
View File
@@ -1,14 +1,14 @@
{
"schema": "hammer-build-state/1",
"totals": {
"recipes": 833,
"nodes": 834,
"sealed": 833,
"recipes": 834,
"nodes": 835,
"sealed": 834,
"ajeno": 1
},
"by_class": {
"ajeno": 1,
"c": 201,
"c": 202,
"go": 362,
"gui": 35,
"kernel": 6,
@@ -17,7 +17,7 @@
"debt_by_class": {},
"by_queue": {
"corpus": {
"sealed": 819,
"sealed": 820,
"ajeno": 1
},
"incoming-wlr": {
@@ -41,9 +41,9 @@
"sealed": 33
},
"escritorio-sway": {
"raices": 69,
"clausura": 172,
"sealed": 172
"raices": 70,
"clausura": 173,
"sealed": 173
}
},
"sin_perfil": 644,
@@ -6434,6 +6434,31 @@
"perfiles": [],
"dependientes_total": 0
},
"hicolor-icon-theme": {
"iname": "hicolor-icon-theme",
"version": "0.18",
"link": "dynamic",
"compiler": "zig-cc",
"deps": [
"meson",
"samurai",
"python3",
"pkgconf"
],
"cls": "c",
"queue": "corpus",
"hash": "b3:98ad44a5c02059b4cac576bbbf24195a229cda1c807f1eb6c7e80424ceab1e16",
"state": "sealed",
"blocked_by": [],
"unblocks": 0,
"perfiles": [
"escritorio-cosmic",
"escritorio-gnome",
"escritorio-kde",
"escritorio-sway"
],
"dependientes_total": 1
},
"hivemind": {
"iname": "hivemind",
"version": "1.1.0",
@@ -9661,7 +9686,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 122
"dependientes_total": 121
},
"micro": {
"iname": "micro",
@@ -11270,7 +11295,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 383
"dependientes_total": 382
},
"plow": {
"iname": "plow",
@@ -11671,7 +11696,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 294
"dependientes_total": 293
},
"qrcp": {
"iname": "qrcp",
@@ -12226,7 +12251,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 256
"dependientes_total": 255
},
"sassc": {
"iname": "sassc",
+34 -9
View File
@@ -1,14 +1,14 @@
{
"schema": "hammer-build-state/1",
"totals": {
"recipes": 820,
"nodes": 821,
"sealed": 820,
"recipes": 821,
"nodes": 822,
"sealed": 821,
"ajeno": 1
},
"by_class": {
"ajeno": 1,
"c": 188,
"c": 189,
"go": 362,
"gui": 35,
"kernel": 6,
@@ -17,7 +17,7 @@
"debt_by_class": {},
"by_queue": {
"corpus": {
"sealed": 820,
"sealed": 821,
"ajeno": 1
}
},
@@ -6357,6 +6357,31 @@
"perfiles": [],
"dependientes_total": 0
},
"hicolor-icon-theme": {
"iname": "hicolor-icon-theme",
"version": "0.18",
"link": "dynamic",
"compiler": "zig-cc",
"deps": [
"meson",
"samurai",
"python3",
"pkgconf"
],
"cls": "c",
"queue": "corpus",
"hash": "b3:98ad44a5c02059b4cac576bbbf24195a229cda1c807f1eb6c7e80424ceab1e16",
"state": "sealed",
"blocked_by": [],
"unblocks": 0,
"perfiles": [
"escritorio-cosmic",
"escritorio-gnome",
"escritorio-kde",
"escritorio-sway"
],
"dependientes_total": 1
},
"hivemind": {
"iname": "hivemind",
"version": "1.1.0",
@@ -9542,7 +9567,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 122
"dependientes_total": 121
},
"micro": {
"iname": "micro",
@@ -11151,7 +11176,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 383
"dependientes_total": 382
},
"plow": {
"iname": "plow",
@@ -11552,7 +11577,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 294
"dependientes_total": 293
},
"qrcp": {
"iname": "qrcp",
@@ -12107,7 +12132,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 256
"dependientes_total": 255
},
"sassc": {
"iname": "sassc",
+53
View File
@@ -165,6 +165,30 @@ paquetes = [
# 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]
@@ -298,6 +322,22 @@ paquetes = [
# 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 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",
]
[perfil.escritorio-cosmic]
@@ -549,4 +589,17 @@ paquetes = [
# 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",
]
@@ -1,34 +0,0 @@
# hicolor-icon-theme 0.18 — el tema de iconos BASE del estándar freedesktop, y nada más que su
# esqueleto: un `index.theme` y el árbol de directorios vacíos por tamaño y categoría.
#
# QUÉ ES Y POR QUÉ HACE FALTA: `hicolor` es el tema de FALLBACK obligatorio de la especificación de
# iconos. Cada aplicación instala sus iconos en `/usr/share/icons/hicolor/...`, y todo buscador de
# iconos (GTK, Qt, el shell) termina ahí cuando el tema activo no tiene lo que se pide. Sin su
# `index.theme` el directorio existe pero NO es un tema: la búsqueda no lo recorre y los iconos de
# las aplicaciones quedan invisibles aunque los ficheros estén en su sitio.
#
# No trae ni un icono propio, a propósito — es el contrato, no el contenido. De ahí que sea la receta
# más chica del frente y a la vez la que no se puede saltear.
#
# Ojo con la versión: hasta 0.17 era autotools; **0.18 pasó a meson** y el tarball ya no trae
# `configure` (ni `configure.ac`). Un `./configure` heredado de la receta vieja sale con 127.
name = "hicolor-icon-theme"
version = "0.18"
license = "GPL-2.0-or-later"
[source]
tarball = "https://icon-theme.freedesktop.org/releases/hicolor-icon-theme-0.18.tar.xz"
sha256 = "db0e50a80aa3bf64bb45cbca5cf9f75efd9348cf2ac690b907435238c3cf81d7"
[build]
compiler = "zig-cc"
target = "x86_64-linux-musl"
link = "dynamic"
[build.phases]
configure = "PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release --wrap-mode=nodownload"
compile = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output"
install = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild"
[deps]
build = ["meson", "samurai", "python3", "pkgconf"]