minga abierto a P2P (la ventana oficial), fastfetch al corpus, y el rehash por su ruta

**minga con su daemon escuchando.** Decisión del usuario: minga es la ventana oficial al mundo y git
queda como espejo de compatibilidad, así que el daemon no es opcional — es el punto de entrada. El
binario ya está sellado (`b3:121cf4a8…`, 22 M, static-pie) y ahora trae su `[[user]]` (uid 970, home
`/work/minga`: en la raíz no cabe y `/work` sobrevive a un re-`dd`) y su `[[service]]`:
`listen /ip4/0.0.0.0/tcp/4001` — la convención libp2p, libre en la caja (ocupados: 22022 admin,
2345 git-SSH, 3002 gitea en loopback, 80/443 caddy). Declarar ambos **no movió el ArtifactHash**.

⚠⚠ **La identidad no se sella ni se inventa.** El keypair lo genera el usuario con `minga init`;
tawasuyu avisó de que el suyo era provisorio. Si la card hiciera un `init` automático, la caja se
inventaría su identidad soberana en el primer arranque y todo lo que se firme después colgaría de
ella. La guarda comprueba que el repo exista y sale 78: un peer sin identidad decidida es peor que
un peer ausente.

**fastfetch** (2.68.1) entra al corpus y a `perfil.cli` — lo heredan servidor y los escritorios.
Receta CMake con `-DCMAKE_LINK_DEPENDS_USE_LINKER=OFF` (sin eso el lld de zig segfaultea y el error
no nombra a zig) y con la detección opcional APAGADA explícitamente: con `link = "static"` no hay
`dlopen`, y una detección que entra «porque la librería estaba en el lab ese día» produce artefactos
distintos bajo el mismo nombre.

