feat(granja): el censo de applets al latido — existía, traía su guardián, y nadie lo corría
`busybox-censo-proveedores.py` mide contra los artefactos del store quién provee DE VERDAD cada
applet de busybox, y trae un `--guardian` que sale ≠0 si alguno pierde el proveedor que el TSV
registra. Estaba escrito para esto desde que se escribió y **nunca se cableó**: la medición sólo
existía cuando alguien la lanzaba a mano.
Al correrlo hoy, con cero deuda en los cinco grafos (1158/1158 sellados): de los 401 applets, **215
ya tienen dueño real, 0 están mal atribuidos y 47 los provee SÓLO busybox**.
Y el titular de esos 47 no es «faltan recetas». Faltan DOS —`getty`/`cttyhack` y el `nslookup`— más
un `killall5` que es BORRAR. Lo que hay es algo peor:
arje-zero (PID 1) sellado · perfiles=[] ⇒ el init sale del PISO
brush (sh, ash, hush) sellado · perfiles=[] ⇒ /bin/sh sale de busybox
busybox sellado · perfiles=[] ⇒ y aun así viaja, por el piso
chrony (rdate) sellado · perfiles=[]
**Las dos piezas más básicas del sistema están construidas, sellada cada una, y declaradas por
ningún perfil.** Es `docs/state/piso.json` por el otro lado: allá se vio que el piso tapa 418
caminos de la clausura; acá se ve que la clausura no contiene ni el init ni el shell. Los otros 43
son equivalencias de NOMBRE que el TSV atribuye mal (`ifconfig`/`netstat`/`route`/`arp` son de
net-tools, no de iproute2; `adduser`/`addgroup`/`mkpasswd` son busybox-ismos que shadow no trae).
Una línea por ciclo —`applets ✓ SÓLO lo provee busybox : 47 ← el trabajo que queda`— porque ese
número tiene que BAJAR y para eso hay que verlo todos los días. El detalle sale sólo cuando el
guardián se queja. Probado en los dos caminos: verde con el store real, y rojo apuntándolo a un
store vacío (`✗ REGRESIÓN: 215 applets PERDIERON su proveedor`).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Semántico sayk'uy
Mana ima sutichaypas t'ikrakurqanchu: qillqalla, yachachiylla utaq willaylla t'ikrakurqan.
1 qillqakuna · +24 −0
- scripts/farm/cosecha-cron.sh +24 −0
diff --git a/scripts/farm/cosecha-cron.sh b/scripts/farm/cosecha-cron.sh
index 01eb97fb..48f04525 100755
--- a/scripts/farm/cosecha-cron.sh
+++ b/scripts/farm/cosecha-cron.sh
@@ -461,6 +461,30 @@ if [ -x "$HAMMER" ]; then
mv work/.subcomandos.tmp docs/state/subcomandos.txt
echo " subcomandos.txt ✓ $(grep -m1 'TOTAL:' docs/state/subcomandos.txt || echo '0 inertes')"
+ # ── EL CENSO DE APPLETS, QUE EXISTÍA Y NADIE CORRÍA ──────────────────────────────────────────
+ # `busybox-censo-proveedores.py` mide, contra los artefactos del store, quién provee de verdad
+ # cada applet de busybox — y trae un `--guardian` que sale ≠0 si alguno PIERDE el proveedor que
+ # el TSV registra. Estaba escrito para esto y **nunca se cableó**: la medición sólo existía
+ # cuando alguien la lanzaba a mano, o sea casi nunca.
+ #
+ # Medido el 2026-10-16 al correrlo: de los 401 applets, 215 ya tienen dueño real y **47 los
+ # provee SÓLO busybox**. Y el titular no es «faltan recetas» —faltan dos: `getty`/`cttyhack` y
+ # el `nslookup`— sino que **`arje-zero` (PID 1) y `brush` (el shell, `sh`/`ash`/`hush`) están
+ # SELLADOS y en NINGÚN perfil**, igual que `busybox` y `chrony`. O sea que la imagen toma su init
+ # del piso y su `/bin/sh` de busybox, y la clausura no contiene ninguna de las dos piezas más
+ # básicas del sistema. Es el censo del piso (`docs/state/piso.json`) por el otro lado.
+ #
+ # Una línea por ciclo, y el detalle sólo cuando el guardián se queja: lo que el número tiene que
+ # hacer es BAJAR, y para eso hay que verlo todos los días.
+ if python3 scripts/busybox-censo-proveedores.py --guardian > work/.applets.salida 2>&1; then
+ echo " applets ✓ $(grep -m1 'SÓLO lo provee busybox' work/.applets.salida \
+ | sed 's/^ *//; s/ */ /g' || echo '(sin resumen)')"
+ else
+ echo " ⚠⚠ un applet PERDIÓ el proveedor que el TSV registra — el reemplazo dejó de instalarlo:"
+ grep -E 'PERDIÓ|perdió|✗' work/.applets.salida | head -6 | sed 's/^/ /'
+ fi
+ rm -f work/.applets.salida
+
{ 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