docs: adenda al plan de apps — el censo, el muro de GL revisado y la respuesta a «¿Electron?»

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.
This commit is contained in:
Sergio
2026-09-13 01:10:00 +00:00
parent cbecd0ba12
commit 584cc128a8
+155
View File
@@ -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.