El 6.6 de la unidad 9 del SDD 26. Una navegación de PRIMER NIVEL a un medio
(`Content-Type: video/*` o `audio/*`) se cancela y la URL se la lleva `mpv`, que ya viaja en las
cuatro imágenes de escritorio: esto no agrega ni una receta, es cablear lo que ya estaba.
MEDIO http://…/audio.wav
CANCELADA la navegación http://…/audio.wav
ABIERTO /usr/bin/mpv pid=266 http://…/audio.wav
mpv: AO: [null] 8000Hz mono 1ch u8 ← su propio log: DECODIFICÓ, no sólo arrancó
LA REGLA ES ESTRECHA A PROPÓSITO: sólo el primer nivel. Un `<video>` embebido es parte de la página y
sacarlo de ahí rompería el sitio que lo puso. Las reglas anchas en el camino de cada petición son las
que terminan rompiendo la web de alguien.
FAIL-OPEN, y es lo que prueba el control negativo: cancelar es SÍNCRONO y la respuesta del host llega
después, así que no se puede saber en el momento si el reproductor arrancó. Se cancela sólo con el
puerto vivo y, si el host contesta que no pudo, la URL VUELVE al navegador con una marca para no
entrar en bucle:
SIN REPRODUCTOR no hay reproductor en /usr/bin/mpv: esta imagen no lo trae
VUELVE AL NAVEGADOR http://…/audio.wav?atuq-medios=no
Quedarse sin vídeo Y sin pestaña es el único resultado inaceptable, y es justo el que se consigue si
uno confía en que salió bien.
⚠ EL BUG QUE ESTE GUARDIÁN DESTAPÓ VALE MÁS QUE LA FUNCIÓN, y estaba DESPUÉS del éxito aparente: la
primera corrida detectó el medio, canceló y recibió el pid… y después el puerto murió con «Native
application tried to send a message of 546281442 bytes». **Un hijo hereda los descriptores del padre,
y los del padre SON la tubería de native messaging**: `mpv` escribía su salida ahí y el navegador la
leía como un marco. Arreglado en tawasuyu (`2e99d216`, pineado acá) con tres redirecciones, cada una
contra un fallo distinto — `stdin` a null porque mpv LEE stdin y se comería los mensajes del
navegador; `stdout` al stderr del host y no a `/dev/null`, porque apagarlo arreglaría el bug y se
llevaría puesto el diagnóstico; `stderr` heredado por lo mismo.
Y dos cosas del ARNÉS, las dos ya vistas antes en esta misma sesión:
· la URL NO se pasa por la línea de comandos: una petición del arranque compite con la
inicialización de la extensión (la misma carrera del guardián de `sct`). El guardián navega a una
página que redirige a los 3 s, que además es lo que hace una persona: seguir un enlace;
· la evidencia de que el reproductor CORRIÓ se le pide a su propio `log-file`, porque su salida ya no
va al stdout del host y Gecko no vuelca el stderr del host al del navegador. Sin eso sólo se sabría
que hubo un `spawn`.
Del §6 quedan el foco (6.5), la IA local (6.7) —que además es la que traería el motor que le falta al
archivo del §6.3— y el torrent (6.9). Medido de paso: **el corpus no tiene ninguna receta de LLM ni de
embeddings**, así que 6.7 hoy no se puede pagar.
Medido sobre `atuq b3:a7080058` y `puriy-costura b3:060314e6`.
77 lines
5.5 KiB
TOML
77 lines
5.5 KiB
TOML
# puriy-costura — «la costura» del SDD 26 §7: el proceso nativo LARGO al que le habla la extensión
|
|
# de `atuq` por native messaging, y que del otro lado habla con la suite.
|
|
#
|
|
# ══ POR QUÉ ESTA RECETA EXISTE, Y POR QUÉ EL BINARIO NO ES DE TAKANA ═══════════════════════════
|
|
# Todo lo del §6 que no es CSS —transparencia de scripts, descargas al CAS, archivo con RAG,
|
|
# torrent, foco— pasa por UN solo mecanismo, y que sea uno y no siete es la decisión de fondo: cada
|
|
# función es un VERBO de este host y no un proyecto nuevo. El binario vive en tawasuyu porque es
|
|
# SUITE, no build system; takana lo construye, lo mete en la clausura y le deja el manifiesto de
|
|
# native messaging en su sitio. Acá no se decide nada de allá: el nombre del crate se decidió en
|
|
# tawasuyu con su regla 10 puesta (2026-09-09).
|
|
#
|
|
# ══ EL COMMIT PINEADO TRAE EL LOCK, Y ESO COSTÓ DOS COMMITS ═══════════════════════════════════
|
|
# `ebe41e96` = `9958224a0` (los dos crates) + el `Cargo.lock` cerrado. Sin lock al día `cargo vendor
|
|
# --locked` muere con «cannot update the lock file», que NO nombra al crate culpable; y sin
|
|
# `--locked` la resolución puede cambiar sola entre builds, que es lo que rompe la reproducibilidad
|
|
# del artefacto. Mismo cuidado que `arje-packager.toml`.
|
|
#
|
|
# ⚠ Y la trampa que costó el primer intento, porque va a volver: **un `Cargo.lock` regenerado en el
|
|
# clon compartido de tawasuyu NO describe su `main`** — ese árbol tiene cientos de ficheros en vuelo
|
|
# de otras sesiones, así que el lock sale describiendo el escritorio de todos. El primer commit del
|
|
# lock quedó a una línea de cerrar (`tempfile` en `nahual-iconos`, que lo declara en
|
|
# `[dev-dependencies]`). Si hay que publicar un lock de allá, se genera en un árbol LIMPIO del commit
|
|
# (`git archive <sha> | tar -x`, que además no toca el `.git` compartido) y se verifica que el diff
|
|
# contra HEAD sea sólo lo que uno agregó.
|
|
#
|
|
# ══ `--bin` NO ES REDUNDANTE ══════════════════════════════════════════════════════════════════
|
|
# `puriy-costura` tiene lib + bin (la lib es lo que los tests ejercitan por el cable de verdad), y el
|
|
# root del monorepo es un manifiesto VIRTUAL: `-p` elige el paquete y `--bin` hace falta porque
|
|
# `cargo rustc -- <flags>` exige un target único. Sin él el build muere con un error que habla de
|
|
# targets ambiguos y no menciona esta receta.
|
|
#
|
|
# ══ QUÉ LE FALTA PARA QUE ATUQ LO USE ═════════════════════════════════════════════════════════
|
|
# El manifiesto en `/usr/lib/mozilla/native-messaging-hosts/` (medido en el §7.bis: NO va en el
|
|
# appdir, sale de un `/usr/lib/mozilla` COMPILADO en Gecko) y la extensión que lo llame, que es la
|
|
# unidad 6. Un manifiesto que apunte a un binario ausente, o que declare una extensión que no
|
|
# existe, es un fallo silencioso: el navegador arranca igual y la función simplemente no está. Por
|
|
# eso el manifiesto NO se agrega desde acá «para tenerlo listo».
|
|
|
|
name = "puriy-costura"
|
|
version = "0.1.0"
|
|
# Lo que declara el propio crate en tawasuyu (`[workspace.package]`), no una simplificación.
|
|
license = "MIT OR Apache-2.0"
|
|
|
|
[source]
|
|
repo = "gitea@git.tawasuyu.net:tawasuyu/tawasuyu.git"
|
|
commit = "2e99d21675de7aa3b60bf4d9d22fd4c8b76ffe0c"
|
|
# ⚠ SIN ESTO EL BUILD MUERE EN UN SITIO QUE NO NOMBRA LA CAUSA — medido acá el 2026-09-10.
|
|
# tawasuyu COMMITEA su propio `vendor/`: adentro tiene un `smithay` parcheado a mano (tearing/flip
|
|
# async para el compositor), y lo enchufa con `[patch.crates-io] smithay = { path = "vendor/smithay" }`.
|
|
# Un patch POR RUTA no necesita `.cargo-checksum.json`, y de hecho **upstream no lo commitea**. Pero
|
|
# `cargo vendor` convierte su directorio de salida en un DIRECTORIO DE REEMPLAZO DE FUENTE, donde
|
|
# cada crate SÍ tiene que traer checksum — así que si se vendorea sobre `vendor/`, el smithay
|
|
# parcheado pasa a estar sujeto a una regla que nunca cumplió.
|
|
#
|
|
# El síntoma no menciona nada de esto: 1 de 1699 crates sin `.cargo-checksum.json`, y un error que
|
|
# habla de `taffy` y de una «replaced source». Anotado porque la explicación fácil —«cargo vendor
|
|
# BORRÓ el checksum»— es falsa y se comprobó: `git ls-tree` dice que ese fichero nunca existió.
|
|
#
|
|
# `cargo_vendor_dir` NO entra en el ArtifactHash (`hash_inputs` usa `git:<commit>`, compiler, target
|
|
# y link), así que ponerlo no re-hashea nada. Las otras cinco recetas que construyen desde este
|
|
# monorepo (arje-zero, arje-polkit-compat, arje-logind-compat, libelogind, y mise por el mismo motivo
|
|
# en otro repo) ya lo llevan.
|
|
#
|
|
# ⚠ Y el precio, medido: el vendoreo es del WORKSPACE ENTERO, no de este crate. Son **2,4 G** en
|
|
# `.hammer-cargo-vendor` y 1699 crates —`axum`, `aws-lc-sys`, `av1-grain`— para un host que usa
|
|
# quince. Es el mismo precio que ya pagan las otras cinco; no es de esta receta, pero conviene
|
|
# saberlo antes de construirla en una máquina con el disco al 94%.
|
|
cargo_vendor_dir = ".hammer-cargo-vendor"
|
|
|
|
[build]
|
|
compiler = "zig-cc"
|
|
target = "x86_64-linux-musl"
|
|
# Estático musl: lo lanza el navegador, así que no puede depender de encontrar un loader ni un
|
|
# `libstdc++` que en este corpus ya nos costó una noche (ver el `[deps] runtime` de atuq).
|
|
link = "static"
|
|
flags = ["-p", "puriy-costura", "--bin", "puriy-costura"]
|