exp-ec: tres fallos del propio arnés — sellaba basura y el veredicto no miraba el estado de salida
Los encontró la corrida en el worker, y los tres estaban disfrazados de resultado. 1. El `exit 77` se insertaba antes de la ÚLTIMA `'''` del fichero, que no siempre cierra una fase: una receta puede traer bloques `'''` después (un `[[service]]`, una nota larga). En `dwarves`, `elfutils` y `elfutils-libdw` cayó fuera de toda fase, el build corrió entero y SELLÓ — con el hash movido por el `set -e`, o sea tres artefactos basura. Ahora se rastrea la anidación. 2. El veredicto se leía con `grep "exit 77"` sobre el log, y takana IMPRIME el script de la fase: esa cadena aparece siempre porque la inyectamos nosotros. Daba SOBREVIVE hasta a un build que selló. Ahora se ata a `build phase falló (exit 77)`, que es el estado de salida de verdad. (Comprobado a posteriori que los 14 SOBREVIVE de la corrida buena sí habían salido 77.) 3. Sin `--store`, takana usa su default `/store`, que en el worker es un store de SCRATCH casi vacío — reconstruía el mundo en vez de reusar el de la granja (`./store`, 908 artefactos). Ahora el store va por `STORE`. Y un guardián para lo que no debería volver a pasar: si un build SELLA, se clasifica `SELLO-INDEBIDO` y se grita el hash, en vez de contarse como un resultado más. Los tres artefactos basura ya se borraron del `/store` de scratch del worker; el store de la granja nunca se tocó.
Semántico sayk'uy
Mana ima sutichaypas t'ikrakurqanchu: qillqalla, yachachiylla utaq willaylla t'ikrakurqan.
1 qillqakuna · +20 −4
- scripts/farm/exp-ec.sh +20 −4
diff --git a/scripts/farm/exp-ec.sh b/scripts/farm/exp-ec.sh
index 460b4829..0b75627b 100755
--- a/scripts/farm/exp-ec.sh
+++ b/scripts/farm/exp-ec.sh
@@ -43,14 +43,30 @@ while read -r r; do
/^(compile|install|configure|check|prepare) = .{3}$/ { print; print "set -e"; inb=1; next }
{ print }
' "$r" > "$REC/exp-ec-$n.toml"
- # `exit 77` como última línea de la última fase del fichero
- last=$(grep -n "^'''$" "$REC/exp-ec-$n.toml" | tail -1 | cut -d: -f1)
+ # El `exit 77` va al cierre de la ÚLTIMA FASE, que NO es la última `'''` del fichero: una receta
+ # puede traer bloques `'''` después de las fases (un `[[service]]`, una nota larga). MEDIDO el
+ # 2026-09-18: en `dwarves`, `elfutils` y `elfutils-libdw` el `exit 77` cayó fuera de toda fase, el
+ # build corrió entero y SELLÓ — con el hash movido por el `set -e`, o sea basura en el store. Por
+ # eso acá se rastrea la anidación en vez de buscar la última comilla triple.
+ last=$(awk '
+ /^(compile|install|configure|check|prepare) = .{3}$/ { dentro=1; next }
+ dentro && /^.{3}$/ { fin=NR; dentro=0 }
+ END { print fin }' "$REC/exp-ec-$n.toml")
+ [ -n "$last" ] || { echo "[SIN-FASES] $n"; printf '%s\t%s\t%s\n' "$n" "SIN-FASES" "" >> "$OUT"; rm -f "$REC/exp-ec-$n.toml"; continue; }
[ -n "$last" ] && sed -i "${last}i exit 77" "$REC/exp-ec-$n.toml"
log="$TMP/$n.log"
- timeout "$TLIMITE" flock -o "$LOCK" "$TAKANA" build "$REC/exp-ec-$n.toml" > "$log" 2>&1
+ timeout "$TLIMITE" flock -o "$LOCK" "$TAKANA" ${STORE:+--store "$STORE"} build "$REC/exp-ec-$n.toml" > "$log" 2>&1
rc=$?
- if grep -q "exit 77" "$log"; then v="SOBREVIVE"
+ # ⚠ El veredicto se lee en el ESTADO DE SALIDA que reporta takana, NO buscando `exit 77` en el
+ # log: takana IMPRIME el script de la fase, así que esa cadena aparece SIEMPRE — la inyectamos
+ # nosotros. Buscarla a secas daría SOBREVIVE hasta a un build que selló.
+ if grep -q "build phase falló (exit 77)" "$log"; then v="SOBREVIVE"
+ elif grep -qE "sealed path=\S*-$n\$" "$log"; then
+ # No debería pasar nunca: si selló, el `exit 77` no llegó a correr y el artefacto lleva el hash
+ # MOVIDO por el `set -e` ⇒ es basura en el store. Se grita con el hash para poder borrarlo.
+ v="SELLO-INDEBIDO"
+ echo " ⚠⚠ $n SELLÓ — basura: $(grep -oE "sealed path=\S+" "$log" | tail -1 | sed 's|.*/||')"
elif [ $rc -eq 124 ]; then v="TIMEOUT"
elif grep -qE "build phase falló \(exit [0-9]+\)" "$log"; then v="SE-ROMPE"
else v="OTRO"; fi