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 1572Shell 203Rust 109Markdown 993728 Definiciones

🐛 la granja molía UNA receta por cola y por ciclo — el `xargs -I{}` recibía la cola entera junta

Medido hoy al encolar `lld21` junto a `rust`: el ciclo decía «2 recetas en recipes/incoming» y
construía UNA. La causa estå en el filtro de «ya sellado en el hub»: acumula en `filtrada` uniendo
con ESPACIOS, y mĂĄs abajo la cola se le pasa a `xargs -I{}`, que trata **una lĂ­nea = un elemento**.
Unidas por espacios, N recetas llegan como UN SOLO argumento:

    printf '%s\n' " a.toml b.toml c.toml" | xargs -I{} sh -c 'echo [$1]' _ {}
      recibe: [a.toml b.toml c.toml]          ← uno solo

⇒ la fase paralela fallaba SIEMPRE con «No such file», y la fase 1b —el reintento serial— salvaba
exactamente UNA receta: la Ășltima, porque `basename` de esa ristra da el Ășltimo nombre. El log
parecía normal, con su ✗ seguido de un ✓ (reintento serial), y ese patrón está en TODAS las colas
(yambar, spidermonkey, rust
). O sea que el reintento serial, que existe para conciliar colisiones
de concurrencia, venĂ­a tapando el bug desde que se escribiĂł el filtro.

El arreglo son dos lĂ­neas: acumular con salto de lĂ­nea y descartar la lĂ­nea vacĂ­a con la que arranca
el acumulador (una línea vacía también es un elemento para `xargs -I{}`). Probado en chiquito, en
los dos sentidos: antes 1 elemento, después 3.

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

9f325a3c05d1b7d0e08dced0cb9faf6f58f4ebea · por Sergio · (hace 1 mes) · padre 3f3bb2ed1 · ver el årbol en este commit

Delta semĂĄntico

Ninguna definiciĂłn cambiĂł: el cambio es de texto, documentaciĂłn o datos.

1 archivos · +14 −2

diff --git a/scripts/build-farm.sh b/scripts/build-farm.sh
index d60712d0..3e7ad811 100755
--- a/scripts/build-farm.sh
+++ b/scripts/build-farm.sh
@@ -68,14 +68,26 @@ if [ -s "$SELLADOS" ]; then
     [ -n "$n" ] || n=$(basename "$f" .toml)
     H=$("$HAMMER" --store "$STORE" hash "$f" 2>/dev/null | tail -1 | sed 's/^b3://')
     if [ -n "$H" ] && grep -qx "$H-$n" "$SELLADOS"; then saltadas=$((saltadas+1)); continue; fi
-    filtrada="$filtrada $f"
+    # ⚠ SALTO DE LÍNEA Y NO ESPACIO, y esto era un BUG que costó throughput en silencio
+    # (medido 2026-09-16): mĂĄs abajo la cola se le pasa a `xargs -I{}`, que trata **una lĂ­nea = un
+    # elemento**. Unidas por espacios, N recetas llegaban como UN SOLO argumento: la fase paralela
+    # fallaba siempre con «No such file» y la fase 1b —el reintento serial— salvaba EXACTAMENTE UNA,
+    # la Ășltima, porque `basename` de esa ristra da el Ășltimo nombre. O sea que la granja molĂ­a
+    # **una receta por cola y por ciclo** en vez de la cola entera, y el log parecía normal: un ✗
+    # seguido de un ✓ (reintento serial). Se vio al encolar `lld21` junto a `rust` y descubrir que
+    # el ciclo decía «2 recetas» y construía una.
+    filtrada="$filtrada
+$f"
   done
   [ "$cerradas" -gt 0 ] && echo "  ($cerradas CERRADAS por decisión — ver la cabecera de cada receta)"
   [ "$saltadas" -gt 0 ] && echo "  (saltadas $saltadas ya selladas en el hub — ver la nota del sync unidireccional)"
   queue="$filtrada"
   [ -n "$(echo $queue)" ] || { echo "nada que hacer en $QUEUE: todo sellado en el hub"; exit 0; }
 fi
-n_total=$(printf '%s\n' "$queue" | wc -l | tr -d ' ')
+# `grep -v` porque el acumulador del filtro arranca con una lĂ­nea vacĂ­a, y una lĂ­nea vacĂ­a es un
+# elemento mĂĄs para `xargs -I{}`: construirĂ­a la receta "" y ensuciarĂ­a el conteo.
+queue=$(printf '%s\n' "$queue" | grep -v '^[[:space:]]*$' || true)
+n_total=$(printf '%s\n' "$queue" | grep -c . || true)
 echo "==> GRANJA: $n_total recetas en $QUEUE, $JOBS workers en paralelo"
 
 # ── Fase 1: BUILD en paralelo. Cada worker construye una receta y deja su status (.ok con hash | .fail