# harkaq-exec — el último eslabón de la jaula, empaquetado como receta. # # POR QUÉ EXISTE (descubierto el 2026-09-15, mudando `api.sergio.gioser.net` a la caja nueva). # `takana qorpa provision` murió en la caja de producción con: # # Error: no encuentro harkaq-exec en /root/.cache/harkaq/harkaq-exec — la instancia NO va a # correr enjaulada y eso no se hace en silencio. # construilo: gcc -O1 -Wall -static -o … scripts/harkaq/harkaq-exec.c # # El mensaje es bueno y la receta que propone es imposible: **en una caja instalada no hay gcc, ni # árbol de desarrollo, ni `scripts/`**. El binario sólo existía como un `gcc` a mano en el hub, en # una caché de `$HOME` — o sea que la jaula del ADR 0015 funcionaba únicamente en la máquina donde # alguien la había compilado. Es [[subcomando-sin-driver]] otra vez, un piso más abajo: `takana # qorpa` viaja en TODAS las imágenes y su herramienta en NINGUNA. # # ⚠ Y su compañero `bwrap` estaba igual: sellado desde hace meses, declarado en CERO perfiles # (`"perfiles": []` en `build-state.json`) — y lo invocan por PATH tanto `qorpa` como el sandbox de # `takana build` (`takana-build/src/sandbox.rs`). Los dos entran a `perfil.base` en la misma unidad # de trabajo: una imagen de takana que no puede enjaular no puede ni construir. # # ── EL PIN VA AL COMMIT QUE TOCÓ LA FUENTE, no a HEAD ───────────────────────────────────────────── # `scripts/harkaq/harkaq-exec.c` no cambia desde el 2026-09-03; el repo, cada media hora (el cron de # la cosecha commitea el estado del grafo). Pinear HEAD re-hashearía esta receta cada media hora sin # que su fuente se moviera. El commit de abajo es el último que tocó el `.c` y su `.h`. # # La fuente vive en `scripts/` y no en un árbol propio de la receta a propósito: `harkaq-run.sh`, # `harkaq-farm-setup.sh` y `q2-runtime-base.sh` la compilan desde ahí, y dos copias del mismo `.c` # divergen en silencio. El precio es subir el `commit` cuando la jaula cambie — el mismo que paga # `recipes/takana.toml`. name = "harkaq-exec" version = "0.0.1" license = "MIT" [source] # El repo del propio takana; la URL es sólo locator y no entra en `hash_inputs` (ADR 0013 §1). repo = "https://git.gioser.net/sergio/takana.git" commit = "c0ded9acb285ee6c7c6b191590c9635a6242a274" [build] compiler = "zig-cc" target = "x86_64-linux-musl" # Estático **obligatorio**, no por costumbre: harkaq-exec corre DENTRO del rootfs del sandbox, donde # no hay cargador dinámico que valga (lo dice el encabezado del propio `.c`). link = "static" [build.phases] # El árbol es el repo entero, sin sistema de build que detectar: las tres fases van a mano. configure = "true" # `-mcpu=baseline` por reproducibilidad independiente de la CPU del builder, como el resto del lab # (y ver [[cgo-sin-baseline-sigill]]: hornear la ISA del que compila es un SIGILL en otra caja). # Los headers de seccomp/landlock salen del rootfs del lab; `harkaq-uapi.h` está al lado del `.c`. compile = "zig cc -mcpu=baseline -static -O1 -Wall -o harkaq-exec scripts/harkaq/harkaq-exec.c" install = "mkdir -p /out/usr/bin && cp harkaq-exec /out/usr/bin/harkaq-exec" [deps] build = ["binutils"]