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
This commit is contained in:
Sergio
2026-09-12 02:35:21 +00:00
parent 6f482edd65
commit fb3a326dfd
+27 -2
View File
@@ -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