gioser

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 1572Shell 203Rust 109Markdown 993728 Sutichaykuna

⎇ 3b305286d5e0a3265226be489e51447f1b68a169 docs/plan-apps-usuario-final.md Markdown · 172 siq'ikuna · 10.8 KB Ñawpa willay ch'uya

plan de apps: la decisión de audio queda tomada — opción 1, con la salvedad de pulseaudio 3b305286d · Sergio ·

1# Plan — apps de usuario final (montón A del ADR 0015), MEDIDO
2
3**Fecha de la medición:** 2026-09-03 · **Catálogo contra el que se midió:** 1079 recetas
4(corpus + las cuatro colas) · **Instrumento:** `makedepends`+`depends` del APKBUILD de Alpine de
5cada candidata, cruzados contra los nombres de receta que existen en el disco.
6
7## Por qué existe este documento
8
9El [ADR 0015](adr/0015-imagenes-ajenas.md) parte las apps que faltan en tres montones y dice del
10**A** —Firefox, Chromium, LibreOffice, mpv, GIMP, Inkscape, Blender, OBS— que no lo bloquea *«nada
11estructural: son Wayland-nativos y compilables. Falta escribirlas»*, y propone el orden
12**mpv → OBS → Firefox**.
13
14`mpv` se escribió el 2026-09-03 y esa parte se confirmó. Al ir por el segundo, la medición
15**desmiente la premisa para el resto del montón**: OBS y Firefox no están a una receta de distancia,
16están detrás de muros que esta distro levantó a propósito. Este documento deja el dato escrito para
17que la decisión se tome mirándolo y no de memoria.
18
19## Cómo leer la tabla
20
21Dos columnas, y **la que importa es la segunda**:
22
23- **recetas que faltan** — cuántos `makedepends` de Alpine no tienen receta acá. Es una **cota
24  superior floja**: Alpine construye con todo activado y nosotros no. El control lo da `mpv`, que
25  YA ESTÁ SELLADA y aun así aparece con 16 faltantes — son exactamente las perillas que su receta
26  apaga a propósito (jack, sndio, libbluray, zimg, rubberband…). O sea: un número alto no prueba
27  que sea caro.
28- **muros de diseño** — dependencias que NO son «una receta más», sino decisiones ya tomadas de
29  esta distro: GTK3 aparcado, X11 al tacho, Qt6 que vive sólo en `incoming-kde`, toolchain wasi
30  inexistente. **Un muro no se paga escribiendo una receta: se paga cambiando una decisión.**
31
32## La tabla
33
34| app | faltan | muros | veredicto |
35|---|---:|---|---|
36| ~~wf-recorder~~ | — | — | ✅ **SELLADA 2026-09-03** (b3:25caa359), con audio. Se destrabó al promover pipewire al corpus. Sólo en `escritorio-sway`: captura por `wlr-screencopy` y KWin/mutter no lo implementan. |
37| **imv** | 7 | — | barato: los 7 son cargadores de formato opcionales (heif, jxl, freeimage…). Visor de imágenes. |
38| **zathura** | 8 | — | lector de PDF; `girara` es su propia lib y ya usa GTK4 en Alpine. |
39| **mupdf** | 9 | X11 | el X11 es del visor `mupdf-x11`; el motor y `mupdf-gl` no. Requiere mirar. |
40| **inkscape** | 14 | — | sin muros, pero `gtkmm3` en la lista hay que verificarlo (¿GTK3 encubierto?). |
41| *mpv* | *16* | *X11* | *YA SELLADA — es el control del método, no una candidata.* |
42| **gimp** | 18 | **GTK3**, X11 | GIMP 2.10 es GTK2/3. Fuera de alcance mientras GTK3 esté aparcado. |
43| **obs-studio** | 20 | **Qt6**, X11 | ver abajo. |
44| **firefox** | 26 | **GTK3**, X11, **wasi** | ver abajo. |
45| **chromium** | 38 | **GTK3**, **Qt6**, X11 | peor que Firefox por todos lados. |
46| **libreoffice** | 59 | **GTK3**, **Qt6**, X11 | 59 recetas y tres muros. No es un ticket, es un año. |
47
48## ⚠ El defecto del método, encontrado al usarlo (y lo que destapó)
49
50La columna «recetas que faltan» pregunta **¿existe esta receta en el disco?** y esa es la pregunta
51equivocada. La correcta es **¿la alcanza el consumidor?** — porque una receta resuelve sus deps
52sibling-first (su propia cola) y después el catálogo PADRE, **nunca una cola hermana**.
53
54Se descubrió al ir a escribir `wf-recorder`, que la tabla daba en 0/0: su `makedepends` pide
55`pipewire-dev` y `pulseaudio-dev`, los dos existen… **en las tres colas de escritorio y en ninguna
56en el corpus**. Una app del corpus no los ve. wf-recorder construye igual (`-Dpulse=disabled
57-Dpipewire=disabled`, `have_audio=false`) pero graba **sin sonido**, y no tiene backend ALSA con el
58que caerse.
59
60### Lo que eso destapa, que es más grande que wf-recorder
61
62> **El corpus no tiene ningún cliente de audio salvo ALSA.** `libpipewire-0.3` y `libpulse` viven
63> sólo en `incoming-{kde,gnome,cosmic}`. Toda app multimedia que llegue al corpus va a chocar acá.
64
65Ya chocó dos veces en un día: `mpv` terminó con `--ao=alsa` en vez de su salida nativa de PipeWire
66(y por eso hubo que dar vuelta `-Dpipewire-alsa` en las tres pipewire, que fue el arreglo correcto
67pero fue un rodeo), y ahora `wf-recorder` se queda mudo.
68
69**DECIDIDA Y HECHA el 2026-09-03 — opción 1, con una salvedad medida.** Lo que sigue queda como
70registro de por qué. La decisión era: promover UNA pipewire al corpus. Construye
71—el corpus tiene su propia `glib`, `dbus` y `pcre2`— pero el problema no es construirla: es que una
72imagen que hidrate `corpus/pipewire` **y** la de su cola pondría dos `libpipewire-0.3.so` distintas
73en la misma ruta, que es la enfermedad de las dos glib. Las salidas posibles, para pensarlas
74despierto:
75
761. **Una sola pipewire, en el corpus, y las tres colas jubilan la suya.** Es lo más limpio y es lo
77   que ya se hizo con otras 13 copias que sellaban igual — pero éstas NO sellan igual (difieren en
78   glib/dbus/pcre2), así que hay que decidir cuál gana y volver a sellar wireplumber y los portales
79   de las tres colas.
802. **Aceptar ALSA como la única ABI de audio del corpus**, que es lo que hoy quedó funcionando de
81   hecho: `-Dpipewire-alsa=enabled` hace que un cliente ALSA desemboque en PipeWire. Barato y ya
82   está hecho; el precio es que las apps del corpus nunca usan la API nativa (sin control por-stream,
83   sin metadata de sesión) y que las que sólo hablan pulse/pipewire —wf-recorder— quedan afuera.
843. **Que las apps multimedia vivan en las colas**, una copia por escritorio. Es lo que la estructura
85   empuja hoy y es exactamente lo que no queremos para una app que sirve a las cuatro imágenes.
86
87### Cómo se resolvió
88
89Ganó la **opción 1**, y salió barata porque la variante de COSMIC ya resolvía su cierre entero
90contra el catálogo padre: `recipes/pipewire.toml` sella el MISMO hash que tenía en la cola. Con ella
91subieron `libsndfile` y `dbus-shared` (duplicados exactos). 9 copias de cola jubiladas, **5
92rebuilds**.
93
94Lo que hizo segura la promoción fue una medición, no un argumento: **ningún pipewire enlaza glib**
95—sus NEEDED son `libdbus-1.so.3`, `libpulse.so.0`, `libsndfile.so.1`— así que `libpipewire-0.3.so`
96se comparte entre las cuatro imágenes sin repetir el episodio de las dos glib.
97
98**Y la salvedad, que es la parte que valía la pena medir:** `pulseaudio` NO se promovió.
99`libpulse-mainloop-glib.so.0.0.6` mide **45.712 bytes** en la variante de GNOME (NEEDED
100`libglib-2.0.so.0`) y **2.455.600** en la del corpus, que se traga la glib ESTÁTICA. Esa dentro del
101proceso de gnome-shell —que ya carga la glib sombra dinámica— es el cuadro de colord. Las tres
102pulseaudio se quedan: son variantes deliberadas. Sin esa salvedad los rebuilds habrían sido 8,
103incluido `gnome-shell`.
104
105La regla general que sale de acá, y sirve para la próxima promoción:
106
107> **Enlazar contra una variante y correr contra otra es legítimo cuando lo que cruza es un SONAME**
108> (misma ABI). Lo que no se puede es **hidratar dos artefactos distintos en la misma ruta**. Por eso
109> pipewire se puede compartir y pulseaudio no.
110
111Consecuencias inmediatas: `mpv` pasó a `-Dpipewire=enabled` (con ALSA detrás, para imágenes sin
112demonio) y `wf-recorder` se escribió y selló el mismo día.
113
114## Los dos veredictos que corrigen al ADR
115
116### Firefox NO es montón A
117
118Su APKBUILD pide `gtk+3.0-dev` — **Firefox no tiene backend GTK4 ni lo va a tener a corto plazo**, y
119GTK3 es una de las tres deudas que el frente GNOME aparcó por diseño. Además pide `libxt`,
120`libxcomposite` (X11) y un **toolchain wasi** (`wasi-sdk`, `wasi-compiler-rt`) que no existe en el
121corpus, más `nodejs`, `icu`, `nss/nspr`, `clang/llvm/lld` versionados y `cbindgen`.
122
123La memoria del repo decía que a Firefox «le falta subir el techo MSRV». Eso es cierto **y es lo
124menor**: el bloqueo real es GTK3.
125
126**Consecuencia estratégica, que es la decisión que hay que tomar despierto:** todos los navegadores
127del mundo Linux son o GTK3 (Firefox y derivados) o Chromium (que además arrastra Qt6 y GTK3 en
128Alpine). Entonces **«tener navegador» no es un ticket del montón A**: es elegir entre
129
1301. **autorar el stack GTK3** —revierte una decisión de diseño y reabre GIMP/Inkscape de paso—, o
1312. **darle el navegador a [qorpa](adr/0015-imagenes-ajenas.md)**, o sea tratarlo como montón B: el
132   navegador corre en la imagen ajena, hablando Wayland por socket.
133
134La opción 2 es coherente con todo lo demás que ya se decidió, y tiene una ventaja que conviene
135nombrar: el navegador es *justamente* el proceso al que menos ganas dan de darle el sistema entero.
136
137### OBS no puede ser una app del corpus
138
139Pide `qt6-qtbase-dev`, `qt6-qtbase-private-dev` y `qt6-qtsvg-dev`, y **Qt6 vive sólo en
140`incoming-kde/`**. Una receta resuelve sibling-first y después el catálogo padre: desde el corpus no
141se alcanza una cola. O sea que OBS hoy sólo puede existir **dentro de la cola de KDE**, y entonces
142no es una app de las cuatro imágenes sino una app de KDE. Súmese X11 (`libx11`, `libxcb`,
143`libxcomposite`, `libxinerama`) y 20 recetas nuevas (`libdatachannel`, `librist`, `libsrt`,
144`mbedtls`, `rnnoise`, `x264`, `luajit`, `swig`, `vlc`…).
145
146**Si lo que se quiere es grabar la pantalla** —que es el 80% de para qué se instala OBS— eso ya está
147al alcance de la mano: **`wf-recorder` sale con CERO recetas faltantes y cero muros**, porque su
148cierre (wayland, ffmpeg, libdrm) quedó completo cuando entró mpv.
149
150## Orden propuesto, en reemplazo del del ADR
151
1521. ✅ **mpv** — hecho (2026-09-03).
1532. **decisión de audio del corpus** (el ⚠ de arriba). Destraba wf-recorder y le da a mpv
154   su salida nativa. Es una decisión, no una campaña.
1553. **wf-recorder** — inmediato una vez tomada esa decisión; cubre el caso de uso principal de OBS.
1564. **imv** — visor de imágenes; los 7 faltantes son opcionales y se puede entrar con los mínimos.
1575. **zathura** (+ backend PDF) — verificar antes que su cadena sea GTK4 y no GTK3.
1586. **Decisión de navegador** — no es trabajo de recetas, es la elección de arriba. No debería
159   entrar a una cola de build hasta que esté tomada.
160
161OBS, Firefox, Chromium, GIMP y LibreOffice **salen del montón A** hasta que se decida GTK3 o qorpa.
162Que se llame montón A y no se pueda construir es peor que no tenerlo en la lista: es deuda fantasma,
163la misma figura que la terna de GNOME que había que sacar de `targets.toml` para que el grafo dejara
164de mentir.
165
166## Reproducir la medición
167
168`/tmp/.../triaje-apps.py` fue un script de una sola vez; si hace falta repetirlo, lo que hace es:
169bajar el APKBUILD de cada candidata, extraer `makedepends`/`depends`, quitarles el sufijo `-dev`, y
170cruzar contra `recipes/*.toml` + `recipes/incoming-*/*.toml`, separando una lista fija de nombres
171que son muros de diseño (gtk+3.0, qt6-*, lib X11, wasi-*). No se guarda en `scripts/` porque la
172lista de candidatas es del momento, no un invariante que valga la pena vigilar.

