SDD 26 §6.11: la pregunta era «¿reproduce?», y la respuesta destapó dos errores y un bug

El §6.10 preguntó «¿qué NO puede hacer?» y contestó leyendo cadenas de sonames.
Media pregunta. Al hacer la otra mitad —¿se ve el vídeo?— salieron tres cosas:

DOS ERRORES DEL MAPA, los dos por leer una etiqueta en vez de medir:

- «no hay receta de ffmpeg» era falso: la hay, sellada, y ya viajaba en la
  clausura de los cuatro escritorios por `mpv`. Lo que faltaba era la lista de
  raíces del runner.
- «VA-API sin receta» también: `libva` está y está en las cuatro imágenes. El
  hueco es real pero es el DRIVER — las tres mesa van `-Dgallium-va=disabled`.
  Y queda anotado que ahora el mapa ya no lo puede ver, porque la librería
  presente silencia el aviso sin encender la función.

UN BUG REAL: AV1 no reproducía. Gecko se come el primer elemento de
`LD_LIBRARY_PATH` al lanzar el RDD ⇒ sin appdir ⇒ ffvpx no carga ⇒ se cae al
ffmpeg del sistema, que no trae AV1 por software. Sin error, sin NEEDED
faltante, sin cadena ausente: `readyState=1` para siempre.

