tawasuyu

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 1569Shell 203Rust 109Markdown 993728 Definitions

latido: los dos vigías nuevos entran al cron — un guardián que hay que acordarse de invocar no existe

`vigia-subcomandos.py` y `hydrate-profile.py --auditar-raices` nacieron ayer encontrando cosas
reales: 46 binarios sellados que no se pueden invocar por falta de driver, y 4 comandos de `bzip2`
apuntando a `/out/usr/bin/…`. **Las dos las encontré a mano, y eso no se repite solo.**

El argumento ya estaba escrito tres líneas más abajo en este mismo fichero, al lado de
`vigia-sonames`, y costó caro: nadie lo corría, así que `libstdc++.so.6` —que rompía el navegador en
los CUATRO perfiles— estuvo en su salida meses sin que nadie la leyera.

Van FUERA de la puerta diaria porque son baratos: **4 s y 22 s** medidos. Dentro del `if` del sello
correrían una vez al día sin motivo.

⚠ **Y la primera versión de este commit los metió DENTRO de la puerta**, justo lo contrario de lo que
decía su propio comentario — el ciclo de prueba no imprimió ni una línea de ellos y así se vio. Por
eso se corre el ciclo de verdad antes de dar por bueno un cablazo al cron: un bloque mal colocado en
un script desatendido no avisa, simplemente no pasa nada.

Dejan fichero en `docs/state/` con la FECHA DE MEDICIÓN por delante, por la misma razón que el
static-audit: con el frente en verde el texto es constante, `git diff --cached --quiet` no vería
cambio, y dentro de tres meses el fichero sería indistinguible de uno rancio. Con la fecha, cada
ciclo deja huella en el `git log` — se ve que el vigía sigue VIVO, no sólo que el último veredicto
fue bueno.

Verificado corriendo el ciclo completo:

    subcomandos.txt ✓    TOTAL: 44 herramientas selladas que no se pueden invocar.
    raices.txt ✓    ✓ 0 ofensores NUEVOS sobre 1 artefactos.
    ==> estado commiteado+pusheado

fb3a326dfdced537787b01921e9257409ca247e0 · by Sergio · (1 month ago) · parent 6f482edd6 · browse the tree at this commit

Semantic delta

No definition changed: this change is text, documentation or data.

1 files · +27 −2

diff --git a/scripts/farm/cosecha-cron.sh b/scripts/farm/cosecha-cron.sh
index d776c095..db47e201 100755
--- a/scripts/farm/cosecha-cron.sh
+++ b/scripts/farm/cosecha-cron.sh
@@ -335,6 +335,31 @@ if [ -x "$HAMMER" ]; then
   #
   # NO toma `work/.farm-build.lock` a propósito: sólo LEE el store, y retener el lock 8 min pararía
   # la granja entera. `nice -n 19` porque la prioridad la tiene construir, no auditar.
+  # ── LOS DOS VIGÍAS NUEVOS (2026-09-12) ───────────────────────────────────────────────────────
+  # Van FUERA de la puerta diaria porque son baratos —medidos: 4 s y 22 s— y dentro del `if` del
+  # sello sólo correrían una vez al día sin motivo.
+  #
+  # El argumento para cablearlos es el mismo que dejó escrito `vigia-sonames` tres líneas más
+  # abajo, y que costó `libstdc++.so.6` roto en los cuatro perfiles: **un vigía que hay que
+  # acordarse de invocar no se distingue de no tenerlo**. Los dos nacieron hoy encontrando cosas
+  # reales —46 binarios inertes por falta de driver; 4 comandos de bzip2 apuntando a `/out`— y las
+  # dos las encontré a mano. Eso no se repite solo.
+  #
+  # Dejan fichero en `docs/state/` con la FECHA DE MEDICIÓN por delante, por la misma razón que el
+  # static-audit: con el frente en verde el texto es constante, `git diff --cached --quiet` no vería
+  # cambio, y dentro de tres meses el fichero sería indistinguible de uno rancio. Con la fecha, cada
+  # ciclo deja huella en el `git log` ⇒ se ve que el vigía sigue VIVO, no sólo que el último
+  # veredicto fue bueno.
+  { echo "subcomandos sin driver · medido $(date -u +%FT%TZ)"
+    python3 scripts/vigia-subcomandos.py 2>&1; } > work/.subcomandos.tmp
+  mv work/.subcomandos.tmp docs/state/subcomandos.txt
+  echo "   subcomandos.txt ✓ $(grep -m1 'TOTAL:' docs/state/subcomandos.txt || echo '0 inertes')"
+
+  { echo "raíces sucias y symlinks al lab · medido $(date -u +%FT%TZ)"
+    python3 scripts/hydrate-profile.py --auditar-raices 2>&1; } > work/.raices.tmp
+  mv work/.raices.tmp docs/state/raices.txt
+  echo "   raices.txt ✓ $(grep -m1 'ofensor' docs/state/raices.txt || echo '(sin resumen)')"
+
   AUDIT_SELLO="work/.static-audit.sello"
   if [ ! -f "$AUDIT_SELLO" ] || [ -n "$(find "$AUDIT_SELLO" -mtime +0 2>/dev/null)" ]; then
   # ── VIGÍA DE SONAMES (2026-09-06) ────────────────────────────────────────────────────────────
@@ -382,13 +407,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/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/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/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/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