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:
Sergio
2026-09-09 18:25:58 +00:00
parent 7b6da600d6
commit 8730aad34e
49 changed files with 64 additions and 64 deletions
+2 -2
View File
@@ -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
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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)
+2 -2
View File
@@ -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 \
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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
View File
@@ -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"
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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=("$@")
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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>}"
+1 -1
View File
@@ -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}"
+1 -1
View File
@@ -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"
+2 -2
View File
@@ -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
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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
+4 -4
View File
@@ -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"
+2 -2
View File
@@ -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"
+2 -2
View File
@@ -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.
+1 -1
View File
@@ -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 -1
View File
@@ -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
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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
+1 -1
View File
@@ -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):
+1 -1
View File
@@ -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"
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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)}"
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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
}
+1 -1
View File
@@ -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; }
+1 -1
View File
@@ -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
View File
@@ -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"
+1 -1
View File
@@ -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"
+1 -1
View File
@@ -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"
+1 -1
View File
@@ -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}"
+1 -1
View File
@@ -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
View File
@@ -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
+1 -1
View File
@@ -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"
+1 -1
View File
@@ -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"
+1 -1
View File
@@ -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"}
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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"
}
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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):
+1 -1
View File
@@ -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.