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/.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/.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