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 188Rust 55Shell 30Markdown 281211 Definiciones

latido: el vigía de servicios entra al cron — 18 demonios se embarcan y nadie los arranca

Contesta la pregunta que ni el grafo ni `vigia-sonames` contestan: no «¿está
sellado?» ni «¿arranca el binario?» sino **«¿hay alguien que lo LEVANTE?»**. Un
demonio puede estar sellado, con contenido, con todos sus sonames resueltos, y
que ninguna imagen lo arranque nunca.

Va al latido por la lección que `vigia-sonames` ya dejó escrita doce líneas más
arriba —un vigía que hay que acordarse de invocar no se distingue de no tenerlo—
y con más motivo: su entrada son DOS ficheros que cambian por separado (las
recetas y `targets.toml`), así que la divergencia entre «declarado» y
«habilitado» aparece sola, sin que nadie toque el vigía.

Corre PRIMERO su propio `--selftest`: si el guardián está roto, su silencio no
es una respuesta.

Primera lectura, ya en el repo: 0 errores y 18 avisos. El más ruidoso es
`dbus-system`, que viaja en SEIS perfiles y sólo GNOME lo arranca.

eb85c5976ecac7d59b026ff923eb8f042d534b7e · por Sergio · (hace 1 mes) · padre 30c8d1892 · ver el árbol en este commit

Delta semántico

Ninguna definición cambió: el cambio es de texto, documentación o datos.

2 archivos · +83 −2

