🏔 cosmic: EL ESCRITORIO ENTERO DIBUJADO — panel, dock y applets en QEMU
26/26 recetas selladas, escritorio-cosmic 62/62. La captura (895 colores) muestra el panel superior con Workspaces/Applications, reloj y los applets de a11y, audio, red, batería y encendido; el dock inferior con lanzador, workspaces y biblioteca; y el fondo en el color exacto que configura cosmic-start. 48 procesos cosmic estables a los 30s. Y CORRIGE UN DIAGNÓSTICO MÍO. Cuando el panel selló y no dibujó, lo atribuí a que le faltaban los applets. Hacían falta —sin ellos el panel está vacío— pero no eran la causa de la pantalla lisa: -device virtio-gpu-pci no reemplaza la VGA por defecto de QEMU, la SUMA. Dos cards, dos outputs, cosmic-bg pinta en los dos y el panel se ancla en uno; el screendump capturaba el otro. Log impecable, pantalla lisa. Con -vga none sale entero. Un síntoma puede tener dos causas suficientes: arreglar la primera no prueba nada. También: PATH como primera línea de cosmic-start. El getty da un PATH sin /usr/bin y en la imagen mkdir sólo vive ahí, así que los cuatro mkdir -p fallaban en silencio — gratis hoy porque los directorios venían horneados, fatal el día que cambie la imagen. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Semántico sayk'uy
Mana ima sutichaypas t'ikrakurqanchu: qillqalla, yachachiylla utaq willaylla t'ikrakurqan.
5 qillqakuna · +84 −19
diff --git a/docs/evidencia/cosmic-panel-applets-qemu-2026-08-04.png b/docs/evidencia/cosmic-panel-applets-qemu-2026-08-04.png
new file mode 100644
index 00000000..45d75e4d
Binary files /dev/null and b/docs/evidencia/cosmic-panel-applets-qemu-2026-08-04.png differ
diff --git a/docs/runbooks/cosmic-desktop.md b/docs/runbooks/cosmic-desktop.md
index 0aff3670..b55d0c8f 100644
--- a/docs/runbooks/cosmic-desktop.md
+++ b/docs/runbooks/cosmic-desktop.md
@@ -102,19 +102,15 @@ Más `cosmic-settings-daemon` y `xdg-desktop-portal-cosmic` fuera de esa lista.
| `cosmic-osd` | ✅ sellado | `b3:f15cb9c1` |
| `cosmic-settings-daemon` | ✅ sellado | `b3:0263288e` |
| `cosmic-notifications` | ✅ sellado | `b3:3e2a5478` |
-| `cosmic-applets` · `cosmic-launcher` · `cosmic-app-library` · `cosmic-workspaces-epoch` | receta escrita, **build cortado a mitad** | — |
+| `cosmic-launcher` | ✅ sellado | `b3:c17b4956` |
+| `cosmic-app-library` | ✅ sellado | `b3:b2a163e7` |
+| `cosmic-workspaces-epoch` | ✅ sellado (necesitó `mesa`, ver gotcha 11) | `b3:a031249e` |
+| **`cosmic-applets`** (19 binarios en uno) | ✅ **sellado** (necesitó `dbus-shared`, ver gotcha 10) | `b3:3e53a325` |
-**Los cuatro últimos quedaron sin sellar porque se cortó la sesión de trabajo, no porque fallaran**:
-los tres clientes venían compilando limpio y `cosmic-applets` ya había pasado el vendoreo y la dep de
-`libdbus`. Se retoman con `hammer build recipes/incoming-cosmic/<pieza>.toml --store store` — no hay
-nada que diagnosticar primero.
+**La cola está COMPLETA: 26 recetas, `escritorio-cosmic` 62/62.**
**El mínimo viable de una sesión son cuatro**: `cosmic-comp` + `cosmic-settings-daemon` +
-`cosmic-notifications` + `cosmic-panel` (los tres `.expect` de la tabla de arriba). Tres están
-sellados; falta notifications.
-
-Y `cosmic-applets` es aparte pero no opcional para VER algo: sin sus veinte symlinks el panel arranca,
-dice «Done spawning applets» y no dibuja.
+`cosmic-notifications` + `cosmic-panel` (los tres `.expect` de la tabla de arriba).
**El orden no es el de la lista de arranque.** `cosmic-bg` va antes que el panel a propósito: habla
Wayland con `smithay-client-toolkit` y **no toca libcosmic ni iced**, mientras que panel, launcher,
@@ -312,6 +308,40 @@ cerró hoy en GNOME.
con una fuente `Color`, que cosmic-bg soporta de fábrica — y va en el lanzador, no en el artefacto,
porque es política de la imagen de prueba y no algo que el paquete prometa.
+10. **`build.rs` contento ≠ linker contento: `cosmic-applets` necesita la libdbus COMPARTIDA.**
+ Los applets de red, bluetooth y status-area hablan D-Bus por `libdbus-sys` (FFI a la C, no zbus
+ como el resto de la suite). Declarar `dbus` a secas alcanza para que su `build.rs` pase —le basta
+ el `.pc`, que el paquete del daemon trae— y el fallo aparece **una hora después, en el enlace
+ final del multiplexor**: `unable to find dynamic system library 'dbus-1'`. El corpus sólo
+ empaqueta `libdbus-1.a`; el `.so` vive en `dbus-shared`. Son dos preguntas distintas y las
+ contestan dos herramientas distintas: pkg-config dice si la dep *existe*, el linker si hay algo
+ que *enlazar*. Era la única receta de la cola que pedía la estática.
+
+11. **`cosmic-workspaces` necesita `mesa`, y la dep sale de lo que el programa MUESTRA.** La vista de
+ espacios de trabajo dibuja miniaturas vivas de las ventanas; el compositor se las pasa como
+ DMA-BUF por `zcosmic-toplevel-info` y el cliente importa el fd con GBM ⇒ `-lgbm`. Es el único
+ cliente de la suite que toca el pipeline gráfico además del compositor, así que el juego fijo de
+ cuatro (`libxkbcommon`, `pkgconf`, `libudev-zero`, `libinput`) no alcanza. Corolario del gotcha
+ de siempre: la dep no se deduce de la familia del paquete, se lee de lo que hace.
+
+12. **DOS GPUs en QEMU = el panel dibuja en la pantalla que no mirás.** `-device virtio-gpu-pci` no
+ reemplaza a la VGA por defecto de QEMU: la SUMA. El invitado ve `card0` y `card1`, cosmic-comp
+ crea dos outputs (`Virtual-1` y `Unknown-1`), `cosmic-bg` pinta el fondo en ambos y el panel se
+ ancla en uno solo. El `screendump` captura el otro ⇒ **fondo perfecto, panel invisible, y ni un
+ solo error en el log**. Con `-vga none` el escritorio aparece entero a la primera.
+ **Y esto corrige un diagnóstico anterior de este mismo runbook**: cuando el panel selló y no
+ dibujó, lo atribuí a que le faltaban los applets. Los applets hacían falta —sin ellos el panel
+ está vacío— pero **no eran la causa de la pantalla lisa**; la causa era la segunda GPU, que ya
+ estaba ahí. Un síntoma puede tener dos causas suficientes y arreglar la primera no prueba nada:
+ la prueba es la pantalla, no el razonamiento.
+
+13. **`mkdir: not found` en `cosmic-start`, y la sesión arrancaba igual.** El getty entrega un PATH
+ sin `/usr/bin`, y en la imagen fundida `mkdir` sólo vive ahí (`/usr/bin/mkdir → coreutils`; la
+ base metal no tendió el symlink `/bin/mkdir → busybox` que sí tienen chmod, mount, sed y tee).
+ Los cuatro `mkdir -p` de la preparación fallaban y **no se notaba**, porque los directorios
+ venían horneados en la imagen. Es la forma más traicionera de bug: gratis hoy, fatal el día que
+ alguien cambie cómo se arma la imagen. Fix: exportar `PATH` como primera línea del script.
+
## Cómo se construye
```sh
@@ -320,13 +350,42 @@ cd ~/hammer
./target/release/hammer build recipes/incoming-cosmic/<pieza>.toml --store store
```
+## 🏔 EL ESCRITORIO ENTERO, DIBUJADO (2026-08-04)
+
+`docs/evidencia/cosmic-panel-applets-qemu-2026-08-04.png` — 1280×800, **895 colores distintos**:
+
+- **panel superior** (banda `(27,27,27)`, 32 px): botones *Workspaces* y *Applications* a la
+ izquierda, reloj al centro, y a la derecha los applets de accesibilidad, audio, red, batería y
+ encendido;
+- **dock inferior** centrado y redondeado, con lanzador, workspaces, biblioteca de aplicaciones y
+ las entradas `.desktop` del rootfs;
+- fondo `(33,74,135)` = exactamente el `Color(Single((0.13,0.29,0.53)))` que escribe `cosmic-start`.
+
+48 procesos `cosmic-*` estables a los 30 s, sobre el kernel de hammer con arje-zero como PID1.
+Se reproduce así (headless y automatizable; **el `-vga none` no es opcional**, ver gotcha 12):
+
+```sh
+COSMIC_MODE=session bash scripts/cosmic/qemu-desktop-image.sh
+qemu-system-x86_64 -machine q35,accel=kvm -cpu host -smp 4 -m 4096 \
+ -drive if=pflash,format=raw,readonly=on,file=/usr/share/edk2/x64/OVMF_CODE.4m.fd \
+ -drive if=pflash,format=raw,file=/tmp/OVMF_VARS.fd \
+ -drive file=work/hammer-cosmic-qemu.img,format=raw,if=virtio \
+ -vga none -device virtio-gpu-pci,xres=1280,yres=800 \
+ -display none -serial file:/tmp/cosmic.serial -qmp unix:/tmp/qmp.sock,server,nowait
+# y después, por QMP: {"execute":"screendump","arguments":{"filename":"/tmp/shot.ppm"}}
+```
+
+El veredicto es **contar colores distintos del PPM**, no leer el log: con dos GPUs el log salía
+impecable y la pantalla estaba lisa.
+
## Lo que falta, en orden
-1. Cerrar `cosmic-comp`. Es el gate: sin compositor no hay escritorio que probar.
-2. El primer cliente de iced (`cosmic-panel`), que es la pregunta abierta de verdad — libcosmic con
- `winit`/`wgpu` puede pedir más de lo que pide cosmic-bg.
-3. `cosmic-settings-daemon`, `cosmic-launcher`, `cosmic-app-library`, `cosmic-notifications`,
- `cosmic-osd`, `cosmic-workspaces-epoch`, `cosmic-idle`.
-4. Imagen QEMU con `bash` + `dbus-run-session` + `hicolor-icon-theme`, y **validar CON PANTALLA**
- (`DISP=gtk` + `screendump`, contar colores distintos) — regla heredada de KDE y GNOME.
-5. `xdg-desktop-portal-cosmic` y `cosmic-greeter`, que son de la etapa siguiente.
+1. **Entrada real**: el escritorio está dibujado pero nadie probó un click ni una tecla. `virtio-tablet`
+ + `virtio-keyboard` y verificar que el launcher abre (es lo que separa «pinta» de «se usa»).
+2. `xdg-desktop-portal-cosmic` — sin él no hay captura de pantalla, ni file-chooser, ni compartir.
+3. `cosmic-settings` (el panel de control) y `cosmic-files`: la suite tiene aplicaciones y el
+ catálogo todavía no.
+4. `cosmic-greeter` (hoy `cosmic-session` lo lanza y falla con ENOENT, sin consecuencias) y
+ `cosmic-osd` con teclas de brillo/volumen reales.
+5. Metal: la imagen de QEMU y la de metal comparten todo menos el driver; el viaje físico es el
+ mismo que el de `metal-dual-desktop-en-curso`.
diff --git a/scripts/cosmic/cosmic-start-qemu.sh b/scripts/cosmic/cosmic-start-qemu.sh
old mode 100644
new mode 100755
index 04d13e88..def6091f
--- a/scripts/cosmic/cosmic-start-qemu.sh
+++ b/scripts/cosmic/cosmic-start-qemu.sh
@@ -7,6 +7,12 @@
# corre ANTES, prepara el entorno, y después le pasa la posta. Cuanto menos dependa, más temprano
# puede reportar.
set -u
+# PATH ARRIBA DE TODO, y no es cosmético. El getty entrega un PATH que NO trae /usr/bin, y en esta
+# imagen `mkdir` sólo existe ahí (`/usr/bin/mkdir → coreutils`; la base metal no tendió el symlink
+# `/bin/mkdir → busybox` que sí tienen chmod, mount, sed y tee). Resultado: los cuatro `mkdir -p` de
+# la preparación fallaban con «mkdir: not found» y la sesión arrancaba IGUAL, porque los directorios
+# venían horneados en la imagen. Un fallo que no se cobra nada hasta que alguien cambia la imagen.
+export PATH=/usr/bin:/bin:/usr/sbin:/sbin
say() { echo "== cosmic-qemu :: $*" | tee -a /dev/console /dev/ttyS0 2>/dev/null; }
dump() { echo "---- $1 ----" > /dev/ttyS0 2>/dev/null; cat "$1" > /dev/ttyS0 2>/dev/null; }
alive() { s=$(sed -n 's/^State:[[:space:]]*//p' /proc/$1/status 2>/dev/null); case "$s" in ""|Z*) return 1;; *) return 0;; esac; }
@@ -40,7 +46,7 @@ else
[ -w "$XDG_RUNTIME_DIR" ] && say " ✓ ahora sí" || say " ✗ sigue sin andar"
fi
mkdir -p /root/.config /root/.cache /var/lib/dbus /run/dbus /tmp && chmod 1777 /tmp
-export HOME=/root SHELL=/bin/bash PATH=/usr/bin:/bin:/usr/sbin:/sbin
+export HOME=/root SHELL=/bin/bash # PATH ya salió arriba, antes del primer mkdir
say "kernel $(uname -r) · drm: $(ls /dev/dri 2>/dev/null | tr '\n' ' ')"
diff --git a/scripts/cosmic/hydrate-cosmic.sh b/scripts/cosmic/hydrate-cosmic.sh
old mode 100644
new mode 100755
diff --git a/scripts/cosmic/qemu-desktop-image.sh b/scripts/cosmic/qemu-desktop-image.sh
old mode 100644
new mode 100755