Y `ca-certificates`: el rehash se llamaba por nombre y **`c_rehash` lo instala esta misma receta en
`/out/usr/bin`**, no está en el PATH del sandbox. Se invoca por su ruta. La guarda que añadí ayer
hizo su trabajo: el build falló ruidosamente en vez de sellar otra vez un capath sin índice.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016Tf9T4vGzsMoT7eS8YzMFn
This commit is contained in:
Sergio
2026-09-14 21:34:42 +00:00
co-authored by Claude Opus 5
parent 2d8a0a72e9
commit 64d48e743e
4 changed files with 87 additions and 2 deletions
+12 -1
View File
@@ -102,6 +102,10 @@ hereda = ["base"]
# declara abajo es el subconjunto que ya estaba sellado y que un usuario de esta capa espera
# encontrar — cero recetas nuevas, cero builds: sólo dejan de ser invisibles.
paquetes = [
# `fastfetch` (2026-09-14, pedido del usuario): la tarjeta de presentación del sistema. En una
# distro propia es lo primero que contesta «¿qué estoy corriendo?» sin leer tres ficheros de
# `/proc`, y en una caja recién instalada distingue «arrancó» de «arrancó lo que yo creía».
"fastfetch",
"bat", "fd", "ripgrep", "jq", "zoxide", "dust", "procs", "htop", "less", "tree",
"hyperfine", "delta", "eza", "sd", "tokei", "fzf", "skim", "git-cliff", "gitui",
"starship",
@@ -1308,6 +1312,13 @@ paquetes = [
# fuerte —TODA imagen de takana corre arje-zero como PID 1 y ninguna se puede operar sin él— y es
# una línea. Se deja como decisión a tomar, no como olvido.
"arjectl",
# `minga` (2026-09-14): **la ventana oficial al mundo**. Decisión del usuario: el árbol del código
# y la cola de compilación pasan a minga, y git queda como espejo de compatibilidad. Va con su
# daemon P2P escuchando (`servicios`, abajo) — no es un CLI suelto, es el punto de entrada.
# ⚠ Su card NO genera la identidad: el keypair lo crea el usuario con `minga init` y la guarda
# sale 78 si el repo no existe. Una caja que se inventa su identidad soberana al arrancar es peor
# que una caja sin peer.
"minga",
# `netup` (2026-09-10): el cliente DHCP propio que levanta la red al arrancar. Entra como RAÍZ
# aunque su binario YA venga dentro del `product-rootfs`, y por una razón concreta: el del producto
# está congelado en el artefacto sellado del bootstrap, así que un arreglo de netup no llega nunca
@@ -1358,4 +1369,4 @@ paquetes = [
# `gitea` en `/etc/passwd`— y sale con 78 si falta alguna. Es a propósito: las dos vienen con los
# datos de la mudanza, y un gitea que arranca sin su config ofrece el asistente de «crear
# administrador» a quien pase. Hasta que la mudanza traiga ambas, este servicio NO levanta y lo dice.
servicios = ["sshd", "gitea", "caddy"]
servicios = ["sshd", "gitea", "caddy", "minga"]
+4 -1
View File
@@ -80,8 +80,11 @@ make install DESTDIR="/out"
# 200, que es la prueba de que los certificados están y lo que falta es el ÍNDICE.
#
# Se generan acá, donde `c_rehash` y perl existen, y viajan dentro del artefacto.
# ⚠ `c_rehash` lo compila e instala ESTA receta (`install -m755 c_rehash /out/usr/bin`), así que
# no está en el `PATH` del sandbox: hay que invocarlo por su ruta de destino. La primera versión
# lo llamaba por nombre, no lo encontraba, y la guarda de abajo cazó el silencio.
cp "/out"/usr/share/ca-certificates/*.crt "/out"/etc/ssl/certs/ 2>/dev/null || true
c_rehash "/out"/etc/ssl/certs >/dev/null 2>&1 || /usr/bin/c_rehash "/out"/etc/ssl/certs >/dev/null 2>&1 || true
"/out"/usr/bin/c_rehash "/out"/etc/ssl/certs || ./c_rehash "/out"/etc/ssl/certs || true
# Falla ruidosamente si el rehash no produjo NADA: un capath sin enlaces es exactamente el bug
# que esto viene a cerrar, y sellarlo en silencio lo devolvería intacto.
n=$(find "/out"/etc/ssl/certs -name '*.0' | wc -l)
+38
View File
@@ -0,0 +1,38 @@
# fastfetch — la tarjeta de presentación del sistema: qué distro, qué kernel, qué CPU, qué RAM.
#
# Pedido por el usuario (2026-09-14). No es adorno: en una distro propia es la primera herramienta
# que contesta «¿qué estoy corriendo?» sin leerse tres ficheros de `/proc`, y en una caja recién
# instalada es lo que distingue «arrancó» de «arrancó lo que yo creía».
#
# ══ CMake + zig: la línea que no se puede olvidar ══════════════════════════════════════════════
# `-DCMAKE_LINK_DEPENDS_USE_LINKER=OFF`. Sin eso, el `lld` de zig **segfaultea** al recibir
# `--dependency-file` y el error no menciona a zig ni a lld — dice `Error running link command:
# Segmentation fault`. Cinco de las quince recetas CMake barridas estaban selladas Y rotas por esto.
#
# ══ LO QUE SE APAGA, Y POR QUÉ ═════════════════════════════════════════════════════════════════
# fastfetch detecta MUCHO por `dlopen` de librerías opcionales (X11, Vulkan, DConf, ImageMagick…).
# Con `link = "static"` eso no aplica: el binario no abre nada en runtime. Se apagan explícitamente
# los módulos que traerían dependencias que esta distro no tiene —o que las tiene por otra vía— para
# que el build no dependa de qué haya en el lab **el día que se construya**: una detección que entra
# «porque estaba» es un artefacto distinto en cada máquina, con el mismo nombre.
name = "fastfetch"
version = "2.68.1"
license = "MIT"
[source]
repo = "https://github.com/fastfetch-cli/fastfetch"
commit = "1c1136ebd1e943d6d2ba7c204a11deee3e948dd8"
[build]
compiler = "zig-cc"
target = "x86_64-linux-musl"
link = "static"
flags = []
[deps]
build = ["cmake", "linux-headers"]
[build.phases]
configure = "cmake -S . -B build -DCMAKE_LINK_DEPENDS_USE_LINKER=OFF -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DENABLE_SYSTEM_YYJSON=OFF -DENABLE_VULKAN=OFF -DENABLE_OPENCL=OFF -DENABLE_X11=OFF -DENABLE_XRANDR=OFF -DENABLE_WAYLAND=OFF -DENABLE_DCONF=OFF -DENABLE_IMAGEMAGICK7=OFF -DENABLE_CHAFA=OFF -DENABLE_DBUS=OFF -DENABLE_PULSE=OFF -DENABLE_DDCUTIL=OFF -DENABLE_SQLITE3=OFF -DENABLE_RPM=OFF -DENABLE_LIBNM=OFF -DENABLE_LIBZFS=OFF -DENABLE_EGL=OFF -DENABLE_GLX=OFF -DENABLE_OSMESA=OFF -DENABLE_DRM=OFF -DENABLE_ELF=OFF -DENABLE_LIBCJSON=OFF"
compile = "cmake --build build"
install = "DESTDIR=/out cmake --install build"
+33
View File
@@ -55,3 +55,36 @@ link = "static"
# `rustc` can only be passed to one target» — el paquete tiene lib y bin, y hay que nombrar cuál.
# Medido acá, y es el mismo muro que ya tuvo `recipes/takana.toml` con sus dos `[[bin]]`.
flags = ["-p", "minga-cli", "--bin", "minga"]
# ── LA CUENTA (SDD 30) ──────────────────────────────────────────────────────────────────────────
# El daemon P2P escucha en una red pública: no corre como root. `uid` declarado, no asignado.
[[user]]
name = "minga"
uid = 970
home = "/work/minga"
# ── EL SERVICIO: minga ABIERTO A P2P (SDD 30) ───────────────────────────────────────────────────
# Decisión del usuario (2026-09-14): **minga es la ventana oficial al mundo, y git queda como espejo
# de compatibilidad**. Por eso el daemon no es opcional acá — es el punto de entrada.
#
# `listen /ip4/0.0.0.0/tcp/4001`: 4001 es la convención libp2p y está libre en la caja (los puertos
# ocupados son 22022 admin, 2345 git-SSH, 3002 gitea en loopback, 80/443 caddy).
#
# ⚠⚠ LA IDENTIDAD NO SE SELLA NI SE INVENTA. El keypair vive en el repo (`minga init` lo genera y lo
# cifra con passphrase) y **es del usuario**, no de esta receta: tawasuyu avisó de que el suyo era
# provisorio. Si esta card encarnara un `init` automático, la caja se inventaría una identidad
# soberana en su primer arranque y todo lo que se firme después colgaría de ella. Por eso la guarda
# comprueba que el repo EXISTA y sale 78 si no — un peer sin identidad decidida es peor que un peer
# ausente.
#
# El `home` del usuario ES el repo (`/work/minga`): en la raíz no cabe (3 G), y `/work` sobrevive a
# un re-provisionado con `dd` de la imagen.
[[service]]
label = "minga"
id = "01M2EKDA006TYGVY3J5N2X9FZR"
exec = "/bin/busybox"
argv = ["sh", "-c", "test -d /work/minga/.minga || { echo 'minga: falta el repo en /work/minga/.minga — la identidad la genera el USUARIO con `minga init`, no esta card' >&2; exit 78; }; /bin/grep -q '^minga:' /etc/passwd || { echo 'minga: no existe el usuario `minga` en /etc/passwd' >&2; exit 78; }; cd /work/minga || exit 78; exec /usr/bin/setuidgid minga /usr/bin/minga listen /ip4/0.0.0.0/tcp/4001"]
envp = [["PATH", "/usr/bin:/bin"], ["HOME", "/work/minga"], ["USER", "minga"]]
networking = "full"
cgroup = "arje.slice/minga"
restart = { initial_ms = 1000, max_ms = 30000 }