From 040d174bbe1f4c91e918280d182d2397783b6725 Mon Sep 17 00:00:00 2001 From: sergio Date: Sat, 8 Aug 2026 10:49:50 -0400 Subject: [PATCH] =?UTF-8?q?desplegar-strip:=20ordenar=20por=20IMPACTO=20EN?= =?UTF-8?q?=20EL=20GRAFO,=20no=20alfab=C3=A9ticamente?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Medido sobre el corpus: **686 de 779 recetas son HOJAS** (cero dependientes transitivos) ⇒ el 88% se puede desplegar sin provocar UNA SOLA reconstrucción extra. Las caras son pocas y conocidas: make 416 · pkgconf 360 · go 359 · binutils 343 · zlib 315 · python3 287 · samurai 272 · meson 257. El orden alfabético anterior era activamente malo: la primera tanda de la etapa 4 tocó expat, zstd y ncurses —tres bibliotecas base— y dejó 54 recetas sin artefacto vigente, incluida la cadena wlroots/sway sellada la noche anterior. Sin este orden, cada tanda pequeña provoca una cascada grande y la campaña avanza hacia atrás. Hojas primero; las ~93 con dependientes, en una ola coordinada y con la granja arriba. Co-Authored-By: Claude Opus 5 (1M context) --- scripts/desplegar-strip.sh | 39 +++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/scripts/desplegar-strip.sh b/scripts/desplegar-strip.sh index 5ca780eb..63e40a48 100755 --- a/scripts/desplegar-strip.sh +++ b/scripts/desplegar-strip.sh @@ -35,8 +35,45 @@ done EXCLUIDAS="binutils make" +# ── ORDEN POR IMPACTO EN EL GRAFO, NO ALFABÉTICO ─────────────────────────────────────────────── +# Activar `strip_debug` re-hashea la receta Y, en cascada, todo lo que dependa de ella. La primera +# tanda de la etapa 4 lo aprendió caro: tocar `expat`, `zstd` y `ncurses` —tres bibliotecas BASE— +# dejó 54 recetas sin artefacto vigente, incluida la cadena wlroots/sway sellada la noche anterior. +# +# Medido sobre el corpus: **686 de 779 recetas son HOJAS** (cero dependientes transitivos) ⇒ el 88% +# se puede desplegar sin provocar UNA SOLA reconstrucción extra. Las caras son pocas y conocidas: +# make 416 · pkgconf 360 · go 359 · binutils 343 · zlib 315 · python3 287 · samurai 272 · meson 257 +# ⇒ Hojas primero; las que tienen dependientes, en una ola coordinada y con la granja arriba. +# Sin este orden, cada tanda pequeña provoca una cascada grande y la campaña avanza hacia atrás. +CANDIDATAS_ORDENADAS=$(python3 - <<'PYEOF' +import glob, re, collections, sys +sys.setrecursionlimit(10000) +deps, name_of = {}, {} +for p in glob.glob('recipes/*.toml') + glob.glob('recipes/incoming-*/*.toml'): + s = open(p, encoding='utf-8', errors='replace').read() + m = re.search(r'^name\s*=\s*"([^"]+)"', s, re.M) + n = m.group(1) if m else p.split('/')[-1][:-5] + name_of[p] = n + d = set() + mb = re.search(r'^\[deps\](.*?)(?=^\[|\Z)', s, re.M | re.S) + if mb: d.update(re.findall(r'"([a-z0-9._+-]+)"', mb.group(1))) + deps.setdefault(n, set()).update(d) +rev = collections.defaultdict(set) +for n, ds in deps.items(): + for d in ds: rev[d].add(n) +def trans(n, visto=None): + if visto is None: visto = set() + for x in rev.get(n, ()): + if x not in visto: visto.add(x); trans(x, visto) + return visto +filas = [(len(trans(n)), p) for p, n in name_of.items() if p.startswith('recipes/') and '/incoming-' not in p] +filas.sort() +print('\n'.join(p for _, p in filas)) +PYEOF +) + candidatas="" -for f in recipes/*.toml; do +for f in $CANDIDATAS_ORDENADAS; do [ -f "$f" ] || continue n=$(basename "$f" .toml) case " $EXCLUIDAS " in *" $n "*) continue ;; esac