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 1173Shell 64Rust 62Markdown 441482 Definitions

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.

8730aad34e868068796f9c85ca4e4c89cfb43fa6 · by Sergio · (1 month ago) · parent 7b6da600d · browse the tree at this commit

Semantic delta

No definition changed: this change is text, documentation or data.

49 files · +64 −64

diff --git a/CLAUDE.md b/CLAUDE.md
index 90deb40e..81887b0f 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -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
diff --git a/docs/runbooks/armador-de-kernel.md b/docs/runbooks/armador-de-kernel.md
index 2891a34d..68006d3b 100644
--- a/docs/runbooks/armador-de-kernel.md
+++ b/docs/runbooks/armador-de-kernel.md
@@ -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
diff --git a/docs/runbooks/cosmic-desktop.md b/docs/runbooks/cosmic-desktop.md
index b792f254..baaaa44f 100644
--- a/docs/runbooks/cosmic-desktop.md
+++ b/docs/runbooks/cosmic-desktop.md
@@ -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)
diff --git a/docs/runbooks/stage1-vm-boot.md b/docs/runbooks/stage1-vm-boot.md
index f9a1aa19..51e5930e 100644
--- a/docs/runbooks/stage1-vm-boot.md
+++ b/docs/runbooks/stage1-vm-boot.md
@@ -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 \
diff --git a/scripts/atuq-nested.sh b/scripts/atuq-nested.sh
index d6371c98..2e0d9f5a 100755
--- a/scripts/atuq-nested.sh
+++ b/scripts/atuq-nested.sh
@@ -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
diff --git a/scripts/build-farm.sh b/scripts/build-farm.sh
index 47851bfc..05dfac88 100755
--- a/scripts/build-farm.sh
+++ b/scripts/build-farm.sh
@@ -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
 
diff --git a/scripts/build-state.py b/scripts/build-state.py
index 63bf7601..e53c68b5 100755
--- a/scripts/build-state.py
+++ b/scripts/build-state.py
@@ -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
diff --git a/scripts/consenso.sh b/scripts/consenso.sh
index 556e83b6..513c5dc6 100755
--- a/scripts/consenso.sh
+++ b/scripts/consenso.sh
@@ -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"
diff --git a/scripts/cosmic/cosmic-nested.sh b/scripts/cosmic/cosmic-nested.sh
index f711b1d9..a4d7ce03 100755
--- a/scripts/cosmic/cosmic-nested.sh
+++ b/scripts/cosmic/cosmic-nested.sh
@@ -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
diff --git a/scripts/cosmic/hydrate-cosmic.sh b/scripts/cosmic/hydrate-cosmic.sh
index e329bba4..6b6d1905 100755
--- a/scripts/cosmic/hydrate-cosmic.sh
+++ b/scripts/cosmic/hydrate-cosmic.sh
@@ -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=("$@")
diff --git a/scripts/cosmic/metal-desktop-image.sh b/scripts/cosmic/metal-desktop-image.sh
index d47da48e..fea89890 100755
--- a/scripts/cosmic/metal-desktop-image.sh
+++ b/scripts/cosmic/metal-desktop-image.sh
@@ -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
diff --git a/scripts/cosmic/qemu-desktop-image.sh b/scripts/cosmic/qemu-desktop-image.sh
index e26d422c..8e703283 100755
--- a/scripts/cosmic/qemu-desktop-image.sh
+++ b/scripts/cosmic/qemu-desktop-image.sh
@@ -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
diff --git a/scripts/farm/build-timed.sh b/scripts/farm/build-timed.sh
index 6c5c57c7..6e25d6ac 100755
--- a/scripts/farm/build-timed.sh
+++ b/scripts/farm/build-timed.sh
@@ -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>}"
diff --git a/scripts/farm/campana-deuda.sh b/scripts/farm/campana-deuda.sh
index 1430e7ea..e94f2446 100755
--- a/scripts/farm/campana-deuda.sh
+++ b/scripts/farm/campana-deuda.sh
@@ -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}"
 
diff --git a/scripts/farm/cosecha-cron.sh b/scripts/farm/cosecha-cron.sh
index ed68a4bf..aa171d12 100755
--- a/scripts/farm/cosecha-cron.sh
+++ b/scripts/farm/cosecha-cron.sh
@@ -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"
 
