From afd867ea515962a48cf7071e23aabb60b5dc1f98 Mon Sep 17 00:00:00 2001 From: sergio Date: Fri, 24 Jul 2026 14:23:12 -0400 Subject: [PATCH] =?UTF-8?q?yupana:=20drenar=20reckona=20honesto=20un=20per?= =?UTF-8?q?fil=20sin=20cierre=20(guardi=C3=A1n=20GNOME)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- scripts/drenar.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) 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