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…
pin de tawasuyu: las 37 recetas saltan al mismo commit
1# shuma-daemon — el dueño de los Workspaces de shuma: sesiones PTY, paneles y el socket de admin
2# que consultan el gateway, el TUI y el shell. Es el que hace que `/shuma/*` sirva de algo.
3#
4# ── POR QUÉ ESTA RECETA (2026-09-16) ────────────────────────────────────────────────────────────
5# Va en par con `shuma-gateway`: el gateway sin daemon es un puente a ninguna parte. Los dos corren
6# hoy en gioser desde binarios puestos a mano —el del daemon, además, desde un **inodo borrado**— y
7# la mudanza los reconstruye en vez de copiarlos (SDD 28 §6.34).
8#
9# ⚠ **Lo que esta receta NO resuelve, y hay que decirlo acá**: en gioser el daemon corre como
10# `sergio`, no como root, y el payload `Native` de una tarjeta de arje **no tiene campo de usuario**
11# (SDD 29 §4.0 quinquies). Declararlo sin más lo pondría a correr como root, que no es «perder una
12# opción» sino cambiar el sistema. La bajada de privilegio se decide al escribir la tarjeta, no acá.
13name = "shuma-daemon"
14version = "0.1.0"
15license = "MIT OR Apache-2.0"
16
17[source]
18repo = "https://git.tawasuyu.net/tawasuyu/tawasuyu.git"
19commit = "cbff0c7dda490b11214c5f454c68f765647baa2d"
20cargo_vendor_dir = ".hammer-cargo-vendor"
21
22[build]
23compiler = "zig-cc"
24target = "x86_64-linux-musl"
25link = "static"
26flags = ["-p", "shuma-daemon", "--bin", "shuma-daemon"]
27
28# ── LA CUENTA (SDD 30) ──────────────────────────────────────────────────────────────────────────
29# Fuera de `hash_inputs`: declarar esto NO re-hashea shuma-daemon (control corrido, el hash no se
30# movió).
31#
32# ⚠ EN GIOSER CORRE COMO `sergio`, Y ESO NO SE PUEDE TRADUCIR SOLO. El payload `Native` de arje no
33# tiene campo de usuario (SDD 29 §4.0 quinquies), así que una tarjeta escrita «como estaba» lo
34# pondría de ROOT — y esto es un demonio que abre PTYs y ejecuta shells: correrlo de root no es
35# perder una opción, es entregar la máquina. La cuenta es propia y sin privilegio, y el descenso se
36# hace en el comando con `setuidgid`, igual que gitea.
37[[user]]
38name = "shuma"
39uid = 967
40home = "/var/lib/shuma"
41# ⚠ Y LA SHELL NO ES UN DETALLE ACÁ. El default de `[[user]]` es `/bin/false`, que es lo correcto
42# para un demonio (gitea, squid) y **lo exactamente contrario** para éste: shuma-daemon existe para
43# abrir PTYs y lanzar shells. Con `/bin/false` el servicio arranca, se supervisa, contesta… y cada
44# pestaña que alguien abra muere al instante. Un fallo que no se ve al desplegar: se ve al usarlo.
45shell = "/bin/sh"
46
47# ── EL SERVICIO ─────────────────────────────────────────────────────────────────────────────────
48# Las guardas salen 78 NOMBRANDO EL ARREGLO. Es lo que hace la diferencia entre un servicio que
49# reintenta para siempre con «unknown user» y uno que dice qué falta: medido con gitea, cuya imagen
50# arrancaba perfecta y sin el servicio por el que existe.
51#
52# `XDG_RUNTIME_DIR` no es decoración: es donde el daemon pone su socket, y es por ese socket que el
53# gateway le habla. En gioser vale `/run/shuma`, medido en el entorno del proceso vivo.
54[[service]]
55label = "shuma-daemon"
56id = "01M2EKDA00SH0MADAEM0N7X4K2"
57exec = "/bin/busybox"
58argv = ["sh", "-c", "/bin/grep -q '^sergio:' /etc/passwd || { echo 'shuma-daemon: no existe el usuario `sergio` en /etc/passwd — la receta lo declara con [[user]]; la imagen lo compone con `takana users`' >&2; exit 78; }; mkdir -p /run/shuma /var/lib/shuma || exit 78; chown shuma:shuma /run/shuma /var/lib/shuma || exit 78; cd /home/sergio || exit 78; exec /usr/bin/setuidgid sergio /usr/bin/shuma-daemon"]
59envp = [["PATH", "/usr/bin:/bin"], ["HOME", "/home/sergio"], ["USER", "sergio"], ["XDG_RUNTIME_DIR", "/run/shuma"]]
60networking = "full"
61cgroup = "arje.slice/shuma-daemon"
62restart = { initial_ms = 1000, max_ms = 30000 }
63
64# ── ⚠ `shuma-askpass` NO VA EN ESTA CAJA, y conviene decirlo acá porque el daemon lo PIDE ────────
65# Al arrancar, shuma-daemon avisa: «askpass: no encontré `shuma-askpass` … sudo/ssh pedirán la clave
66# por el TTY». Se intentó darle la receta (2026-09-16) y el resultado fue mejor que construirla:
67#
68# 1. **No construye**: su dependencia `atspi-common` muere con `custom attribute panicked —
69# message: File has no extension.` en el proc-macro `#[validate(signal: …)]`, que lee un
70# fichero en tiempo de compilación y no resuelve la ruta dentro del sandbox (`/src/...`).
71# 292 errores en cascada, todos hijos de ese pánico.
72# 2. **Y no hace falta**: su propio `Cargo.toml` la describe como «Mini-ventana Llimphi compatible
73# con SUDO_ASKPASS» — es una VENTANA (llimphi-ui, theme, widget-text-input, clipboard). En un
74# servidor sin pantalla no tiene dónde dibujarse, y las sesiones de shuma son PTYs: ahí el
75# prompt por TTY es el camino correcto, no una degradación.
76#
77# ⇒ el aviso del daemon es para el escritorio, no para el servidor. Si algún día hace falta acá,
78# primero hay que resolver el proc-macro de atspi, no reponer la receta.
79
80# ── ⚠ CORRE COMO `sergio`, NO COMO `shuma` (2026-09-17) ─────────────────────────────────────────
81# La cuenta `shuma` se creó cuando la caja no tenía usuario de la persona. Ahora sí, y shuma es su
82# CONSOLA: las pestañas que abre son sesiones suyas, y desde ahí lanza `claude`, que entra a la
83# jaula `claude-sergio` con SU memoria y SUS credenciales. Con el daemon corriendo como `shuma`,
84# cada terminal de la web habría sido de otro usuario que no es nadie — y `claude` habría buscado
85# una jaula `claude-shuma` que no existe.