libffi-shared en base: python3 volvía a ser INERTE en servidor, cli y base — y el vigía no miraba ahí

`vigia-sonames.py` corría por defecto SÓLO sobre los cinco perfiles de escritorio
(`p.startswith("escritorio")`). O sea que `base`, `cli` y `servidor` —el objetivo de la mudanza—
**nunca se miraron**. Apuntándolo a ellos a mano:

    == servidor  147 nodos · 183 sonames provistos · 1 sin proveedor
       FALTA libffi.so.8   ← lo piden: python3

`python3` no arrancaba en las tres imágenes, por el mecanismo EXACTO que `musl-shared` y
`zlib-shared` arreglaron dos días antes: la receta canónica de libffi es `--disable-shared`, ningún
artefacto del cierre publica ese soname, y dentro del lab el agujero lo tapa el rootfs de Alpine —
así que el build pasa y la imagen sale rota. `libffi-shared` ya existía en el corpus y ya estaba
declarada en otros dos perfiles; sólo faltaba en `base`.

    servidor 148 nodos · 186 sonames · **0 sin proveedor**    (base y cli, igual)

## Y el vigía pasa a mirar TODOS los perfiles

⚠ **Es la tercera vez en dos días que un guardián de este repo mide menos de lo que su resumen
afirma**: `static-audit.sh` sólo globeaba `recipes/` y no las 5 colas (3 mentiras ocultas); el bloque
de raíces sucias sólo corría al hidratar un perfil y no veía las 649 recetas fuera de toda imagen
(qdrant con 69 M de basura); y éste dejaba fuera medio sistema. **Un «0 huecos» sobre la mitad del
sistema se imprime igual que uno sobre todo él.**

⇒ Al leer un guardián, leer su SCOPE antes que su veredicto: el glob, el bucle, de dónde saca la
lista. Los ocho perfiles dan 0 sin proveedor, así que ampliar el alcance no mete ruido — sólo deja de
esconder.
This commit is contained in:
Sergio
2026-09-13 20:13:16 +00:00
parent 01649076da
commit 5e5369f775
3 changed files with 36 additions and 11 deletions
+13 -10
View File
@@ -28,14 +28,14 @@
},
"by_profile": {
"base": {
"raices": 31,
"clausura": 65,
"sealed": 65
"raices": 32,
"clausura": 66,
"sealed": 66
},
"cli": {
"raices": 83,
"clausura": 131,
"sealed": 131
"raices": 84,
"clausura": 132,
"sealed": 132
},
"escritorio-mirada": {
"raices": 17,
@@ -43,9 +43,9 @@
"sealed": 41
},
"servidor": {
"raices": 95,
"clausura": 147,
"sealed": 147
"raices": 96,
"clausura": 148,
"sealed": 148
}
},
"sin_perfil": 620,
@@ -9894,11 +9894,14 @@
"blocked_by": [],
"unblocks": 0,
"perfiles": [
"base",
"cli",
"escritorio-cosmic",
"escritorio-gnome",
"escritorio-kde",
"escritorio-mirada",
"escritorio-sway"
"escritorio-sway",
"servidor"
],
"dependientes_total": 10
},
+14
View File
@@ -46,6 +46,20 @@ paquetes = [
# `--disable-shared` y ningún artefacto publicaba ese soname — otra vez el rootfs del lab tapando
# el agujero. La variante ya existía en el corpus; sólo faltaba declararla.
"zlib-shared",
# `libffi-shared` (2026-09-13): el TERCER hueco de la misma familia, y lo encontró ampliar el
# alcance de un vigía, no una imagen rota. `vigia-sonames.py` corría por defecto SÓLO sobre los
# cinco perfiles de escritorio (`p.startswith("escritorio")`), así que `base`, `cli` y `servidor`
# —el objetivo de la mudanza— nunca se miraron. Apuntándolo a ellos:
#
# == servidor 147 nodos · 183 sonames provistos · 1 sin proveedor
# FALTA libffi.so.8 ← lo piden: python3
#
# O sea que `python3` volvía a ser INERTE en las tres imágenes, por el mismo mecanismo exacto que
# `musl-shared` y `zlib-shared` arreglaron dos días antes: la receta canónica de libffi es
# `--disable-shared`, ningún artefacto del cierre publica ese soname, y en el lab el agujero lo
# tapa el rootfs de Alpine. La variante `libffi-shared` YA existía y ya estaba declarada en
# `escritorio-mirada` y en otro perfil — sólo faltaba acá.
"libffi-shared",
# `zstd-cli` (2026-09-11): la distro comprime TODO con zstd —la imagen del lab
# (`lab-image.tar.zst`), el respaldo al Storage Box, el `dd` remoto de una instalación— y la imagen
# no traía con qué descomprimirlo: **un takana recién instalado no puede desempacar su propio
+9 -1
View File
@@ -133,7 +133,15 @@ def main():
colas = yupana.cargar_colas()
perfiles = targets_mod.load()
memb = yupana.membresia(colas, perfiles)
quiero = args or [p for p in perfiles if p.startswith("escritorio")]
# ⚠ **POR DEFECTO, TODOS LOS PERFILES.** Antes era `p.startswith("escritorio")`, y ese filtro
# dejaba fuera a `base`, `cli` y `servidor` — o sea al objetivo de la mudanza. El coste se midió
# el 2026-09-13 apuntándolo a mano: los tres tenían `FALTA libffi.so.8 ← lo piden: python3`, con
# `python3` INERTE en las tres imágenes por el mismo mecanismo que `musl-shared` y `zlib-shared`
# habían arreglado dos días antes. El vigía existía, el hueco estaba, y nadie lo miraba.
# Es la tercera vez en dos días que un guardián de este repo mide menos de lo que su resumen
# afirma (antes: `static-audit.sh` sin las colas, y el bloque de raíces sucias sólo sobre
# perfiles). Un «0 huecos» sobre la mitad del sistema se imprime igual que uno sobre todo él.
quiero = args or sorted(perfiles)
huecos = 0
for perfil in quiero:
nodos = {n for n, ps in memb.items() if perfil in ps and n[0] != "wanted"}