gioser

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 1184Shell 70Rust 62Markdown 501503 Sutichaykuna

kde: upower — la imagen declaraba powerdevil y no tenía batería

Primero de los dos huecos que dejaban a KDE POR DEBAJO de una instalación estándar. El perfil
declaraba `powerdevil` —el gestor de energía de Plasma— pero no a `upower`, que es con quien
powerdevil habla para leer la batería y aplicar perfiles. Medido: upower sólo existía en la cola de
GNOME, y las colas no se ven entre sí (HERMANO→corpus, nunca de reojo). En un portátil eso es un
escritorio sin indicador de batería, y el arranque no falla ⇒ no se ve hasta usarlo.

Cuesta TRES recetas y no siete, y la diferencia es una perilla: `-Dintrospection=disabled`.
GNOME la necesita ENCENDIDA porque su shell hace `imports.gi.UPowerGlib` desde JavaScript, o sea que
carga el typelib. powerdevil NO: habla D-Bus con `org.freedesktop.UPower`. Apagarla saca de la
frontera gobject-introspection, gi-foreign-girs, glib-introspected y py3-setuptools, que sólo viven
en la cola de GNOME.

⚠ Y NO SE PROMUEVEN AL CORPUS, aunque era lo primero que intenté. Al mover `libgudev` allá su
ArtifactHash CAMBIÓ (7404bc8d → 87ca5e73) y eso no es una mudanza: `glib` existe en las DOS colas y
son recetas distintas, así que desde `incoming-gnome/` se construye contra la glib de GNOME y desde
el corpus contra la del corpus. Promoverla habría arrastrado a GNOME a la glib del corpus — el
cuadro de las «dos glib» que este repo ya pagó caro. Revertido y verificado que vuelve al hash de
antes (7404bc8d), o sea GNOME intacto. Se COPIAN a la cola de KDE.
`udev-pc` sí comparte artefacto (sus deps son sólo pkgconf ⇒ mismo hash desde las dos colas, un
solo directorio en el store). `libgudev` es otro a propósito, por la glib.

VERIFICADO sobre el artefacto sellado, no supuesto: trae `usr/libexec/upowerd`, el
`org.freedesktop.UPower.service` de system-services y su política en `system.d` — que es exactamente
lo que powerdevil necesita para que el demonio arranque por activación D-Bus.

El perfil pasa a 49 raíces, 301/301 listo, deuda 0.

Queda el segundo hueco: KDE no tiene backend de portal (ni `xdg-desktop-portal` en su cola), o sea
que no hay compartir pantalla — y en particular la captura de obs-studio, que la imagen ya trae, no
tiene con quién hablar en Plasma. Eso es más caro: pide traer el portal a la cola y ESCRIBIR
`xdg-desktop-portal-kde`, que no existe como receta en ninguna cola.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LCt3ettR4Z7b6wPCBmbvEV

542d9875fbe6f5527792a0b41a2a541222868fbb · ruwaq Sergio · (1 killa ñawpaq) · tayta 807683dbc · kay commitpi sach'ata qhaway

Semántico sayk'uy

Mana ima sutichaypas t'ikrakurqanchu: qillqalla, yachachiylla utaq willaylla t'ikrakurqan.

12 qillqakuna · +458 −159

diff --git a/docs/state/build-state-cosmic.json b/docs/state/build-state-cosmic.json
index c5212aa1..d997333d 100644
--- a/docs/state/build-state-cosmic.json
+++ b/docs/state/build-state-cosmic.json
@@ -3600,7 +3600,7 @@
     "escritorio-kde",
     "escritorio-sway"
    ],
-   "dependientes_total": 10
+   "dependientes_total": 11
   },
   "ddh": {
    "iname": "ddh",
@@ -4527,7 +4527,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 67
+   "dependientes_total": 68
   },
   "expat-shared": {
    "iname": "expat-shared",
@@ -5549,7 +5549,7 @@
     "escritorio-kde",
     "escritorio-sway"
    ],
-   "dependientes_total": 107
+   "dependientes_total": 108
   },
   "gh": {
    "iname": "gh",
@@ -6075,7 +6075,7 @@
     "escritorio-kde",
     "escritorio-sway"
    ],
-   "dependientes_total": 33
+   "dependientes_total": 35
   },
   "glib-shared": {
    "iname": "glib-shared",
@@ -9785,7 +9785,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 113
+   "dependientes_total": 115
   },
   "libffi-shared": {
    "iname": "libffi-shared",
@@ -10317,7 +10317,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 46
+   "dependientes_total": 48
   },
   "libunibreak": {
    "iname": "libunibreak",
@@ -11402,7 +11402,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 125
+   "dependientes_total": 127
   },
   "micro": {
    "iname": "micro",
@@ -12999,7 +12999,7 @@
     "escritorio-kde",
     "escritorio-sway"
    ],
-   "dependientes_total": 85
+   "dependientes_total": 87
   },
   "pcre2-shared": {
    "iname": "pcre2-shared",
@@ -13261,7 +13261,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 397
+   "dependientes_total": 400
   },
   "plow": {
    "iname": "plow",
@@ -13730,7 +13730,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 316
+   "dependientes_total": 318
   },
   "qrcp": {
    "iname": "qrcp",
@@ -14345,7 +14345,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 268
+   "dependientes_total": 270
   },
   "sassc": {
    "iname": "sassc",
@@ -17933,7 +17933,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 115
+   "dependientes_total": 116
   },
   "zlib-ng": {
    "iname": "zlib-ng",
@@ -17975,7 +17975,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 86
+   "dependientes_total": 87
   },
   "zola": {
    "iname": "zola",
diff --git a/docs/state/build-state-gnome.json b/docs/state/build-state-gnome.json
index fa4ad40c..6cf1d719 100644
--- a/docs/state/build-state-gnome.json
+++ b/docs/state/build-state-gnome.json
@@ -3267,7 +3267,7 @@
     "escritorio-kde",
     "escritorio-sway"
    ],