Y lo que quedó MEDIDO, por el lanzador de verdad y headless: H.264+AAC, VP9+Opus,
AV1, MP3 y FLAC reproducen, con el tiempo avanzando y no con «se creó el
decodificador» — que en AV1 se creaba igual y no entregaba un cuadro.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NNFzrqFBEt6W7maGJKf2Xs
This commit is contained in:
Sergio
2026-09-07 15:40:45 +00:00
co-authored by Claude Opus 5
parent f3aaab75c6
commit 6a1343d2d2
+73 -3
View File
@@ -505,16 +505,17 @@ lo haya—, así que no falla nunca: imprime un mapa triado. Lo que sí se puede
contrario, que es lo útil: **si la cadena está y el fichero no, esa función no existe en esta
imagen.**
De 85 cadenas con forma de soname, **47 no tienen quién las provea**. Triadas:
De 85 cadenas con forma de soname, **47 no tenían quién las provea**. Triadas (y con dos filas
corregidas el mismo día — ver §6.11, que las midió en vez de deducirlas; hoy el mapa da **7 huecos**):
| Qué se pierde | Estado |
|---|---|
| **Códecs del sistema (H.264/AAC)** | hueco — no hay receta de `ffmpeg`. Lo bundleado cubre VP9/AV1/Opus, no H.264 |
| **Códecs del sistema (H.264/AAC)** | **ERA FALSO**`recipes/ffmpeg.toml` existe, está sellada y ya viajaba en los cuatro escritorios por `mpv`. Corregido en §6.11: **reproduce** |
| **Notificaciones web** (`libnotify`) | ✅ **CERRADO el 2026-09-07**: `recipes/libnotify.toml`, 0.8.8, compartida. Es el primer hueco que este mapa encontró Y cerró |
| **Llavero** (`libsecret`) | hueco — pero **la receta ya existe** en `incoming-gnome` |
| **Sonidos del sistema** (`libcanberra`) | hueco — receta en `incoming-kde` |
| **WebGPU / vulkan** (`libvulkan`) | hueco — receta `vulkan-loader` en `incoming-kde` |
| **Vídeo por hardware** (VA-API) | hueco — sin receta |
| **Vídeo por hardware** (VA-API) | hueco, pero **no por falta de receta**: `libva` está sellada y en las cuatro imágenes. Falta el driver — las tres mesa van con `-Dgallium-va=disabled` y `-Dvideo-codecs=` vacío ⇒ ni un `*_drv_video.so` |
| **Lectura en voz alta** (`libspeechd`) | hueco — sin receta |
| `libGL` | **decisión**: la distro es Wayland-only sin GLX y Firefox va por EGL |
| `libcurl` | **decisión**: sólo lo usa `pingsender`, que manda telemetría — apagada |
@@ -562,6 +563,75 @@ anotada. El daemon habrá que nombrarlo de otro modo o meterlo en `incoming-wlr`
sí. La pregunta que faltaba era «¿y qué NO puede hacer?», que ninguna métrica del repo respondía
porque todas miran presencia y ésta mira ausencia declarada por el propio binario.
### 6.11 Y ahora la pregunta que faltaba: ¿REPRODUCE? (2026-09-07)
El §6.10 preguntó «¿qué NO puede hacer?» y contestó leyendo cadenas. Media pregunta. La otra mitad
—**¿se ve el vídeo?**— no la contesta ningún auditor de ELF, y al hacerla aparecieron **dos errores
del mapa y un bug real del navegador**.
**Error 1: «no hay receta de ffmpeg».** La hay. `recipes/ffmpeg.toml`, 7.1, sellada, publica
`libavcodec.so.61` —uno de los once sonames que `libxul.so` sondea por `dlopen` literal— y **ya
viajaba en la clausura de los cuatro escritorios**, arrastrada por `mpv`. Comprobado con
`yupana.membresia`, que es la vista honesta por par `(cola, nombre)`, no leyendo el TOML:
escritorio-kde 308 nodos · escritorio-gnome 192 · escritorio-sway 203 · escritorio-cosmic 163
ffmpeg ✓ en los cuatro · libva ✓ en los cuatro
Lo que faltaba no era la receta: era **la lista de raíces de `scripts/atuq-nested.sh`**, escrita a
mano, que hidrataba un rootfs más pobre que la imagen. Otra vez el instrumento y no el artefacto —
la misma forma que `gcc-libs` el día anterior. Y la comprobación previa que sí se pudo hacer sin
correr nada: de los 82 símbolos con forma `av*_` que `libxul` dlsimboliza, **los 9 que nuestro
`libavcodec` no exporta son los de la API vieja** (`avcodec_decode_video2`, `av_lockmgr_register`,
`avcodec_register_all`…), que Firefox sólo pide para las versiones 53-57.
**Error 2: «VA-API, sin receta».** También la hay, y también está en las cuatro imágenes. El hueco
es real pero por la OTRA mitad: las tres recetas de mesa construyen con `-Dgallium-va=disabled` y
`-Dvideo-codecs=` vacío ⇒ **no existe un solo `*_drv_video.so`**. Un cargador sin ICD no acelera
nada, exactamente como `vulkan-loader`. ⚠ Y con una trampa nueva: ahora que `libva` está en el
rootfs, **el mapa de `--dlopen` ya no la reporta**, porque mide presencia de fichero. La librería
presente SILENCIA el aviso sin encender la función. Queda escrito acá porque el guardián ya no
puede decirlo.
**El bug real: AV1 no reproducía.** Gecko **se come el primer elemento de `LD_LIBRARY_PATH`** al
lanzar el proceso RDD, el que decodifica vídeo. El lanzador ponía `/usr/lib/atuq` una sola vez —o
sea, primero—, así que el RDD arrancaba sin él, no encontraba el ffvpx bundleado (donde vive dav1d)
y anotaba `FFVPX: Link result: NoProvidedLib`. Y ahí **no falla**: se cae al ffmpeg del sistema, que
cubre H.264/AAC/VP8/VP9/MP3/FLAC/Opus… pero **no AV1 por software**, porque el decodificador `av1`
de ffmpeg es sólo hwaccel y nuestra receta va sin dav1d. Resultado: un vídeo AV1 se quedaba en
`readyState=1` para siempre, sin un error, sin un NEEDED faltante y sin una cadena ausente.
Tres corridas del MISMO artefacto que sólo cambian esa variable:
LD=/usr/lib/atuq:/usr/lib:/lib → RDD NoProvidedLib AV1 ✗
LD=/usr/lib/atuq:/usr/lib/atuq:/usr/lib → RDD Success AV1 ✓
LD=/relleno:/usr/lib/atuq:/usr/lib → RDD Success AV1 ✓ (el relleno se lo come)
El arreglo es repetir el appdir en `recipes/atuq/bin/atuq`. Feo y correcto mientras no haya
`patchelf` en el corpus para grabar `RUNPATH=$ORIGIN`, que borraría la variable entera.
**Lo que quedó medido**, con `scripts/test-atuq-codecs.sh`, headless, por el lanzador de verdad y
sin `LD_LIBRARY_PATH` de afuera:
| Muestra | Veredicto |
|---|---|
| H.264 + AAC (mp4) | ✅ `t=3.00`, 75 cuadros |
| VP9 + Opus (webm) | ✅ `t=3.00` |
| AV1 (mp4) | ✅ `t=3.00` — sólo desde el arreglo del lanzador |
| MP3 | ✅ |
| FLAC | ✅ |
El veredicto **no es «se creó el decodificador»**: es que `currentTime` AVANCE. La distinción no es
retórica — en el caso de AV1 el decodificador se creaba (`RemoteDecoderChild … codec: av1`) y no
entregaba un solo cuadro. El guardián corre con `--negative-control`, que saltea el lanzador y
**exige que AV1 falle**: probado en los dos sentidos, porque uno que no puede fallar y uno que nunca
falló se ven igual desde afuera.
**Dos bugs de andamiaje que salieron de paso**, los dos en `atuq-nested.sh` y los dos escondidos
detrás de una caché: el bucle de hidratación salía 1 siempre (línea vacía final + `set -e`) y mataba
el script sin imprimir nada, y la comparación del sello nunca daba igual (un `\n` que `$(cat …)`
recorta de un lado y no del otro), así que el rootfs se rehidrataba entero en cada corrida. El
primero sólo se veía cuando cambiaban los hashes; lo destapó agregar `ffmpeg` a las raíces.
### 2.ter Dónde vive la fuente de `atuq` — hizo falta un modo de `[source]` nuevo
Escribir la receta destapó un muro que este documento no había visto: `[source]` era