Files
takana/docs/plan-apps-usuario-final.md
T
Sergio 524d18aba1 plan de apps: el triaje preguntaba «¿existe la receta?» y la pregunta es «¿la alcanza quién la usa?»
Se descubrió usándolo. `wf-recorder` daba 0 faltantes / 0 muros, y al ir a escribirlo resultó que
sus dos backends de audio —pipewire y pulse— existen en las TRES colas de escritorio y en NINGUNA
en el corpus. Una receta del corpus no ve una cola hermana, así que wf-recorder construye pero
graba MUDO, y no tiene backend ALSA con el que caerse.

Lo que eso destapa es más grande que wf-recorder y por eso queda escrito como decisión abierta:
**el corpus no tiene ningún cliente de audio salvo ALSA**. Ya chocó dos veces en un día — mpv
terminó con `--ao=alsa` en vez de su salida nativa, y ahora esto. Las tres salidas posibles
(promover UNA pipewire al corpus / aceptar ALSA como la ABI única / que las apps multimedia vivan
en las colas) quedan planteadas con su precio; la primera choca con la enfermedad de las dos glib
y no se decide de madrugada.

wf-recorder NO se escribe hasta entonces: un grabador de pantalla mudo es la clase de media-cosa
que conviene no sellar sin que alguien la haya elegido.
2026-09-03 03:47:17 +00:00

148 lines
9.3 KiB
Markdown

