fix(granja): el diagnóstico mostraba el PRINCIPIO del log, no el fallo
La línea que existe para nombrar la causa de un fallo no reintentado imprimía `head -c 120` del log, y con eso salía así el 2026-10-11: ``` · obs-studio no reintentado (firma no reconocida: … INFO takana_build: caché: artefacto ya…) ``` una línea de cache-hit del arranque, mientras el fallo verdadero —`ProcessFdQuotaExceeded` al enlazar libavcodec— estaba al FINAL. **Un diagnóstico que muestra el principio del log no diagnostica nada**: hay que abrir el fichero igual, que es justo el paso que esa línea debía ahorrar. Me costó ese paso hoy. Pasa a `tail`. Y entra `ProcessFdQuotaExceeded` / `Too many open files` / `no space left on device` a la lista de razones del `.fail`: esas dos recetas sanas se anotaron como «fallo (ver log)», y **un fallo sin nombre se anota como deuda y se diagnostica leyendo la receta, que es donde no está**. El límite de fds ya se sube en este guion; esto es para el día que algo lo vuelva a tocar. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Semántico sayk'uy
Mana ima sutichaypas t'ikrakurqanchu: qillqalla, yachachiylla utaq willaylla t'ikrakurqan.
1 qillqakuna · +14 −2
- scripts/build-farm.sh +14 −2
diff --git a/scripts/build-farm.sh b/scripts/build-farm.sh
index 2767ab4d..6c90331f 100755
--- a/scripts/build-farm.sh
+++ b/scripts/build-farm.sh
@@ -133,7 +133,12 @@ printf '%s\n' "$queue" | xargs -P"$JOBS" -I '{}' sh -c '
if [ "${H#b3:}" != "$H" ] && [ -n "$H" ]; then
echo "$H" > "'"$FARM"'/status/$n.ok"; printf " ✓ %-18s %s\n" "$n" "$H"
else
- r=$(grep -oiE "requires rustc [0-9.]+|cannot find -l[a-z0-9]+|could not find .[a-z0-9_-]+.|error\[E[0-9]+\]|not found|unsupported|no such file" "$log" | head -1)
+ # `ProcessFdQuota`/`Too many open files` en la lista porque el 2026-10-11 dos recetas sanas
+ # (`obs-studio`, `spectacle`) murieron por el límite de descriptores y la razón salió como
+ # «fallo (ver log)» — un fallo sin nombre se anota como deuda y se diagnostica leyendo la
+ # receta, que es donde no está. El límite ya se sube en este guion, así que esto es para el día
+ # que algo lo vuelva a tocar: que el informe lo DIGA en vez de callarlo.
+ r=$(grep -oiE "requires rustc [0-9.]+|cannot find -l[a-z0-9]+|could not find .[a-z0-9_-]+.|error\[E[0-9]+\]|ProcessFdQuotaExceeded|Too many open files|no space left on device|not found|unsupported|no such file" "$log" | head -1)
echo "${r:-fallo (ver log)}" > "'"$FARM"'/status/$n.fail"; printf " ✗ %-18s %s\n" "$n" "${r:-fallo}"
fi
' _ '{}'
@@ -161,8 +166,15 @@ for s in "$FARM"/status/*.fail; do
# El defecto de fondo no era la firma que faltaba sino que faltarla fuese MUDO: la lista sólo
# puede crecer si alguien se entera de que se quedó corta. Sin esta línea, la única señal de que
# una receta es reintentable era que a alguien se le ocurriera correrla a mano.
+ # ⚠ LA COLA DEL LOG, NO LA CABEZA — y esto costó un paso real el 2026-10-11. Con `head` el
+ # mensaje salía así:
+ # · obs-studio no reintentado (firma no reconocida: … INFO takana_build: caché: artefacto ya…)
+ # o sea una línea de CACHE-HIT del arranque, mientras el fallo verdadero
+ # (`ProcessFdQuotaExceeded` al enlazar libavcodec) estaba al FINAL. Un diagnóstico que existe
+ # para nombrar la causa y muestra el principio del log no nombra nada: hay que ir a abrir el
+ # fichero igual, que es justo el paso que esta línea debía ahorrar.
printf " · %-18s no reintentado (firma no reconocida: %s)\n" "$n" \
- "$(head -c 120 "$log" 2>/dev/null | tr '\n' ' ' | tr -s ' ')"
+ "$(tail -c 200 "$log" 2>/dev/null | tr '\n' ' ' | tr -s ' ')"
continue
fi
H=$("$HAMMER" --store "$STORE" build "$f" 2>"$log" | tail -1 || true)