From 584cc128a847626b913c731bc3e24fb1e3ecf614 Mon Sep 17 00:00:00 2001 From: Sergio Date: Sun, 13 Sep 2026 01:10:00 +0000 Subject: [PATCH] =?UTF-8?q?docs:=20adenda=20al=20plan=20de=20apps=20?= =?UTF-8?q?=E2=80=94=20el=20censo,=20el=20muro=20de=20GL=20revisado=20y=20?= =?UTF-8?q?la=20respuesta=20a=20=C2=AB=C2=BFElectron=3F=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tres preguntas del usuario, contestadas midiendo, y dos de las mediciones CORRIGEN cosas que este mismo fichero afirmaba. 1. CENSO: de ~50 apps muy usadas el catálogo tiene 9, y CINCO de las nueve son de KDE (o sea que llegan a una de las cuatro imágenes). 2. ⚠ CORRECCIÓN al «tercer defecto del método». Este documento dice, con fecha 2026-09-03, que ninguna cola publica libGL.so ni gl.pc. Dejó de ser cierto AL DÍA SIGUIENTE: recipes/libglvnd.toml es del 2026-09-04 y `provee.py --desde corpus opengl` da ✓ (libOpenGL.so.0 + opengl.pc). Y la corrección trae su propia corrección: la campaña quedó A MEDIAS. Las tres mesa siguen con -Dglvnd=false, no hay libEGL_mesa.so.0 ni egl_vendor.d, y en el rootfs KDE hidratado conviven DOS libEGL.so.1 distintos (mesa 1.440.624 B gana el symlink; el de glvnd, 323.144 B, queda huérfano). OBS —la razón de escribir libglvnd— NO la usa en runtime: libobs-opengl.so sale con NEEDED libEGL.so.1 y ni un gl[A-Z] indefinido, o sea que su glad resuelve por eglGetProcAddress. ⇒ el `opengl ✓` es verdad DE ENLACE. El muro pasó de «no enlaza» a «enlaza y no corre». Corolario: darktable estaba MAL clasificada como caso de GL. Su UI es GTK3+cairo; su muro es la cola de deps (lensfun, libgphoto2, openexr, imath, libraw, osm-gps-map, portmidi + cuatro que sólo viven en colas). Blender sí es el caso de GL. 3. ELECTRON: `grep -rni electron docs/ recipes/` da CERO. Nunca estuvo planeado. Y no existe un «Electron con base Firefox» porque Gecko no tiene API de embebido desde XULRunner (SDD 26 §1) — pero eso es exactamente lo que es atuq, y ya está: artefacto derivado + chrome propio + extensiones + host de native messaging en Rust. Falta un modo SSB, que es más barato que UN port. GenOffice concretamente: Apache-2.0 (salvo ee/), acepta endpoints OpenAI-compatible locales ⇒ la mitad de IA es una línea de config contra el llama-cpp que YA viaja en los cuatro escritorios. La mitad de runtime es qorpa. ⚠ Y el muro real es el MODELO: Qwen2.5-1.5B no sostiene IA agéntica sobre un .xlsx. 4. QUÉ REHACER, con criterio escrito: sólo cuando el bloqueo es estructural Y el valor vive en un protocolo o formato abierto. Pasan tres: el shell de apps sobre atuq, una bóveda de contraseñas (la mitad cara —la integración con el navegador— ya está construida), y un cliente Matrix si fractal no construye. Thunderbird es el más desaprovechado de la lista de EMPAQUETAR: es Gecko. --- docs/plan-apps-usuario-final.md | 155 ++++++++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) diff --git a/docs/plan-apps-usuario-final.md b/docs/plan-apps-usuario-final.md index 380cc618..d57fdf53 100644 --- a/docs/plan-apps-usuario-final.md +++ b/docs/plan-apps-usuario-final.md @@ -302,3 +302,158 @@ bajar el APKBUILD de cada candidata, extraer `makedepends`/`depends`, quitarles cruzar contra `recipes/*.toml` + `recipes/incoming-*/*.toml`, separando una lista fija de nombres que son muros de diseño (gtk+3.0, qt6-*, lib X11, wasi-*). No se guarda en `scripts/` porque la lista de candidatas es del momento, no un invariante que valga la pena vigilar. + +--- + +# ADENDA 2026-09-13 — el censo, el muro de GL revisado, y la respuesta a «¿Electron?» + +Sale de tres preguntas del usuario en una sesión: *¿es congruente empaquetar GenOffice?*, *¿teníamos +planeado compilar Electron?*, *¿qué apps muy usadas valdría la pena replicar de cero en vez de +incluirlas?*. Las tres se contestaron midiendo, y dos mediciones **corrigen cosas escritas arriba**. + +## 1. El censo: de ~50 apps muy usadas, el catálogo tiene 9 + +Cruzado contra los 1158 nombres de receta del disco (corpus + las cuatro colas): + +**Están (9):** `firefox`, `mpv`, `obs-studio`, `zathura`, `okular`, `gwenview`, `dolphin`, `ark`, +`spectacle` — y **cinco de esas nueve son de KDE**, o sea que sólo llegan a una de las cuatro +imágenes. + +**No están:** gimp, inkscape, krita, darktable, blender, audacity, kdenlive, shotcut, vlc, chromium, +thunderbird, evolution, libreoffice, calligra, scribus, calibre, transmission, qbittorrent, deluge, +filezilla, remmina, wireshark, virt-manager, gparted, keepassxc, bitwarden, signal-desktop, +telegram-desktop, element-desktop, fractal, discord, slack, zoom, spotify, steam, lutris, wine, +vscode, zed, sublime-text, obsidian, logseq, anki, gnucash, homebank, thunar, nautilus, pcmanfm, +file-roller, flameshot. + +## 2. ⚠ CORRECCIÓN al «tercer defecto del método»: el muro de GL se movió, y luego se disfrazó + +La sección de arriba dice, con fecha 2026-09-03, que **ninguna cola publica `libGL.so` ni `gl.pc`** y +que por eso toda app de GL de escritorio está bloqueada. **Eso dejó de ser cierto al día siguiente** y +conviene no repetirlo de memoria: + +``` +scripts/provee.py --desde corpus gl opengl # corrido el 2026-09-13 + gl ✗ NADIE LO PUBLICA en ninguna cola + opengl ✓ corpus/libglvnd ⇒ libOpenGL.so.0 opengl.pc +``` + +`recipes/libglvnd.toml` existe desde el **2026-09-04**, escrita para OBS, y hace la partición que +ordena el problema —que arriba estaba mezclado en una sola fila: + +- **`libGL.so.1` = GL *más GLX*** en una sola librería ⇒ **implica X11**. Encenderlo metería + `libX11`/`libxcb`/`xorgproto` —hoy sólo en `incoming-kde`— **en el CORPUS**, o sea en las cinco + imágenes, para servir a una app. Eso sí sería contraproducente: es reabrir X11-al-tacho. +- **`libOpenGL.so.0` = GL de escritorio pelado**, sin ventana ni plataforma, con el contexto creado + por EGL. **No contradice ninguna decisión de la distro.** Es la que se eligió. + +⚠ **Pero la campaña quedó a medias, y eso vale más que la buena noticia.** Las tres recetas de mesa +siguen con `-Dglvnd=false`. Medido en el rootfs de KDE ya hidratado: + +| | mesa | libglvnd | +|---|---|---| +| `/usr/lib/libEGL.so.1` | → `libEGL.so.1.0.0`, **1.440.624 B** (el driver) | → `libEGL.so.1.1.0`, **323.144 B** (puro despacho) | +| `libEGL_mesa.so.0` + `/usr/share/glvnd/egl_vendor.d/` | ✗ | ✗ | + +Las **dos** están declaradas en `escritorio-kde` ⇒ dos `libEGL.so.1` distintos en la misma ruta. Hoy +gana el de mesa —por orden de hidratación, no porque nada lo guarde— y el de glvnd queda huérfano al +lado. La propia receta de `libglvnd` avisaba de esto: *«mesa se reconstruye en la MISMA campaña, no +después»*. + +**Y OBS, que fue la razón de escribir libglvnd, no la usa en runtime.** `libobs-opengl.so` sale con +`NEEDED libEGL.so.1` y nada más; sus símbolos indefinidos son todos `egl*`, **ni un `gl[A-Z]` sin +resolver** ⇒ su `glad` resuelve los punteros por `eglGetProcAddress` contra la EGL de mesa. glvnd +está en la imagen satisfaciendo un requisito **de enlace** (el `OpenGL::GL` de CMake) y es **inerte**. + +⇒ **El estado real del muro**: `provee.py` dice `opengl ✓` y eso es verdad **de enlace**. En runtime +no hay vendor de GL de escritorio registrado. Una app que de verdad llame por `libOpenGL.so.0` +encontraría una tabla de despacho vacía. El muro pasó de *«no enlaza»* a *«enlaza y no corre»*, que +es el modo de fallo más caro de esta casa. **Terminarlo es re-sellar las tres mesa con +`-Dglvnd=true` en un solo movimiento**, y su precio ya está medido: radio grande sobre `mesa` y +libglvnd pasa a ser pieza obligatoria de las cuatro imágenes. + +**Corolario para la tabla de arriba:** `darktable` estaba mal clasificada como caso de GL. No lo es — +su UI es GTK3+cairo y OpenCL es opcional. Su muro es la **cola de deps**: faltan `lensfun`, +`libgphoto2`, `openexr`, `imath`, `libraw`, `osm-gps-map`, `portmidi`, y `exiv2`/`librsvg`/ +`libsecret`/`colord` existen **sólo en colas** (inalcanzables desde el corpus). Es un frente de ~8 +recetas, no un muro. **`blender` sí es el caso de GL** (pide 4.3 core). + +## 3. Electron: nunca estuvo planeado, y el sustituto ya está construido + +`grep -rniE 'electron' docs/ recipes/` da **cero coincidencias**. No hay plan, ni ADR, ni ticket — y +la tabla de arriba explica por qué sin nombrarlo: `chromium` es la peor fila del montón A (38 recetas ++ GTK3 + Qt6 + X11), y Electron es Chromium **más** Node. + +### No existe un «Electron con base Firefox», y el SDD 26 §1 dice por qué + +> Gecko **no tiene API de embebido** en escritorio desde que murió XULRunner; GeckoView existe y es +> de Android. ⇒ un envoltorio de Gecko es necesariamente **chrome-level**. + +Por eso los intentos históricos (Positron, Mozilla 2016) no cuajaron. **Pero eso es exactamente lo +que es `atuq`, y ya está hecho:** + +| pieza de Electron | equivalente en `atuq` | estado | +|---|---|---| +| runtime Chromium | Gecko como **artefacto DERIVADO** de `firefox`, sin fork de fuente | ✅ sellado, en las 4 imágenes | +| UI en HTML/JS | `omni.ja` re-empacado + `userChrome.css` + `distribution/extensions/` | ✅ SDD 26 §4.g | +| lado Node (acceso al sistema) | **host de native messaging en Rust** | ✅ §7.quater, 2026-09-10 | +| IPC | `connectNative`, con el contrato MEDIDO | ✅ §7.bis | + +⇒ **Lo que falta para que `atuq` sea una plataforma de apps y no sólo un navegador es chico**: un +modo SSB (una ventana, sin barra, con su icono y su `.desktop`) y una clase de receta «app de atuq». +Eso es más barato que **un solo** port de Electron, y destraba una familia entera en vez de un +programa. + +### GenOffice, concretamente + +Electron + TypeScript + React, sidecar Rust para xlsx, **Apache-2.0** salvo `ee/` (licencia +Enterprise aparte), en `github.com/genspark-ai/genoffice`. Su README dice que acepta **cualquier +endpoint OpenAI-compatible, incluidos servidores de modelo locales**. + +- **La mitad de IA está resuelta y es una línea de configuración**: `llama-cpp` sirve + `/v1/chat/completions` y `/v1/embeddings`, y **ya viaja en los cuatro escritorios** junto con + `ia-modelo-chat`. Apuntarlo a `http://127.0.0.1:8080/v1` elimina Genspark, la API key y la salida + del documento de la máquina. +- **La mitad de runtime no**: no hay Electron ni lo va a haber. La vía es **qorpa** — + `docs/state/qorpa-imagenes.toml` ya cura `ubuntu-base` y GenOffice publica `.deb`. +- ⚠ **Y el muro real no es el empaquetado, es el MODELO.** El pineado es Qwen2.5-1.5B-Instruct + Q4_K_M (20,1 tok/s en CPU, elegido por peso y licencia). Para reescribir un párrafo alcanza; para + lo que GenOffice llama IA agéntica sobre un `.xlsx`, un 1.5B da basura. Conectarlo funciona; que + **sirva** pide pinear un modelo mucho mayor, y eso es su propia unidad de trabajo (y RAM). + +## 4. Qué vale la pena REHACER en vez de incluir + +El criterio, porque sin criterio esto es una lista de deseos: + +> **Rehacer sólo cuando el upstream está bloqueado por algo ESTRUCTURAL y el valor vive en un +> protocolo o formato abierto, no en el código.** Si no: empaquetar, o enjaular. + +**Empaquetar — el muro cayó o nunca existió:** + +- **`thunderbird`** es el más desaprovechado: **es Gecko**. Misma cadena que `firefox`, que ya + construye. Ningún muro nuevo, sólo otro build largo. Es el cliente de correo gráfico más barato + que este catálogo puede tener. +- **`gimp`**: estaba bloqueado por GTK3 y **`gtk3` ya está sellada** (Wayland-only). Pide re-triaje + con `provee.py` antes de prometer nada. +- **`krita`, `kdenlive`, `qbittorrent`, `keepassxc`, `calibre`**: son Qt6, y Qt6 está **completo en + `incoming-kde`**. Son recetas de cola, no muros — pero sólo llegan a la imagen KDE. +- **`fractal`** (Matrix, GTK4+Rust) y **`transmission`**: sin muro conocido. + +**Enjaular (qorpa), no rehacer:** vscode, discord, slack, signal, obsidian, zoom, spotify, steam, +**genoffice**. Y **blender**, porque la jaula trae su propia mesa glibc y **esquiva la campaña de +glvnd por completo**. + +**Rehacer desde tawasuyu — la lista corta que pasa el criterio:** + +1. **El shell de apps sobre `atuq`** (§3). No es una app: es el runtime. Máximo apalancamiento. +2. **Bóveda / gestor de contraseñas.** KeePassXC es Qt y Bitwarden es Electron, pero el valor está + en el formato KDBX y en la integración con el navegador — y **esa mitad, que es la cara en todos + lados, ya está construida**: `agora` (Ed25519), `qullqa` y el host de native messaging. +3. **Cliente Matrix nativo — sólo si `fractal` no construye.** Medir antes de escribir. + +El precedente que dice que el método funciona es propio: **torrent (SDD 26 §6.9) y medios (§6.6) se +rehicieron como demonios Rust en vez de empaquetar transmission y vlc, y los dos están cerrados.** + +⚠ Y la advertencia que el SDD 26 §2 ya pagó: portar un upstream vivo compra **su cinta de correr** +(*«el costo de Zen no es el motor: es el rebase cada cuatro semanas»*). Un port de GenOffice es una +relación, no una receta.