kde/H-Qt: ADR 0011 → gate PASADO; lecciones durables + snapshot para reanudar
Registra el resultado (qtbase sella b3:7c7c747d, app Qt rc=0 offscreen), las 3 lecciones de-Alpinización (wrapper zig/CMake, tensión estático↔dinámico = deuda Capa 0, hidratación runtime musl) y el snapshot hammer-kde-qtbase-2026-07-11 (img 407438750) para arrancar futuras farm-up sin re-pagar el build. Próximo: qtdeclarative/QML (H-QML) + saldar deuda Capa 0. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Delta semántico
Ninguna definición cambió: el cambio es de texto, documentación o datos.
1 archivos · +38 −5
diff --git a/docs/adr/0011-escritorio-kde-plasma.md b/docs/adr/0011-escritorio-kde-plasma.md
index 97e0871f..82be06ea 100644
--- a/docs/adr/0011-escritorio-kde-plasma.md
+++ b/docs/adr/0011-escritorio-kde-plasma.md
@@ -1,6 +1,6 @@
# 0011 — Etapa Escritorio: campaña KDE Plasma 6
-Estado: propuesto (roadmap de campaña, no implementación)
+Estado: aceptado · **gate H-Qt PASADO (2026-07-11)**
Fecha: 2026-07-11
Relacionado: [[etapa-g-importar-nix]], [[etapa-g-gui-chain-boundary]], [[granja-efimera-hcloud]],
0003-zig-cc-builder, 0008-bootstrap-stages, 0010-arranque-grafo-mirada
@@ -164,9 +164,42 @@ por demanda.
- **Adoptar binarios Qt/KDE de Alpine sin rebuild**: viola soberanía del bootstrap; se acepta sólo
como deuda puntual (ej. GL), no como base del escritorio.
+## Resultado H-Qt (2026-07-11) — GATE PASADO ✅
+
+`qtbase 6.11.1` **construye y sella** en la granja (`b3:7c7c747d4d4b609f0d9eddbab5b4bc73e7816ce71c03e0fc53cfebf7ba35cebd`),
+receta `recipes/incoming-kde/qtbase.toml` (de-Alpinizada del APKBUILD, conserva sus parches de musl).
+Produce `libQt6Core/Gui/Widgets/OpenGL.so` **dinámicos** + el plugin QPA `libqwayland.so`. La app de
+prueba `scripts/kde/h-qt-test.cpp` (QApplication+QLabel) compila y linkea contra él, y **corre a rc=0**
+con `QT_QPA_PLATFORM=offscreen` en el rootfs musl del worker: crea la ventana y el event loop sale
+limpio. **El régimen dinámico + zig-cc + musl del ADR queda probado end-to-end en el componente más
+difícil de KDE** — el riesgo #1 (¿sobrevive el toolchain a Qt?) está respondido: sí.
+
+**Snapshot `hammer-kde-qtbase-2026-07-11` (img 407438750)**: worker con qtbase + su cierre de deps ya
+sellados. Arrancar futuras `farm-up` de la campaña KDE desde ESTA imagen (no la golden limpia) evita
+re-pagar ~45 min de build. El worker efímero se destruyó (baseline €0).
+
+### Lecciones durables (patrón de-Alpinización Qt/KDE)
+1. **zig-cc + CMake**: CMake canonicaliza el symlink `cc`→`/opt/zig/zig`, perdiendo el despacho por
+ `argv[0]`; ASM y custom-commands invocan `zig -std=…` (subcomando inválido). Fix: scripts wrapper
+ reales (`$PWD/.zwrap/{cc,cxx}` = `exec zig cc/c++ -mcpu=baseline`), en el ÁRBOL DE FUENTE (no /tmp,
+ que se vacía entre fases), y `-DCMAKE_{C,CXX,ASM}_COMPILER` apuntándolos. Un script no se canonicaliza.
+2. **Tensión estático↔dinámico (la deuda central de Capa 0)**: la capa GUI arma `.so`, pero muchas
+ libs C canónicas están selladas como **archive estático sin -fPIC** (openssl `libcrypto.a`, sqlite)
+ o **incompletas bajo `-Wl,--no-undefined`** (glib) o **sin arrastrar deps transitivas** (fontconfig
+ →expat). `libQt6Core.so` SÍ linkea con glib/pcre2 (PIC-compat) y `zlib` entra como `libz.so`. Para
+ el gate se apagó/bundleó lo problemático (dbus/sql/openssl/glib/fontconfig OFF; freetype/harfbuzz/
+ libpng/libjpeg bundled). **DEUDA para KDE real: reconstruir el closure C shared-PIC + `.pc` con
+ `Requires.private` completo** (SSL/SQL/glib/fontconfig los va a exigir Plasma).
+3. **Hidratación runtime**: correr un binario musl del store exige el rootfs musl (`.dev-fs/alpine`, el
+ host del worker es glibc) + el cierre de `.so` en `LD_LIBRARY_PATH` (mesa/libdrm/…). Varios libs son
+ static-only en el store: se puede fabricar la `.so` desde el `.a` si es PIC
+ (`zig cc -shared -Wl,--whole-archive lib.a`). Falta una hidratación FHS que capture el cierre runtime.
+
## Próximo paso concreto
-Importar+pinnear la **Capa 0 faltante** a `recipes/incoming-kde/` (empezando por Mesa-completo +
-pila xcb/X11 + elogind/seatd + PipeWire), y correr la primera `farm-run` de la campaña. El gate
-temprano a perseguir es **H-Qt**: si `qtbase` + una ventana Qt no funciona bajo el régimen dinámico,
-todo lo demás se replantea antes de gastar granja en 700 recetas.
+Con H-Qt cerrado, la **Capa 1 (Qt6)** sigue con **qtdeclarative (QML)** — Plasma es QML, es el
+siguiente de-risk (hito H-QML) — más `qtwayland` como módulo completo (ya tenemos su QPA en qtbase,
+pero KDE usa `qtwayland` extendido). En paralelo, **saldar la deuda de Capa 0**: sqlite+openssl
+shared-PIC y glib `.a` completo, para reactivar SSL/SQL/glib en un qtbase "real" (hoy es el qtbase del
+gate, reducido; se rebuildea con features plenas antes de promover a canónico/firmado). Arrancar las
+`farm-up` desde el snapshot `hammer-kde-qtbase-2026-07-11`.