diff --git a/scripts/farm/farm-lab-sync.sh b/scripts/farm/farm-lab-sync.sh
index 9a15684f..429f950e 100755
--- a/scripts/farm/farm-lab-sync.sh
+++ b/scripts/farm/farm-lab-sync.sh
@@ -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
diff --git a/scripts/farm/farm-worker-loop.sh b/scripts/farm/farm-worker-loop.sh
index bff9cb2e..79a88dd5 100755
--- a/scripts/farm/farm-worker-loop.sh
+++ b/scripts/farm/farm-worker-loop.sh
@@ -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
diff --git a/scripts/farm/harkaq-campana-vol.sh b/scripts/farm/harkaq-campana-vol.sh
index 19163625..4c48666f 100755
--- a/scripts/farm/harkaq-campana-vol.sh
+++ b/scripts/farm/harkaq-campana-vol.sh
@@ -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
diff --git a/scripts/farm/harkaq-campana.sh b/scripts/farm/harkaq-campana.sh
index 7982260a..3364b6c4 100755
--- a/scripts/farm/harkaq-campana.sh
+++ b/scripts/farm/harkaq-campana.sh
@@ -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"
diff --git a/scripts/farm/harvest-go.sh b/scripts/farm/harvest-go.sh
index d8f8dd54..c8f6ad4f 100755
--- a/scripts/farm/harvest-go.sh
+++ b/scripts/farm/harvest-go.sh
@@ -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"
diff --git a/scripts/farm/saldar-deuda-static.sh b/scripts/farm/saldar-deuda-static.sh
index bf37581c..aec9ac29 100755
--- a/scripts/farm/saldar-deuda-static.sh
+++ b/scripts/farm/saldar-deuda-static.sh
@@ -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.
diff --git a/scripts/farm/vps-setup.sh b/scripts/farm/vps-setup.sh
index ea919c47..f2dbd6a4 100755
--- a/scripts/farm/vps-setup.sh
+++ b/scripts/farm/vps-setup.sh
@@ -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)"
diff --git a/scripts/fuentes/mirror-env.sh b/scripts/fuentes/mirror-env.sh
index 1a912c0b..99aef38c 100644
--- a/scripts/fuentes/mirror-env.sh
+++ b/scripts/fuentes/mirror-env.sh
@@ -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
diff --git a/scripts/gnome/hydrate-gnome.sh b/scripts/gnome/hydrate-gnome.sh
index 1577b695..c2178a78 100755
--- a/scripts/gnome/hydrate-gnome.sh
+++ b/scripts/gnome/hydrate-gnome.sh
@@ -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
diff --git a/scripts/gnome/qemu-desktop-image.sh b/scripts/gnome/qemu-desktop-image.sh
index a29ccb40..f3712228 100755
--- a/scripts/gnome/qemu-desktop-image.sh
+++ b/scripts/gnome/qemu-desktop-image.sh
@@ -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
diff --git a/scripts/harkaq/harkaq-trace-build.sh b/scripts/harkaq/harkaq-trace-build.sh
index 0d9cd832..03089f03 100644
--- a/scripts/harkaq/harkaq-trace-build.sh
+++ b/scripts/harkaq/harkaq-trace-build.sh
@@ -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
diff --git a/scripts/hydrate-profile.py b/scripts/hydrate-profile.py
index c344af16..20d4f87a 100755
--- a/scripts/hydrate-profile.py
+++ b/scripts/hydrate-profile.py
@@ -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):
diff --git a/scripts/kde/complete-closure.sh b/scripts/kde/complete-closure.sh
index 572f386e..706b4fae 100644
--- a/scripts/kde/complete-closure.sh
+++ b/scripts/kde/complete-closure.sh
@@ -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"
diff --git a/scripts/kde/hydrate-fhs.sh b/scripts/kde/hydrate-fhs.sh
index 6823cf16..eff790ef 100644
--- a/scripts/kde/hydrate-fhs.sh
+++ b/scripts/kde/hydrate-fhs.sh
@@ -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
diff --git a/scripts/kde/hydrate-from-store.sh b/scripts/kde/hydrate-from-store.sh
index 8e4a8fba..422fef5d 100644
--- a/scripts/kde/hydrate-from-store.sh
+++ b/scripts/kde/hydrate-from-store.sh
@@ -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)}"
diff --git a/scripts/lib/libs-compartidas-desde-store.sh b/scripts/lib/libs-compartidas-desde-store.sh
index d57e42f4..1c552285 100644
--- a/scripts/lib/libs-compartidas-desde-store.sh
+++ b/scripts/lib/libs-compartidas-desde-store.sh
@@ -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
diff --git a/scripts/lib/pid1-desde-store.sh b/scripts/lib/pid1-desde-store.sh
index a838a97a..d42a1136 100644
--- a/scripts/lib/pid1-desde-store.sh
+++ b/scripts/lib/pid1-desde-store.sh
@@ -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
 }
