tawasuyu

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…

TOML 1534Shell 199Rust 109Markdown 993713 Definitions

etapa 4: primera tanda desplegada y verificada (3/3) + el desplegador por tandas

zstd 12M→2M (−83%) · ncurses 6M→2M (−67%) · expat 2M→1M (−50%). Cero ficheros vacíos y
**las tres REPRODUCEN**. La maquinaria de la etapa 4 queda validada de punta a punta:
activar → construir en la granja → verificar con why-differs.

LA DEP DE binutils VA EXPLÍCITA, y es la decisión de diseño de esta etapa. El paso de strip usa
`strip --strip-debug -D` de binutils. Se podría hacer que el lab lo materialice solo, sin tocar
las recetas — pero entonces la VERSIÓN de binutils sería un input INVISIBLE: dos corridas con
binutils distintos darían artefactos distintos con el mismo hash. Los `deps` sí entran en
`hash_inputs`, así que declararlo es lo único que mantiene el invariante. Cuesta una edición
mecánica por receta; el invariante no se negocia por comodidad.

EXCLUSIONES, y son exactamente dos: `binutils` y `make`. binutils provee el strip y depende de
make ⇒ activarles el split los haría necesitarse a sí mismos para construirse. No es preferencia,
es la circularidad. (Las recetas CERRADAS POR DECISIÓN tampoco se tocan.)

POR TANDAS Y NO DE GOLPE: activar re-hashea la receta a propósito y en cascada todo lo que
dependa de ella. Hacerlo sobre las 775 candidatas a la vez dejaría el corpus entero sin sellar
al mismo tiempo — días de granja antes de poder verificar NADA, y el disco aguantando artefactos
viejos y nuevos a la vez. Por tandas se mide, se verifica y se poda entre medias, que es lo que
hace la campaña reversible.

La primera tanda NO se tomó del orden alfabético que propone el script: ésas son CLIs Go/Rust
que ya vimos que no reconstruyen en el worker (necesitan red para sus módulos), y validar la
maquinaria con recetas que fallan por otro motivo no habría probado nada. Se eligieron tres
paquetes C con artefacto presente. Para las tandas grandes hay que resolver antes el acceso a
red de los módulos Go/Rust, o restringirse a lo que reconstruye.

Estado: 775 candidatas, 5 desplegadas (bison y appstream del piloto + estas 3).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

b344c5803bd4a6050d6b3fdaa645c962f4603ede · by sergio · (2 months ago) · parent 0e6d84361 · browse the tree at this commit

Semantic delta

No definition changed: this change is text, documentation or data.

4 files · +91 −1

diff --git a/recipes/expat.toml b/recipes/expat.toml
index 5e896eb3..904ee8db 100644
--- a/recipes/expat.toml
+++ b/recipes/expat.toml
@@ -12,10 +12,13 @@ sha256  = "10b195ee78160a908388180a8fe3603d4e9a12f4755fbf5f3816b23a9d750da0"
 compiler = "zig-cc"
 target   = "x86_64-linux-musl"
 link     = "static"
+
+# Split de la info de depuración (SDD 23 etapa 4). Entra en `hash_inputs`: re-hashea a propósito.
+strip_debug = true
 flags    = []
 
 [deps]
-build = ["make"]
+build = ["binutils", "make"]
 
 [build.phases]
 # --with-pic: el .a estático lleva objetos PIC ⇒ enlazable dentro de .so (Mesa liga libexpat en
diff --git a/recipes/ncurses.toml b/recipes/ncurses.toml
index 4e565236..5ddb78e2 100644
--- a/recipes/ncurses.toml
+++ b/recipes/ncurses.toml
@@ -9,7 +9,13 @@ sha256  = "136d91bc269a9a5785e5f9e980bc76ab57428f604ce3e5a5a90cebc767971cc6"
 compiler = "zig-cc"
 target   = "x86_64-linux-musl"
 link     = "static"
+
+# Split de la info de depuración (SDD 23 etapa 4). Entra en `hash_inputs`: re-hashea a propósito.
+strip_debug = true
 [build.phases]
 configure = "./configure --prefix=/usr --without-shared --with-normal --enable-widec --without-debug --without-ada --without-tests --enable-pc-files --with-pkg-config-libdir=/usr/lib/pkgconfig --with-fallbacks=linux,vt100,vt220,xterm,xterm-256color,screen,tmux,tmux-256color,ansi"
 compile   = "make"
 install   = "make install.libs install.includes DESTDIR=/out"
+
+[deps]
+build = ["binutils"]
diff --git a/recipes/zstd.toml b/recipes/zstd.toml
index c7f1f388..d9af0e42 100644
--- a/recipes/zstd.toml
+++ b/recipes/zstd.toml
@@ -10,9 +10,15 @@ sha256  = "eb33e51f49a15e023950cd7825ca74a4a2b43db8354825ac24fc1b7ee09e6fa3"
 compiler = "zig-cc"
 target   = "x86_64-linux-musl"
 link     = "static"
+
+# Split de la info de depuración (SDD 23 etapa 4). Entra en `hash_inputs`: re-hashea a propósito.
+strip_debug = true
 flags    = []
 [build.phases]
 # CFLAGS con -fPIC: el libzstd.a lleva objetos PIC ⇒ enlazable dentro de .so (Mesa liga libzstd en
 # sus bibliotecas compartidas; sin PIC: «R_X86_64_PC32 ... recompile with -fPIC»). PIC es superset.
 compile = 'make -C lib libzstd.a CFLAGS="-O3 -fPIC"'
 install = 'make -C lib install PREFIX=/usr DESTDIR=/out'
