tawasuyu

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 Definiciones

⎇ 4190c7b43e5bd323a9b166340cfa16cd324ca2e4 scripts/farm/harkaq-campana.sh Shell · 85 líneas · 4.3 KB Historia crudo

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

1#!/bin/sh
2# harkaq-campana.sh — bucle AUTÓNOMO del worker para la campaña harkaq. Hermano de
3# farm-worker-loop.sh: muele sin esperar a nadie, 24/7, y no pregunta NADA.
4#
5#   scripts/farm/harkaq-campana.sh [lista-de-recetas.txt]
6#
7# Mide, no decide: por cada receta la construye bajo la jaula y guarda los veredictos crudos en
8# work/harkaq-campana/<n>.verdicts. La clasificación y la edición de recetas las hace el HUB
9# (harvest-harkaq.sh, por cron), porque el store del worker es parcial y marcaría como irreducible
10# lo que sí es declarable. El worker MIDE, el hub CLASIFICA.
11#
12# Idempotente: lo ya medido se saltea; re-correrlo sólo mide lo nuevo. Cuando no queda nada,
13# duerme y re-escanea — igual que farm-worker-loop.sh.
14#
15# Diseñado para la NOCHE: nunca bloquea esperando una decisión. Un build que falla NO detiene la
16# cola; su veredicto se guarda igual (un build que falla es justo cuando más interesa saber qué
17# tocó fuera de su clausura) y se sigue. Ocho horas de idle por una pregunta es el fallo que este
18# script existe para no tener.
19set -u
20
21HAMMER_DIR="${TAKANA_DIR:-${HAMMER_DIR:-/opt/takana}}"
22cd "$HAMMER_DIR"
23LISTA="${1:-work/harkaq-cola.txt}"
24OUT="work/harkaq-campana"
25BIN="${HARKAQ_BIN:-/root/.cache/harkaq}"
26IDLE_SLEEP="${IDLE_SLEEP:-300}"
27POR_RECETA="${POR_RECETA:-900}"
28mkdir -p "$OUT"
29
30export HARKAQ=1 HARKAQ_BIN="$BIN" HARKAQ_BASE="${HARKAQ_BASE:-$BIN/base.policy}"
31export HARKAQ_TIMEOUT="${HARKAQ_TIMEOUT:-300}"
32
33# Gate 1: sin ABI>=7 el kernel no audita y TODOS los veredictos saldrían SinEvidencia. Moler la
34# noche entera para producir "no sabemos" es peor que no moler.
35abi=$(python3 -c 'import ctypes;print(ctypes.CDLL("libc.so.6").syscall(444,None,0,1))' 2>/dev/null)
36if [ "${abi:-0}" -lt 7 ]; then
37    echo "ABORTO: Landlock ABI ${abi:-?} < 7 ⇒ sin audit de denegaciones. ¿La golden es la 6.17?"
38    exit 4
39fi
40
41# Gate 2: ¿el binario TIENE harkaq dentro? La golden hornea un `target/release/takana` viejo y el
42# rsync excluye /target ⇒ si el `cargo build` del provisioning no corrió, el worker construye
43# alegremente SIN LA JAULA y produce cero veredictos. Pasó: la primera corrida molió 2 recetas con
44# un binario del 29/06 (0 ocurrencias de "harkaq") y las marcó "sin veredicto" como si fuera culpa
45# de las recetas. Ocho horas así son la noche entera perdida — y el log diría "salteada", nunca
46# "estoy ciego". Es el falso `Hermetico` de D9 mudado al orquestador: la ausencia como respuesta
47# tranquilizadora.
48if ! strings ./target/release/takana 2>/dev/null | grep -q harkaq; then
49    echo "ABORTO: ./target/release/takana NO tiene harkaq compilado (¿corrió el cargo build?)."
50    echo "        Sin esto la campaña muele sin jaula y produce 0 veredictos, en silencio."
51    exit 4
52fi
53echo "$(date -u +%FT%TZ) campaña harkaq: ABI $abi, binario con jaula ✓, cola $LISTA"
54
55while :; do
56    hechas=0; nuevas=0
57    while IFS= read -r n; do
58        [ -n "$n" ] || continue
59        [ -f "recipes/$n.toml" ] || continue
60        if [ -s "$OUT/$n.verdicts" ]; then hechas=$((hechas + 1)); continue; fi
61
62        # Forzar build real: `takana build` pega en la caché si el artefacto ya está sellado y no
63        # correría nada (veredicto vacío que NO es un fallo). La copia va AL LADO del original o se
64        # rompe la resolución de deps.build, que son relativas al dir de la receta.
65        tmp="recipes/.hk-$n.toml"
66        sed "s/^name *= *\"$n\"/name = \"$n-hkm\"/" "recipes/$n.toml" > "$tmp"
67        timeout "$POR_RECETA" ./target/release/takana build "$tmp" --store "$PWD/store" \
68            > "$OUT/$n.log" 2>&1
69        rm -f "$tmp"
70        grep '^\[harkaq\] {' "$OUT/$n.log" | sed 's/^\[harkaq\] //' > "$OUT/$n.verdicts"
71        if [ -s "$OUT/$n.verdicts" ]; then
72            nuevas=$((nuevas + 1))
73            echo "$(date -u +%FT%TZ) ++ $n ($(wc -l < "$OUT/$n.verdicts") fase/s medidas)"
74        else
75            # Sin veredicto: el build ni arrancó (fetch, dep rota…). Se marca para no reintentar
76            # en bucle y se SIGUE — la cola no se detiene por una receta.
77            echo "sin-veredicto" > "$OUT/$n.skip"
78            rm -f "$OUT/$n.verdicts"
79            echo "$(date -u +%FT%TZ) ?? $n — sin veredicto, salteada (ver $OUT/$n.log)"
80        fi
81    done < "$LISTA"
82
83    echo "$(date -u +%FT%TZ) ciclo: $nuevas nuevas, $hechas ya medidas. durmiendo ${IDLE_SLEEP}s"
84    sleep "$IDLE_SLEEP"
85done