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 604Rust 56Shell 36Markdown 281227 Definitions

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.

5e5369f7758c8cba42ec150f8b7d07ca1748d830 · by Sergio · (1 month ago) · parent 01649076d · browse the tree at this commit

Semantic delta · 1

scripts/vigia-sonames.py

  • body changed fn main

3 files · +36 −11

diff --git a/docs/state/build-state.json b/docs/state/build-state.json
index 413fa664..72afe71d 100644
--- a/docs/state/build-state.json
+++ b/docs/state/build-state.json
@@ -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
   },
diff --git a/docs/state/targets.toml b/docs/state/targets.toml
index f351a2d0..af33cc81 100644
--- a/docs/state/targets.toml
+++ b/docs/state/targets.toml
@@ -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
diff --git a/scripts/vigia-sonames.py b/scripts/vigia-sonames.py
index 35db14ba..9145ccbf 100755
--- a/scripts/vigia-sonames.py
+++ b/scripts/vigia-sonames.py
@@ -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"}