Files
takana/recipes/shuma-pregunta.toml
T
SergioandClaude Opus 5 bd8f9fbbb2 atuq: la bóveda ANDA hasta la etapa D — y con el navegador abierto quedaba muda por un tercer fallo
Con el arreglo de llimghi sellado, el guardián de metal pasó de la A a la D:

    A ✓ sin la app dueña, el host contesta locked:true (y con ok:true, que es la trampa)
    B ✓ con la app, vault.status dice ABIERTA — el socket sube en 1 s
    C ✓ el diálogo ABRE en el compositor y se lo CONTESTA: «1» ⇒ yes, «2» ⇒ no (los dos sentidos)
    D ✓ vault.save con consentimiento real guarda, y vault.match la encuentra SIN contraseña
    E ✗ el navegador pide la contraseña y no llega nunca

La E destapó un fallo que no es de atuq ni de llimphi: el dueño de la bóveda atendía de a UN cliente
—`atender_cliente` no vuelve hasta que el cliente se va, y se lo llamaba en el hilo del accept—, así
que la primera conexión se quedaba con él mientras viviera. Y el caso normal es ése: Gecko lanza un
`puriy-costura` por PUERTO, ocho en atuq, y todos conectan al arrancar. La extensión de la bóveda
mandaba `vault.match` y no volvía nunca: sin insignia, sin log y sin error, indistinguible de «este
sitio no tiene contraseñas».

Control sin navegador, en los dos sentidos: un solo cliente contesta en milisegundos; con otro host
conectado y quieto, la misma pregunta queda colgada y la mata el timeout a los 30 s.

Arreglado en tawasuyu (`cf3540460`, un hilo por conexión; los diálogos los serializa ahora el Mutex
de la bóveda) con su test de regresión, que además cazó que el arreglo obvio —clonar el Dueno— borra
el socket en el Drop del primer hilo que termina. Los siete tests que ya había no podían ver el fallo:
abrían un cliente por vez, que es justo lo que producción nunca hace.

⚠ Y subir el pin volvió a chocar con el `Cargo.lock` abierto de tawasuyu. Lo que importa para la
próxima es CUÁL operación lo cierra: `cargo metadata` sin `--locked` da **1 línea** de diff y cero
checksums movidos; `cargo generate-lockfile` da 6.305 líneas y 750 checksums, e invalidaría el
vendoreo de todos. Publicado en `b80f7567c` con índice temporal (estaba MM).

Del lado del guardián, tres cosas que salieron de fallar:
· el contestador INSISTE hasta que la ventana se va — con el mismo `wtype rc=0`, una corrida
  contestaba y otra volvía `denied`: la ventana entra al árbol del compositor antes de que llimphi
  tenga el teclado enganchado, y un sleep más largo sólo mueve el borde;
· el contestador busca la ventana POR PATRÓN: con el navegador abierto, teclear «la enfocada» le
  contestaría a la página, y eso es un sí que nadie dio;
· la sonda del chrome mira `isShownForTab` y la insignia ANTES de apretar — `triggerClickOrPopup`
  sale por la puerta de atrás si la acción no está mostrada, y un click que no llega se ve igual que
  una bóveda que no contesta. (Y `WebExtensionPolicy` no es global en el scope de una ventana: sale
  del módulo. Eso costó una corrida.)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-18 14:52:50 +00:00

83 lines
5.2 KiB
TOML

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