repro: podar el árbol de fuentes tras cada veredicto sano — el barrido ya no llena el disco

Un barrido dejaba un árbol extraído por receta en `work/sources` y no limpiaba hasta el final. En el
hub eso llevó el disco del 95% al 98% DOS VECES hoy, y un disco lleno no se lee como disco lleno: se
lee como recetas rotas. Con la poda por veredicto, `work/sources` se queda en 3 MB durante toda la
tanda en vez de crecer hasta 7,7 G.

No cuesta nada porque `fetch.rs` borra y re-extrae el árbol en CADA build por diseño: guardarlo entre
recetas de un barrido no ahorra un segundo.

Dos límites deliberados:
  · Sólo se poda cuando el veredicto es SANO. Si algo falló o divergió, el árbol es justamente lo que
    hace falta para mirarlo — un verificador que limpia la escena del problema que acaba de encontrar
    sirve para poco. Es la misma razón por la que los ejemplares divergentes se conservan.
  · Sólo el árbol de ESA receta. Las deps extraídas se quedan: son compartidas, y borrarlas mientras
    otra cosa las usa es exactamente el ADR 0012.

Con esto la cobertura se puede levantar en el HUB, que es donde están los 1157 artefactos. El worker
sólo tiene los que construyó —el último barrido allá reportó 47 de 60 «sin artefacto»— así que como
máquina de cobertura no sirve por más disco que tenga.
This commit is contained in:
Sergio
2026-09-05 21:05:12 +00:00
parent 8b43b44c11
commit a48885e143
+19 -1
View File
@@ -117,6 +117,23 @@ LIBRO="${LIBRO:-docs/state/repro-verificado.tsv}"
'#' \
'# receta<TAB>hash<TAB>fecha<TAB>veredicto' > "$LIBRO"
# ── PODAR EL ÁRBOL DE FUENTES TRAS CADA VEREDICTO SANO ─────────────────────────────────────────
# Un barrido deja un árbol extraído por receta en `work/sources` y no limpia hasta el final: en el
# hub eso llevó el disco del 95% al 98% dos veces el 2026-09-05, y un disco lleno se lee como receta
# rota ([[disco-lleno-se-lee-como-receta-rota]]). Guardarlos no vale nada para el barrido, porque
# `fetch.rs` borra y re-extrae el árbol en CADA build por diseño.
#
# Pero sólo se poda cuando el veredicto es SANO. Si algo falló o divergió, el árbol es justamente lo
# que hace falta para mirarlo: un verificador que limpia la escena del problema que acaba de
# encontrar sirve para poco.
#
# ⚠ Sólo el árbol de ESTA receta. Las deps que se hayan extraído se quedan: son compartidas, y
# borrarlas mientras otra cosa las usa es el ADR 0012.
podar_fuentes() {
[ -n "${1:-}" ] || return 0
rm -rf "$ROOT/work/sources/$1"-* 2>/dev/null || true
}
ya_verificado() { grep -qF "$(printf '%s\t%s\t' "$1" "$2")" "$LIBRO" 2>/dev/null; }
anotar() { printf '%s\t%s\t%s\t%s\n' "$1" "$2" "$(date -u +%F)" "$3" >> "$LIBRO"; }
@@ -215,7 +232,7 @@ for f in $RECETAS; do
if "$HAMMER" why-differs "$GUARDA/$D" "$STORE/$D" >/dev/null 2>&1; then
printf " ✓ %-26s REPRODUCE\n" "$n"; ok=$((ok+1))
anotar "$n" "$H" "reproduce"
rm -rf "$GUARDA/$D"
rm -rf "$GUARDA/$D"; podar_fuentes "$n"
else
# ── DERIVA vs NO-DETERMINISMO: SE DECIDE ACÁ, NO EN LA CABEZA DE QUIEN LEE ──────────────
# Que el guardado difiera de una reconstrucción de hoy puede ser dos cosas MUY distintas:
@@ -247,6 +264,7 @@ for f in $RECETAS; do
# Se anota igual: las dos reconstrucciones coincidieron entre sí, que es justo lo que
# significa «reproduce». Lo viejo era el ejemplar guardado, no el determinismo.
anotar "$n" "$H" "reproduce (tras poner al día un artefacto derivado)"
podar_fuentes "$n"
rm -rf "$GUARDA/$D" "$GUARDA/$D.r1"
else
printf " ✗ %-26s NO-DETERMINISMO (dos reconstrucciones difieren entre sí)\n" "$n"