Files
hammer/docs/HANDOFF-noche-kde-2026-07-14.md

157 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# HANDOFF — sesión nocturna autónoma KDE (2026-07-13→14)
Trabajo desatendido continuando la campaña KDE Plasma 6 tras cerrar H-QML. Estado y próximos pasos.
## Lo logrado esta noche (todo committeado+pusheado a main)
1. **Hidratación FHS del escritorio COMPLETO, rebuild-free** (commit d6944b2). `hammer hydrate <hash>
--into` proyecta artefactos SELLADOS del store sin reproduce (el `install`-reproduce rebuildеa qtbase
por consumidor — hashing frágil bajo régimen dinámico). `scripts/kde/hydrate-from-store.sh` →
`work/kde-store-rootfs`: 137 pkgs, hashes = los sellados de la campaña (kwin 3a674cb6, plasma-workspace
284c862f, libplasma 963403fe, etc.).
2. **Cierre runtime COMPLETO + zlib soberano shared** (commit a7449a0).
- `scripts/kde/complete-closure.sh`: escanea DT_NEEDED de todos los ELF del rootfs y proyecta del store
lo que falte (libmount.so.1/util-linux, libltdl, libzstd, libQt6UiTools). **1269 .so, 0 faltantes.**
- `recipes/incoming-kde/zlib-shared.toml` (bd559f41): el stack GUI NEEDED `libz.so.1` por soname y
ningún artefacto lo proveía → caía al de Alpine (fuga de soberanía). `.so` fabricado del `libz.a`
PIC vía `--whole-archive`.
- **kwin_wayland ahora resuelve TODAS sus libs** y carga su plugin QPA (antes fallaba por libs faltantes).
3. **mesa-swrast construido** (softpipe/swrast, GL por software SIN LLVM, sello c59738eb; la receta
`recipes/mesa-swrast.toml` ya existía). Provee `swrast_dri.so` + `kms_swrast_dri.so` + libEGL/GLESv2
software, para render sin GPU.
4. **`scripts/kde/run-plasma-headless.sh`**: lanzador de la sesión Plasma headless (software EGL/softpipe
sobre el KMS del worker). NO funciona aún (ver abajo).
## 🎉 LANDMARK: kwin + plasmashell CORREN HEADLESS end-to-end (software, rootfs soberano)
El hack `loader --library-path` rompía el `dlopen` de plugins de kwin (QPA `create()` → core dump). **Fix
= bwrap con el rootfs merged como `/`** (`--overlay-src .dev-fs/alpine --overlay-src kde-store-rootfs
--tmp-overlay /` + `LD_LIBRARY_PATH=/usr/lib64:/usr/lib/qt6:/usr/lib:/lib`), paths FHS nativos. Con eso:
- **`kwin_wayland --virtual --width 1280 --height 800` LEVANTA el compositor** (backend virtual, framebuffer
en memoria; gbm sobre renderD128 falla pero cae a compositing por software y sigue) → **`Accepting client
connections on sockets: QList("wayland-0")`**, socket `/run/wayland-0` creado.
- **`plasmashell` CONECTA a wayland-0 y arranca** (proceso vivo, frameworkintegration/QtQuick-software
cargados). El stack Plasma 6 SOBERANO (musl/zig-cc) EJECUTA end-to-end sin GPU real.
- Se traba en `starting invalid corona "org.kde.plasma.desktop"` → **falta el paquete SHELL
`org.kde.plasma.desktop`, que provee `plasma-desktop` (NO construido aún)**. plasma-workspace da el
binario plasmashell, no el shell/corona. Ese es el único gran gap a "escritorio prende" (H-shell).
Env que funciona (bwrap): `GALLIUM_DRIVER=swrast LIBGL_ALWAYS_SOFTWARE=1 LIBGL_DRIVERS_PATH=/usr/lib/dri
MESA_LOADER_DRIVER_OVERRIDE=swrast QT_QUICK_BACKEND=software` + mesa-swrast hidratado. Gaps menores
detectados (no-fatales para arrancar, sí para un desktop limpio): D-Bus session (crear `/run/dbus` antes de
`dbus-daemon --session`), xkeyboard-config (`/usr/share/X11/xkb`), breeze-icons (icon theme), fuentes.
## Próximo directo a H-shell: plasma-desktop (EN CONSTRUCCIÓN al cierre de la noche)
`plasma-desktop` (shell org.kde.plasma.desktop) es lo único que falta para H-shell. Progreso nocturno:
- **Receta `recipes/incoming-kde/plasma-desktop.toml` DRAFTED** (patrón KF6, WITH_X11=OFF wayland-puro).
**Configura OK y COMPILA** (155 objetos). Deps nuevas que pedía: `qt5compat`, `knotifyconfig`,
`plasma5support` (las 2 últimas: qt5compat/plasma5support ya sellados; knotifyconfig lo SELLÉ, ver abajo).
- **`knotifyconfig` 6.27.0 SELLADO** (7db820f8, commit 726b309) — framework KF6 nuevo, dep de plasma-desktop.
- **Al cierre (CAVEAT IMPORTANTE)**: `hammer build plasma-desktop` dispara un **rebuild casi TOTAL del
stack KDE** — la deriva de hashes (riesgo de reproducibilidad del ADR) hace cache-MISS de casi todos los
deps ya sellados (qtdeclarative, breeze, baloo, kwidgetsaddons, ktexteditor… rebuildeándose; 0 sellados
en 1.5h al cierre). Va nohup'd y **puede sellar recién en varias horas** (rebuildеa el mundo). Si por la
mañana NO selló o sigue rebuildeando deps, esta vía es inviable tal cual — ver alternativas:
- **(a) Build en un farm-up desde el snapshot de la campaña** (`hammer-kde-plasma-workspace-2026-07-13` u
otro `hammer-kde-*`): ahí los deps sellados cache-hitean (mismo entorno que la campaña) ⇒ sólo compila
los 155 objetos de plasma-desktop (~10 min). `IMAGE=<id> scripts/farm/farm-up.sh 1` + build.
- **(b) Extraer SÓLO el shell** `org.kde.plasma.desktop` (QML/data puro) si se puede aislar del build C++.
- **(c) Investigar/arreglar la deriva de hashes** de los deps (por qué hworker-4 ya no cache-hitea los
artefactos que él mismo selló en la campaña — ¿el store cambió? ¿resolución de deps de la receta?).
El artefacto plasma-desktop, cuando exista, se hidrata SOLO (su shell+applets), sin importar los deps
rebuildeados. Matar el build runaway: `$W 'pkill -f plasma-desktop; pkill ninja; pkill -f cmake'`.
### plasma-desktop — ESTADO FINAL de la noche (~08:40) + BUG CLAVE
**BUG CLAVE resuelto (aplica a TODA la campaña):** el sandbox de build usa **busybox grep, que NO soporta
`--include`** ⇒ un `sed` vía `grep -rl ... --include=CMakeLists.txt` falla SILENCIOSO (for-loop vacío).
Usar seds DIRECTOS sobre el fichero (`sed -i '...' CMakeLists.txt`). Esto me costó ~5 intentos creyendo
que el patch de libwacom no aplicaba.
**Cadena de configure resuelta** (todo en la receta, seds directos + deps): `qt5compat`✓ `knotifyconfig`✓
(SELLADO 7db820f8) `plasma5support`✓ `qqc2-desktop-style`✓ `plasma-workspace`✓(añadido — provee
LibKLookAndFeel/LibKWorkspace/LibTaskManager/LibNotificationManager) `xkeyboard-config`✓(SELLADO 37756ac8,
para ConfigureChecks `xkb_base`) + patches a opcional: KF6NetworkManagerQt, KF6DocTools, libwacom,
KSMServerDBusInterface (wayland-puro no tiene ksmserver), xkbregistry + `add_subdirectory(kcms)` removido.
**BLOCKER VIVO al cerrar**: `feature_summary` aborta por REQUIRED no hallados: **XCB-XKB** (kcm/keyboard),
**KF6Kirigami**, **KF6QQC2DesktopStyle** (¡ambos EN deps — no deberían faltar!), **EGL** (mesa lo provee),
**Qt6QuickWidgets** (módulo de qtdeclarative). Que kirigami/qqc2 falten pese a estar en deps sugiere una
interacción de la remoción de kcms o del régimen wayland-puro (o falta materializar EGL/QuickWidgets .pc).
**Investigar con cabeza fresca**: (1) ¿por qué kirigami/qqc2 no se hallan si están en deps y otros KF6 sí?
(2) EGL → ¿egl.pc de mesa en PKG_CONFIG_PATH? (3) Qt6QuickWidgets → ¿dep explícito? (4) XCB-XKB es del
kcm/keyboard: si molesta, hay find_package/set_package_properties REQUIRED top-level que sobreviven a la
remoción del subdir — patchearlos. Receta muy avanzada; falta este último tramo de feature_summary.
### (referencia previa) Cadena de blockers de plasma-desktop
Los deps CACHE-HITEAN (no hay cascada — el build compila ~155 obj en ~15 min); el problema es la
de-Alpinización del configure. Blockers resueltos en la receta: `qt5compat`✓ `knotifyconfig`✓(SELLADO
7db820f8) `plasma5support`✓ `qqc2-desktop-style`✓ + patches a opcional de `KF6NetworkManagerQt`/`KF6DocTools`
+ `libwacom`→sin-REQUIRED + `add_subdirectory(kcms)` REMOVIDO (el shell vive en containments/applets, no en
los KCMs de System Settings, que traen el infierno kaccounts/wacom/touchpad). **Blocker vivo al parar**:
`libwacom` + `KAccounts6` REQUIRED los piden subdirs NO-kcms (applets/containments). **Recomendación para
cerrar**: podar los subdirs/applets que exigen accounts/wacom (mismo patrón: `sed -i '/add_subdirectory(X)/d'`)
o buildear SHELL-ONLY. El objetivo mínimo es que el artefacto contenga
`/usr/share/plasma/shells/org.kde.plasma.desktop/` + los containments base (desktop/panel) + applets core
(kickoff/taskmanager/systemtray/folder) — con eso plasmashell carga la corona. Una vez que selle:
hidratar SOLO el artefacto plasma-desktop al rootfs y re-correr `run-plasma-headless.sh`.
Build detenido al cierre (no dejar corriendo: el estado del build-dir se enredó entre intentos).
### Comandos de la mañana (retomar plasma-desktop → intentar H-shell)
```
W="ssh -i ~/.ssh/github5 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no root@95.217.179.242"
# 1) ¿selló plasma-desktop?
$W 'cd /opt/hammer; grep -E "sealed.*plasma-desktop|PD_EXIT=" work/build-plasma-desktop.log | tail -3'
# si NO selló y no hay build vivo (ps), relanzar:
# $W 'cd /opt/hammer; nohup sh -c "NO_PROXY=localhost NIX_STORE=\$HOME/.nixstore ./target/release/hammer --store ./store build recipes/incoming-kde/plasma-desktop.toml; echo PD_EXIT=\$?" > work/build-plasma-desktop.log 2>&1 &'
# 2) al sellar: hidratar plasma-desktop al rootfs headless + su cierre
$W 'cd /opt/hammer; H=$(ls -dt store/*-plasma-desktop|head -1|sed -E "s|store/([0-9a-f]+)-.*|\1|"); \
./target/release/hammer --store ./store hydrate $H --into work/kde-store-rootfs --link static; \
RFS=work/kde-store-rootfs scripts/kde/complete-closure.sh'
# 3) correr la sesión (¿carga la corona org.kde.plasma.desktop ahora?):
$W 'cd /opt/hammer; SECS=40 scripts/kde/run-plasma-headless.sh 2>&1 | tail -40'
# Buscar en client.log: ¿desapareció "invalid corona"? ¿aparecen containments/panel?
```
Posibles blockers restantes de plasma-desktop (si el build falla más adelante): más frameworks KF6 no
construidos (mismo método: configure delata `Could NOT find KF6Xxx` → draftar receta clonando
knotifyconfig.toml → sellar → añadir a deps). Candidatos: kpeople, baloo (→lmdb), kaccounts, libxkbfile.
Opcionales pesados a apagar por flag si aparecen REQUIRED: ibus, packagekit, pulseaudio/pipewire.
### Piezas de datos que faltan para un desktop LIMPIO (no bloquean el arranque)
- **fuentes**: `xkeyboard-config-2.44.tar.xz` sha `54d2c33eeebb031d48fa590c543e54c9bcbd0f00386ebc6489b2f47a0da4342a`
(para `/usr/share/X11/xkb`, quita el error xkb); una receta de fuentes dejavu (Qt ya no las trae).
- **breeze-icons** (icon theme "breeze not found").
## Camino paralelo: METAL (tu laptop TigerLake/Intel)
El rootfs está hecho para **GPU Intel real (`iris_dri.so`)**, no software. Donde kwin renderiza de verdad
es tu laptop. Para probar H-shell mañana:
1. **Regenerar el rootfs de producto con Mesa IRIS** (NO swrast — esta noche se le hizo swap a swrast para
el intento headless; revertir):
```
# en el worker (o local con el store):
RFS=work/kde-metal-rootfs TARGETS="plasma-workspace kwin kscreenlocker breeze frameworkintegration \
qqc2-desktop-style plasma-integration" scripts/kde/hydrate-from-store.sh
RFS=work/kde-metal-rootfs scripts/kde/complete-closure.sh # cierra libmount/libz/etc.
# asegurar iris (mesa canónico) hidratado, NO mesa-swrast
```
2. **Fuentes**: falta desplegar TTFs (dejavu) — Qt ya no las trae (`QFontDatabase: Cannot find font
directory`). Cosmético pero necesario para texto. (Pendiente: receta dejavu-fonts.)
3. **Empaquetar como imagen booteable EFI** (`scripts/install-image-efi.sh` / `disk-image.sh`) con
kernel-metal ([[etapa-metal-usb]]) + un init que lance `startplasma-wayland`, y bootear en el laptop
(Secure Boot OFF).
## Alternativa productiva (si se prefiere seguir en el worker)
- **Capa 2 KF6 / apps núcleo**: importar+construir `konsole`/`dolphin`/`kate` vía granja (extiende el
escritorio usable). Verificable (sellan o no).
- **Seguir debug headless**: correr kwin bajo gdb en el worker para el backtrace del core dump del QPA;
probar `KWIN_DRM_NO_AMS=1`, `WLR_RENDERER=pixman`-equivalentes, o el backend `--virtual` con distinto
EGL (`EGL_PLATFORM=surfaceless`).
## Comandos útiles
- Worker: `ssh -i ~/.ssh/github5 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no root@95.217.179.242` (cd /opt/hammer). zsh: `${=VAR}` para splitear.
- Rootfs actual: `work/kde-store-rootfs` (con mesa-swrast swapped). Rehidratar limpio con los scripts de arriba.