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>
This commit is contained in:
Sergio
2026-09-18 14:52:50 +00:00
co-authored by Claude Opus 5
parent 4b52acae06
commit bd8f9fbbb2
4 changed files with 342 additions and 17 deletions
+7 -1
View File
@@ -37,6 +37,12 @@ version = "0.1.0"
license = "MPL-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,
@@ -45,7 +51,7 @@ license = "MPL-2.0"
# §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 = "eed3120b6ccf4583c86c60cb2cdc8ccb9a379c04"
commit = "b80f7567c189f0bcba988efb7b0c5c2049f9aca6"
# tawasuyu COMMITEA su propio `vendor/` (smithay parcheado por `[patch.crates-io]` POR RUTA); el
# `cargo vendor` de takana lo pisaría y el error hablaría de un crate cualquiera, no de esto.
# No entra en `hash_inputs`.
+7 -1
View File
@@ -31,6 +31,12 @@ 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,
@@ -39,7 +45,7 @@ license = "MIT OR Apache-2.0"
# §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 = "eed3120b6ccf4583c86c60cb2cdc8ccb9a379c04"
commit = "b80f7567c189f0bcba988efb7b0c5c2049f9aca6"
cargo_vendor_dir = ".hammer-cargo-vendor"
[build]