gnome: la frontera de runtime MEDIDA — 7 typelibs, 6 proveedores, y la regla que la destapó
Venía cerrando typelibs de a uno: AccountsService → DBus-1.0 → cairo-1.0 → Gdm-1.0,
un rebuild de imagen y un arranque completo por cada uno. Cuatro rondas para
descubrir que la lista estaba escrita todo el tiempo.
`js/misc/dependencies.js` de gnome-shell ENUMERA lo que el shell exige al arrancar.
Cruzada contra el rootfs hidratado, la frontera completa es exacta:
GnomeDesktop-4.0 + GnomeBG-4.0 → gnome-desktop (YA sellada, pero -Dintrospection=false
y estática ⇒ falta la variante de isla dinámica)
Geoclue-2.0 → geoclue (sin receta)
GWeather-4.0 → libgweather (sin receta)
IBus-1.0 → ibus (sin receta)
Rsvg-2.0 → librsvg (sin receta; es Rust)
UPowerGlib-1.0 → upower (sin receta)
Los otros veinte de la lista ya están. GnomeBluetooth, NM/NMA4 y Malcontent son
condicionales y no bloquean.
REGLA, y es el precio de no haberla aplicado antes: cuando el muro es `Requiring X`,
no cierres X y vuelvas a arrancar — leé el fichero donde el programa DECLARA sus deps
de runtime y cerralas todas de una.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Delta semántico
Ninguna definición cambió: el cambio es de texto, documentación o datos.
1 archivos · +43 −17
diff --git a/docs/runbooks/gnome-qemu-desktop.md b/docs/runbooks/gnome-qemu-desktop.md
index 22736fc4..5f11a4b4 100644
--- a/docs/runbooks/gnome-qemu-desktop.md
+++ b/docs/runbooks/gnome-qemu-desktop.md
@@ -48,19 +48,37 @@ gdb -batch -q -ex "set sysroot $PWD/work/gnome-qemu-rootfs" \
-ex "core-file /tmp/core.gnome-shell" -ex "bt 25" work/gnome-qemu-rootfs/usr/bin/gnome-shell
```
-## EL MURO DE HOY — el typelib de AccountsService
-
-```
-Gjs-CRITICAL: JS ERROR: Error: Requiring AccountsService, version 1.0:
- Typelib file for namespace 'AccountsService', version '1.0' not found
-Execution of main.js threw exception → gnome-shell sale con código 1
-```
-
-No es un cuelgue: es una dep de RUNTIME que falta. La receta está escrita y medida en
-`recipes/incoming-gnome/accountsservice.toml` y **no sella todavía** por dos huecos de NUESTRA capa
-de compatibilidad, contados símbolo por símbolo en el comentario de esa receta: ocho símbolos
-`sd-*` que `libelogind` no exporta (los cinco `sd_login_monitor_*` son una API de notificación, no
-getters) y `fgetspent_r`, que es extensión de glibc y musl no tiene.
+## EL MURO DE HOY — los typelibs de runtime de la capa JS
+
+No es un cuelgue ni un crash: el compositor sube, expone `wayland-0`, y el shell sale con código 1
+porque a `imports.gi.*` le falta un typelib. Cada vez que se cierra uno, aparece el siguiente.
+
+**Y ESA ITERACIÓN ES INNECESARIA — la lista está declarada en el propio shell.**
+`js/misc/dependencies.js` enumera EXACTAMENTE lo que el shell exige al arrancar. Cruzada contra el
+rootfs hidratado, la frontera completa es de **siete typelibs**, de cinco recetas nuevas y una a
+rehacer (medido, no estimado):
+
+| typelib | lo provee | estado |
+|---|---|---|
+| `GnomeDesktop-4.0`, `GnomeBG-4.0` | `gnome-desktop` | **ya sellada, pero con `-Dintrospection=false` y estática** ⇒ hace falta la variante de isla dinámica |
+| `Geoclue-2.0` | geoclue | sin receta |
+| `GWeather-4.0` | libgweather | sin receta |
+| `IBus-1.0` | ibus | sin receta |
+| `Rsvg-2.0` | librsvg | sin receta (**es Rust**) |
+| `UPowerGlib-1.0` | upower | sin receta |
+
+Lo demás de esa lista ya está: AccountsService, Atk, Atspi, Gcr, Gdk, Gdm, Gio, GioUnix,
+GDesktopEnums, GdkPixbuf, Graphene, Pango, Polkit, PolkitAgent, Soup, y los cinco de mutter/shell
+(Meta, Clutter, Cogl, Shell, St). `GnomeBluetooth`, `NM`/`NMA4` y `Malcontent` son condicionales de
+compilación o de runtime y no bloquean.
+
+**La regla que sale de acá, y es el precio de no haberla aplicado antes: cuando el muro es
+`Requiring X`, no cierres X y vuelvas a arrancar — leé el fichero donde el programa DECLARA sus
+dependencias de runtime y cerralas todas de una.** Cada ronda de este bucle cuesta un rebuild de
+imagen y un arranque completo.
+
+Cerrados por este camino hasta hoy, en orden: `AccountsService` → `DBus-1.0` (que incluye `Atspi`) →
+`cairo-1.0` (que incluyen `Gdk` y `Pango`) → `Gdm-1.0`.
## CÓMO CAYÓ EL MURO ANTERIOR — la hebra de input (cerrado 2026-07-29)
@@ -134,12 +152,20 @@ elige `/dev/dri/card0` como primaria sin quejarse. Es el rédito directo de la c
## Lo que falta, en orden
-1. **`AccountsService`** (el muro de hoy): cerrar los ocho símbolos `sd-*` en `arje-sdlogin-compat`
- y `fgetspent_r`, sellar `accountsservice`, y hidratar su typelib. Ojo al costo: re-sellar
- `libelogind` re-hashea todo lo que lo declara (mutter, gnome-shell, polkit…) ⇒ pasar
- `yupana radio libelogind` ANTES de tocarlo.
+1. **Los seis proveedores de typelib de la tabla de arriba**, en una sola tanda. `gnome-desktop`
+ dinámica+introspectada primero (ya está sellada, sólo cambia el modo), después geoclue,
+ libgweather, upower, librsvg e ibus. Ojo al costo de `libelogind`: re-sellarla re-hashea todo lo
+ que la declara (mutter, gnome-shell…) ⇒ pasar `yupana radio libelogind` ANTES de tocarla — ya
+ pasó dos veces en esta campaña.
2. **Empaquetar la política D-Bus de login1** dentro del artefacto de arje-logind-compat (hoy la
escribe el script de imagen).
3. Arreglar el `identity mismatch` del `Announce` al bus del fractal (hoy sólo un WARN).
4. Con la capa JS viva: validar CON PANTALLA (`DISP=gtk`), nunca sólo por serial — regla heredada de
KDE ([[metal-dual-desktop-en-curso]]).
+
+## Recetas nuevas de esta etapa
+
+`accountsservice` (b3:0328b0d0, + parche `fgetspent_r` para musl) · `gi-foreign-typelibs`
+(b3:c8a4d2f8 — un `.gir` NO es un typelib: gjs resuelve contra el compilado) · `libgdm`
+(b3:46fac484 — sólo la librería cliente; el demonio sigue aparcado por linux-pam).
+`libelogind` pasó de 14 a 25 símbolos en tres tandas.