-   "dependientes_total": 10
+   "dependientes_total": 11
   },
   "ddh": {
    "iname": "ddh",
@@ -4239,7 +4239,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 67
+   "dependientes_total": 68
   },
   "expat-shared": {
    "iname": "expat-shared",
@@ -5367,7 +5367,7 @@
     "escritorio-kde",
     "escritorio-sway"
    ],
-   "dependientes_total": 107
+   "dependientes_total": 108
   },
   "gh": {
    "iname": "gh",
@@ -10225,7 +10225,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 113
+   "dependientes_total": 115
   },
   "libffi-shared": {
    "iname": "libffi-shared",
@@ -11099,7 +11099,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 46
+   "dependientes_total": 48
   },
   "libunibreak": {
    "iname": "libunibreak",
@@ -12226,7 +12226,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 125
+   "dependientes_total": 127
   },
   "micro": {
    "iname": "micro",
@@ -13992,7 +13992,7 @@
     "escritorio-kde",
     "escritorio-sway"
    ],
-   "dependientes_total": 85
+   "dependientes_total": 87
   },
   "pcre2-shared": {
    "iname": "pcre2-shared",
@@ -14254,7 +14254,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 397
+   "dependientes_total": 400
   },
   "plow": {
    "iname": "plow",
@@ -14800,7 +14800,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 316
+   "dependientes_total": 318
   },
   "qrcp": {
    "iname": "qrcp",
@@ -15415,7 +15415,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 268
+   "dependientes_total": 270
   },
   "sassc": {
    "iname": "sassc",
@@ -19143,7 +19143,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 115
+   "dependientes_total": 116
   },
   "zlib-ng": {
    "iname": "zlib-ng",
@@ -19185,7 +19185,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 86
+   "dependientes_total": 87
   },
   "zola": {
    "iname": "zola",
diff --git a/docs/state/build-state-kde.json b/docs/state/build-state-kde.json
index a21c5a96..9694e5cf 100644
--- a/docs/state/build-state-kde.json
+++ b/docs/state/build-state-kde.json
@@ -1,14 +1,14 @@
 {
  "schema": "hammer-build-state/1",
  "totals": {
-  "recipes": 1045,
-  "nodes": 1047,
-  "sealed": 1045,
+  "recipes": 1048,
+  "nodes": 1050,
+  "sealed": 1048,
   "ajeno": 2
  },
  "by_class": {
   "ajeno": 2,
-  "c": 400,
+  "c": 403,
   "go": 362,
   "gui": 44,
   "kernel": 6,
@@ -21,7 +21,7 @@
    "ajeno": 1
   },
   "incoming-kde": {
-   "sealed": 193,
+   "sealed": 196,
    "ajeno": 1
   }
  },
@@ -37,9 +37,9 @@
    "sealed": 76
   },
   "escritorio-kde": {
-   "raices": 48,
-   "clausura": 299,
-   "sealed": 298,
+   "raices": 49,
+   "clausura": 302,
+   "sealed": 301,
    "ajeno": 1
   },
   "escritorio-mirada": {
@@ -3383,7 +3383,7 @@
     "escritorio-kde",
     "escritorio-sway"
    ],
-   "dependientes_total": 10
+   "dependientes_total": 11
   },
   "ddh": {
    "iname": "ddh",
@@ -4419,7 +4419,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 67
+   "dependientes_total": 68
   },
   "expat-shared": {
    "iname": "expat-shared",
@@ -5604,7 +5604,7 @@
     "escritorio-kde",
     "escritorio-sway"
    ],
-   "dependientes_total": 107
+   "dependientes_total": 108
   },
   "gh": {
    "iname": "gh",
@@ -6130,7 +6130,7 @@
     "escritorio-kde",
     "escritorio-sway"
    ],
-   "dependientes_total": 33
+   "dependientes_total": 35
   },
   "glib-shared": {
    "iname": "glib-shared",
@@ -13723,7 +13723,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 113
+   "dependientes_total": 115
   },
   "libffi-shared": {
    "iname": "libffi-shared",
@@ -13832,6 +13832,34 @@
    ],
    "dependientes_total": 17
   },
+  "libgudev": {
+   "iname": "libgudev",
+   "version": "238",
+   "link": "static",
+   "compiler": "zig-cc",
+   "deps": [
+    "glib",
+    "libffi",
+    "libudev-zero",
+    "meson",
+    "pcre2",
+    "pkgconf",
+    "python3",
+    "samurai",
+    "zlib"
+   ],
+   "cls": "c",
+   "queue": "incoming-kde",
+   "foreign": false,
+   "hash": "b3:87ca5e730612988bf88d04e4a0b50dc0aa7a4ce38845c059bd9e983d2d58b8a8",
+   "state": "sealed",
+   "blocked_by": [],
+   "unblocks": 0,
+   "perfiles": [
+    "escritorio-kde"
+   ],
+   "dependientes_total": 1
+  },
   "libinput": {
    "iname": "libinput",
    "version": "1.28.1",
@@ -14575,7 +14603,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 46
+   "dependientes_total": 48
   },
   "libunibreak": {
    "iname": "libunibreak",
@@ -15848,7 +15876,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 125
+   "dependientes_total": 127
   },
   "micro": {
    "iname": "micro",
@@ -17761,7 +17789,7 @@
     "escritorio-kde",
     "escritorio-sway"
    ],
