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:
+12
-1
@@ -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"]
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
@@ -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 }
|
||||
|
||||
Reference in New Issue
Block a user