From 60703e3975299f76f44d3e2d4c8df9486d97816e Mon Sep 17 00:00:00 2001 From: Sergio Date: Thu, 10 Sep 2026 00:05:53 +0000 Subject: [PATCH] puriy-costura: la receta del host de native messaging, y las dos trampas del monorepo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit El binario de «la costura» (SDD 26 §7) entra al corpus: `b3:3b633431`, ELF estático musl de 952 K pineado a tawasuyu `ebe41e96`. Verificado como artefacto y no sólo como build — un marco de 4 bytes por stdin y contesta `{"id":1,"ok":true,"verb":"ping","version":"0.1.0"}`; y la promesa del §6.1 entera contra el binario SELLADO: cuatro visitas aprendiendo, a la cuarta `stable`, y en la quinta un script cambiado ⇒ un evento que nombra el recurso y el delta de tamaño (+6 bytes). Deja `registro.postcard` y `bitacora.postcard` en el `--state`. Las dos cosas que costaron, las dos con el mismo patrón (el error no nombra la causa): 1. `cargo vendor --locked` murió con «cannot update the lock file», que NO dice qué crate falta. El lock de tawasuyu estaba desalineado con su propio `main`, y —esto es lo reutilizable— **un `Cargo.lock` regenerado en ese clon compartido NO describe su `main`**: ese árbol tiene cientos de ficheros en vuelo de otras sesiones. El nombre del crate culpable salió de diffear el lock publicado contra el que resuelve un árbol LIMPIO del commit (`git archive | tar -x`, que además no toca el `.git` compartido). Arreglado allá en dos commits; acá se pinea el que cierra. 2. Después murió por el `vendor/` propio del monorepo: tawasuyu parchea `smithay` a mano y lo enchufa con `[patch.crates-io] path = "vendor/smithay"`. Un patch por RUTA no necesita `.cargo-checksum.json` —y 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 traerlo. El síntoma fue 1 de 1699 crates sin checksum y un error que hablaba de `taffy`. La solución ya estaba en el corpus: `cargo_vendor_dir`, que las otras cinco recetas de este monorepo ya llevan. ⚠ Y la explicación FÁCIL era falsa: «cargo vendor borró el checksum» — `git ls-tree` dice que ese fichero nunca existió. Queda escrito en la receta para que nadie lo vuelva a deducir. El precio, medido y anotado: el vendoreo es del workspace ENTERO (2,4 G, 1699 crates, `axum` y `aws-lc-sys` incluidos) para un host que usa quince deps. Mismo precio que ya pagan las otras cinco. NO se declara en ningún perfil de `targets.toml` todavía, y NO se agrega el manifiesto de native messaging a atuq: sin la extensión que lo llame (unidad 6) sería un binario que nadie invoca y un manifiesto apuntando a una extensión inexistente, que es un fallo silencioso — el navegador arranca igual y la función no está. --- recipes/puriy-costura.toml | 76 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 recipes/puriy-costura.toml diff --git a/recipes/puriy-costura.toml b/recipes/puriy-costura.toml new file mode 100644 index 00000000..6eefb5b6 --- /dev/null +++ b/recipes/puriy-costura.toml @@ -0,0 +1,76 @@ +# 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 | 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 -- ` 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 = "ebe41e9683f8d53c988061dd8e46eb74c2057490" +# ⚠ 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:`, 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"]