-   "dependientes_total": 85
+   "dependientes_total": 87
   },
   "pcre2-shared": {
    "iname": "pcre2-shared",
@@ -18091,7 +18119,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 397
+   "dependientes_total": 400
   },
   "plasma-activities": {
    "iname": "plasma-activities",
@@ -18919,7 +18947,7 @@
    "perfiles": [
     "escritorio-kde"
    ],
-   "dependientes_total": 2
+   "dependientes_total": 3
   },
   "polkit-qt-1": {
    "iname": "polkit-qt-1",
@@ -19650,7 +19678,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 316
+   "dependientes_total": 318
   },
   "qcoro": {
    "iname": "qcoro",
@@ -20875,7 +20903,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 268
+   "dependientes_total": 270
   },
   "sassc": {
    "iname": "sassc",
@@ -23225,6 +23253,26 @@
    ],
    "dependientes_total": 0
   },
+  "udev-pc": {
+   "iname": "udev-pc",
+   "version": "1.0.4",
+   "link": "dynamic",
+   "compiler": "zig-cc",
+   "deps": [
+    "pkgconf"
+   ],
+   "cls": "c",
+   "queue": "incoming-kde",
+   "foreign": false,
+   "hash": "b3:fa880b5c36fbbaa19be875fc526b833ceb7ad6a1817de92bf6f41f5d4c671d5f",
+   "state": "sealed",
+   "blocked_by": [],
+   "unblocks": 0,
+   "perfiles": [
+    "escritorio-kde"
+   ],
+   "dependientes_total": 1
+  },
   "umoci": {
    "iname": "umoci",
    "version": "0.6.0",
@@ -23297,6 +23345,40 @@
    "perfiles": [],
    "dependientes_total": 0
   },
+  "upower": {
+   "iname": "upower",
+   "version": "1.90.10",
+   "link": "dynamic",
+   "compiler": "zig-cc",
+   "deps": [
+    "dbus-shared",
+    "expat",
+    "gettext-tiny",
+    "glib",
+    "libffi",
+    "libgudev",
+    "libudev-zero",
+    "meson",
+    "pcre2",
+    "pkgconf",
+    "polkit",
+    "python3",
+    "samurai",
+    "udev-pc",
+    "zlib-shared"
+   ],
+   "cls": "c",
+   "queue": "incoming-kde",
+   "foreign": false,
+   "hash": "b3:bf6a8d8f602ccb7ee436443c1098cfdd76d31084346a9b15601d7a67c2f1a8b8",
+   "state": "sealed",
+   "blocked_by": [],
+   "unblocks": 0,
+   "perfiles": [
+    "escritorio-kde"
+   ],
+   "dependientes_total": 0
+  },
   "usbutils": {
    "iname": "usbutils",
    "version": "019",
@@ -25048,7 +25130,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 115
+   "dependientes_total": 116
   },
   "zlib-ng": {
    "iname": "zlib-ng",
@@ -25090,7 +25172,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 86
+   "dependientes_total": 87
   },
   "zola": {
    "iname": "zola",
diff --git a/docs/state/build-state-wlr.json b/docs/state/build-state-wlr.json
index 741c06bb..f3b7a4b8 100644
--- a/docs/state/build-state-wlr.json
+++ b/docs/state/build-state-wlr.json
@@ -3137,7 +3137,7 @@
     "escritorio-kde",
     "escritorio-sway"
    ],
-   "dependientes_total": 10
+   "dependientes_total": 11
   },
   "ddh": {
    "iname": "ddh",
@@ -4102,7 +4102,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 67
+   "dependientes_total": 68
   },
   "expat-shared": {
    "iname": "expat-shared",
@@ -5164,7 +5164,7 @@
     "escritorio-kde",
     "escritorio-sway"
    ],
-   "dependientes_total": 107
+   "dependientes_total": 108
   },
   "gh": {
    "iname": "gh",
@@ -5690,7 +5690,7 @@
     "escritorio-kde",
     "escritorio-sway"
    ],
-   "dependientes_total": 33
+   "dependientes_total": 35
   },
   "glib-shared": {
    "iname": "glib-shared",
@@ -9434,7 +9434,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 113
+   "dependientes_total": 115
   },
   "libffi-shared": {
    "iname": "libffi-shared",
@@ -9940,7 +9940,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 46
+   "dependientes_total": 48
   },
   "libunibreak": {
    "iname": "libunibreak",
@@ -11025,7 +11025,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 125
+   "dependientes_total": 127
   },
   "micro": {
    "iname": "micro",
@@ -12625,7 +12625,7 @@
     "escritorio-kde",
     "escritorio-sway"
    ],
-   "dependientes_total": 85
+   "dependientes_total": 87
   },
   "pcre2-shared": {
    "iname": "pcre2-shared",
@@ -12887,7 +12887,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 397
+   "dependientes_total": 400
   },
   "plow": {
    "iname": "plow",
@@ -13312,7 +13312,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 316
+   "dependientes_total": 318
   },
   "qrcp": {
    "iname": "qrcp",
@@ -13927,7 +13927,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 268
+   "dependientes_total": 270
   },
   "sassc": {
    "iname": "sassc",
@@ -17732,7 +17732,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 115
+   "dependientes_total": 116
   },
   "zlib-ng": {
    "iname": "zlib-ng",
@@ -17774,7 +17774,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 86
+   "dependientes_total": 87
   },
   "zola": {
    "iname": "zola",
diff --git a/docs/state/build-state.json b/docs/state/build-state.json
index 339c7a25..819108f7 100644
--- a/docs/state/build-state.json
+++ b/docs/state/build-state.json
@@ -5604,7 +5604,7 @@
     "escritorio-kde",
     "escritorio-sway"
    ],
