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…
atuq: la bóveda ANDA hasta la etapa D — y con el navegador abierto quedaba muda por un tercer fallo
1# shuma-pregunta — la pregunta con opciones que contesta una PERSONA, y devuelve la elegida por
2# stdout en una línea de JSON. Hermano de `shuma-askpass`: dentro del cajón de shuma si el pedido
3# sale de una de sus pestañas, y en su propia ventana llimphi si no.
4#
5# ── POR QUÉ ENTRA AL CORPUS AHORA (2026-09-18) ─────────────────────────────────────────────────
6# Porque es **el consentimiento de la bóveda**, y sin él la bóveda del navegador no entrega nada.
7# `pacha_boveda::navegador::PorDialogo` —la política que la app le pone al socket del navegador—
8# es literalmente un `Command::new("shuma-pregunta")`, y su primera línea de manejo de error es:
9#
10# let Ok(mut hijo) = hijo else {
11# // No hay con qué preguntar ⇒ no.
12# return false;
13# };
14#
15# O sea que **sin este binario en la imagen, todo `vault.fill` se deniega**, y se deniega bien: la
16# extensión lee `f.denied === true` y se calla, que es lo correcto y es indistinguible de que el
17# usuario haya dicho que no. La función se ve apagada y nada falla. Ver `recipes/boveda.toml`, que
18# trae la otra mitad (el dueño de la base) y la medición que destapó las dos ausencias.
19#
20# No es sólo de la bóveda: es el diálogo declarado de la suite (`COLA-SHUMA` §I2), y existe para
21# sacar del medio la costumbre de reconocer un menú por su forma en la pantalla de un terminal y
22# contestarlo a ciegas con flechas.
23#
24# ── LA FORMA DE LA RECETA ──────────────────────────────────────────────────────────────────────
25# llimphi GUI del monorepo, igual que `recipes/boveda.toml`: `link = "dynamic"` (winit + wgpu
26# cargan EGL/Vulkan/wayland por `dlopen`) y el mismo pin `23a292863` que comparten `shuma-daemon`,
27# `shuma-gateway`, `shuma-tui`, `puriy-costura` y `pacha-*` — un pin distinto es otro vendoreo de
28# 2,4 G del workspace entero.
29name = "shuma-pregunta"
30version = "0.1.0"
31license = "MIT OR Apache-2.0"
32
33[source]
34# ⚠ El pin subió otra vez el 2026-09-18, a `b80f7567c` (el arreglo es `cf3540460`; el commit de
35# arriba es el que además publica el `Cargo.lock` cerrado, sin el cual `cargo vendor --locked`
36# no corre): el dueño de la bóveda atendía de a UN
37# cliente y con el navegador abierto eso la deja MUDA (Gecko lanza un host por extensión, ocho, y
38# todos se conectan al arrancar). SDD 26 §7.octies. Las dos recetas se mueven juntas para no pagar
39# un tercer vendoreo de 2,4 G: comparten árbol por `<repo>-<sha>`.
40# ⚠ EL PIN NO ES EL DE SUS HERMANAS, Y ES A PROPÓSITO (2026-09-18). Las demás recetas del monorepo
41# están en `23a292863`; ésta apunta a `eed3120b6`, que es el commit donde llimphi aprende a pasarle
42# el **display handle** a wgpu en el camino de escritorio. Con el pin viejo este binario sella,
43# arranca y **no abre ventana**: wgpu cae a la plataforma EGL surfaceless, la surface no tiene un
44# solo formato y la app panica con un «index out of bounds» que no nombra nada de esto (SDD 26
45# §7.septies). El precio es un árbol de fuentes propio — otro vendoreo de 2,4 G, porque el árbol se
46# comparte por `<repo>-<sha>`—; se paga hasta que las demás suban al mismo commit.
47repo = "https://git.tawasuyu.net/tawasuyu/tawasuyu.git"
48commit = "b80f7567c189f0bcba988efb7b0c5c2049f9aca6"
49cargo_vendor_dir = ".hammer-cargo-vendor"
50
51[build]
52compiler = "zig-cc"
53target = "x86_64-linux-musl"
54link = "dynamic"
55flags = ["-p", "shuma-pregunta", "--bin", "shuma-pregunta"]
56
57# Fase `compile` explícita por `LOCKSTEP_XML_PATH` — la causa, entera, está en `mirada-greeter.toml`
58# y repetida en `recipes/boveda.toml`: `accesskit_winit` → `atspi` → `zbus-lockstep-macros`, cuyo
59# `#[validate]` panica al encontrar el subdir `xml/schemas/`. La comprobación falla a gritos porque
60# un `cp` mudo dejaría la variable apuntando a un directorio vacío.
61[build.phases]
62compile = '''
63set -e
64XMLDIR="$PWD/.atspi-lockstep-xml"
65mkdir -p "$XMLDIR"
66ls .hammer-cargo-vendor/atspi-common/xml/*.xml >/dev/null 2>&1 || { echo "no hay .hammer-cargo-vendor/atspi-common/xml/*.xml — ¿cambió el vendoreo o la versión de atspi? sin esto zbus-lockstep-macros panica en xml/schemas/" >&2; exit 1; }
67cp .hammer-cargo-vendor/atspi-common/xml/*.xml "$XMLDIR"/
68export LOCKSTEP_XML_PATH="$XMLDIR"
69printf '%s\n' '#!/bin/sh' 'for a do' 'case "$a" in --target=*) a=--target=x86_64-linux-musl ;; esac' 'set -- "$@" "$a"' 'shift' 'done' 'exec zig cc -mcpu=baseline "$@"' > "$PWD/.hammer-zig-cc"
70chmod +x "$PWD/.hammer-zig-cc"
71RF="-C linker=$PWD/.hammer-zig-cc"
72rustc -vV | grep -q 'host: .*-alpine-' || RF="$RF -C link-self-contained=no"
73CC="$PWD/.hammer-zig-cc" RUSTFLAGS="$RF" cargo rustc --release --locked --offline -p shuma-pregunta --bin shuma-pregunta -- -C target-feature=-crt-static
74'''
75install = '''
76set -e
77test -x target/release/shuma-pregunta || { echo "no hay target/release/shuma-pregunta" >&2; exit 1; }
78install -Dm755 target/release/shuma-pregunta /out/usr/bin/shuma-pregunta
79'''
80
81[deps]
82build = ["mesa", "wayland", "wayland-protocols", "libdrm", "expat", "zlib", "zstd", "libffi", "pkgconf"]