atuq-nested: faltaba gcc-libs, y su ausencia hacía MENTIR a la prueba entera
`atuq` declara `NEEDED libstdc++.so.6` y `libgcc_s.so.1` —lo hereda de firefox,
que va con clang++ y la libstdc++ COMPARTIDA— y su clausura ya estaba bien:
`recipes/atuq.toml` declara `runtime = ["gcc-libs"]` desde 5b9777bd, yupana lee
`deps.runtime` desde 02facebe, y el vigía de sonames da CERO en los cinco
perfiles (rehecho hoy: 41/306/190/161/201 nodos, 0 sin proveedor).
Lo que estaba mal era el INSTRUMENTO. `atuq-nested.sh` no hidrataba `gcc-libs`, y
como la jaula monta `.dev-fs/alpine` como capa de abajo, cada «atuq corre» de
estos días resolvió libstdc++ contra el LAB. Corría, sí: en una máquina con
Alpine debajo, que es exactamente lo que la distro no es. El artefacto estaba
sano y la prueba era ciega — que es peor, porque una prueba ciega dice que sí.
Los dos ficheros ni se parecen, así que la duda se resuelve mirando:
corpus 20.850.968 bytes
lab 2.804.104 bytes
Con `gcc-libs` en las raíces, dentro de la jaula se ve el de 20 MB, y
`scripts/test-atuq-ruteo.py` vuelve a pasar entero — o sea que el ruteo por
contenedor está probado ahora contra la libstdc++ del corpus y no contra la del
lab. Queda una dependencia del lab que NO es de esta prueba y está por diseño: el
intérprete `/lib/ld-musl-x86_64.so.1`, que ningún artefacto provee y que las
imágenes copian del devfs (`scripts/mirada-usb.sh`).
De paso, un puntero muerto: las recetas dicen «lo vigila scripts/audit-needed.sh»
y ese script lo BORRÓ 02facebe al reemplazarlo por el vigía de sonames. Corregido
en atuq.toml. Quedan otras siete recetas apuntándole (firefox, waterfox,
gcc-libs, mesa-llvmpipe, librsvg, spidermonkey, firefox-instrumentado) y no se
tocan desde acá porque son de otro frente.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UgNtJEFetMYbXax5dVUjZZ
Delta semántico
Ninguna definición cambió: el cambio es de texto, documentación o datos.
2 archivos · +19 −2
- recipes/atuq.toml +9 −1
- scripts/atuq-nested.sh +10 −1
diff --git a/recipes/atuq.toml b/recipes/atuq.toml
index 2c3aa36e..08d1d721 100644
--- a/recipes/atuq.toml
+++ b/recipes/atuq.toml
@@ -149,7 +149,15 @@ grep -q '^Name=atuq' "$DST/application.ini" || { echo "atuq: application.ini no
# `atuq` bajo un sway headless, no leyendo el grafo.
# `runtime` NO entra en el ArtifactHash (igual que `license`), así que declararlo NO re-hashea:
# lo que cambia es la CLAUSURA, que es lo que se hidrata en la imagen. Lo vigila
-# `scripts/audit-needed.sh`.
+# `scripts/vigia-sonames.py`, que entró en el latido en `02facebe` — y NO `scripts/audit-needed.sh`,
+# que ese mismo commit BORRÓ. Quedan otras siete recetas apuntando al script muerto; no se tocan
+# desde acá porque son de otro frente.
+#
+# ⚠ Y hubo un segundo agujero, en el INSTRUMENTO y no en el artefacto (2026-09-07): la clausura
+# declaraba bien `gcc-libs`, pero `scripts/atuq-nested.sh` no lo hidrataba, y como la jaula monta
+# `.dev-fs/alpine` como capa de abajo, cada «atuq corre» de estos días resolvió `libstdc++.so.6`
+# contra el LAB. Corregido allá. Los dos ficheros ni se parecen —20.850.968 bytes el del corpus,
+# 2.804.104 el del lab—, así que ante la duda de cuál se cargó, se mira el tamaño.
runtime = ["gcc-libs"]
# `firefox` como dep de BUILD y no de runtime: su árbol se materializa en el sandbox, se copia
# dentro del artefacto de atuq y a partir de ahí atuq no lo necesita más. El precio es que el
diff --git a/scripts/atuq-nested.sh b/scripts/atuq-nested.sh
index af4deb8f..89e8dc5a 100755
--- a/scripts/atuq-nested.sh
+++ b/scripts/atuq-nested.sh
@@ -35,11 +35,20 @@ URL="${URL:-about:support}"
# de build— y meterlas engordaría el rootfs sin cambiar nada de lo que se ve.
# Las variantes `-shared` y NO las estáticas: en runtime una `.a` no sirve para nada, y son las que
# gtk3 declara NEEDED desde que se arregló el cuadro de las dos Pango.
-RAICES="atuq gtk3 atk gdk-pixbuf-shared pango-shared cairo-shared libepoxy glib-shared pcre2-shared
+RAICES="atuq gcc-libs gtk3 atk gdk-pixbuf-shared pango-shared cairo-shared libepoxy glib-shared pcre2-shared
libffi-shared zlib-shared harfbuzz-shared fribidi freetype-shared fontconfig-shared pixman libpng-shared
libjpeg-turbo-shared wayland libxkbcommon mesa libdrm dbus pipewire pulseaudio alsa-lib
libxml2-shared dejavu-fonts
xkeyboard-config grim"
+# ⚠ `gcc-libs` FALTABA, y su ausencia hacía MENTIR a esta prueba entera (2026-09-07). `atuq` declara
+# `NEEDED libstdc++.so.6` y `libgcc_s.so.1` —lo hereda de firefox, que va con clang++ y la libstdc++
+# COMPARTIDA de Alpine—, y esas dos sólo existían en el lab. Como la jaula monta `.dev-fs/alpine`
+# como capa de abajo, el navegador arrancaba resolviéndolas contra el LAB y todos decíamos «atuq
+# corre». Corría, sí: en una máquina con Alpine debajo, que es exactamente lo que la distro no es.
+# La clausura ya estaba bien —`recipes/atuq.toml` declara `runtime = ["gcc-libs"]` y el vigía de
+# sonames da CERO—, lo que estaba mal era ESTA lista, o sea el instrumento y no el artefacto.
+# Se nota a simple vista porque los dos ficheros no se parecen: el del corpus pesa 20.850.968 bytes
+# y el del lab 2.804.104. Si algún día hay duda de cuál se cargó, se mira el tamaño.
# `grim` no lo necesita atuq: lo necesita QUIEN LO MIRA. Con `CAPTURA=<fichero.png>` este script
# saca la pantalla real desde dentro de la jaula, contra el mismo socket wayland. Es lo que separó
# «el proceso vive» de «la ventana muestra lo que queremos»: durante horas dije «mirá tu pantalla»