gioser

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 604Rust 56Shell 36Markdown 281227 Sutichaykuna

⎇ 8b1673d689b25a7854e74067da850d4a8f8a09ea scripts/consenso.sh Shell · 85 siq'ikuna · 4.2 KB Ñawpa willay ch'uya

takana: el worker pasa a /opt/takana y takana-farm.service aacee245d · Sergio ·

1#!/bin/sh
2# consenso.sh <receta> [N] — CONSENSO DE RECONSTRUCCIÓN (SDD 17 §1).
3#
4# N builders INDEPENDIENTES reproducen el mismo hash ⇒ el binario es confiable **sin que nadie
5# firme nada**. Convierte la reproducibilidad de QA en primitiva de distribución: cualquiera
6# puede ser mirror, nadie puede envenenar el repo.
7#
8#   scripts/consenso.sh recipes/bzip2.toml 2
9#
10# Builders: este hub (laptop) + N-1 workers efímeros de la granja, cada uno una máquina física
11# distinta con su propio OS. Si coinciden ⇒ CONSENSO. Si divergen ⇒ candidato a `why-differs`
12# (SDD 17 §2) — y eso también es información: una divergencia es un canal impuro encontrado.
13#
14# Por qué esto no lo puede ofrecer nix/debian: su repro es incompleta. takana ya paga el
15# invariante (bit-repro verificada: selfhost, kernel), así que esto cae casi solo del invariante
16# — que es la tesis del SDD 17: buscar "qué cae del invariante", no "qué frontera agregar".
17#
18# NO firma ni publica: sólo produce el veredicto de consenso. El log de transparencia
19# (`fork-proof`, hash-encadenado + detección de equivocation) es el paso siguiente y YA está
20# escrito en tawasuyu — no hay que construir un rekor.
21set -eu
22
23RECETA="${1:?uso: consenso.sh <receta.toml> [N-builders]}"
24N="${2:-2}"
25HUB="$(cd "$(dirname "$0")/.." && pwd)"
26cd "$HUB"
27IMAGE="${IMAGE:-408909310}"
28TYPE="${TYPE:-ccx23}"
29LOCATION="${LOCATION:-hel1}"
30SSHKEY="${SSHKEY:-desarrollo@jlsoltech.com}"
31SSH_KEY="${SSH_KEY:-$HOME/.ssh/github5}"
32SSH="ssh -i $SSH_KEY -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o BatchMode=yes"
33n=$(basename "$RECETA" .toml)
34OUT="work/consenso"; mkdir -p "$OUT"
35
36echo "══ CONSENSO DE RECONSTRUCCIÓN — $n, $N builders independientes"
37
38# Builder 1: el hub. Es un builder legítimo (otra máquina, otro OS que los workers).
39echo "── builder 1: hub local ($(uname -s), $(grep -m1 '^NAME=' /etc/os-release 2>/dev/null | cut -d'"' -f2 || echo '?'))"
40h1=$(timeout "${POR:-900}" ./target/debug/hammer build "$RECETA" --store "$PWD/store" 2>/dev/null \
41     | grep -oE '^b3:[a-f0-9]{64}' | head -1)
42echo "   → ${h1:-FALLÓ}"
43[ -z "$h1" ] && { echo "   el hub no puede construir $n ⇒ sin consenso posible desde acá"; exit 3; }
44echo "$h1  hub" > "$OUT/$n.hashes"
45
46# Builders 2..N: workers efímeros, cada uno una máquina física distinta.
47i=2
48while [ "$i" -le "$N" ]; do
49    name="hkc-$i"
50    echo "── builder $i: worker efímero $name"
51    hcloud server create --name "$name" --image "$IMAGE" --type "$TYPE" --location "$LOCATION" \
52        --ssh-key "$SSHKEY" >/dev/null 2>&1
53    ip=$(hcloud server ip "$name")
54    for _ in $(seq 1 30); do $SSH "root@$ip" true 2>/dev/null && break; sleep 6; done
55    rsync -az -e "$SSH" --exclude /work --exclude /store --exclude '/store-*' --exclude /target \
56        --exclude /dist --exclude /tandas --exclude /.dev-fs --exclude /.git --exclude /.scratch \
57        --exclude '*.png' --exclude '/content*' ./ "root@$ip:/opt/takana/" >/dev/null 2>&1
58    hN=$($SSH "root@$ip" "export PATH=\$HOME/.cargo/bin:\$PATH; cd /opt/takana && \
59        cargo build --release -q -p takana-cli 2>/dev/null; \
60        timeout ${POR:-900} ./target/release/takana build $RECETA --store \$PWD/store 2>/dev/null \
61        | grep -oE '^b3:[a-f0-9]{64}' | head -1" 2>/dev/null | tr -d '\r')
62    echo "   → ${hN:-FALLÓ}"
63    [ -n "$hN" ] && echo "$hN  $name" >> "$OUT/$n.hashes"
64    hcloud server delete "$name" >/dev/null 2>&1
65    i=$((i + 1))
66done
67
68echo
69echo "══ VEREDICTO"
70cat "$OUT/$n.hashes" | sed 's/^/   /'
71distintos=$(awk '{print $1}' "$OUT/$n.hashes" | sort -u | wc -l)
72cuantos=$(wc -l < "$OUT/$n.hashes")
73if [ "$cuantos" -lt 2 ]; then
74    echo "   SIN CONSENSO: sólo $cuantos builder(s) produjeron hash. No se afirma nada."
75    exit 3
76elif [ "$distintos" = 1 ]; then
77    echo "   ✅ CONSENSO ($cuantos/$cuantos builders, mismo hash bit a bit)"
78    echo "   ⇒ el artefacto es confiable SIN FIRMA: N máquinas independientes lo reprodujeron."
79    exit 0
80else
81    echo "   ⚠️  DIVERGENCIA: $distintos hashes distintos entre $cuantos builders."
82    echo "   ⇒ hay un canal impuro. Es trabajo para \`why-differs\` (SDD 17 §2) — y la"
83    echo "      divergencia YA es información: el invariante bit-repro se rompió acá."
84    exit 1
85fi