From cb8c49736c55abb3431e5e194b0baf840d2e8965 Mon Sep 17 00:00:00 2001 From: sergio Date: Sun, 21 Jun 2026 07:21:44 -0400 Subject: [PATCH] =?UTF-8?q?Etapa=20F=20dogfood:=20`scripts/build-repo.sh`?= =?UTF-8?q?=20=E2=80=94=20poblar=20el=20corpus=20como=20repo=20de=20releas?= =?UTF-8?q?e=20firmado?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Convierte la maquinaria de paquetería en la cadena de suministro real: cada receta del corpus se vuelve un .swm, el repo es el catálogo firmado, install lo reproduce localmente. - scripts/build-repo.sh: packea recipes/*.toml al repo, anclando expected_hash con `pack --build` (cache-hit si el artefacto ya está sellado; fallback a pack sin ancla por timeout/fallo), y firma el release (clave efímera o KEY=). Env: REPO/STORE/KEY/DISTRO/BUILD_TIMEOUT. - /dist/ gitignoreado (el repo es artefacto reproducible desde el script). - Validado: poblado de 34 paquetes (31 con expected_hash anclado), release firmado. install ripgrep desde el repo FIRMADO en modo --require-signed → release trusted → reproduce b3:9e6079fd (casa el ancla del catálogo) → hidrata → rg 14.1.1 corre. Cadena completa. Co-Authored-By: Claude Opus 4.8 --- .gitignore | 1 + scripts/build-repo.sh | 58 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100755 scripts/build-repo.sh diff --git a/.gitignore b/.gitignore index 791f529f..da572db0 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ Cargo.lock.orig /var/ /.dev-fs/ /work/ +/dist/ *.swm.local # editor / OS diff --git a/scripts/build-repo.sh b/scripts/build-repo.sh new file mode 100755 index 00000000..069375b7 --- /dev/null +++ b/scripts/build-repo.sh @@ -0,0 +1,58 @@ +#!/bin/sh +# build-repo.sh — Etapa F (dogfood): puebla un REPO DE PAQUETES hammer desde el corpus +# `recipes/*.toml` y firma el release. Convierte la maquinaria de paquetería en la cadena de +# suministro real de la distro: cada receta se vuelve un `.swm` (mutación sobre fuente), el repo +# es el catálogo firmado, y `hammer install --repo ` lo reproduce localmente. +# +# Para cada receta intenta ANCLAR el `expected_hash` con `pack --build` (instantáneo si el +# artefacto ya está sellado en el store — cache-hit; ver hammer-build::build). Si construir desde +# cero excede el timeout (o falla), cae a `pack` sin ancla: la entrada del catálogo igual existe y +# el `source_patch` sigue siendo reproducible, sólo sin hash del autor contra el que comparar. +# +# Env: +# REPO= destino del repo (default ./dist/repo) +# STORE= store con artefactos cacheados (default ./store) +# KEY= clave privada ed25519 para firmar el release (default: genera una efímera) +# DISTRO= distro_version de la base de los paquetes (default dev) +# BUILD_TIMEOUT segundos máx por `pack --build` antes de caer a pack sin ancla (default 90) +set -eu + +REPO="${REPO:-$(pwd)/dist/repo}" +STORE="${STORE:-./store}" +DISTRO="${DISTRO:-dev}" +BUILD_TIMEOUT="${BUILD_TIMEOUT:-90}" +HAMMER="cargo run -q -p hammer-cli --" + +rm -rf "$REPO" +mkdir -p "$REPO" + +# Clave de firma del release: la pasada por KEY, o una efímera en el dir del repo. +KEYDIR="$(dirname "$REPO")/keys" +if [ -z "${KEY:-}" ]; then + mkdir -p "$KEYDIR" + if [ ! -f "$KEYDIR/release.ed25519" ]; then + $HAMMER keygen release --out "$KEYDIR" >/dev/null + fi + KEY="$KEYDIR/release.ed25519" + echo "firmando el release con clave efímera $KEY" +fi + +anchored=0; plain=0; failed="" +for r in recipes/*.toml; do + name=$(basename "$r" .toml) + if timeout "$BUILD_TIMEOUT" $HAMMER --store "$STORE" pack "$r" \ + --repo "$REPO" --distro-version "$DISTRO" --build >/dev/null 2>&1; then + anchored=$((anchored + 1)) + elif $HAMMER pack "$r" --repo "$REPO" --distro-version "$DISTRO" >/dev/null 2>&1; then + plain=$((plain + 1)) + else + failed="$failed $name" + fi +done + +$HAMMER repo sign --repo "$REPO" --key "$KEY" +echo +$HAMMER repo list --repo "$REPO" +echo +echo "poblado: $anchored con expected_hash anclado, $plain sin ancla.${failed:+ FALLARON:$failed}" +echo "repo en $REPO (firmado). probá: hammer install --repo $REPO --trust $KEYDIR --require-signed"