diff --git a/docs/state/targets.toml b/docs/state/targets.toml
index 89585898..9b3c0e7a 100644
--- a/docs/state/targets.toml
+++ b/docs/state/targets.toml
@@ -366,11 +366,21 @@ paquetes = [
# sobre `xdg-shell` (no pide protocolos de wlroots), así que corre bajo mutter igual que bajo sway;
# su único NEEDED es `libc.so`. helix es TUI y corre dentro de la terminal.
#
- # KDE queda fuera de este arreglo A PROPÓSITO, y es un hallazgo aparte: tiene `konsole`, `kate` y
- # `dolphin` SELLADAS en su cola y sin declarar, más otras 19 apps y hasta `plasma-desktop`,
- # `plasma-nm`, `plasma-pa` y `powerdevil`. Su perfil son 13 raíces de ARRANQUE EN METAL, no la
- # imagen de escritorio completa (ésa se hidrató aparte, por hash). Reordenar eso es decisión del
- # frente KDE, no de éste.
+ # ⚠ ESTO ESTABA VIEJO, corregido el 2026-09-09. Decía que KDE quedaba fuera del arreglo y que «su
+ # perfil son 13 raíces de ARRANQUE EN METAL, no la imagen completa», con konsole/kate/dolphin y
+ # otras 19 apps selladas y sin declarar. Ya no: el frente KDE lo reordenó y hoy su perfil son **48
+ # raíces** con konsole, dolphin, kate, okular, ark, spectacle, gwenview, kcalc, las fuentes y las
+ # `*-shared` de runtime declaradas. De su cola quedan 8 recetas fuera del perfil, y son las que
+ # corresponde: libICE, libSM, libXtst y los cinco eslabones que sólo servían a xwayland
+ # (libfontenc, libXfont2, libxkbfile, libxshmfence, xkbcomp), huérfanos desde que la receta se
+ # retiró.
+ #
+ # Lo que a KDE le queda no es este arreglo sino OTRO, medido el mismo día: su imagen no se hidrata
+ # desde el perfil sino de un rootfs YA ARMADO (`kde-qemu-rootfs`, 8,4 G) que nadie re-deriva, así
+ # que se queda atrás a medida que el perfil crece. Comprobado contra ese rootfs: de las 18 hojas
+ # que el perfil declara están 15 — faltan `obs-studio` y `atuq`, justo las dos que se añadieron
+ # después de aquella hidratación. Re-hidratarlo con `scripts/hydrate-profile.py escritorio-kde`
+ # es decisión del frente KDE, no de éste.
"foot", "helix",
# ── FUENTES ──────────────────────────────────────────────────────────────────────────────────
# ⚠ Añadida el 2026-09-03 porque este perfil no traía NI UN FICHERO DE FUENTE. Medido recorriendo
diff --git a/scripts/cosmic/hydrate-cosmic.sh b/scripts/cosmic/hydrate-cosmic.sh
index 061a8f56..dfa73945 100755
--- a/scripts/cosmic/hydrate-cosmic.sh
+++ b/scripts/cosmic/hydrate-cosmic.sh
@@ -13,6 +13,28 @@
# dep de build de ningún otro, así que el grafo no los ve. La lista autoritativa es
# `cosmic-session/src/main.rs`, no una intuición sobre qué hace falta.
#
+# ⚠ SUPERADO POR `scripts/hydrate-profile.py` (2026-09-09). Usar:
+#
+# scripts/hydrate-profile.py escritorio-cosmic --into
+#
+# POR QUÉ, y está MEDIDO. La lista de raíces de abajo es una segunda fuente de verdad frente a
+# `docs/state/targets.toml`, y había divergido: el script nombra 25 raíces, el perfil declara 43, y
+# **17 paquetes declarados NO llegaban al rootfs**. Entre ellos `adwaita-cursors` —que es
+# EXACTAMENTE el ejemplo con el que la cabecera de `hydrate-profile.py` advirtió del problema el
+# 2026-09-04: «habrían seguido armando un rootfs sin cursores»—, `xkeyboard-config` (sin él no hay
+# mapa de teclado, la cicatriz de sway), `bash`, el navegador `atuq`, `mpv`, `swayimg`, `zathura` y
+# su plugin, las dos `dejavu-fonts`, `libnotify`, `desktop-file-utils`, `hicolor-icon-theme` y las
+# cinco `*-shared` de runtime.
+#
+# Y al revés no se pierde NADA, que es lo que hace el cambio barato: de las 25 raíces del script, la
+# única que el perfil no declara es `zlib-shared`, y la clausura del perfil la alcanza igual. O sea
+# que el motivo que justificaba la lista a mano —el párrafo de abajo: los componentes que
+# `cosmic-session` lanza por PATH y el grafo no ve— **ya está resuelto en el perfil**, que los
+# declara a todos como raíces. La lista quedó redundante sin que nadie lo notara.
+#
+# El script se deja porque su cabecera documenta ese porqué, que sigue siendo cierto sobre la
+# NATURALEZA de COSMIC; lo que ya no es cierto es que su lista sea la verdad.
+#
# Uso: scripts/cosmic/hydrate-cosmic.sh [receta.toml ...]
# Env: RFS (def work/cosmic-rootfs) destino
# STORE (def ./store)
diff --git a/scripts/cosmic/metal-desktop-image.sh b/scripts/cosmic/metal-desktop-image.sh
index 6fb870aa..9b698162 100755
--- a/scripts/cosmic/metal-desktop-image.sh
+++ b/scripts/cosmic/metal-desktop-image.sh
@@ -47,7 +47,7 @@ KERNEL="${KERNEL:-$(ls -dt store/*-linux-metal-dual/boot/bzImage 2>/dev/null | h
MERGED="${MERGED:-work/cosmic-metal-rootfs}"
IMG="${IMG:-work/hammer-cosmic-metal.img}"
-for x in "$BASE" "$COSMIC"; do [ -d "$x" ] || { echo "falta $x (corré scripts/cosmic/hydrate-cosmic.sh)" >&2; exit 1; }; done
+for x in "$BASE" "$COSMIC"; do [ -d "$x" ] || { echo "falta $x (corré scripts/hydrate-profile.py escritorio-cosmic --into $COSMIC)" >&2; exit 1; }; done
[ -n "$KERNEL" ] && [ -r "$KERNEL" ] || { echo "falta linux-metal-dual (hammer build recipes/linux-metal-dual.toml)" >&2; exit 1; }
echo "==> fundiendo rootfs por hardlinks (base metal + COSMIC)"
diff --git a/scripts/cosmic/qemu-desktop-image.sh b/scripts/cosmic/qemu-desktop-image.sh
index e482502e..cd0b39e6 100755
--- a/scripts/cosmic/qemu-desktop-image.sh
+++ b/scripts/cosmic/qemu-desktop-image.sh
@@ -4,7 +4,9 @@
# la base metal, la inyección de mesa-llvmpipe/LLVM/musl y el truco del console-getty.
#
# work/metal-rootfs base: arje-zero PID1 + busybox + kernel(EFI-stub) + firmware
-# work/cosmic-rootfs cierre de COSMIC (lo arma scripts/cosmic/hydrate-cosmic.sh)
+# work/cosmic-rootfs cierre de COSMIC (lo arma `scripts/hydrate-profile.py escritorio-cosmic`;
+# hydrate-cosmic.sh quedó SUPERADO — su lista a mano se saltaba 17 paquetes
+# que el perfil declara, entre ellos adwaita-cursors y xkeyboard-config)
# + store/*-mesa-llvmpipe GBM/EGL de software (el cierre trae mesa con iris_dri, que es Intel real)
# + store/*-llvm18 libLLVM que llvmpipe JIT-linkea
# → work/cosmic-qemu-rootfs (hardlinks) → work/hammer-cosmic-qemu.img
@@ -21,7 +23,7 @@ MERGED="${MERGED:-work/cosmic-qemu-rootfs}"
IMG="${IMG:-work/hammer-cosmic-qemu.img}"
[ -d "$BASE" ] || { echo "falta $BASE" >&2; exit 1; }
-[ -d "$COSMIC" ] || { echo "falta $COSMIC — corré scripts/cosmic/hydrate-cosmic.sh" >&2; exit 1; }
+[ -d "$COSMIC" ] || { echo "falta $COSMIC — corré scripts/hydrate-profile.py escritorio-cosmic --into $COSMIC" >&2; exit 1; }
[ -n "$MESA" ] && [ -d "$MESA" ] || { echo "falta mesa-llvmpipe en store/" >&2; exit 1; }
echo "==> fundiendo rootfs por hardlinks (base metal + cierre COSMIC)"