+
+[deps]
+build = ["binutils"]
diff --git a/scripts/desplegar-strip.sh b/scripts/desplegar-strip.sh
new file mode 100755
index 00000000..5ca780eb
--- /dev/null
+++ b/scripts/desplegar-strip.sh
@@ -0,0 +1,75 @@
+#!/usr/bin/env bash
+# desplegar-strip.sh — activa `strip_debug = true` por TANDAS. Etapa 4 del SDD 23.
+#
+# ── QUÉ HACE Y POR QUÉ POR TANDAS ──────────────────────────────────────────────────────────────
+# Activar el split de debug re-hashea la receta A PROPÓSITO (cambia el contenido del artefacto), y
+# re-hashea en cascada todo lo que dependa de ella. Hacerlo de golpe sobre 1161 recetas dejaría el
+# corpus entero sin sellar a la vez: días de granja antes de poder verificar NADA, y el disco
+# aguantando artefactos viejos y nuevos al mismo tiempo.
+# Por tandas se puede medir, verificar y podar entre medias, que es lo que hace la campaña
+# reversible en vez de un salto a ciegas.
+#
+# ── LA DEP DE `binutils` VA EXPLÍCITA, NO INYECTADA POR EL LAB ──────────────────────────────────
+# El paso de strip usa `strip --strip-debug -D` de binutils. Se podría hacer que el lab lo
+# materialice solo, sin tocar las recetas — pero entonces la VERSIÓN de binutils sería un input
+# invisible: dos corridas con binutils distintos darían artefactos distintos con el mismo hash. Los
+# `deps` SÍ entran en `hash_inputs`, así que declararlo es lo único que mantiene el invariante.
+# Cuesta una edición mecánica por receta; el invariante no se negocia por comodidad.
+#
+# ── EXCLUSIONES, y por qué exactamente éstas ───────────────────────────────────────────────────
+# `binutils` y `make`: binutils provee el `strip`, y depende de make. Si se les activara el split se
+# necesitarían a sí mismos para construirse. No es una preferencia: es la circularidad.
+#
+# Uso:   scripts/desplegar-strip.sh --tanda N [--aplicar]
+#        (sin --aplicar sólo lista lo que haría)
+set -uo pipefail
+ROOT="$(cd "$(dirname "$0")/.." && pwd)"; cd "$ROOT"
+N="${N:-25}"; APLICAR=0
+while [ $# -gt 0 ]; do
+  case "$1" in
+    --tanda) N="$2"; shift 2 ;;
+    --aplicar) APLICAR=1; shift ;;
+    *) echo "opción desconocida: $1" >&2; exit 2 ;;
+  esac
+done
+
+EXCLUIDAS="binutils make"
+
+candidatas=""
+for f in recipes/*.toml; do
+  [ -f "$f" ] || continue
+  n=$(basename "$f" .toml)
+  case " $EXCLUIDAS " in *" $n "*) continue ;; esac
+  grep -q 'strip_debug' "$f" && continue          # ya desplegada
+  grep -q 'CERRADA POR DECISIÓN' "$f" && continue # no se toca lo cerrado
+  grep -qE '^link\s*=' "$f" || continue           # sin línea link no sé dónde insertar
+  candidatas="$candidatas $f"
+done
+
+total=$(echo $candidatas | wc -w)
+tanda=$(echo $candidatas | tr ' ' '\n' | head -"$N")
+echo "==> candidatas totales: $total · esta tanda: $(echo $tanda | wc -w)"
+[ "$APLICAR" = 1 ] || { echo "$tanda" | tr ' ' '\n' | head -10 | sed 's|^|    |'; echo "==> DRY-RUN: nada tocado. Repetí con --aplicar."; exit 0; }
+
+hechas=0
+for f in $tanda; do
+  python3 - "$f" <<'PY'
+import re, sys
+p = sys.argv[1]; s = open(p).read()
+m = re.search(r'^(link\s*=\s*"[a-z]+")\s*$', s, re.M)
+if not m: sys.exit(0)
+s = s[:m.end(1)] + '\n\n# Split de la info de depuración (SDD 23 etapa 4). Entra en `hash_inputs`: re-hashea a propósito.\nstrip_debug = true' + s[m.end(1):]
+# binutils en deps: el paso de strip del lab usa su `strip --strip-debug -D`.
+if '"binutils"' not in s:
+    if re.search(r'^build\s*=\s*\[', s, re.M):
+        s = re.sub(r'^build\s*=\s*\[', 'build = ["binutils", ', s, count=1, flags=re.M)
+    elif '[deps]' in s:
+        s = s.replace('[deps]', '[deps]\nbuild = ["binutils"]', 1)
+    else:
+        s = s.rstrip('\n') + '\n\n[deps]\nbuild = ["binutils"]\n'
+open(p, 'w').write(s)
+PY
+  hechas=$((hechas+1))
+done
+echo "==> $hechas recetas con strip_debug=true (+ dep binutils)"
+echo "==> siguiente: construir la tanda en la granja y verificar con scripts/verificar-repro.sh"