# Plan — apps de usuario final (montón A del ADR 0015), MEDIDO
**Fecha de la medición:** 2026-09-03 · **Catálogo contra el que se midió:** 1079 recetas
(corpus + las cuatro colas) · **Instrumento:** `makedepends`+`depends` del APKBUILD de Alpine de
cada candidata, cruzados contra los nombres de receta que existen en el disco.
## Por qué existe este documento
El [ADR 0015](adr/0015-imagenes-ajenas.md) parte las apps que faltan en tres montones y dice del
**A** —Firefox, Chromium, LibreOffice, mpv, GIMP, Inkscape, Blender, OBS— que no lo bloquea *«nada
estructural: son Wayland-nativos y compilables. Falta escribirlas»*, y propone el orden
**mpv → OBS → Firefox**.
`mpv` se escribió el 2026-09-03 y esa parte se confirmó. Al ir por el segundo, la medición
**desmiente la premisa para el resto del montón**: OBS y Firefox no están a una receta de distancia,
están detrás de muros que esta distro levantó a propósito. Este documento deja el dato escrito para
que la decisión se tome mirándolo y no de memoria.
## Cómo leer la tabla
Dos columnas, y **la que importa es la segunda**:
- **recetas que faltan** — cuántos `makedepends` de Alpine no tienen receta acá. Es una **cota
superior floja**: Alpine construye con todo activado y nosotros no. El control lo da `mpv`, que
YA ESTÁ SELLADA y aun así aparece con 16 faltantes — son exactamente las perillas que su receta
apaga a propósito (jack, sndio, libbluray, zimg, rubberband…). O sea: un número alto no prueba
que sea caro.
- **muros de diseño** — dependencias que NO son «una receta más», sino decisiones ya tomadas de
esta distro: GTK3 aparcado, X11 al tacho, Qt6 que vive sólo en `incoming-kde`, toolchain wasi
inexistente. **Un muro no se paga escribiendo una receta: se paga cambiando una decisión.**
## La tabla
| app | faltan | muros | veredicto |
|---|---:|---|---|
| **wf-recorder** | 0 | *(ver ⚠ abajo)* | construible hoy **sin audio**: su captura de sonido es pulse o pipewire, y ninguno de los dos se alcanza desde el corpus. |
| **imv** | 7 | — | barato: los 7 son cargadores de formato opcionales (heif, jxl, freeimage…). Visor de imágenes. |
| **zathura** | 8 | — | lector de PDF; `girara` es su propia lib y ya usa GTK4 en Alpine. |
| **mupdf** | 9 | X11 | el X11 es del visor `mupdf-x11`; el motor y `mupdf-gl` no. Requiere mirar. |
| **inkscape** | 14 | — | sin muros, pero `gtkmm3` en la lista hay que verificarlo (¿GTK3 encubierto?). |
| *mpv* | *16* | *X11* | *YA SELLADA — es el control del método, no una candidata.* |
| **gimp** | 18 | **GTK3**, X11 | GIMP 2.10 es GTK2/3. Fuera de alcance mientras GTK3 esté aparcado. |
| **obs-studio** | 20 | **Qt6**, X11 | ver abajo. |
| **firefox** | 26 | **GTK3**, X11, **wasi** | ver abajo. |
| **chromium** | 38 | **GTK3**, **Qt6**, X11 | peor que Firefox por todos lados. |
| **libreoffice** | 59 | **GTK3**, **Qt6**, X11 | 59 recetas y tres muros. No es un ticket, es un año. |
## ⚠ El defecto del método, encontrado al usarlo (y lo que destapó)
La columna «recetas que faltan» pregunta **¿existe esta receta en el disco?** y esa es la pregunta
equivocada. La correcta es **¿la alcanza el consumidor?** — porque una receta resuelve sus deps
sibling-first (su propia cola) y después el catálogo PADRE, **nunca una cola hermana**.
Se descubrió al ir a escribir `wf-recorder`, que la tabla daba en 0/0: su `makedepends` pide
`pipewire-dev` y `pulseaudio-dev`, los dos existen… **en las tres colas de escritorio y en ninguna
en el corpus**. Una app del corpus no los ve. wf-recorder construye igual (`-Dpulse=disabled
-Dpipewire=disabled`, `have_audio=false`) pero graba **sin sonido**, y no tiene backend ALSA con el
que caerse.
### Lo que eso destapa, que es más grande que wf-recorder
> **El corpus no tiene ningún cliente de audio salvo ALSA.** `libpipewire-0.3` y `libpulse` viven
> sólo en `incoming-{kde,gnome,cosmic}`. Toda app multimedia que llegue al corpus va a chocar acá.
Ya chocó dos veces en un día: `mpv` terminó con `--ao=alsa` en vez de su salida nativa de PipeWire
(y por eso hubo que dar vuelta `-Dpipewire-alsa` en las tres pipewire, que fue el arreglo correcto
pero fue un rodeo), y ahora `wf-recorder` se queda mudo.
**La decisión que hay que tomar (no es de madrugada):** promover UNA pipewire al corpus. Construye
—el corpus tiene su propia `glib`, `dbus` y `pcre2`— pero el problema no es construirla: es que una
imagen que hidrate `corpus/pipewire` **y** la de su cola pondría dos `libpipewire-0.3.so` distintas
en la misma ruta, que es la enfermedad de las dos glib. Las salidas posibles, para pensarlas
despierto:
1. **Una sola pipewire, en el corpus, y las tres colas jubilan la suya.** Es lo más limpio y es lo
que ya se hizo con otras 13 copias que sellaban igual — pero éstas NO sellan igual (difieren en
glib/dbus/pcre2), así que hay que decidir cuál gana y volver a sellar wireplumber y los portales
de las tres colas.
2. **Aceptar ALSA como la única ABI de audio del corpus**, que es lo que hoy quedó funcionando de
hecho: `-Dpipewire-alsa=enabled` hace que un cliente ALSA desemboque en PipeWire. Barato y ya
está hecho; el precio es que las apps del corpus nunca usan la API nativa (sin control por-stream,
sin metadata de sesión) y que las que sólo hablan pulse/pipewire —wf-recorder— quedan afuera.
3. **Que las apps multimedia vivan en las colas**, una copia por escritorio. Es lo que la estructura
empuja hoy y es exactamente lo que no queremos para una app que sirve a las cuatro imágenes.
Hasta que eso se decida, `wf-recorder` queda **sin escribir**: un grabador de pantalla mudo es
justamente la clase de media-cosa que conviene no sellar sin que alguien la haya elegido.
## Los dos veredictos que corrigen al ADR
### Firefox NO es montón A
Su APKBUILD pide `gtk+3.0-dev`**Firefox no tiene backend GTK4 ni lo va a tener a corto plazo**, y
GTK3 es una de las tres deudas que el frente GNOME aparcó por diseño. Además pide `libxt`,
`libxcomposite` (X11) y un **toolchain wasi** (`wasi-sdk`, `wasi-compiler-rt`) que no existe en el
corpus, más `nodejs`, `icu`, `nss/nspr`, `clang/llvm/lld` versionados y `cbindgen`.
La memoria del repo decía que a Firefox «le falta subir el techo MSRV». Eso es cierto **y es lo
menor**: el bloqueo real es GTK3.
**Consecuencia estratégica, que es la decisión que hay que tomar despierto:** todos los navegadores
del mundo Linux son o GTK3 (Firefox y derivados) o Chromium (que además arrastra Qt6 y GTK3 en
Alpine). Entonces **«tener navegador» no es un ticket del montón A**: es elegir entre
1. **autorar el stack GTK3** —revierte una decisión de diseño y reabre GIMP/Inkscape de paso—, o
2. **darle el navegador a [qorpa](adr/0015-imagenes-ajenas.md)**, o sea tratarlo como montón B: el
navegador corre en la imagen ajena, hablando Wayland por socket.
La opción 2 es coherente con todo lo demás que ya se decidió, y tiene una ventaja que conviene
nombrar: el navegador es *justamente* el proceso al que menos ganas dan de darle el sistema entero.
### OBS no puede ser una app del corpus
Pide `qt6-qtbase-dev`, `qt6-qtbase-private-dev` y `qt6-qtsvg-dev`, y **Qt6 vive sólo en
`incoming-kde/`**. Una receta resuelve sibling-first y después el catálogo padre: desde el corpus no
se alcanza una cola. O sea que OBS hoy sólo puede existir **dentro de la cola de KDE**, y entonces
no es una app de las cuatro imágenes sino una app de KDE. Súmese X11 (`libx11`, `libxcb`,
`libxcomposite`, `libxinerama`) y 20 recetas nuevas (`libdatachannel`, `librist`, `libsrt`,
`mbedtls`, `rnnoise`, `x264`, `luajit`, `swig`, `vlc`…).
**Si lo que se quiere es grabar la pantalla** —que es el 80% de para qué se instala OBS— eso ya está
al alcance de la mano: **`wf-recorder` sale con CERO recetas faltantes y cero muros**, porque su
cierre (wayland, ffmpeg, libdrm) quedó completo cuando entró mpv.
## Orden propuesto, en reemplazo del del ADR
1.**mpv** — hecho (2026-09-03).
2. **decisión de audio del corpus** (el ⚠ de arriba). Destraba wf-recorder y le da a mpv
su salida nativa. Es una decisión, no una campaña.
3. **wf-recorder** — inmediato una vez tomada esa decisión; cubre el caso de uso principal de OBS.
4. **imv** — visor de imágenes; los 7 faltantes son opcionales y se puede entrar con los mínimos.
5. **zathura** (+ backend PDF) — verificar antes que su cadena sea GTK4 y no GTK3.
6. **Decisión de navegador** — no es trabajo de recetas, es la elección de arriba. No debería
entrar a una cola de build hasta que esté tomada.
OBS, Firefox, Chromium, GIMP y LibreOffice **salen del montón A** hasta que se decida GTK3 o qorpa.
Que se llame montón A y no se pueda construir es peor que no tenerlo en la lista: es deuda fantasma,
la misma figura que la terna de GNOME que había que sacar de `targets.toml` para que el grafo dejara
de mentir.
## Reproducir la medición
`/tmp/.../triaje-apps.py` fue un script de una sola vez; si hace falta repetirlo, lo que hace es:
bajar el APKBUILD de cada candidata, extraer `makedepends`/`depends`, quitarles el sufijo `-dev`, y
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.