Files
sergioandClaude Opus 4.8 85b5a9bc46 yupana: instrumentar duración de build en el worker → camino crítico PESADO
El peso que le faltaba a las ondas: sin él, critical-path = nº de pasos; con él,
ETA real en segundos.

INSTRUMENTACIÓN (worker):
  scripts/farm/build-timed.sh envuelve `hammer build` midiendo la pared y la
  registra en $STORE/.times/<hash>-<host>.json — un SIDECAR del store, NUNCA
  dentro del artefacto. La duración es no determinista (varía por máquina/carga)
  ⇒ no puede tocar el ArtifactHash. Keyed por hash (CAS-safe: dos workers no se
  pisan) + host (varias muestras por receta). Viaja al hub con el rsync de store
  que ya hace la cosecha; ninguna herramienta del store lo confunde con artefacto.
  Sólo builds REALES (pared ≥ UMBRAL 3s) — los cache-hits no envenenan la mediana.
  campana-deuda.sh ahora construye vía build-timed.sh (transparente, mismo exit).

CONSUMO (hub): yupana._tiempos() carga name→mediana de segundos; keystones
computa el CAMINO CRÍTICO pesado = longest weighted path del subgrafo de deuda
(peso = segundos de build). La cadena más larga hay que construirla en SERIE
aunque haya ∞ workers ⇒ es la ETA con paralelismo infinito. Degrada con gracia:
sin datos, peso=1 y el camino crítico = nº de pasos (lo que ya daban las ondas).

Verificado: con muestras sintéticas da "ETA 19 min sobre 5 pasos, kio → kparts →
frameworkintegration → breeze → plasma-integration"; sin datos degrada a "5 pasos
(SIN datos)". store/.times está git-ignorado (metadata de máquina, no se commitea).

LÍMITE honesto (en la cabecera de build-timed.sh): `hammer build` arrastra deps ⇒
la pared incluye deps no selladas. En orden topológico (drenar) las deps ya están
selladas y la pared mide sobre todo ESTA receta — cota superior buena para pesar.
La precisión exacta pediría instrumentar el sellado dentro de hammer-build (Rust).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-22 20:25:09 -04:00

43 lines
2.2 KiB
Bash
Executable File

#!/bin/sh
# build-timed.sh <receta.toml> — corre `hammer build` MIDIENDO la duración de pared y la registra
# como metadata, para alimentar el camino crítico PESADO de yupana (el peso que le faltaba a las
# ondas: sin él, critical-path = nº de pasos; con él, ETA real en segundos).
#
# DÓNDE VIVE EL DATO. En `$STORE/.times/<hash>-<host>.json` — un SIDECAR del store, NUNCA dentro del
# artefacto (`<hash>-<name>/`). La duración es NO determinista (varía por máquina y carga) ⇒ no puede
# tocar el ArtifactHash ni la reproducibilidad. Es metadata SOBRE un build, keyed por el hash del
# artefacto (CAS-safe: dos workers no se pisan) + host (permite varias muestras por receta). Viaja al
# hub con el rsync del store que ya hace la cosecha; ninguna herramienta del store lo confunde con un
# artefacto (no matchea `<hash>-<name>`).
#
# SÓLO BUILDS REALES. Un cache-hit devuelve al instante; un build C/KDE tarda minutos. Se registra
# sólo si la pared supera UMBRAL_TIEMPO (def 3s), así los cache-hits no envenenan la mediana con ~0.
# Limitación honesta: `hammer build` arrastra deps ⇒ la pared incluye deps NO selladas. Construyendo
# en orden topológico (drenar) las deps ya están selladas (cache-hit) y la pared mide sobre todo ESTA
# receta. No es perfecto; es una cota superior buena para pesar. La precisión exacta pediría instrumentar
# el sellado dentro de hammer-build (Rust), deuda futura.
#
# Sale con el MISMO código que `hammer build` (transparente para el llamador).
set -u
HAMMER="${HAMMER:-./target/release/hammer}"
STORE="${STORE:-./store}"
UMBRAL="${UMBRAL_TIEMPO:-3}"
f="${1:?uso: build-timed.sh <receta.toml>}"
h=$("$HAMMER" --store "$STORE" hash "$f" 2>/dev/null) # b3:… (dry-run, ~2ms, no necesita store)
start=$(date +%s)
"$HAMMER" --store "$STORE" build "$f"
rc=$?
end=$(date +%s)
elapsed=$((end - start))
if [ "$rc" -eq 0 ] && [ "$elapsed" -ge "$UMBRAL" ] && [ -n "$h" ]; then
name=$(basename "$f" .toml)
host=$(hostname 2>/dev/null || echo worker)
hh=${h#b3:}
mkdir -p "$STORE/.times"
printf '{"hash":"%s","name":"%s","seconds":%s,"host":"%s","epoch":%s}\n' \
"$h" "$name" "$elapsed" "$host" "$end" > "$STORE/.times/${hh}-${host}.json"
fi
exit "$rc"