diff --git a/docs/state/targets.toml b/docs/state/targets.toml index 22a2df08..9d641ca0 100644 --- a/docs/state/targets.toml +++ b/docs/state/targets.toml @@ -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"] diff --git a/recipes/ca-certificates.toml b/recipes/ca-certificates.toml index 986fb770..afa59c75 100644 --- a/recipes/ca-certificates.toml +++ b/recipes/ca-certificates.toml @@ -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) diff --git a/recipes/fastfetch.toml b/recipes/fastfetch.toml new file mode 100644 index 00000000..a4dbc6c0 --- /dev/null +++ b/recipes/fastfetch.toml @@ -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" diff --git a/recipes/minga.toml b/recipes/minga.toml index abaaea1a..d8eb0742 100644 --- a/recipes/minga.toml +++ b/recipes/minga.toml @@ -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 }