gioser

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…

vigía de subcomandos: separar el hueco CONOCIDO del NUEVO — «44 inertes» todos los días no se lee

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.

df1230d2a51fe564b6546fdfd640e0a189da5e20 · por Sergio · (hace 1 mes) · padre 713128f26 · ver el árbol en este commit

Delta semántico · 1

scripts/vigia-subcomandos.py

  • cambió por dentro fn main

1 archivos · +25 −4

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__":