diff --git a/docs/state/servicios.txt b/docs/state/servicios.txt
new file mode 100644
index 00000000..9a22bdc5
--- /dev/null
+++ b/docs/state/servicios.txt
@@ -0,0 +1,59 @@
+servicios por imagen · medido 2026-09-12T11:12:49Z
+── autoprueba del vigía (el primer caso es el CONTROL, tiene que pasar)
+   ✓ CONTROL: declarado, habilitado y la receta en el perfil
+   ✓ habilitado y NADIE lo declara
+         ERROR  sshd: habilitado por el perfil y NINGUNA receta lo declara
+   ✓ dos recetas DEL PERFIL declaran el mismo label
+         ERROR  sshd: lo declaran 2 recetas DEL PERFIL (openssh, dropbear)
+         AVISO  sshd: `openssh` está en la imagen y TRAE este servicio, pero el perfil no lo arranca
+         AVISO  sshd: `dropbear` está en la imagen y TRAE este servicio, pero el perfil no lo arranca
+   ✓ lo declara una receta que NO está en el perfil
+         ERROR  sshd: lo declara(n) openssh, que NO pertenece(n) al perfil ⇒ el card apuntaría a un binario que la imagen no trae
+   ✓ mismo label en DOS COLAS, sólo una en el perfil ⇒ NO es colisión
+   ✓ servicio de SESIÓN ⇒ avisa pero no rompe
+         AVISO  pipewire: es de SESIÓN (`pipewire`) — hoy lo lanza el script de sesión, no arje: fuera de mirada nadie entrega cards de sesión (SDD 30 §4c)
+   ✓ la INVERSA: en la imagen, trae demonio, nadie lo arranca ⇒ AVISO
+         AVISO  sshd: `openssh` está en la imagen y TRAE este servicio, pero el perfil no lo arranca
+   TODAS OK
+── base
+   AVISO  dbus-system: `dbus` está en la imagen y TRAE este servicio, pero el perfil no lo arranca
+   (el perfil no arranca ningún servicio)
+── cli
+   AVISO  dbus-system: `dbus` está en la imagen y TRAE este servicio, pero el perfil no lo arranca
+   (el perfil no arranca ningún servicio)
+── escritorio-cosmic
+   AVISO  dbus-system: `dbus` está en la imagen y TRAE este servicio, pero el perfil no lo arranca
+   AVISO  logind-compat: `arje-logind-compat` está en la imagen y TRAE este servicio, pero el perfil no lo arranca
+   AVISO  pipewire: `pipewire` está en la imagen y TRAE este servicio, pero el perfil no lo arranca
+   AVISO  pipewire-pulse: `pipewire` está en la imagen y TRAE este servicio, pero el perfil no lo arranca
+   AVISO  wireplumber: `wireplumber` está en la imagen y TRAE este servicio, pero el perfil no lo arranca
+   (el perfil no arranca ningún servicio)
+── escritorio-gnome
+   AVISO  pipewire: es de SESIÓN (`pipewire`) — hoy lo lanza el script de sesión, no arje: fuera de mirada nadie entrega cards de sesión (SDD 30 §4c)
+   AVISO  pipewire-pulse: es de SESIÓN (`pipewire`) — hoy lo lanza el script de sesión, no arje: fuera de mirada nadie entrega cards de sesión (SDD 30 §4c)
+   AVISO  wireplumber: es de SESIÓN (`wireplumber`) — hoy lo lanza el script de sesión, no arje: fuera de mirada nadie entrega cards de sesión (SDD 30 §4c)
+   dbus-system              dbus                 /usr/bin/dbus-daemon
+   logind-compat            arje-logind-compat   /usr/bin/arje-logind-compat
+   polkit-compat            arje-polkit-compat   /usr/bin/arje-polkit-compat
+   accounts-daemon          accountsservice      /usr/libexec/accounts-daemon
+   upowerd                  upower               /usr/libexec/upowerd
+   colord                   colord               /usr/libexec/colord
+   pipewire                 pipewire             /usr/bin/pipewire
+   pipewire-pulse           pipewire             /usr/bin/pipewire-pulse
+   wireplumber              wireplumber          /usr/bin/wireplumber
+── escritorio-kde
+   AVISO  dbus-system: `dbus` está en la imagen y TRAE este servicio, pero el perfil no lo arranca
+   AVISO  pipewire: `pipewire` está en la imagen y TRAE este servicio, pero el perfil no lo arranca
+   AVISO  pipewire-pulse: `pipewire` está en la imagen y TRAE este servicio, pero el perfil no lo arranca
+   AVISO  upowerd: `upower` está en la imagen y TRAE este servicio, pero el perfil no lo arranca
+   (el perfil no arranca ningún servicio)
+── escritorio-mirada
+   (el perfil no arranca ningún servicio)
+── escritorio-sway
+   AVISO  dbus-system: `dbus` está en la imagen y TRAE este servicio, pero el perfil no lo arranca
+   AVISO  pipewire: `pipewire` está en la imagen y TRAE este servicio, pero el perfil no lo arranca
+   AVISO  pipewire-pulse: `pipewire` está en la imagen y TRAE este servicio, pero el perfil no lo arranca
+   (el perfil no arranca ningún servicio)
+── servidor
+   AVISO  dbus-system: `dbus` está en la imagen y TRAE este servicio, pero el perfil no lo arranca
+   sshd                     openssh              /bin/busybox
diff --git a/scripts/farm/cosecha-cron.sh b/scripts/farm/cosecha-cron.sh
index db47e201..d95ae806 100755
--- a/scripts/farm/cosecha-cron.sh
+++ b/scripts/farm/cosecha-cron.sh
@@ -376,6 +376,28 @@ if [ -x "$HAMMER" ]; then
     && echo "   sonames.txt ✓ $(grep -c 'FALTA' docs/state/sonames.txt) hueco(s) sin proveedor" \
     || echo "   ⚠ vigia-sonames.py falló"
 
