#!/bin/sh # build-timed.sh — corre `takana 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/-.json` — un SIDECAR del store, NUNCA dentro del # artefacto (`-/`). 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 `-`). # # 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: `takana 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 takana-build (Rust), deuda futura. # # Sale con el MISMO código que `takana build` (transparente para el llamador). set -u HAMMER="${TAKANA:-${HAMMER:-./target/release/takana}}" STORE="${STORE:-./store}" UMBRAL="${UMBRAL_TIEMPO:-3}" f="${1:?uso: build-timed.sh }" 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"