From fb3a326dfdced537787b01921e9257409ca247e0 Mon Sep 17 00:00:00 2001 From: Sergio Date: Sat, 12 Sep 2026 02:35:21 +0000 Subject: [PATCH] =?UTF-8?q?latido:=20los=20dos=20vig=C3=ADas=20nuevos=20en?= =?UTF-8?q?tran=20al=20cron=20=E2=80=94=20un=20guardi=C3=A1n=20que=20hay?= =?UTF-8?q?=20que=20acordarse=20de=20invocar=20no=20existe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `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 --- scripts/farm/cosecha-cron.sh | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) 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 (`-- `), 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