-   "dependientes_total": 33
+   "dependientes_total": 34
   },
   "glib-shared": {
    "iname": "glib-shared",
@@ -9317,7 +9317,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 113
+   "dependientes_total": 114
   },
   "libffi-shared": {
    "iname": "libffi-shared",
@@ -9823,7 +9823,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 46
+   "dependientes_total": 47
   },
   "libunibreak": {
    "iname": "libunibreak",
@@ -10908,7 +10908,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 125
+   "dependientes_total": 126
   },
   "micro": {
    "iname": "micro",
@@ -12508,7 +12508,7 @@
     "escritorio-kde",
     "escritorio-sway"
    ],
-   "dependientes_total": 85
+   "dependientes_total": 86
   },
   "pcre2-shared": {
    "iname": "pcre2-shared",
@@ -12770,7 +12770,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 397
+   "dependientes_total": 399
   },
   "plow": {
    "iname": "plow",
@@ -13195,7 +13195,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 316
+   "dependientes_total": 317
   },
   "qrcp": {
    "iname": "qrcp",
@@ -13810,7 +13810,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 268
+   "dependientes_total": 269
   },
   "sassc": {
    "iname": "sassc",
@@ -17301,7 +17301,7 @@
     "escritorio-mirada",
     "escritorio-sway"
    ],
-   "dependientes_total": 115
+   "dependientes_total": 116
   },
   "zlib-ng": {
    "iname": "zlib-ng",
diff --git a/docs/state/drenaje.json b/docs/state/drenaje.json
index 6e483641..bfcf3fdd 100644
--- a/docs/state/drenaje.json
+++ b/docs/state/drenaje.json
@@ -40,7 +40,7 @@
   },
   "escritorio-kde": {
    "grafo": "docs/state/build-state-kde.json",
-   "nodos": 299,
+   "nodos": 302,
    "en_deuda": 0,
    "ondas": 0,
    "profundidad": 0,
diff --git a/docs/state/duplicados.json b/docs/state/duplicados.json
index 978e1fc8..5533e06d 100644
--- a/docs/state/duplicados.json
+++ b/docs/state/duplicados.json
@@ -80,7 +80,7 @@
     "incoming-kde/dbus"
    ],
    "radio": {
-    "corpus/dbus-shared": 10,
+    "corpus/dbus-shared": 11,
     "corpus/dbus": 6,
     "incoming-kde/dbus": 117
    }
@@ -104,7 +104,7 @@
    ],
    "radio": {
     "corpus/expat-shared": 2,
-    "corpus/expat": 67
+    "corpus/expat": 68
    }
   },
   {
@@ -165,7 +165,7 @@
    ],
    "radio": {
     "corpus/glib-shared": 25,
-    "corpus/glib": 33,
+    "corpus/glib": 35,
     "incoming-gnome/glib-introspected": 30,
     "incoming-gnome/glib": 46
    }
@@ -204,7 +204,7 @@
    ],
    "radio": {
     "corpus/libffi-shared": 10,
-    "corpus/libffi": 113
+    "corpus/libffi": 115
    }
   },
   {
@@ -385,7 +385,7 @@
    ],
    "radio": {
     "corpus/pcre2-shared": 26,
-    "corpus/pcre2": 85
+    "corpus/pcre2": 87
    }
   },
   {
@@ -454,8 +454,8 @@
     "corpus/zlib-shared"
    ],
    "radio": {
-    "corpus/zlib-shared": 86,
-    "corpus/zlib": 115
+    "corpus/zlib-shared": 87,
+    "corpus/zlib": 116
    }
   },
   {
@@ -489,7 +489,7 @@
     "corpus/itstool"
    ],
    "radio": {
-    "corpus/gettext-tiny": 107,
+    "corpus/gettext-tiny": 108,
     "corpus/itstool": 1
    },
    "carriers": [
@@ -532,14 +532,17 @@
    "sha": "10148cfd6047d387",
    "nudos": [
     "corpus/libudev-zero",
-    "incoming-gnome/udev-pc"
+    "incoming-gnome/udev-pc",
+    "incoming-kde/udev-pc"
    ],
    "radio": {
-    "corpus/libudev-zero": 46,
-    "incoming-gnome/udev-pc": 4
+    "corpus/libudev-zero": 48,
+    "incoming-gnome/udev-pc": 4,
+    "incoming-kde/udev-pc": 1
    },
    "carriers": [
-    "incoming-gnome/udev-pc"
+    "incoming-gnome/udev-pc",
+    "incoming-kde/udev-pc"
    ]
   },
   {
@@ -564,6 +567,30 @@
   }
  ],
  "sombras": [
+  {
+   "nombre": "libgudev",
+   "colas": [
+    "incoming-gnome",
+    "incoming-kde"
+   ],
+   "redundante": true,
+   "radio": {
+    "incoming-gnome/libgudev": 6,
+    "incoming-kde/libgudev": 1
+   }
+  },
+  {
+   "nombre": "udev-pc",
+   "colas": [
+    "incoming-gnome",
+    "incoming-kde"
+   ],
+   "redundante": true,
+   "radio": {
+    "incoming-gnome/udev-pc": 4,
+    "incoming-kde/udev-pc": 1
+   }
+  },
   {
    "nombre": "cairo-shared",
    "colas": [
@@ -610,7 +637,7 @@
    ],
    "redundante": false,
    "radio": {
-    "corpus/glib": 33,
+    "corpus/glib": 35,
     "incoming-gnome/glib": 46
    }
   },
@@ -891,7 +918,7 @@
    "redundante": false,
    "radio": {
     "incoming-gnome/polkit": 5,
-    "incoming-kde/polkit": 2
+    "incoming-kde/polkit": 3
    }
   },
   {
@@ -908,6 +935,18 @@
     "incoming-kde/pulseaudio": 4
    }
   },
