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