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
Delta semántico
Ninguna definición cambió: el cambio es de texto, documentación o datos.
1 archivos · +73 −3
diff --git a/docs/26-atuq-envoltorio-gecko.md b/docs/26-atuq-envoltorio-gecko.md
index 189c6cf4..716e0a25 100644
--- a/docs/26-atuq-envoltorio-gecko.md
+++ b/docs/26-atuq-envoltorio-gecko.md
@@ -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