takana etapa 3b: las 49 invocaciones pasan a ./target/release/takana
Los llamadores EJECUTABLES: scripts/ (incluida toda la granja), los runbooks y CLAUDE.md. Seguro porque la 3a ya garantiza que el worker emite los dos binarios, y porque en farm-lab-sync.sh el cargo build remoto precede a la invocación remota en el mismo script. Verificado: sintaxis de los 49 (bash -n / py_compile — ojo que why-differs-barrido.sh es Python con extensión .sh) y `takana hash` devuelve hash real sobre el store. NO se toca en esta etapa, a propósito: - La variable de entorno HAMMER=. Es interfaz de los scripts entre sí y hay llamadores que la fijan; renombrarla va con la etapa 4. - docs/evidencia/ y los HANDOFF: son REGISTRO de lo que se corrió ese día. Reescribir un comando dentro de una evidencia la falsifica. - docs/state/: es generado, se regenera solo. - Los ADR y los docs de diseño: texto, y `hammer` sigue funcionando. Van con la etapa 5, que es la de churn de texto.
This commit is contained in:
@@ -7,13 +7,13 @@ trabajo de otro sin enterarse. El resto del diseño está en `docs/`.
|
||||
## 1. Todo `hammer build` va envuelto en `flock`
|
||||
|
||||
```sh
|
||||
flock work/.farm-build.lock ./target/release/hammer --store ./store build <receta>
|
||||
flock work/.farm-build.lock ./target/release/takana --store ./store build <receta>
|
||||
```
|
||||
|
||||
Para una tanda, tomar el lock una sola vez y no por receta:
|
||||
|
||||
```sh
|
||||
flock work/.farm-build.lock bash -c 'for r in ...; do ./target/release/hammer --store ./store build "$r"; done'
|
||||
flock work/.farm-build.lock bash -c 'for r in ...; do ./target/release/takana --store ./store build "$r"; done'
|
||||
```
|
||||
|
||||
**Por qué.** `hammer build` comparte `work/sources/<dep>-<sha>` entre todas las recetas. Dos builds
|
||||
|
||||
@@ -99,7 +99,7 @@ no resuelven. `plan` no escribe en `recipes/` por su cuenta: ese directorio es e
|
||||
⚠ **Y al construirla, `hammer build` va SIEMPRE bajo el lock compartido:**
|
||||
|
||||
```sh
|
||||
flock work/.farm-build.lock ./target/release/hammer --store ./store build recipes/linux-derivada.toml
|
||||
flock work/.farm-build.lock ./target/release/takana --store ./store build recipes/linux-derivada.toml
|
||||
```
|
||||
|
||||
`hammer build` comparte `work/sources/<dep>-<sha>` entre todas las recetas. Dos builds simultáneos
|
||||
|
||||
@@ -352,8 +352,8 @@ cerró hoy en GNOME.
|
||||
|
||||
```sh
|
||||
cd ~/hammer
|
||||
./target/release/hammer --store store hash recipes/incoming-cosmic/<pieza>.toml # dry-run, ~2ms
|
||||
./target/release/hammer build recipes/incoming-cosmic/<pieza>.toml --store store
|
||||
./target/release/takana --store store hash recipes/incoming-cosmic/<pieza>.toml # dry-run, ~2ms
|
||||
./target/release/takana build recipes/incoming-cosmic/<pieza>.toml --store store
|
||||
```
|
||||
|
||||
## 🏔 EL ESCRITORIO ENTERO, DIBUJADO (2026-08-04)
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
- **Herramientas host**: `qemu-system-x86_64`, un kernel x86_64 (`/boot/vmlinuz-*`), `cpio`, `gzip`.
|
||||
- **Espacio/tiempo**: construir `arje-zero` vendorea las deps del **monorepo tawasuyu entero** — es
|
||||
pesado y lento la primera vez (se cachea después).
|
||||
- **El binario `hammer`**: `cargo build --release -p hammer-cli` ⇒ `./target/release/hammer`.
|
||||
- **El binario `hammer`**: `cargo build --release -p hammer-cli` ⇒ `./target/release/takana`.
|
||||
|
||||
> El store debe vivir en la raíz del repo (`./store`) para que `BuildConfig` resuelva
|
||||
> `.dev-fs/alpine` como hermano (`store/..` = repo root). El toolchain de Stage 1 **no** es el de
|
||||
@@ -35,7 +35,7 @@
|
||||
## 2. Stage 0 — ingerir la semilla (zig)
|
||||
|
||||
```sh
|
||||
export HAMMER=./target/release/hammer
|
||||
export HAMMER=./target/release/takana
|
||||
export STORE=./store
|
||||
|
||||
"$HAMMER" --store "$STORE" bootstrap stage0 \
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
# va en la lista de raíces por eso, no por completismo.
|
||||
set -eu
|
||||
ROOT="$(cd "$(dirname "$0")/.." && pwd)"; cd "$ROOT"
|
||||
H="$ROOT/target/release/hammer"
|
||||
H="$ROOT/target/release/takana"
|
||||
|
||||
# ── EL ROOTFS VA EN EL MISMO MOUNT QUE EL STORE, Y NO ES UN CAPRICHO ───────────────────────────
|
||||
# `hydrate` proyecta con HARDLINKS, y `linkat()` rechaza cruzar un punto de montaje aunque los dos
|
||||
|
||||
@@ -23,7 +23,7 @@ STORE="${STORE:-./store}"
|
||||
REPO="${REPO:-$ROOT/dist/repo}"
|
||||
KEY="${KEY:-$ROOT/dist/keys/release.ed25519}"
|
||||
DISTRO="${DISTRO:-dev}"
|
||||
HAMMER="${HAMMER:-$ROOT/target/release/hammer}"
|
||||
HAMMER="${HAMMER:-$ROOT/target/release/takana}"
|
||||
PROMOTE="${PROMOTE:-1}"
|
||||
JOBS="${JOBS:-$(( $(nproc) - 2 ))}"; [ "$JOBS" -ge 1 ] || JOBS=1
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
#
|
||||
# Uso: scripts/build-state.py # regenera docs/state/build-state.json + resumen
|
||||
# scripts/build-state.py --check # exit 1 si hay unhashable o deps huérfanas (gate CI)
|
||||
# Env: HAMMER (def target/release/hammer), STORE (def ./store).
|
||||
# Env: HAMMER (def target/release/takana), STORE (def ./store).
|
||||
import json, os, subprocess, sys, glob, tomllib
|
||||
from pathlib import Path
|
||||
|
||||
@@ -44,7 +44,7 @@ import yupana # la YUPANA: el motor de dependencias INVERSAS que cruza TODAS la
|
||||
|
||||
ROOT = Path(__file__).resolve().parent.parent
|
||||
os.chdir(ROOT)
|
||||
HAMMER = os.environ.get("HAMMER", str(ROOT / "target/release/hammer"))
|
||||
HAMMER = os.environ.get("HAMMER", str(ROOT / "target/release/takana"))
|
||||
STORE = os.environ.get("STORE", str(ROOT / "store"))
|
||||
CHECK = "--check" in sys.argv
|
||||
# `--kde`: además del corpus canónico, cubre la cola `recipes/incoming-kde/` (206 recetas del
|
||||
|
||||
+1
-1
@@ -57,7 +57,7 @@ while [ "$i" -le "$N" ]; do
|
||||
--exclude '*.png' --exclude '/content*' ./ "root@$ip:/opt/hammer/" >/dev/null 2>&1
|
||||
hN=$($SSH "root@$ip" "export PATH=\$HOME/.cargo/bin:\$PATH; cd /opt/hammer && \
|
||||
cargo build --release -q -p hammer-cli 2>/dev/null; \
|
||||
timeout ${POR:-900} ./target/release/hammer build $RECETA --store \$PWD/store 2>/dev/null \
|
||||
timeout ${POR:-900} ./target/release/takana build $RECETA --store \$PWD/store 2>/dev/null \
|
||||
| grep -oE '^b3:[a-f0-9]{64}' | head -1" 2>/dev/null | tr -d '\r')
|
||||
echo " → ${hN:-FALLÓ}"
|
||||
[ -n "$hN" ] && echo "$hN $name" >> "$OUT/$n.hashes"
|
||||
|
||||
@@ -53,7 +53,7 @@ mkdir -p "$OUT"
|
||||
# GL por software. Se resuelve por HASH VIGENTE (`hammer hash`), no por el más reciente del store:
|
||||
# con dos artefactos del mismo paquete conviviendo, la fecha miente.
|
||||
if [ -z "${MESA+x}" ]; then
|
||||
MH=$(./target/release/hammer --store ./store hash recipes/mesa-llvmpipe.toml 2>/dev/null | tr -d "\n" | sed "s/b3://")
|
||||
MH=$(./target/release/takana --store ./store hash recipes/mesa-llvmpipe.toml 2>/dev/null | tr -d "\n" | sed "s/b3://")
|
||||
MESA=$(ls -d store/"$MH"-mesa-llvmpipe 2>/dev/null || true)
|
||||
[ -n "${MESA:-}" ] || echo " ⚠ sin mesa-llvmpipe sellado: el compositor NO va a poder iniciar EGL" >&2
|
||||
fi
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
set -uo pipefail
|
||||
ROOT="$(cd "$(dirname "$0")/../.." && pwd)"; cd "$ROOT"
|
||||
RFS="${RFS:-work/cosmic-rootfs}"; STORE="${STORE:-./store}"; LINK="${LINK:-static}"
|
||||
HAMMER="${HAMMER:-./target/release/hammer}"; KEEP="${KEEP:-0}"
|
||||
HAMMER="${HAMMER:-./target/release/takana}"; KEEP="${KEEP:-0}"
|
||||
|
||||
if [ $# -gt 0 ]; then
|
||||
TARGETS=("$@")
|
||||
|
||||
@@ -80,7 +80,7 @@ ln -sf /usr/lib/musl/lib/libc.so "$MERGED/usr/lib/libc.musl-x86_64.so.1"
|
||||
# no habría tenido con quién hablar aunque el GL fuese perfecto. Se descubrió corriendo `cosmic-start`
|
||||
# sobre la imagen de metal por primera vez (antes sólo se validaba que llegara al prompt).
|
||||
echo "==> inyectando arje-logind-compat (el login1 del fractal) + su política"
|
||||
if ALC="${ALC:-store/$(./target/release/hammer --store store hash recipes/arje-logind-compat.toml 2>/dev/null | tail -1 | sed 's/^b3://')-arje-logind-compat}"; [ -d "$ALC" ]; then
|
||||
if ALC="${ALC:-store/$(./target/release/takana --store store hash recipes/arje-logind-compat.toml 2>/dev/null | tail -1 | sed 's/^b3://')-arje-logind-compat}"; [ -d "$ALC" ]; then
|
||||
install -Dm755 "$ALC"/usr/bin/arje-logind-compat "$MERGED"/usr/bin/arje-logind-compat
|
||||
install -d "$MERGED/usr/share/dbus-1/system.d"
|
||||
cp -a --remove-destination "$ALC"/usr/share/dbus-1/system.d/. "$MERGED"/usr/share/dbus-1/system.d/ 2>/dev/null || true
|
||||
|
||||
@@ -73,7 +73,7 @@ echo "==> inyectando arje-logind-compat (el login1 del fractal) + su política"
|
||||
# cosmic-comp pregunta por su sesión igual que mutter y kwin. El daemon no entra por el cierre porque
|
||||
# nadie lo declara como dep de build. Se elige por `hammer hash` —la receta de HOY—, no por el más
|
||||
# reciente del store. Su política D-Bus viaja DENTRO del artefacto desde 2026-07-30.
|
||||
if ALC="${ALC:-store/$(./target/release/hammer --store store hash recipes/arje-logind-compat.toml 2>/dev/null | tail -1 | sed 's/^b3://')-arje-logind-compat}"; [ -d "$ALC" ]; then
|
||||
if ALC="${ALC:-store/$(./target/release/takana --store store hash recipes/arje-logind-compat.toml 2>/dev/null | tail -1 | sed 's/^b3://')-arje-logind-compat}"; [ -d "$ALC" ]; then
|
||||
install -Dm755 "$ALC"/usr/bin/arje-logind-compat "$MERGED"/usr/bin/arje-logind-compat
|
||||
install -d "$MERGED/usr/share/dbus-1/system.d"
|
||||
cp -a --remove-destination "$ALC"/usr/share/dbus-1/system.d/. "$MERGED"/usr/share/dbus-1/system.d/ 2>/dev/null || true
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
#
|
||||
# Sale con el MISMO código que `hammer build` (transparente para el llamador).
|
||||
set -u
|
||||
HAMMER="${HAMMER:-./target/release/hammer}"
|
||||
HAMMER="${HAMMER:-./target/release/takana}"
|
||||
STORE="${STORE:-./store}"
|
||||
UMBRAL="${UMBRAL_TIEMPO:-3}"
|
||||
f="${1:?uso: build-timed.sh <receta.toml>}"
|
||||
|
||||
@@ -30,7 +30,7 @@ HAMMER_DIR="${HAMMER_DIR:-/opt/hammer}"
|
||||
# qué contener a este script, así que un `$0` relativo se pierde seguro.
|
||||
YO="$(cd "$(dirname "$0")" && pwd)/$(basename "$0")"
|
||||
cd "$HAMMER_DIR"
|
||||
HAMMER="${HAMMER:-$HAMMER_DIR/target/release/hammer}"
|
||||
HAMMER="${HAMMER:-$HAMMER_DIR/target/release/takana}"
|
||||
STORE="${STORE:-$HAMMER_DIR/store}"
|
||||
LOG="${LOG:-/var/log/campana-deuda.log}"
|
||||
|
||||
|
||||
@@ -78,7 +78,7 @@ if [ -s "$FLEET_FIJA" ]; then
|
||||
{ grep -vE '^[[:space:]]*(#|$)' "$FLEET_FIJA" || true; cat "$FLEET" 2>/dev/null || true; } \
|
||||
| awk 'NF && !visto[$1]++' > "$FLEET.seed" && mv "$FLEET.seed" "$FLEET"
|
||||
fi
|
||||
HAMMER="${HAMMER:-$ROOT/target/release/hammer}"
|
||||
HAMMER="${HAMMER:-$ROOT/target/release/takana}"
|
||||
# Workers efímeros reciclan IPs ⇒ no fijar known_hosts (hub-and-spoke, worker sin secretos).
|
||||
SSH="ssh -i $SSH_KEY -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o BatchMode=yes -o LogLevel=ERROR -o ConnectTimeout=15"
|
||||
|
||||
|
||||
@@ -60,8 +60,8 @@ $SSH "root@$IP" "cd $REMOTE && . \$HOME/.cargo/env 2>/dev/null
|
||||
cargo build --release --bin takana --bin hammer 2>&1 | tail -2"
|
||||
|
||||
log "4/4 EVIDENCIA: ¿el worker sella en la misma dirección que el hub?"
|
||||
h_hub=$("$ROOT/target/release/hammer" --store "$ROOT/store" hash "$TESTIGO" | tail -1)
|
||||
h_w=$($SSH "root@$IP" "cd $REMOTE && ./target/release/hammer --store ./store hash $TESTIGO 2>&1 | tail -1")
|
||||
h_hub=$("$ROOT/target/release/takana" --store "$ROOT/store" hash "$TESTIGO" | tail -1)
|
||||
h_w=$($SSH "root@$IP" "cd $REMOTE && ./target/release/takana --store ./store hash $TESTIGO 2>&1 | tail -1")
|
||||
echo " hub : $h_hub"
|
||||
echo " worker : $h_w"
|
||||
if [ "$h_hub" = "$h_w" ]; then
|
||||
|
||||
@@ -191,7 +191,7 @@ fi
|
||||
# esto cuesta un `find`.
|
||||
rebuild_si_hace_falta() {
|
||||
command -v cargo >/dev/null 2>&1 || return 0
|
||||
bin=target/release/hammer
|
||||
bin=target/release/takana
|
||||
[ -x "$bin" ] || { echo "$(date -u +%FT%TZ) no hay binario: compilando"; cargo build --release --bin takana --bin hammer -j"$JOBS" 2>&1 | tail -2; return 0; }
|
||||
# ¿Algún fuente más nuevo que el binario? (Cargo.lock incluido: un bump de dep también cuenta.)
|
||||
if [ -n "$(find crates Cargo.toml Cargo.lock -newer "$bin" -type f -print -quit 2>/dev/null)" ]; then
|
||||
|
||||
@@ -28,7 +28,7 @@ export HARKAQ_TIMEOUT="${HARKAQ_TIMEOUT:-300}"
|
||||
# SinEvidencia (o cero) en silencio — el falso `Hermetico` de D9 mudado al orquestador.
|
||||
abi=$(python3 -c 'import ctypes;print(ctypes.CDLL("libc.so.6").syscall(444,None,0,1))' 2>/dev/null)
|
||||
[ "${abi:-0}" -ge 7 ] || { echo "ABORTO: Landlock ABI ${abi:-?} < 7"; exit 4; }
|
||||
strings ./target/release/hammer 2>/dev/null | grep -q harkaq || { echo "ABORTO: el binario no tiene la jaula"; exit 4; }
|
||||
strings ./target/release/takana 2>/dev/null | grep -q harkaq || { echo "ABORTO: el binario no tiene la jaula"; exit 4; }
|
||||
echo "$(date -u +%FT%TZ) campaña-vol: ABI $abi, jaula ✓, auto-shutdown tras $IDLE_CICLOS ciclos idle"
|
||||
|
||||
autodestruir() {
|
||||
@@ -59,7 +59,7 @@ while :; do
|
||||
|
||||
tmp="recipes/.hk-$n.toml"
|
||||
sed "s/^name *= *\"$n\"/name = \"$n-hkm\"/" "recipes/$n.toml" > "$tmp"
|
||||
timeout "$POR_RECETA" ./target/release/hammer build "$tmp" --store "$PWD/store" \
|
||||
timeout "$POR_RECETA" ./target/release/takana build "$tmp" --store "$PWD/store" \
|
||||
> "$OUT/$n.log" 2>&1
|
||||
rm -f "$tmp"
|
||||
# El sufijo -hkm sella un artefacto que después pega en caché y bloquea la re-medición
|
||||
|
||||
@@ -38,15 +38,15 @@ if [ "${abi:-0}" -lt 7 ]; then
|
||||
exit 4
|
||||
fi
|
||||
|
||||
# Gate 2: ¿el binario TIENE harkaq dentro? La golden hornea un `target/release/hammer` viejo y el
|
||||
# Gate 2: ¿el binario TIENE harkaq dentro? La golden hornea un `target/release/takana` viejo y el
|
||||
# rsync excluye /target ⇒ si el `cargo build` del provisioning no corrió, el worker construye
|
||||
# alegremente SIN LA JAULA y produce cero veredictos. Pasó: la primera corrida molió 2 recetas con
|
||||
# un binario del 29/06 (0 ocurrencias de "harkaq") y las marcó "sin veredicto" como si fuera culpa
|
||||
# de las recetas. Ocho horas así son la noche entera perdida — y el log diría "salteada", nunca
|
||||
# "estoy ciego". Es el falso `Hermetico` de D9 mudado al orquestador: la ausencia como respuesta
|
||||
# tranquilizadora.
|
||||
if ! strings ./target/release/hammer 2>/dev/null | grep -q harkaq; then
|
||||
echo "ABORTO: ./target/release/hammer NO tiene harkaq compilado (¿corrió el cargo build?)."
|
||||
if ! strings ./target/release/takana 2>/dev/null | grep -q harkaq; then
|
||||
echo "ABORTO: ./target/release/takana NO tiene harkaq compilado (¿corrió el cargo build?)."
|
||||
echo " Sin esto la campaña muele sin jaula y produce 0 veredictos, en silencio."
|
||||
exit 4
|
||||
fi
|
||||
@@ -64,7 +64,7 @@ while :; do
|
||||
# rompe la resolución de deps.build, que son relativas al dir de la receta.
|
||||
tmp="recipes/.hk-$n.toml"
|
||||
sed "s/^name *= *\"$n\"/name = \"$n-hkm\"/" "recipes/$n.toml" > "$tmp"
|
||||
timeout "$POR_RECETA" ./target/release/hammer build "$tmp" --store "$PWD/store" \
|
||||
timeout "$POR_RECETA" ./target/release/takana build "$tmp" --store "$PWD/store" \
|
||||
> "$OUT/$n.log" 2>&1
|
||||
rm -f "$tmp"
|
||||
grep '^\[harkaq\] {' "$OUT/$n.log" | sed 's/^\[harkaq\] //' > "$OUT/$n.verdicts"
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
#
|
||||
# Uso (cron): */DohubVPS cd /home/sergio/hammer && scripts/farm/harvest-go.sh root@1.2.3.4 >>work/harvest-go.log 2>&1
|
||||
# Env: SSH_KEY (def ~/.ssh/github5), REMOTE (def /opt/hammer), STORE (def ./store), REPO (def dist/repo),
|
||||
# KEY (def dist/keys/release.ed25519), DISTRO (def dev), HAMMER (def target/release/hammer),
|
||||
# KEY (def dist/keys/release.ed25519), DISTRO (def dev), HAMMER (def target/release/takana),
|
||||
# SEAL_TIMEOUT (def 60s: techo del cache-hit; más = sería build local ⇒ skip).
|
||||
set -u
|
||||
|
||||
@@ -29,7 +29,7 @@ STORE="${STORE:-$ROOT/store}"
|
||||
REPO="${REPO:-$ROOT/dist/repo}"
|
||||
KEY="${KEY:-$ROOT/dist/keys/release.ed25519}"
|
||||
DISTRO="${DISTRO:-dev}"
|
||||
HAMMER="${HAMMER:-$ROOT/target/release/hammer}"
|
||||
HAMMER="${HAMMER:-$ROOT/target/release/takana}"
|
||||
SEAL_TIMEOUT="${SEAL_TIMEOUT:-60}"
|
||||
QUEUE="recipes/incoming-go"
|
||||
REVIEW="tandas/needs-review-weekend"
|
||||
|
||||
@@ -23,11 +23,11 @@
|
||||
# Uso: scripts/farm/saldar-deuda-static.sh # construye toda la deuda
|
||||
# DRY=1 scripts/farm/saldar-deuda-static.sh # sólo LISTA la deuda, no construye
|
||||
# SKIP_GUI=1 scripts/farm/saldar-deuda-static.sh # salta el stack GUI (default si no hay DISPLAY-cap)
|
||||
# Env: HAMMER (def target/release/hammer), STORE (def ./store), JOBS no aplica (serie, por deps).
|
||||
# Env: HAMMER (def target/release/takana), STORE (def ./store), JOBS no aplica (serie, por deps).
|
||||
set -u
|
||||
|
||||
ROOT="$(cd "$(dirname "$0")/../.." && pwd)"; cd "$ROOT"
|
||||
HAMMER="${HAMMER:-$ROOT/target/release/hammer}"
|
||||
HAMMER="${HAMMER:-$ROOT/target/release/takana}"
|
||||
STORE="${STORE:-$ROOT/store}"
|
||||
DRY="${DRY:-0}"
|
||||
# El stack GUI no construye en el laptop (zig-skew rompe cairo). Default: saltarlo salvo que se pida.
|
||||
|
||||
@@ -137,7 +137,7 @@ if ! command -v cargo >/dev/null 2>&1; then
|
||||
fi
|
||||
. "$HOME/.cargo/env"
|
||||
|
||||
echo "==> 5. build hammer (target/release/hammer)"
|
||||
echo "==> 5. build hammer (target/release/takana)"
|
||||
cargo build --release --bin takana --bin hammer
|
||||
|
||||
echo "==> 6. rootfs Alpine edge + zig (bootstrap reproducible; varios min la 1ra vez)"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# mirror-env.sh — activa el mirror de fuentes (ADR 0013). Se hace `source`, no se ejecuta:
|
||||
#
|
||||
# . scripts/fuentes/mirror-env.sh
|
||||
# flock work/.farm-build.lock ./target/release/hammer --store ./store build <receta>
|
||||
# flock work/.farm-build.lock ./target/release/takana --store ./store build <receta>
|
||||
#
|
||||
# Sin esto `hammer build` va derecho a upstream, que es el comportamiento de siempre: el mirror es
|
||||
# ADITIVO y su ausencia nunca rompe un build. Por eso no está horneado en el binario — un default
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
set -uo pipefail
|
||||
ROOT="$(cd "$(dirname "$0")/../.." && pwd)"; cd "$ROOT"
|
||||
RFS="${RFS:-work/gnome-rootfs}"; STORE="${STORE:-./store}"; LINK="${LINK:-static}"
|
||||
HAMMER="${HAMMER:-./target/release/hammer}"; KEEP="${KEEP:-0}"
|
||||
HAMMER="${HAMMER:-./target/release/takana}"; KEEP="${KEEP:-0}"
|
||||
# Por defecto se hidratan DOS raíces, no una. accountsservice no es dep de build de gnome-shell —no
|
||||
# aparece en su meson.build ni en su cierre— sino dep de RUNTIME: la capa JS del shell hace
|
||||
# `imports.gi.AccountsService` y gjs resuelve el typelib al arrancar. Todo lo que el shell carga por
|
||||
|
||||
@@ -102,7 +102,7 @@ echo "==> inyectando arje-logind-compat (el login1 del fractal)"
|
||||
if [ -n "${ALC_BIN:-}" ] && [ -x "$ALC_BIN" ]; then
|
||||
install -Dm755 "$ALC_BIN" "$MERGED"/usr/bin/arje-logind-compat
|
||||
echo " ⚠ binario LOCAL (no sellado): $ALC_BIN"
|
||||
elif ALC="${ALC:-store/$(./target/release/hammer --store store hash recipes/arje-logind-compat.toml 2>/dev/null | tail -1 | sed 's/^b3://')-arje-logind-compat}"; [ -d "$ALC" ]; then
|
||||
elif ALC="${ALC:-store/$(./target/release/takana --store store hash recipes/arje-logind-compat.toml 2>/dev/null | tail -1 | sed 's/^b3://')-arje-logind-compat}"; [ -d "$ALC" ]; then
|
||||
install -Dm755 "$ALC"/usr/bin/arje-logind-compat "$MERGED"/usr/bin/arje-logind-compat
|
||||
# …y su POLÍTICA D-Bus, que desde 2026-07-30 viaja en el artefacto. Se copia, no se escribe: el
|
||||
# dueño del fichero es el paquete. Ojo — inyectar «sólo el binario» era el bug que destapó la
|
||||
@@ -128,7 +128,7 @@ echo "==> inyectando arje-polkit-compat (el PolicyKit1 del fractal) + su políti
|
||||
# libs-only a propósito (el demonio lo pone arje), así que nadie servía ese nombre y gnome-shell
|
||||
# esperaba 25 s por cada uno.
|
||||
# ⚠ El shim autoriza TODO (postura de sistema confiado ya tomada por arje) — ver su receta.
|
||||
if APC="${APC:-store/$(./target/release/hammer --store store hash recipes/arje-polkit-compat.toml 2>/dev/null | tail -1 | sed 's/^b3://')-arje-polkit-compat}"; [ -d "$APC" ]; then
|
||||
if APC="${APC:-store/$(./target/release/takana --store store hash recipes/arje-polkit-compat.toml 2>/dev/null | tail -1 | sed 's/^b3://')-arje-polkit-compat}"; [ -d "$APC" ]; then
|
||||
install -Dm755 "$APC"/usr/bin/arje-polkit-compat "$MERGED"/usr/bin/arje-polkit-compat
|
||||
install -d "$MERGED/usr/share/dbus-1/system.d"
|
||||
cp -a --remove-destination "$APC"/usr/share/dbus-1/system.d/. "$MERGED"/usr/share/dbus-1/system.d/ 2>/dev/null || true
|
||||
|
||||
@@ -16,14 +16,14 @@
|
||||
# de Opus, se coordina allá. Este script existe para medir HOY la señal declaradas-vs-usadas.
|
||||
#
|
||||
# uso: harkaq-trace-build.sh <receta.toml> [store] [outdir]
|
||||
# env: HAMMER (def ./target/release/hammer), TRACE (def /tmp/harkaq-trace), NORM (def
|
||||
# env: HAMMER (def ./target/release/takana), TRACE (def /tmp/harkaq-trace), NORM (def
|
||||
# scripts/harkaq/harkaq-trace-norm.py)
|
||||
# deja en outdir: traza-fase-N.txt (crudas), canonica.txt, sello.txt, resumen.txt
|
||||
set -euo pipefail
|
||||
RECETA="${1:?uso: harkaq-trace-build.sh <receta.toml> [store] [outdir]}"
|
||||
STORE="${2:-./store}"
|
||||
OUT="${3:-/tmp/harkaq-trace-pilot}"
|
||||
HAMMER="${HAMMER:-./target/release/hammer}"
|
||||
HAMMER="${HAMMER:-./target/release/takana}"
|
||||
TRACE="${TRACE:-/tmp/harkaq-trace}"
|
||||
NORM="${NORM:-scripts/harkaq/harkaq-trace-norm.py}"
|
||||
mkdir -p "$OUT"; rm -f "$OUT"/traza-fase-*.txt "$OUT"/canonica.txt "$OUT"/resumen.txt
|
||||
|
||||
@@ -34,7 +34,7 @@ import yupana
|
||||
import targets as targets_mod
|
||||
|
||||
ROOT = yupana.ROOT
|
||||
HAMMER = str(ROOT / "target/release/hammer")
|
||||
HAMMER = str(ROOT / "target/release/takana")
|
||||
|
||||
|
||||
def opcion(nombre, defecto=None):
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
set -uo pipefail
|
||||
ROOT="$(cd "$(dirname "$0")/../.." && pwd)"; cd "$ROOT"
|
||||
STORE="${STORE:-./store}"; RFS="${RFS:-work/kde-store-rootfs}"; LINK="${LINK:-static}"
|
||||
HAMMER="${HAMMER:-./target/release/hammer}"
|
||||
HAMMER="${HAMMER:-./target/release/takana}"
|
||||
CUTOFF="${CUTOFF:-$(date -d 'today 00:00' +%s 2>/dev/null || echo 9999999999)}"
|
||||
# sonames provistos por la base (no soberanos aún / runtime del sistema): no hidratar.
|
||||
BASE_SONAMES="libc.so libc.musl-x86_64.so.1 ld-musl-x86_64.so.1 libc.so.6 ld-linux-x86-64.so.2 libm.so.6 libdl.so.2 libpthread.so.0 librt.so.1 libresolv.so.2"
|
||||
|
||||
@@ -16,7 +16,7 @@ REPO="${REPO:-work/repo-kde}"; TRUST="${TRUST:-dist/keys}"; STORE="${STORE:-./st
|
||||
RFS="${RFS:-work/kde-rootfs}"
|
||||
# TARGETS = uno o varios paquetes tope (unión de cierres). TARGET (singular) sigue soportado.
|
||||
TARGETS="${TARGETS:-${TARGET:-qt6-qtdeclarative}}"
|
||||
HAMMER="${HAMMER:-./target/release/hammer}"
|
||||
HAMMER="${HAMMER:-./target/release/takana}"
|
||||
DB="$RFS/var/lib/hammer/installed.json"
|
||||
|
||||
# cierre transitivo de TODOS los targets, leído del índice (deps + aliases ya resuelven). Excluimos
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
set -uo pipefail
|
||||
ROOT="$(cd "$(dirname "$0")/../.." && pwd)"; cd "$ROOT"
|
||||
REPO="${REPO:-work/repo-kde}"; STORE="${STORE:-./store}"; LINK="${LINK:-static}"
|
||||
RFS="${RFS:-work/kde-store-rootfs}"; HAMMER="${HAMMER:-./target/release/hammer}"
|
||||
RFS="${RFS:-work/kde-store-rootfs}"; HAMMER="${HAMMER:-./target/release/takana}"
|
||||
TARGETS="${TARGETS:-${TARGET:-qt6-qtdeclarative}}"
|
||||
# CUTOFF: por defecto medianoche de hoy (excluye rebuilds de la sesión). Pasá 9999999999 para no filtrar.
|
||||
CUTOFF="${CUTOFF:-$(date -d 'today 00:00' +%s 2>/dev/null || echo 9999999999)}"
|
||||
|
||||
@@ -30,7 +30,7 @@ inyectar_libs_compartidas() {
|
||||
recetas="${LIBS_COMPARTIDAS:-libffi-shared expat-shared bzip2-shared}"
|
||||
echo "==> libs compartidas del store (el cierre sólo trae los .a)"
|
||||
for n in $recetas; do
|
||||
hash=$(./target/release/hammer --store store hash "recipes/$n.toml" 2>/dev/null | tail -1 | sed 's/^b3://')
|
||||
hash=$(./target/release/takana --store store hash "recipes/$n.toml" 2>/dev/null | tail -1 | sed 's/^b3://')
|
||||
dir="store/$hash-$n"
|
||||
if [ -n "$hash" ] && [ -d "$dir" ]; then
|
||||
cp -a --remove-destination "$dir"/usr/lib/*.so* "$merged"/usr/lib/ 2>/dev/null || true
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
inyectar_pid1() {
|
||||
local merged="$1" base="${2:-}" az
|
||||
echo "==> PID1: arje-zero desde el store${base:+ (no desde $base)}"
|
||||
az="${AZ:-store/$(./target/release/hammer --store store hash recipes/arje-zero.toml 2>/dev/null | tail -1 | sed 's/^b3://')-arje-zero}"
|
||||
az="${AZ:-store/$(./target/release/takana --store store hash recipes/arje-zero.toml 2>/dev/null | tail -1 | sed 's/^b3://')-arje-zero}"
|
||||
if [ -d "$az" ] && [ -x "$az/usr/bin/arje-zero" ]; then
|
||||
install -Dm755 "$az"/usr/bin/arje-zero "$merged"/usr/bin/arje-zero
|
||||
local viejo=""
|
||||
@@ -38,7 +38,7 @@ inyectar_pid1() {
|
||||
echo " ✓ $(basename "$az" | cut -c1-12)${viejo:+ (el de $base era de $viejo)}"
|
||||
else
|
||||
echo " ✗ falta arje-zero sellado en store/ — la imagen usaría el PID1 CONGELADO${base:+ de $base}" >&2
|
||||
echo " construílo: ./target/release/hammer build recipes/arje-zero.toml --store store" >&2
|
||||
echo " construílo: ./target/release/takana build recipes/arje-zero.toml --store store" >&2
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@ ROOT="$(cd "$(dirname "$0")/.." && pwd)"; cd "$ROOT"
|
||||
STORE="${STORE:-./store}"
|
||||
DEVFS="${DEVFS:-.dev-fs/alpine}"
|
||||
RFS="${RFS:-work/mirada-rootfs}"
|
||||
HAMMER="${HAMMER:-target/release/hammer}"
|
||||
HAMMER="${HAMMER:-target/release/takana}"
|
||||
PACKAGE="${PACKAGE:-1}"
|
||||
|
||||
[ -d "$DEVFS" ] || { echo "no existe $DEVFS (corré scripts/bootstrap-devfs.sh)" >&2; exit 1; }
|
||||
|
||||
@@ -37,7 +37,7 @@ for pkg in $PKGS_LIST; do
|
||||
printf " - %-16s (no está en el repo, salteado)\n" "$pkg"; skip=$((skip+1)); continue
|
||||
fi
|
||||
if NO_PROXY=localhost NIX_STORE="${NIX_STORE:-$HOME/.nixstore}" \
|
||||
"$ROOT/target/release/hammer" --store "$STORE" install "$pkg" \
|
||||
"$ROOT/target/release/takana" --store "$STORE" install "$pkg" \
|
||||
--repo "$REPO" --prefix "$RFS" --trust "$TRUST" --require-signed --db "$DB" \
|
||||
>/dev/null 2>"$RFS/.install-$pkg.log"; then
|
||||
printf " ✓ %-16s\n" "$pkg"; ok=$((ok+1)); got="$got $pkg"
|
||||
|
||||
+1
-1
@@ -42,7 +42,7 @@ import yupana
|
||||
|
||||
ROOT = yupana.ROOT
|
||||
STORE = os.environ.get("HAMMER_STORE", str(ROOT / "store"))
|
||||
HAMMER = str(ROOT / "target/release/hammer")
|
||||
HAMMER = str(ROOT / "target/release/takana")
|
||||
CACHE = ROOT / "work/provee-cache.json"
|
||||
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
set -eu
|
||||
|
||||
QORPA_ROOT="${HAMMER_QORPA_ROOT:-/var/lib/hammer/qorpa}"
|
||||
HAMMER="${HAMMER_BIN:-./target/release/hammer}"
|
||||
HAMMER="${HAMMER_BIN:-./target/release/takana}"
|
||||
ID="${1:-arch-probe}"
|
||||
export HAMMER_QORPA_ROOT="$QORPA_ROOT"
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
set -eu
|
||||
|
||||
QORPA_ROOT="${HAMMER_QORPA_ROOT:-/var/lib/hammer/qorpa}"
|
||||
HAMMER="${HAMMER_BIN:-./target/release/hammer}"
|
||||
HAMMER="${HAMMER_BIN:-./target/release/takana}"
|
||||
ID="${1:-sniper-probe}"
|
||||
|
||||
UBUNTU_URL="https://cdimage.ubuntu.com/ubuntu-base/releases/24.04/release/ubuntu-base-24.04.3-base-amd64.tar.gz"
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
set -uo pipefail
|
||||
|
||||
ROOT="$(cd "$(dirname "$0")/.." && pwd)"; cd "$ROOT"
|
||||
HAMMER="${HAMMER:-$ROOT/target/release/hammer}"
|
||||
HAMMER="${HAMMER:-$ROOT/target/release/takana}"
|
||||
STORE="${STORE:-./store}"
|
||||
LOCK="$ROOT/work/.farm-build.lock"
|
||||
LOG="${LOG:-$ROOT/work/reconstruccion.log}"
|
||||
|
||||
@@ -37,7 +37,7 @@ set -eu
|
||||
HUB="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
cd "$HUB"
|
||||
STORE="${STORE:-$PWD/store}"
|
||||
HAMMER="${HAMMER:-$HUB/target/release/hammer}"
|
||||
HAMMER="${HAMMER:-$HUB/target/release/takana}"
|
||||
|
||||
if [ $# -gt 0 ]; then
|
||||
recetas=""
|
||||
|
||||
+2
-2
@@ -35,10 +35,10 @@
|
||||
#
|
||||
# Uso: scripts/store-gc.sh [--aplicar] [--huerfanos]
|
||||
# (sin --aplicar es un DRY-RUN: mide y no borra)
|
||||
# Env: STORE (def ./store) HAMMER (def ./target/release/hammer) JOBS (def 8)
|
||||
# Env: STORE (def ./store) HAMMER (def ./target/release/takana) JOBS (def 8)
|
||||
set -uo pipefail
|
||||
ROOT="$(cd "$(dirname "$0")/.." && pwd)"; cd "$ROOT"
|
||||
STORE="${STORE:-./store}"; HAMMER="${HAMMER:-./target/release/hammer}"; JOBS="${JOBS:-8}"
|
||||
STORE="${STORE:-./store}"; HAMMER="${HAMMER:-./target/release/takana}"; JOBS="${JOBS:-8}"
|
||||
APLICAR=0; HUERFANOS=0
|
||||
for a in "$@"; do
|
||||
case "$a" in
|
||||
|
||||
@@ -35,7 +35,7 @@ import zipfile
|
||||
ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
RFS = os.environ.get("RFS", "/mnt/cosecha/escritorios/atuq-rootfs")
|
||||
ALPINE = os.path.join(ROOT, ".dev-fs/alpine")
|
||||
HAMMER = os.path.join(ROOT, "target/release/hammer")
|
||||
HAMMER = os.path.join(ROOT, "target/release/takana")
|
||||
STORE = os.environ.get("HAMMER_STORE", os.path.join(ROOT, "store"))
|
||||
|
||||
EXT_ID = "sonda-inicio@atuq.tawasuyu"
|
||||
|
||||
@@ -47,7 +47,7 @@ import zipfile
|
||||
ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
RFS = os.environ.get("RFS", "/mnt/cosecha/escritorios/atuq-rootfs")
|
||||
ALPINE = os.path.join(ROOT, ".dev-fs/alpine")
|
||||
HAMMER = os.path.join(ROOT, "target/release/hammer")
|
||||
HAMMER = os.path.join(ROOT, "target/release/takana")
|
||||
STORE = os.environ.get("HAMMER_STORE", os.path.join(ROOT, "store"))
|
||||
|
||||
EXT_ID = "nativa@atuq.tawasuyu"
|
||||
|
||||
@@ -48,7 +48,7 @@ import sys
|
||||
ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
RFS = os.environ.get("RFS", "/mnt/cosecha/escritorios/atuq-rootfs")
|
||||
STORE = os.environ.get("HAMMER_STORE", os.path.join(ROOT, "store"))
|
||||
HAMMER = os.path.join(ROOT, "target/release/hammer")
|
||||
HAMMER = os.path.join(ROOT, "target/release/takana")
|
||||
|
||||
# Lo que el corpus NO provee y las imágenes copian del devfs. Documentado, no olvidado.
|
||||
DEL_LAB = {"libc.so", "libc.musl-x86_64.so.1", "ld-musl-x86_64.so.1"}
|
||||
|
||||
@@ -56,7 +56,7 @@ import time
|
||||
ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
RFS = os.environ.get("RFS", "/mnt/cosecha/escritorios/atuq-rootfs")
|
||||
ALPINE = os.path.join(ROOT, ".dev-fs/alpine")
|
||||
HAMMER = os.path.join(ROOT, "target/release/hammer")
|
||||
HAMMER = os.path.join(ROOT, "target/release/takana")
|
||||
STORE = os.path.join(ROOT, "store")
|
||||
# ── LOS PUERTOS LOS ELIGE EL SISTEMA, Y NO ES UN DETALLE ──────────────────────────────────────
|
||||
# Estaban fijos en 8099/9099 y el 2026-09-07 esta prueba dio «NO concluyente» durante media hora por
|
||||
|
||||
@@ -29,7 +29,7 @@ trap fin EXIT
|
||||
# hace pasar por el actual y la prueba mide otra cosa. Y es, además, la demostración de para qué
|
||||
# sirve el control: sin él eso se habría leído como "4 en verde, guardianes ok".
|
||||
art() {
|
||||
h=$(./target/release/hammer --store "$STORE" hash "recipes/$1.toml" 2>/dev/null | tail -1)
|
||||
h=$(./target/release/takana --store "$STORE" hash "recipes/$1.toml" 2>/dev/null | tail -1)
|
||||
h=${h#b3:}
|
||||
[ -n "$h" ] && [ -d "$STORE/$h-$1" ] && printf '%s' "$STORE/$h-$1"
|
||||
}
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
# Env: STORE (def ./store) N (def 30, tamaño de la muestra)
|
||||
set -uo pipefail
|
||||
ROOT="$(cd "$(dirname "$0")/.." && pwd)"; cd "$ROOT"
|
||||
STORE="${STORE:-./store}"; HAMMER="${HAMMER:-./target/release/hammer}"; N="${N:-30}"
|
||||
STORE="${STORE:-./store}"; HAMMER="${HAMMER:-./target/release/takana}"; N="${N:-30}"
|
||||
|
||||
# ── EL LOCK LO TOMA EL SCRIPT, Y ANTES DE TOCAR NADA ───────────────────────────────────────────
|
||||
# Este script llama a `hammer build`, y la regla 1 del repo es que todo build va envuelto en el
|
||||
|
||||
@@ -57,7 +57,7 @@ import targets as targets_mod
|
||||
|
||||
ROOT = yupana.ROOT
|
||||
STORE = os.environ.get("HAMMER_STORE", str(ROOT / "store"))
|
||||
HAMMER = str(ROOT / "target/release/hammer")
|
||||
HAMMER = str(ROOT / "target/release/takana")
|
||||
|
||||
# Invariantes que un perfil NO cumple A PROPÓSITO. Un ✗ permanente por una decisión ya tomada es
|
||||
# deuda fantasma —la misma figura que la terna GNOME que hubo que sacar de targets.toml para que el
|
||||
|
||||
@@ -43,7 +43,7 @@ import targets as targets_mod
|
||||
|
||||
ROOT = yupana.ROOT
|
||||
STORE = os.environ.get("HAMMER_STORE", str(ROOT / "store"))
|
||||
HAMMER = str(ROOT / "target/release/hammer")
|
||||
HAMMER = str(ROOT / "target/release/takana")
|
||||
|
||||
_cache = {}
|
||||
def artefacto(cola, nombre):
|
||||
|
||||
@@ -38,7 +38,7 @@ import sys
|
||||
|
||||
RAIZ = pathlib.Path(__file__).resolve().parent.parent
|
||||
STORE = RAIZ / "store"
|
||||
HAMMER = RAIZ / "target/release/hammer"
|
||||
HAMMER = RAIZ / "target/release/takana"
|
||||
LIMITE = int(os.environ.get("LIMITE", "0"))
|
||||
SALIDA_JSON = os.environ.get("JSON")
|
||||
# Un artefacto puede pesar GB (qt6, kernels): hashearlo entero para el barrido no aporta.
|
||||
|
||||
Reference in New Issue
Block a user