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…
feat(recetas): el pin de mirada y shuma a tawasuyu de491e95, que la granja ya está construyendo
1# mirada-compositor — el compositor Wayland teselante de mirada (sobre smithay). Es el Cuerpo que
2# maneja DRM/GBM/EGL/libseat/libinput directo y dentro del cual corre `mirada-greeter` como cliente.
3# Cierra la cadena de sesión gráfica de tawasuyu.
4#
5# Receta Cargo (patrón arje-zero/mirada-greeter): monorepo tawasuyu al commit fijado 9a17fefc (reusa
6# el árbol vendoreado). `-p mirada-compositor`, link DINÁMICO (smithay enlaza libdrm/gbm/seat/input
7# + dlopen de EGL/wayland/xkbcommon).
8#
9# Sin la fase custom del greeter: mirada-compositor NO usa llimphi-ui ⇒ no arrastra accesskit/atspi
10# (nada de LOCKSTEP_XML_PATH). auth-core → PAM sí (linux-pam). `foreign-av` NO enlaza ffmpeg: spawnea
11# el BINARIO ffmpeg en runtime (sólo si wallpaper=video), así que no hace falta construir ffmpeg.
12#
13# Build-deps que smithay (default features) enlaza por -sys/pkg-config: drm-sys→libdrm, gbm-sys→mesa,
14# libseat-sys→seatd, input-sys→libinput, libudev-sys→libudev-zero. wayland-server.pc → libffi/expat.
15name = "mirada-compositor"
16version = "0.0.1"
17license = "MIT"
18
19[source]
20repo = "https://git.tawasuyu.net/tawasuyu/tawasuyu.git"
21commit = "de491e951687ef7a02e19d2592f8cc2c4b60fd66"
22# tawasuyu COMMITEA su propio `vendor/` (smithay 0.7.0 parcheado por `[patch.crates-io]` POR
23# RUTA: 159 líneas en 4 ficheros —flip async DRM, y dos de layer-shell—). El `cargo vendor` de
24# takana vendorea por default a `vendor/`, que convierte ESE dir en reemplazo de fuente, donde
25# cada crate debe traer `.cargo-checksum.json` — que el patch nunca tuvo (`git ls-tree`: no
26# existió nunca). El pin viejo (9a17fefc, 14-jul) es ANTERIOR a que ese `vendor/` naciera
27# (a37815634, 21-jul), por eso esta receta no lo traía: salta al mover el pin. No entra en
28# `hash_inputs`.
29cargo_vendor_dir = ".hammer-cargo-vendor"
30
31[build]
32compiler = "zig-cc"
33target = "x86_64-linux-musl"
34link = "dynamic"
35flags = ["-p", "mirada-compositor"]
36
37[deps]
38# libxkbcommon (smithay lo enlaza, no sólo dlopen) + pixman (composición CPU de smithay).
39build = ["mesa", "wayland", "wayland-protocols", "libdrm", "seatd", "linux-pam", "libinput", "libudev-zero", "libevdev", "mtdev", "libxkbcommon", "pixman", "expat", "zlib", "zstd", "libffi", "pkgconf"]
40
41# ── LA CARD QUE ARRANCA EL ESCRITORIO (`[[service]]`, 2026-10-15) ─────────────────────────────────
42# Hasta hoy esta receta no declaraba servicio, y la consecuencia estaba MEDIDA y no escrita: la Card
43# que lanza el compositor en la máquina del operador existe porque un script de parche
44# (`tawasuyu:scripts/declarar-mirada-en-la-semilla.sh`) la inyectó en la semilla a mano. O sea que
45# **una instalación de cero arranca el sistema y no arranca el escritorio**, y nada lo avisa: el
46# génesis no se queja de lo que nadie le declaró. Los otros cuatro escritorios ya pasan por
47# `takana service-cards` (lo usan `servidor-image.sh` y los `*-image.sh` de gnome/kde/cosmic);
48# mirada se armaba con un `/sbin/init` escrito a mano por `mirada-usb.sh`, que sirve para un medio
49# live y no deja nada en el disco.
50#
51# La declaración es metadato —fuera de `hash_inputs`, como `[[setuid]]`, `[[user]]` y `license`— así
52# que entra en una receta YA SELLADA sin mover un solo `ArtifactHash`.
53#
54# ⚠ **`seatd` va en la MISMA receta y no en la suya**, por el invariante de `validate_all`: dos
55# recetas no pueden reclamar lo mismo, y acá lo que se declara es el ORDEN de arranque de un
56# escritorio —seatd primero, el compositor después— que es una propiedad de mirada y no de seatd.
57# Sin seatd vivo el compositor no obtiene el seat y muere con el DRM ocupado.
58[[service]]
59label = "seatd"
60id = "01M4ZQ2GXTPZ8RVZRBVZCBE94G"
61exec = "/usr/bin/seatd"
62scope = "system"
63restart = { initial_ms = 500, max_ms = 20000 }
64
65[[service]]
66label = "mirada"
67id = "01M4ZQ2GXTQJ26NFQGXEE1D7BX"
68exec = "/usr/bin/mirada-compositor --drm --greeter"
69scope = "system"
70# El backoff lo hace arje: la versión a mano de esta Card llevaba un `sh -c` de quince líneas que
71# contaba intentos en `/run/mirada-intentos` y se quedaba quieto al tercero. Eso es exactamente lo
72# que `restart` hace, con el tope arriba — un compositor que no abre y reintenta cada 100 ms deja la
73# máquina inservible, y el techo de 30 s es lo que la vuelve diagnosticable.
74restart = { initial_ms = 1000, max_ms = 30000 }
75# ⚠ Un Ente NO hereda el PATH de ningún shell, y el compositor LANZA hijos (el greeter, el riel, la
76# terminal del menú). El PATH de esta Card es el que hereda la sesión entera, y hasta el 2026-10-14
77# decía `/usr/bin:/bin:/usr/sbin:/sbin` — sin `/usr/local/bin`, que es donde vive todo lo instalado
78# a mano. El operador tenía `claude` instalado y la máquina contestaba `claude: not found`.
79#
80# Los bin del hogar NO van acá a propósito: los agrega el propio compositor para el usuario que
81# inicia sesión (`utilidades::path_de_usuario`), y clavarlos en la Card los dejaría apuntando al
82# hogar de UNA persona en una imagen que instala cualquiera.
83envp = [
84 ["PATH", "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],
85 ["HOME", "/root"],
86 ["XDG_RUNTIME_DIR", "/run/arje"],
87 ["XDG_SEAT", "seat0"],
88 ["XDG_SESSION_TYPE", "wayland"],
89 # El layout por defecto; el instalador pregunta el teclado y lo puede reescribir en la Card.
90 ["XKB_DEFAULT_LAYOUT", "us"],
91 # Sin esto libxkbcommon no encuentra las reglas y el teclado no responde una tecla. Lo aporta
92 # `xkeyboard-config`, declarado en el perfil el mismo día que esto.
93 ["XKB_CONFIG_ROOT", "/usr/share/X11/xkb"],
94 ["MIRADA_GREETER_BIN", "/usr/bin/mirada-greeter"],
95 ["RUST_LOG", "info"],
96]