plan-apps-usuario-final.md

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 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:

La tabla

appfaltanmurosveredicto
wf-recorder——✅ SELLADA 2026-09-03 (b3:25caa359), con audio. Se destrabó al promover pipewire al corpus. Sólo en escritorio-sway: captura por wlr-screencopy y KWin/mutter no lo implementan.
imv7—barato: los 7 son cargadores de formato opcionales (heif, jxl, freeimage…). Visor de imágenes.
zathura8—lector de PDF; girara es su propia lib y ya usa GTK4 en Alpine.
mupdf9X11el X11 es del visor mupdf-x11; el motor y mupdf-gl no. Requiere mirar.
inkscape14—sin muros, pero gtkmm3 en la lista hay que verificarlo (¿GTK3 encubierto?).
mpv16X11YA SELLADA — es el control del método, no una candidata.
gimp18GTK3, X11GIMP 2.10 es GTK2/3. Fuera de alcance mientras GTK3 esté aparcado.
obs-studio20Qt6, X11ver abajo.
firefox26GTK3, X11, wasiver abajo.
chromium38GTK3, Qt6, X11peor que Firefox por todos lados.
libreoffice59GTK3, Qt6, X1159 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.

DECIDIDA Y HECHA el 2026-09-03 — opción 1, con una salvedad medida. Lo que sigue queda como registro de por qué. La decisión era: 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.

