From df1230d2a51fe564b6546fdfd640e0a189da5e20 Mon Sep 17 00:00:00 2001 From: Sergio Date: Sun, 13 Sep 2026 20:02:32 +0000 Subject: [PATCH] =?UTF-8?q?vig=C3=ADa=20de=20subcomandos:=20separar=20el?= =?UTF-8?q?=20hueco=20CONOCIDO=20del=20NUEVO=20=E2=80=94=20=C2=AB44=20iner?= =?UTF-8?q?tes=C2=BB=20todos=20los=20d=C3=ADas=20no=20se=20lee?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit El vigía escribe `docs/state/subcomandos.txt` en cada ciclo del latido desde ayer, y decía `TOTAL: 44 herramientas selladas que no se pueden invocar` a secas. Un número grande, constante y sin explicación al lado entrena a saltearse el informe — y entonces el hueco NUEVO, que es el único que pide acción, pasa desapercibido entre el ruido del viejo. Es la misma trampa que ya tienen resuelta `static-audit.sh` (deuda decidida) y `--auditar-raices`. Los 44 son todos del mismo hueco, y ahora el informe dice cuál y por qué: • falta el binario `cargo` (el toolchain de Rust) PENDIENTE DE DECISIÓN, no olvido. `cargo`/`rustc` viven hoy en el LAB y en la cadena de selfhost (mrustc→1.91.1), no como receta del catálogo. Empaquetarlos es una decisión de TOOLCHAIN —qué Rust publica la distro, y desde qué cadena— no trabajo de granja. TOTAL: 44 … (44 de hueco CONOCIDO, 0 NUEVAS) ⇒ exit 0 ⚠ **«PENDIENTE DE DECISIÓN» y no «deuda decidida»**, que es distinto: en el audit estático las tres mentiras tienen un arreglo evaluado y descartado por su coste; acá nadie decidió nada todavía. La etiqueta tiene que decir cuál de las dos cosas es, o dentro de tres meses se lee como cerrada. El código de salida ahora refleja sólo los huecos NUEVOS. Probado con los dos controles: sacando `cargo` de la tabla salen `44 NUEVAS` y exit 1; restaurándola, `0 NUEVAS` y exit 0. ⚠ Y el primer intento de ese control estaba MAL y daba verde: escribí `CONOCIDOS = {} or {…}` para vaciar la tabla, y en Python `{}` es falsy ⇒ la expresión devuelve el segundo dict y la tabla seguía llena. El control «pasaba» sin probar nada. Rehecho renombrando la clave. --- scripts/vigia-subcomandos.py | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/scripts/vigia-subcomandos.py b/scripts/vigia-subcomandos.py index 6e52d868..d359a307 100755 --- a/scripts/vigia-subcomandos.py +++ b/scripts/vigia-subcomandos.py @@ -42,6 +42,7 @@ # Sale: 0 si no hay inertes · 1 si los hay · 2 si la autoprueba falla import glob import os +import textwrap import re import sys @@ -58,6 +59,18 @@ DRIVERS = { } +# Huecos ya CONOCIDOS y con su motivo, para que el fichero diario no diga «44 inertes» a secas todos +# los días. Un número grande y constante, sin explicación al lado, entrena a saltearse el informe — +# y entonces el hueco NUEVO, que es el que importa, pasa desapercibido entre el ruido del viejo. +# Se imprimen como `•` y NO cuentan para el código de salida. +CONOCIDOS = { + "cargo": "PENDIENTE DE DECISIÓN, no olvido. `cargo`/`rustc` viven hoy en el LAB y en la cadena " + "de selfhost (mrustc→1.91.1), no como receta del catálogo. Empaquetarlos es una " + "decisión de TOOLCHAIN —qué Rust publica la distro, y desde qué cadena— no trabajo de " + "granja. Hasta que se tome, estos 44 son catálogo sin consumidor.", +} + + def artefactos(): """Todos los directorios de artefacto del store, por nombre de receta. @@ -142,16 +155,24 @@ def main(): if not hallazgos: print(" ✓ 0 herramientas inertes: todos los drivers de la tabla están en el catálogo") sys.exit(0) - total = 0 + total = nuevos = 0 for prefijo, binario, quien, subs in hallazgos: total += len(subs) - print(f"\n ✗ falta el binario `{binario}` ({quien})") + conocido = CONOCIDOS.get(binario) + marca = "•" if conocido else "✗" + print(f"\n {marca} falta el binario `{binario}` ({quien})") print(f" ⇒ {len(subs)} recetas selladas quedan INERTES:") for i in range(0, len(subs), 6): print(" " + " ".join(subs[i:i + 6])) - print(f"\n TOTAL: {total} herramientas selladas que no se pueden invocar.") + if conocido: + for linea in textwrap.wrap(conocido, 92): + print(f" {linea}") + else: + nuevos += len(subs) + print(f"\n TOTAL: {total} herramientas selladas que no se pueden invocar " + f"({total - nuevos} de hueco CONOCIDO, {nuevos} NUEVAS).") print(" No es deuda de BUILD (construyen y reproducen): es deuda de CATÁLOGO.") - sys.exit(1) + sys.exit(1 if nuevos else 0) if __name__ == "__main__":