repro: «no pude comparar» tampoco es no-determinismo — segundo sitio, misma lección

Una tanda volvió a llenar el libro de veredictos falsos: 47 recetas sanas anotadas como
NO-DETERMINISMO. Esta vez la cadena empezó antes de donde yo había mirado.

El `mv` que APARTA el artefacto falló (el directorio de apartado no estaba) y yo nunca comprobaba que
hubiera funcionado. A partir de ahí todo lo que sigue es basura: el artefacto se queda en su sitio,
`hammer why-differs` compara contra una ruta que no existe y devuelve `Error: store: no existe…`, y
mi código leía cualquier salida no-cero como «difieren». Un error de comparación disfrazado de
veredicto, 47 veces.

Es la MISMA lección que arreglé hace un rato para el build, en un segundo sitio que no miré:
**no poder medir no es un resultado negativo**. Dos guardas nuevas:

  · el apartado se comprueba (`mv || SIN VEREDICTO`) y la receta se salta ruidosamente;
  · `why-differs` se lee, no sólo su exit code: si dice `Error:`/`no existe`, es SIN VEREDICTO, se
    restaura el artefacto y NO se anota nada.

Probadas las dos: con el apartadero sin permiso de escritura sale «no pude apartar el artefacto ⇒
SIN VEREDICTO», el artefacto queda intacto y el libro no crece.

Comprobado además que la tanda mala no perdió NADA: como el `mv` fallaba, los 47 artefactos nunca
salieron del store (`faltan: 0`). El daño fue sólo el registro, y está purgado — el libro queda con
51 verificaciones buenas.

La regla, ya por triplicado hoy: cuando un guardián no puede establecer algo, el estado es *sin
veredicto*, y eso no se escribe. Un libro que anota lo que no midió se cree igual que uno que sí.
This commit is contained in:
Sergio
2026-09-05 21:44:50 +00:00
parent 6c1f80204a
commit 8a2c6fad39
2 changed files with 23 additions and 49 deletions
+21 -2
View File
@@ -227,9 +227,28 @@ for f in $RECETAS; do
D="$H-$n"
[ -d "$STORE/$D" ] || { saltada=$((saltada+1)); continue; }
mv "$STORE/$D" "$GUARDA/$D"; PENDIENTE="$PENDIENTE $D"
# ⚠ Si el apartado FALLA, todo lo que sigue es basura: el `why-differs` de después compara contra
# algo que no existe, devuelve error, y un error leído como «difieren» inventa un no-determinismo.
# Pasó el 2026-09-05 con 47 recetas sanas de una sola tanda. Falla ruidoso y se salta la receta.
mkdir -p "$GUARDA"
if ! mv "$STORE/$D" "$GUARDA/$D" 2>/dev/null; then
printf " ⚠ %-26s no pude apartar el artefacto ⇒ SIN VEREDICTO\n" "$n"
fallo=$((fallo+1)); continue
fi
PENDIENTE="$PENDIENTE $D"
if "$HAMMER" --store "$STORE" build "$f" >/dev/null 2>&1 && [ -d "$STORE/$D" ]; then
if "$HAMMER" why-differs "$GUARDA/$D" "$STORE/$D" >/dev/null 2>&1; then
# `why-differs` devuelve no-cero tanto si DIFIEREN como si NO PUDO comparar (una ruta que no
# existe, por ejemplo). Tratar las dos igual es inventar un veredicto: se mira su salida.
cmp_out=$("$HAMMER" why-differs "$GUARDA/$D" "$STORE/$D" 2>&1); cmp_rc=$?
if [ "$cmp_rc" -ne 0 ] && printf '%s' "$cmp_out" | grep -qiE '^Error:|no existe'; then
printf " ⚠ %-26s no pude comparar (%s) ⇒ SIN VEREDICTO\n" "$n" \
"$(printf '%s' "$cmp_out" | head -1 | cut -c1-60)"
fallo=$((fallo+1))
rm -rf "$STORE/$D"; mv "$GUARDA/$D" "$STORE/$D"
PENDIENTE=$(echo "$PENDIENTE" | sed "s| $D||")
continue
fi
if [ "$cmp_rc" -eq 0 ]; then
printf " ✓ %-26s REPRODUCE\n" "$n"; ok=$((ok+1))
anotar "$n" "$H" "reproduce"
rm -rf "$GUARDA/$D"; podar_fuentes "$n"