Cómo se resolvió

Ganó la opción 1, y salió barata porque la variante de COSMIC ya resolvía su cierre entero contra el catálogo padre: recipes/pipewire.toml sella el MISMO hash que tenía en la cola. Con ella subieron libsndfile y dbus-shared (duplicados exactos). 9 copias de cola jubiladas, 5 rebuilds.

Lo que hizo segura la promoción fue una medición, no un argumento: ningún pipewire enlaza glib —sus NEEDED son libdbus-1.so.3, libpulse.so.0, libsndfile.so.1— así que libpipewire-0.3.so se comparte entre las cuatro imágenes sin repetir el episodio de las dos glib.

Y la salvedad, que es la parte que valía la pena medir: pulseaudio NO se promovió. libpulse-mainloop-glib.so.0.0.6 mide 45.712 bytes en la variante de GNOME (NEEDED libglib-2.0.so.0) y 2.455.600 en la del corpus, que se traga la glib ESTÁTICA. Esa dentro del proceso de gnome-shell —que ya carga la glib sombra dinámica— es el cuadro de colord. Las tres pulseaudio se quedan: son variantes deliberadas. Sin esa salvedad los rebuilds habrían sido 8, incluido gnome-shell.

La regla general que sale de acá, y sirve para la próxima promoción:

Enlazar contra una variante y correr contra otra es legítimo cuando lo que cruza es un SONAME (misma ABI). Lo que no se puede es hidratar dos artefactos distintos en la misma ruta. Por eso pipewire se puede compartir y pulseaudio no.

Consecuencias inmediatas: mpv pasó a -Dpipewire=enabled (con ALSA detrás, para imágenes sin demonio) y wf-recorder se escribió y selló el mismo día.

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, 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.