diff --git a/scripts/mirada-usb.sh b/scripts/mirada-usb.sh
index 52227a95..1451e347 100644
--- a/scripts/mirada-usb.sh
+++ b/scripts/mirada-usb.sh
@@ -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; }
diff --git a/scripts/product-userland-from-repo.sh b/scripts/product-userland-from-repo.sh
index 685a4210..dd858d9c 100755
--- a/scripts/product-userland-from-repo.sh
+++ b/scripts/product-userland-from-repo.sh
@@ -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"
diff --git a/scripts/provee.py b/scripts/provee.py
index dc915b8c..9b95afa0 100755
--- a/scripts/provee.py
+++ b/scripts/provee.py
@@ -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"
 
 
diff --git a/scripts/qorpa/evidence-probe.sh b/scripts/qorpa/evidence-probe.sh
index 14b41662..e05a04cc 100755
--- a/scripts/qorpa/evidence-probe.sh
+++ b/scripts/qorpa/evidence-probe.sh
@@ -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"
 
diff --git a/scripts/qorpa/pressure-vessel-probe.sh b/scripts/qorpa/pressure-vessel-probe.sh
index 01051bfa..cffa6243 100755
--- a/scripts/qorpa/pressure-vessel-probe.sh
+++ b/scripts/qorpa/pressure-vessel-probe.sh
@@ -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"
diff --git a/scripts/reconstruir-corpus.sh b/scripts/reconstruir-corpus.sh
index 2b132ce2..d62109c2 100755
--- a/scripts/reconstruir-corpus.sh
+++ b/scripts/reconstruir-corpus.sh
@@ -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}"
diff --git a/scripts/static-audit.sh b/scripts/static-audit.sh
index ebea5b63..5808182a 100755
--- a/scripts/static-audit.sh
+++ b/scripts/static-audit.sh
@@ -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=""
diff --git a/scripts/store-gc.sh b/scripts/store-gc.sh
index f7dfd4cf..eadc39e4 100755
--- a/scripts/store-gc.sh
+++ b/scripts/store-gc.sh
@@ -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
diff --git a/scripts/test-atuq-inicio.py b/scripts/test-atuq-inicio.py
index 013f49d1..360e8f55 100644
--- a/scripts/test-atuq-inicio.py
+++ b/scripts/test-atuq-inicio.py
@@ -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"
diff --git a/scripts/test-atuq-nativo.py b/scripts/test-atuq-nativo.py
index 8d56e66d..6d9f41ff 100644
--- a/scripts/test-atuq-nativo.py
+++ b/scripts/test-atuq-nativo.py
@@ -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"
diff --git a/scripts/test-atuq-rootfs.py b/scripts/test-atuq-rootfs.py
index 3884deca..4fd42300 100755
--- a/scripts/test-atuq-rootfs.py
+++ b/scripts/test-atuq-rootfs.py
@@ -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"}
diff --git a/scripts/test-atuq-ruteo.py b/scripts/test-atuq-ruteo.py
index ca6f7e54..e16cfbc4 100755
--- a/scripts/test-atuq-ruteo.py
+++ b/scripts/test-atuq-ruteo.py
@@ -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
diff --git a/scripts/test-guardianes-wasm.sh b/scripts/test-guardianes-wasm.sh
index 565ca2d4..77879fa2 100755
--- a/scripts/test-guardianes-wasm.sh
+++ b/scripts/test-guardianes-wasm.sh
@@ -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"
 }
diff --git a/scripts/verificar-repro.sh b/scripts/verificar-repro.sh
index 3bea545a..098dfeee 100755
--- a/scripts/verificar-repro.sh
+++ b/scripts/verificar-repro.sh
@@ -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
diff --git a/scripts/vigia-imagen.py b/scripts/vigia-imagen.py
index 6550d997..fee65af2 100644
--- a/scripts/vigia-imagen.py
+++ b/scripts/vigia-imagen.py
@@ -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
diff --git a/scripts/vigia-sonames.py b/scripts/vigia-sonames.py
index 5a9cb0fc..35db14ba 100755
--- a/scripts/vigia-sonames.py
+++ b/scripts/vigia-sonames.py
@@ -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):
diff --git a/scripts/why-differs-barrido.sh b/scripts/why-differs-barrido.sh
index 9671c88e..a4112922 100755
--- a/scripts/why-differs-barrido.sh
+++ b/scripts/why-differs-barrido.sh
@@ -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.