> 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…
yupana: drenar reckona honesto un perfil sin cierre (guardián GNOME)
drenar --perfil escritorio-gnome erraba 'no encontré un grafo (¿corriste
build-state.py?)' — mentira: el grafo GNOME existe, pero NINGUNA raíz del perfil
(mutter/gnome-shell/gdm) está autorada ⇒ 0 nodos etiquetados con el perfil, y la
comprobación por etiqueta en cargar() fallaba. Dos correcciones:
· cargar(): una cola NO-corpus identifica su grafo unívocamente ⇒ matchear por
cola; la etiqueta sólo desambigua dentro de corpus (perfiles solapados).
· main(): ámbito vacío con perfil ≠ 'imagen completa' — es 'SIN CIERRE todavía:
0 raíces autoradas', y apunta a autorar top-down.
KDE (162 sellados) y corpus (769/4-deuda) sin regresión. El yupana-gnome queda
armado en las 4 capas: objetivo, radio/grafo, keystones y drenar.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
diff --git a/scripts/drenar.py b/scripts/drenar.py
index 69e8c145..b4a2eb9f 100755
--- a/scripts/drenar.py
+++ b/scripts/drenar.py
@@ -54,6 +54,14 @@ def cargar(perfil):
d = json.loads(p.read_text())
if cola not in (d.get("by_queue") or {}):
continue
+ # Una cola NO-corpus identifica su grafo unívocamente (incoming-kde/gnome sólo viven en su
+ # propio grafo), así que basta con que la cola coincida. La comprobación por ETIQUETA de perfil
+ # sólo desambigua dentro de `corpus` (donde varios perfiles se solapan). Sin este atajo, un
+ # perfil cuyas RAÍCES aún no están autoradas (0 nodos etiquetados, p.ej. escritorio-gnome
+ # recién arrancado) no hallaba su grafo y drenar erraba "¿corriste build-state.py?" en vez de
+ # reckonar honestamente un perfil todavía sin cierre.
+ if cola != "corpus":
+ return d, f
if perfil is None or any(perfil in (r.get("perfiles") or []) for r in d["nodes"].values()):
return d, f
return None, None
@@ -140,6 +148,13 @@ def main():
print(f"== drenaje de {etiqueta} ({cual})")
print(f" {len(ambito)} nodos en ámbito · {len(deuda)} en deuda "
f"({len(ambito)-len(deuda)} ya sellados)")
+ if perfil is not None and not ambito:
+ # Ámbito vacío = ninguna raíz del perfil está autorada ⇒ el perfil NO tiene cierre todavía
+ # (top-down sin arrancar). Distinto de "completa": completa tendría nodos sellados en ámbito.
+ # Puede haber recetas SUELTAS en la cola (leaves) que ninguna raíz alcanza aún.
+ print(f" perfil SIN CIERRE todavía: 0 raíces autoradas — autorá desde las raíces "
+ f"declaradas en targets.toml (top-down feature-minimal), no al revés.")
+ return 0
if not deuda:
print(" nada que drenar: la imagen está completa.")
return 0