+  {
+   "nombre": "upower",
+   "colas": [
+    "incoming-gnome",
+    "incoming-kde"
+   ],
+   "redundante": false,
+   "radio": {
+    "incoming-gnome/upower": 0,
+    "incoming-kde/upower": 0
+   }
+  },
   {
    "nombre": "util-linux",
    "colas": [
diff --git a/docs/state/keystones.json b/docs/state/keystones.json
index 21623b16..5a0aa020 100644
--- a/docs/state/keystones.json
+++ b/docs/state/keystones.json
@@ -2,134 +2,155 @@
  "schema": "hammer-keystones/3",
  "nudos": [
   {
-   "nudo": "corpus/make",
-   "gateo_total": 524,
+   "nudo": "incoming-kde/libgudev",
+   "gateo_total": 1,
    "gateo_en_deuda": 0,
    "exclusivo": 0,
+   "en_deuda": true
+  },
+  {
+   "nudo": "corpus/make",
+   "gateo_total": 526,
+   "gateo_en_deuda": 1,
+   "exclusivo": 0,
    "en_deuda": false
   },
   {
    "nudo": "corpus/binutils",
-   "gateo_total": 446,
-   "gateo_en_deuda": 0,
+   "gateo_total": 448,
+   "gateo_en_deuda": 1,
    "exclusivo": 0,
    "en_deuda": false
   },
   {
    "nudo": "corpus/pkgconf",
-   "gateo_total": 438,
-   "gateo_en_deuda": 0,
+   "gateo_total": 441,
+   "gateo_en_deuda": 1,
    "exclusivo": 0,
    "en_deuda": false
   },
   {
    "nudo": "corpus/zlib",
-   "gateo_total": 379,
-   "gateo_en_deuda": 0,
+   "gateo_total": 381,
+   "gateo_en_deuda": 1,
    "exclusivo": 0,
    "en_deuda": false
   },
   {
    "nudo": "corpus/perl",
-   "gateo_total": 375,
-   "gateo_en_deuda": 0,
-   "exclusivo": 0,
-   "en_deuda": false
-  },
-  {
-   "nudo": "corpus/go",
-   "gateo_total": 362,
-   "gateo_en_deuda": 0,
+   "gateo_total": 377,
+   "gateo_en_deuda": 1,
    "exclusivo": 0,
    "en_deuda": false
   },
   {
    "nudo": "corpus/xz-shared",
-   "gateo_total": 354,
-   "gateo_en_deuda": 0,
+   "gateo_total": 356,
+   "gateo_en_deuda": 1,
    "exclusivo": 0,
    "en_deuda": false
   },
   {
    "nudo": "corpus/bzip2-shared",
-   "gateo_total": 353,
-   "gateo_en_deuda": 0,
+   "gateo_total": 355,
+   "gateo_en_deuda": 1,
    "exclusivo": 0,
    "en_deuda": false
   },
   {
    "nudo": "corpus/ncurses-shared",
-   "gateo_total": 353,
-   "gateo_en_deuda": 0,
+   "gateo_total": 355,
+   "gateo_en_deuda": 1,
    "exclusivo": 0,
    "en_deuda": false
   },
   {
    "nudo": "corpus/readline-shared",
-   "gateo_total": 352,
-   "gateo_en_deuda": 0,
+   "gateo_total": 354,
+   "gateo_en_deuda": 1,
    "exclusivo": 0,
    "en_deuda": false
   },
   {
    "nudo": "corpus/openssl-threads",
-   "gateo_total": 351,
-   "gateo_en_deuda": 0,
+   "gateo_total": 353,
+   "gateo_en_deuda": 1,
    "exclusivo": 0,
    "en_deuda": false
   },
   {
    "nudo": "corpus/sqlite-shared",
-   "gateo_total": 351,
-   "gateo_en_deuda": 0,
+   "gateo_total": 353,
+   "gateo_en_deuda": 1,
    "exclusivo": 0,
    "en_deuda": false
   },
   {
    "nudo": "corpus/python3",
-   "gateo_total": 350,
-   "gateo_en_deuda": 0,
+   "gateo_total": 352,
+   "gateo_en_deuda": 1,
    "exclusivo": 1,
    "en_deuda": false
   },
   {
    "nudo": "corpus/samurai",
-   "gateo_total": 335,
-   "gateo_en_deuda": 0,
+   "gateo_total": 337,
+   "gateo_en_deuda": 1,
    "exclusivo": 0,
    "en_deuda": false
   },
   {
    "nudo": "corpus/meson",
-   "gateo_total": 312,
-   "gateo_en_deuda": 0,
+   "gateo_total": 314,
+   "gateo_en_deuda": 1,
    "exclusivo": 0,
    "en_deuda": false
   },
   {
    "nudo": "corpus/libffi",
-   "gateo_total": 246,
-   "gateo_en_deuda": 0,
+   "gateo_total": 248,
+   "gateo_en_deuda": 1,
    "exclusivo": 0,
    "en_deuda": false
   },
   {
-   "nudo": "corpus/bison",
-   "gateo_total": 223,
+   "nudo": "corpus/pcre2",
+   "gateo_total": 220,
+   "gateo_en_deuda": 1,
+   "exclusivo": 0,
+   "en_deuda": false
+  },
+  {
+   "nudo": "corpus/libudev-zero",
+   "gateo_total": 91,
+   "gateo_en_deuda": 1,
+   "exclusivo": 0,
+   "en_deuda": false
+  },
+  {
+   "nudo": "corpus/glib",
+   "gateo_total": 82,
+   "gateo_en_deuda": 1,
+   "exclusivo": 0,
+   "en_deuda": false
+  },
+  {
+   "nudo": "corpus/go",
+   "gateo_total": 362,
    "gateo_en_deuda": 0,
    "exclusivo": 0,
    "en_deuda": false
   },
   {
-   "nudo": "corpus/pcre2",
-   "gateo_total": 218,
+   "nudo": "corpus/bison",
+   "gateo_total": 223,
    "gateo_en_deuda": 0,
    "exclusivo": 0,
    "en_deuda": false
   },
   {
    "nudo": "corpus/expat",
-   "gateo_total": 211,
+   "gateo_total": 212,
    "gateo_en_deuda": 0,
    "exclusivo": 0,
    "en_deuda": false
@@ -269,20 +290,20 @@
   },
   {
    "nudo": "corpus/gettext-tiny",
-   "gateo_total": 130,
+   "gateo_total": 131,
    "gateo_en_deuda": 0,
    "exclusivo": 0,
    "en_deuda": false
   },
   {
-   "nudo": "corpus/linux-headers",
-   "gateo_total": 126,
+   "nudo": "incoming-kde/dbus",
+   "gateo_total": 127,
    "gateo_en_deuda": 0,
    "exclusivo": 0,
    "en_deuda": false
   },
   {
-   "nudo": "incoming-kde/dbus",
+   "nudo": "corpus/linux-headers",
    "gateo_total": 126,
    "gateo_en_deuda": 0,
    "exclusivo": 0,
@@ -381,7 +402,7 @@
   },
   {
    "nudo": "corpus/zlib-shared",
-   "gateo_total": 114,
+   "gateo_total": 115,
    "gateo_en_deuda": 0,
    "exclusivo": 0,
    "en_deuda": false
@@ -428,20 +449,6 @@
    "exclusivo": 0,
    "en_deuda": false
   },
-  {
-   "nudo": "corpus/libudev-zero",
-   "gateo_total": 89,
-   "gateo_en_deuda": 0,
-   "exclusivo": 0,
-   "en_deuda": false
-  },
-  {
-   "nudo": "corpus/glib",
-   "gateo_total": 80,
-   "gateo_en_deuda": 0,
-   "exclusivo": 0,
-   "en_deuda": false
-  },
   {
    "nudo": "incoming-kde/util-linux",
    "gateo_total": 80,
@@ -486,14 +493,14 @@
   },
   {
    "nudo": "corpus/pcre2-shared",
-   "gateo_total": 55,
+   "gateo_total": 56,
    "gateo_en_deuda": 0,
    "exclusivo": 0,
    "en_deuda": false
   },
   {
    "nudo": "corpus/glib-shared",
-   "gateo_total": 54,
+   "gateo_total": 55,
    "gateo_en_deuda": 0,
    "exclusivo": 0,
    "en_deuda": false
@@ -553,21 +560,16 @@
    "gateo_en_deuda": 0,
    "exclusivo": 0,
    "en_deuda": false
-  },
-  {
-   "nudo": "incoming-gnome/glib",
-   "gateo_total": 46,
-   "gateo_en_deuda": 0,
-   "exclusivo": 0,
-   "en_deuda": false
   }
  ],
- "en_deuda": 0,
+ "en_deuda": 1,
  "camino_critico": {
   "con_datos": true,
-  "segundos": 0,
-  "pasos": 0,
-  "cobertura": "0/0",
-  "secuencia": []
+  "segundos": 45.0,
+  "pasos": 1,
+  "cobertura": "0/1",
+  "secuencia": [
+   "incoming-kde/libgudev"
+  ]
  }
 }
diff --git a/docs/state/targets.toml b/docs/state/targets.toml
index 9b3c0e7a..cebc0ab4 100644
--- a/docs/state/targets.toml
+++ b/docs/state/targets.toml
@@ -248,6 +248,16 @@ paquetes = [
   # 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",
+  # ── ENERGÍA: sin esto la imagen NO TIENE BATERÍA (añadido 2026-09-09) ─────────────────────────
+  # ⚠ El perfil declaraba `powerdevil` —el gestor de energía de Plasma— pero NO a upower, que es
+  # con quien powerdevil habla para leer la batería y aplicar perfiles de energía. Medido: `upower`
+  # no estaba ni en esta cola ni en el corpus, sólo en la de GNOME, y las colas no se ven entre sí.
+  # En un portátil eso es un escritorio sin indicador de batería, y el arranque no falla ⇒ no se ve
+  # hasta usarlo. Es el mismo tipo de hueco que las fuentes de GNOME o el «abrir con» vacío.
+  # La receta es una VARIANTE con `-Dintrospection=disabled`: GNOME la necesita encendida porque su
+  # shell hace `imports.gi.UPowerGlib`, pero powerdevil habla D-Bus con `org.freedesktop.UPower` y
+  # no toca el typelib. Apagarla evita copiar cuatro recetas más de introspección a esta cola.
+  "upower",
 ]
 
 [perfil.escritorio-gnome]
diff --git a/recipes/incoming-kde/libgudev.toml b/recipes/incoming-kde/libgudev.toml
new file mode 100644
index 00000000..e59e8af2
--- /dev/null
+++ b/recipes/incoming-kde/libgudev.toml
@@ -0,0 +1,39 @@
+# ⚠ COPIA EN LA COLA KDE (2026-09-09), y NO es lo mismo que la de GNOME aunque el texto sea igual.
+# Las colas no se ven entre sí (HERMANO→corpus), así que `upower` en KDE necesita una acá.
+# ⚠ Y el ARTEFACTO ES DISTINTO a propósito: `glib` existe en las DOS colas y son recetas distintas.
+# Desde `incoming-gnome/` esto se construye contra la glib de GNOME; desde acá, contra la del
+# corpus (KDE no tiene glib hermana). Medido: promoverla al corpus le cambiaba el hash y habría
+# arrastrado a GNOME a la glib del corpus — el cuadro de las «dos glib» que este repo ya pagó.
+# Por eso se COPIA y no se promueve.
+# libgudev 238 — envoltorio GObject sobre libudev (GUdevClient/GUdevDevice: enumerar dispositivos y
+# escuchar uevents con el bucle de GLib en vez de a mano).
+#
+# La piden DOS de la onda 3, y por eso va antes que colord: mutter por su opción `udev`, que es la
+# que necesita el backend NATIVO (KMS/DRM) —o sea, la que hace que mutter sea un compositor de
+# verdad y no sólo un cliente anidado— y colord, que la exige incondicionalmente (gudev-1.0).
+#
+# libudev lo provee libudev-zero, ya en el corpus y sellado (libudev.pc + libudev.a). Ojo con el
+# gotcha ya conocido de este frente: eudev y libudev-zero PISAN el mismo .pc y el mismo .so — acá se
+# declara libudev-zero explícitamente para que no haya duda de cuál entra en el cierre.
+#
+# Feature-minimal: introspection/vapi/tests disabled (tests piden umockdev), gtk_doc off.
+name    = "libgudev"
+version = "238"
+license = "LGPL-2.1-or-later"
+
+[source]
+tarball = "https://download.gnome.org/sources/libgudev/238/libgudev-238.tar.xz"
+sha256  = "61266ab1afc9d73dbc60a8b2af73e99d2fdff47d99544d085760e4fa667b5dd1"
+
+[build]
+compiler = "zig-cc"
+target   = "x86_64-linux-musl"
+link     = "static"
+
+[build.phases]
+configure = "PKG_CONFIG_PATH=/usr/lib/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release --wrap-mode=nodownload --prefer-static -Ddefault_library=static -Dintrospection=disabled -Dvapi=disabled -Dtests=disabled -Dgtk_doc=false -Dc_args=-Wno-error=date-time"
+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", "glib", "libudev-zero", "libffi", "pcre2", "zlib"]
diff --git a/recipes/incoming-kde/udev-pc.toml b/recipes/incoming-kde/udev-pc.toml
new file mode 100644
index 00000000..65fbcfa6
--- /dev/null
+++ b/recipes/incoming-kde/udev-pc.toml
@@ -0,0 +1,53 @@
+# ⚠ COPIA EN LA COLA KDE (2026-09-09). El original vive en `incoming-gnome/`, y las colas NO se ven
+# entre sí: una receta resuelve HERMANO→corpus y nunca de reojo a otra cola. `upower` la necesita
+# para que KDE tenga batería y perfiles de energía (powerdevil habla con upower por D-Bus).
+# Sus deps son sólo `pkgconf`, que está en el corpus ⇒ **el ArtifactHash es el MISMO que el de la
+# copia de GNOME** (verificado): un solo artefacto en el store, cero builds nuevos.
+# udev-pc — el `udev.pc` que falta, y nada más.
+#
+# QUÉ ES: mutter pide DOS pkg-config distintos para su backend nativo (meson.build:262-264):
+# `libudev` (la librería, que da libudev-zero) y `udev` (metadata: la variable `udevdir`, dónde van
+# las reglas). libudev-zero provee el primero y no el segundo — no tiene por qué: es una libudev sin
+# udevd. En distros con systemd el `udev.pc` lo pone systemd; en las que no, lo pone eudev.
+#
+# POR QUÉ UNA RECETA APARTE Y NO AGREGARLO A libudev-zero: `yupana radio libudev-zero` da **51
+# sellados cayendo a deuda**, en las cinco imágenes (base, cli y los tres escritorios). Un fichero de
+# 4 líneas no justifica reconstruir medio catálogo. Esta receta instala SÓLO el .pc, así que no pisa
+# nada de libudev-zero y las dos conviven en el mismo cierre.
+#
+# LA FUENTE es el tarball de libudev-zero a propósito, aunque no se compile nada de él: `[source]` es
+# obligatorio en el esquema de receta, y atarla a su upstream natural deja claro de quién es
+# compañera. El .pc se escribe acá porque libudev-zero no lo trae.
+#
+# udevdir=/usr/lib/udev es la ruta real de esta distro: la Semilla de arje arranca /usr/bin/udevd y
+# ahí busca sus reglas. mutter sólo usa el valor para saber dónde instalar las suyas.
+name    = "udev-pc"
+version = "1.0.4"
+license = "ISC"
+
+[source]
+tarball = "https://github.com/illiliti/libudev-zero/archive/refs/tags/1.0.4.tar.gz"
+sha256  = "10148cfd6047d387bf71eca72cd19c177084224d96434a118d8def6e0a3d6316"
+
+[build]
+compiler = "zig-cc"
+target   = "x86_64-linux-musl"
+link     = "dynamic"
+
+[build.phases]
+compile = 'true'
+install = '''
+set -e
+mkdir -p /out/usr/share/pkgconfig
+cat > /out/usr/share/pkgconfig/udev.pc <<'PC'
+prefix=/usr
+udevdir=${prefix}/lib/udev
+
+Name: udev
+Description: udev device manager (metadata; la libreria la provee libudev-zero)
+Version: 252
+PC
+'''
+
+[deps]
+build = ["pkgconf"]
diff --git a/recipes/incoming-kde/upower.toml b/recipes/incoming-kde/upower.toml
new file mode 100644
index 00000000..b9a45267
--- /dev/null
+++ b/recipes/incoming-kde/upower.toml
@@ -0,0 +1,74 @@
+# ⚠ VARIANTE PARA LA COLA KDE (2026-09-09) — el original está en `incoming-gnome/`.
+#
+# POR QUÉ EXISTE. La imagen de KDE declara `powerdevil` pero NO traía upower, y powerdevil es quien
+# habla con él para la BATERÍA y los perfiles de energía. Medido el 2026-09-09: `upower` no está en
+# la cola de KDE ni en el corpus, así que en un portátil la imagen quedaba sin indicador de batería
+# —y sin que nada fallara al arrancar, que es el modo de fallo caro—. Las colas no se ven entre sí
+# (HERMANO→corpus, nunca de reojo a otra cola), de ahí la copia.
+#
+# ⚠ Y LA DIFERENCIA CON LA DE GNOME NO ES COSMÉTICA: `-Dintrospection=disabled`.
+# GNOME la necesita ENCENDIDA porque su shell hace `imports.gi.UPowerGlib` desde JavaScript — o sea
+# que carga el typelib. **powerdevil no**: habla D-Bus con `org.freedesktop.UPower`, que es la
+# interfaz de red del demonio y no tiene nada que ver con la introspección.
+# Apagarla saca CUATRO recetas de la frontera —gobject-introspection, gi-foreign-girs,
+# glib-introspected y py3-setuptools— que sólo viven en la cola de GNOME y habría que copiar acá.
+# Es la diferencia entre 3 recetas y 7.
+# upower 1.90.10 — el servicio de energía (batería, carga, suspensión por batería crítica) y su
+# librería cliente `libupower-glib`, de donde sale el typelib `UPowerGlib-1.0`.
+#
+# POR QUÉ ENTRA: gnome-shell lo importa desde JavaScript sin condicional
+# (`js/misc/dependencies.js`: `import 'gi://UPowerGlib?version=1.0'`). O sea que **es dep de RUNTIME
+# del shell** aunque no aparezca en su meson.build — el indicador de batería del panel se apoya en
+# esto. Se destapó arrancando la sesión, no compilando.
+#
+# FUENTE: el archivo de gitlab.freedesktop.org y no `upower.freedesktop.org/releases/`, que hoy sirve
+# un índice generado por `tree` sin los tarballs de la serie 1.90. Es el mismo patrón que ya usan
+# cairo, libdrm, libinput, pixman y modemmanager en este repo.
+#
+# LAS TRES PERILLAS QUE HAY QUE FIJAR A MANO, y las tres por el mismo motivo — el `auto` de upower
+# significa «preguntale a un pkg-config de systemd», que acá no existe:
+#
+#  -Dudevrulesdir / -Dudevhwdbdir: con `auto` hace `udev_dep.get_variable(pkgconfig: 'udev_dir')`
+#   (meson.build:97 y :103). Nuestro `udev-pc` declara la variable **`udevdir`**, no `udev_dir` —
+#   el nombre con guión bajo es de systemd-udev; el sin guión es el histórico de eudev, que es el que
+#   copiamos. En vez de tocar `udev-pc` (que arrastraría a libudev-zero y sus 51 dependientes) se
+#   fijan los dos directorios acá, que es lo que la opción existe para permitir.
+#
+#  -Dsystemdsystemunitdir=no: con la cadena vacía hace `dependency('systemd')` DURA
+#   (meson.build:120-122). El valor `no` está contemplado por upstream y saltea la instalación de la
+#   unit (src/meson.build:107). Acá PID1 es arje-zero.
+#
+# -Dintrospection=enabled es el punto de todo esto. `-Didevice=disabled` saca libimobiledevice (el
+# soporte de batería de iPhone), que no está en el corpus. `-Dpolkit=enabled` porque polkit YA está
+# sellada y es lo que decide quién puede suspender.
+#
+# ISLA DINÁMICA: el typelib nombra `libupower-glib.so.3` y gjs la dlopea.
+name    = "upower"
+version = "1.90.10"
+license = "GPL-2.0-or-later"
+
+[source]
+tarball = "https://gitlab.freedesktop.org/upower/upower/-/archive/v1.90.10/upower-v1.90.10.tar.gz"
+sha256  = "7fcd51bece2526dbee5170feb3ffd1adab5b0cd023575f1fd119d969b73f4b90"
+
+[build]
+compiler = "zig-cc"
+target   = "x86_64-linux-musl"
+link     = "dynamic"
+
+[build.phases]
+configure = '''
+set -e
+PKG_CONFIG_PATH=/usr/lib/pkgconfig:/usr/share/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output \
+  --prefix=/usr --buildtype=release --wrap-mode=nodownload \
+  -Ddefault_library=both -Dos_backend=linux -Dintrospection=disabled \
+  -Didevice=disabled -Dpolkit=enabled -Dman=false -Dgtk-doc=false \
+  -Dudevrulesdir=/usr/lib/udev/rules.d -Dudevhwdbdir=/usr/lib/udev/hwdb.d \
+  -Dsystemdsystemunitdir=no -Dc_args=-Wno-error=date-time
+'''
+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]
+# Sin las cuatro de introspección: las saca `-Dintrospection=disabled` (ver cabecera).
+build = ["meson", "samurai", "python3", "pkgconf", "gettext-tiny", "glib", "libgudev", "udev-pc", "libudev-zero", "polkit", "libffi", "pcre2", "zlib-shared", "expat", "dbus-shared"]