+  # ── VIGÍA DE SERVICIOS (2026-09-12, SDD 30 §4a) ──────────────────────────────────────────────
+  # Contesta la pregunta que ni el grafo ni `vigia-sonames` contestan: no «¿está sellado?» ni
+  # «¿arranca el binario?» sino **«¿hay alguien que lo LEVANTE?»**. Un demonio puede estar sellado,
+  # con contenido, con todos sus sonames resueltos… y que ninguna imagen lo arranque nunca.
+  #
+  # Va al latido por la misma lección que dejó escrita `vigia-sonames` doce líneas más arriba —un
+  # vigía que hay que acordarse de invocar no se distingue de no tenerlo— y con más motivo: su
+  # entrada son DOS ficheros que cambian por separado (las recetas y `targets.toml`), así que la
+  # divergencia entre «declarado» y «habilitado» aparece sin que nadie toque el vigía.
+  #
+  # Corre PRIMERO su propio `--selftest`: si el guardián está roto, su silencio no es una respuesta.
+  { echo "servicios por imagen · medido $(ts)"
+    echo "── autoprueba del vigía (el primer caso es el CONTROL, tiene que pasar)"
+    python3 scripts/targets.py --selftest 2>&1 | sed 's/^/   /'
+    for perf in $(python3 scripts/targets.py --lista 2>/dev/null | awk '{print $1}'); do
+      echo "── $perf"
+      python3 scripts/targets.py --services "$perf" 2>&1 | sed 's/^/   /'
+    done
+  } > work/.servicios.tmp 2>&1 && mv work/.servicios.tmp docs/state/servicios.txt \
+    && echo "   servicios.txt ✓ $(grep -c '^   ERROR' docs/state/servicios.txt) error(es), $(grep -c '^   AVISO' docs/state/servicios.txt) aviso(s)" \
+    || echo "   ⚠ vigía de servicios falló"
+
     echo "   static-audit: puerta diaria abierta, barriendo el store (~8 min, nice 19)…"
     nice -n 19 scripts/static-audit.sh > work/.static-audit.salida 2>&1
     audit_rc=$?
@@ -407,13 +429,13 @@ fi
 # 4. Commitear SÓLO el estado firme (el avance que el humano sigue). Recetas nuevas que YO autoré se
 # commitean aparte, a mano, para no meter autoría a medias en un commit de cron.
 if [ "${NO_COMMIT:-}" != "1" ]; then
-  git add docs/state/subcomandos.txt docs/state/raices.txt docs/state/sonames.txt docs/state/build-state.json docs/state/build-state-kde.json docs/state/build-state-gnome.json docs/state/build-state-cosmic.json docs/state/build-state-wlr.json docs/state/drenaje.json docs/state/fuentes-vigia.json docs/state/kernel-contract.txt docs/state/static-audit.txt docs/state/keystones.json docs/state/duplicados.json 2>/dev/null || true
+  git add docs/state/subcomandos.txt docs/state/raices.txt docs/state/sonames.txt docs/state/servicios.txt docs/state/build-state.json docs/state/build-state-kde.json docs/state/build-state-gnome.json docs/state/build-state-cosmic.json docs/state/build-state-wlr.json docs/state/drenaje.json docs/state/fuentes-vigia.json docs/state/kernel-contract.txt docs/state/static-audit.txt docs/state/keystones.json docs/state/duplicados.json 2>/dev/null || true
   if ! git diff --cached --quiet 2>/dev/null; then
     # ⚠ ACOTADO POR PATHSPEC (`-- <rutas>`), no sólo por el `git add` de arriba: el índice es
     # estado COMPARTIDO y `git commit` a secas commitea el índice ENTERO, así que lo que otro
     # agente dejara en `git add` viajaría dentro del commit del cron. Es la regla 2 de CLAUDE.md,
     # y acá pesa más que en ningún lado: esto corre desatendido cada 30 min mientras se trabaja.
-    git commit -q -m "estado: cosecha granja $(ts) — avance del árbol KDE" -- docs/state/subcomandos.txt docs/state/raices.txt docs/state/sonames.txt docs/state/build-state.json docs/state/build-state-kde.json docs/state/build-state-gnome.json docs/state/build-state-cosmic.json docs/state/build-state-wlr.json docs/state/drenaje.json docs/state/fuentes-vigia.json docs/state/kernel-contract.txt docs/state/static-audit.txt docs/state/keystones.json docs/state/duplicados.json 2>/dev/null \
+    git commit -q -m "estado: cosecha granja $(ts) — avance del árbol KDE" -- docs/state/subcomandos.txt docs/state/raices.txt docs/state/sonames.txt docs/state/servicios.txt docs/state/build-state.json docs/state/build-state-kde.json docs/state/build-state-gnome.json docs/state/build-state-cosmic.json docs/state/build-state-wlr.json docs/state/drenaje.json docs/state/fuentes-vigia.json docs/state/kernel-contract.txt docs/state/static-audit.txt docs/state/keystones.json docs/state/duplicados.json 2>/dev/null \
       && { git push -q origin main 2>/dev/null && echo "==> estado commiteado+pusheado" \
            || echo "==> estado commiteado (push falló, reintenta próximo ciclo)"; }
   else