gioser

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

⎇ 27ec9caea002e5aa57f6b9ca87de7fdf8eda5b1a scripts/farm/exp-ec.sh Shell · 53 líneas · 2.8 KB Historia crudo

ADR 0020: el experimento CORRIDO — 10 de 12 sobreviven a `-ec`, y el que cae tiene el artefacto BIEN 27ec9caea · Sergio ·

1#!/bin/bash
2# exp-ec.sh — el experimento del ADR 0020: ¿cuántas recetas dejan de construir si las fases
3# corriesen con `sh -ec` en vez de `sh -c`?
4#
5# ── POR QUÉ NO SELLA NADA, Y POR QUÉ ESO IMPORTA ───────────────────────────────────────────────
6# Modificar una receta le cambia el `ArtifactHash`, así que medir esto a lo bruto dejaría un
7# duplicado basura en el store POR CADA receta que pase — en un store que se respalda. En vez de eso
8# se inyecta `set -e` al principio de cada fase Y un `exit 77` al final de la última, de modo que el
9# build SIEMPRE falla y nunca sella. El veredicto se lee en el código que reporta takana:
10#
11#   · falló con 77   ⇒ las fases corrieron ENTERAS bajo set -e   ⇒ SOBREVIVE a `-ec`
12#   · falló con ≠77  ⇒ una orden intermedia falla y hoy se traga ⇒ SE ROMPE con `-ec`
13#
14# Las copias se escriben en `recipes/exp-ec-*.toml` —tienen que vivir ahí porque takana resuelve las
15# deps RELATIVAS al directorio de la receta— y se barren al terminar.
16#
17# ⚠ El lock se toma POR RECETA, no por tanda. La regla 1 de CLAUDE.md dice lo contrario para las
18# tandas normales, y con razón; acá es al revés a propósito: una tanda de éstas puede durar horas y
19# retener `work/.farm-build.lock` todo ese tiempo pararía la cosecha del latido.
20#
21# Uso:  MUESTRA=/ruta/lista.txt scripts/farm/exp-ec.sh     (una receta por línea, p.ej. recipes/gzip.toml)
22cd "$(dirname "$0")/../.."
23TMP=${TMPDIR:-/tmp}/exp-ec
24REC=$(cd "$(dirname "$0")/../.." && pwd)/recipes
25mkdir -p "$TMP"; OUT="$TMP/resultados.tsv"; : > "$OUT"
26
27while read -r r; do
28  [ -f "$r" ] || continue
29  n=$(basename "$r" .toml)
30  awk '
31    /^(compile|install|configure|check|prepare) = .{3}$/ { print; print "set -e"; inb=1; next }
32    { print }
33  ' "$r" > "$REC/exp-ec-$n.toml"
34  # `exit 77` como última línea de la última fase del fichero
35  last=$(grep -n "^'''$" "$REC/exp-ec-$n.toml" | tail -1 | cut -d: -f1)
36  [ -n "$last" ] && sed -i "${last}i exit 77" "$REC/exp-ec-$n.toml"
37
38  log="$TMP/$n.log"
39  timeout 420 flock -o /work/.farm-build.lock takana build "$REC/exp-ec-$n.toml" > "$log" 2>&1
40  rc=$?
41  if grep -q "exit 77" "$log"; then v="SOBREVIVE"
42  elif [ $rc -eq 124 ]; then v="TIMEOUT"
43  elif grep -qE "build phase falló \(exit [0-9]+\)" "$log"; then v="SE-ROMPE"
44  else v="OTRO"; fi
45  det=$(grep -oE "build phase falló \(exit [0-9]+\): .*" "$log" | head -1 | cut -c1-90)
46  printf '%s\t%s\t%s\n' "$n" "$v" "$det" >> "$OUT"
47  echo "[$v] $n"
48done < ${MUESTRA:?hace falta MUESTRA=<fichero con una receta por línea>}
49
50echo "════ RESUMEN ════"
51for v in SOBREVIVE SE-ROMPE TIMEOUT OTRO; do echo "$v: $(grep -c "	$v	" "$OUT")"; done
52rm -f "$REC"/exp-ec-*.toml
53echo "copias de experimento barridas de recipes/: $(ls "$REC"/exp-ec-*.toml 2>/dev/null | wc -l) quedan"