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…
feat(recetas): pata y churay entran al catálogo — «no hay pata» era que no existía el paquete
1# puriy-costura — «la costura» del SDD 26 §7: el proceso nativo LARGO al que le habla la extensión
2# de `atuq` por native messaging, y que del otro lado habla con la suite.
3#
4# ══ POR QUÉ ESTA RECETA EXISTE, Y POR QUÉ EL BINARIO NO ES DE TAKANA ═══════════════════════════
5# Todo lo del §6 que no es CSS —transparencia de scripts, descargas al CAS, archivo con RAG,
6# torrent, foco— pasa por UN solo mecanismo, y que sea uno y no siete es la decisión de fondo: cada
7# función es un VERBO de este host y no un proyecto nuevo. El binario vive en tawasuyu porque es
8# SUITE, no build system; takana lo construye, lo mete en la clausura y le deja el manifiesto de
9# native messaging en su sitio. Acá no se decide nada de allá: el nombre del crate se decidió en
10# tawasuyu con su regla 10 puesta (2026-09-09).
11#
12# ══ EL COMMIT PINEADO TRAE EL LOCK, Y ESO COSTÓ DOS COMMITS ═══════════════════════════════════
13# `ebe41e96` = `9958224a0` (los dos crates) + el `Cargo.lock` cerrado. Sin lock al día `cargo vendor
14# --locked` muere con «cannot update the lock file», que NO nombra al crate culpable; y sin
15# `--locked` la resolución puede cambiar sola entre builds, que es lo que rompe la reproducibilidad
16# del artefacto. Mismo cuidado que `arje-packager.toml`.
17#
18# ⚠ Y la trampa que costó el primer intento, porque va a volver: **un `Cargo.lock` regenerado en el
19# clon compartido de tawasuyu NO describe su `main`** — ese árbol tiene cientos de ficheros en vuelo
20# de otras sesiones, así que el lock sale describiendo el escritorio de todos. El primer commit del
21# lock quedó a una línea de cerrar (`tempfile` en `nahual-iconos`, que lo declara en
22# `[dev-dependencies]`). Si hay que publicar un lock de allá, se genera en un árbol LIMPIO del commit
23# (`git archive <sha> | tar -x`, que además no toca el `.git` compartido) y se verifica que el diff
24# contra HEAD sea sólo lo que uno agregó.
25#
26# ══ POR QUÉ EL PIN SUBIÓ A `23a292863` (2026-09-16) ═══════════════════════════════════════════
27# El pin anterior (`e19bb0e5`) era ANCESTRO del commit que agregó los verbos de la bóveda, así que
28# `atuq` mandaba `vault.match` y este host contestaba «verbo desconocido»: la extensión lo lee como
29# «no hay bóveda», borra la insignia y se calla. Navegador sin la función, ficheros en orden — el
30# fallo más caro de encontrar que tiene este cable (SDD 26 §7.quinquies). Lo vigila
31# `scripts/vigia-atuq-verbos.py`, que corre en un segundo sin construir nada.
32#
33# Subirlo estuvo BLOQUEADO tres semanas por algo que no era de takana: el `Cargo.lock` de tawasuyu no
34# cerraba para este crate —listaba once deps y el manifiesto ya pedía las cuatro de `pacha-boveda`—,
35# y `cargo vendor --locked` moría sin nombrar al culpable. Desbloqueado publicando el lock cerrado
36# allá (`23a292863`), regenerado en un árbol limpio: 215 líneas, TODAS de contabilidad de deps por
37# ruta, cero `checksum` y cero `source` movidos.
38#
39# ══ `--bin` NO ES REDUNDANTE ══════════════════════════════════════════════════════════════════
40# `puriy-costura` tiene lib + bin (la lib es lo que los tests ejercitan por el cable de verdad), y el
41# root del monorepo es un manifiesto VIRTUAL: `-p` elige el paquete y `--bin` hace falta porque
42# `cargo rustc -- <flags>` exige un target único. Sin él el build muere con un error que habla de
43# targets ambiguos y no menciona esta receta.
44#
45# ══ QUÉ LE FALTA PARA QUE ATUQ LO USE ═════════════════════════════════════════════════════════
46# El manifiesto en `/usr/lib/mozilla/native-messaging-hosts/` (medido en el §7.bis: NO va en el
47# appdir, sale de un `/usr/lib/mozilla` COMPILADO en Gecko) y la extensión que lo llame, que es la
48# unidad 6. Un manifiesto que apunte a un binario ausente, o que declare una extensión que no
49# existe, es un fallo silencioso: el navegador arranca igual y la función simplemente no está. Por
50# eso el manifiesto NO se agrega desde acá «para tenerlo listo».
51
52name = "puriy-costura"
53version = "0.1.0"
54# Lo que declara el propio crate en tawasuyu (`[workspace.package]`), no una simplificación.
55license = "MIT OR Apache-2.0"
56
57[source]
58repo = "https://git.tawasuyu.net/tawasuyu/tawasuyu.git"
59commit = "619431cac9753cd55d0f9e2d99ff8efe7fab651b"
60# ⚠ SIN ESTO EL BUILD MUERE EN UN SITIO QUE NO NOMBRA LA CAUSA — medido acá el 2026-09-10.
61# tawasuyu COMMITEA su propio `vendor/`: adentro tiene un `smithay` parcheado a mano (tearing/flip
62# async para el compositor), y lo enchufa con `[patch.crates-io] smithay = { path = "vendor/smithay" }`.
63# Un patch POR RUTA no necesita `.cargo-checksum.json`, y de hecho **upstream no lo commitea**. Pero
64# `cargo vendor` convierte su directorio de salida en un DIRECTORIO DE REEMPLAZO DE FUENTE, donde
65# cada crate SÍ tiene que traer checksum — así que si se vendorea sobre `vendor/`, el smithay
66# parcheado pasa a estar sujeto a una regla que nunca cumplió.
67#
68# El síntoma no menciona nada de esto: 1 de 1699 crates sin `.cargo-checksum.json`, y un error que
69# habla de `taffy` y de una «replaced source». Anotado porque la explicación fácil —«cargo vendor
70# BORRÓ el checksum»— es falsa y se comprobó: `git ls-tree` dice que ese fichero nunca existió.
71#
72# `cargo_vendor_dir` NO entra en el ArtifactHash (`hash_inputs` usa `git:<commit>`, compiler, target
73# y link), así que ponerlo no re-hashea nada. Las otras cinco recetas que construyen desde este
74# monorepo (arje-zero, arje-polkit-compat, arje-logind-compat, libelogind, y mise por el mismo motivo
75# en otro repo) ya lo llevan.
76#
77# ⚠ Y el precio, medido: el vendoreo es del WORKSPACE ENTERO, no de este crate. Son **2,4 G** en
78# `.hammer-cargo-vendor` y 1699 crates —`axum`, `aws-lc-sys`, `av1-grain`— para un host que usa
79# quince. Es el mismo precio que ya pagan las otras cinco; no es de esta receta, pero conviene
80# saberlo antes de construirla en una máquina con el disco al 94%.
81cargo_vendor_dir = ".hammer-cargo-vendor"
82
83[build]
84compiler = "zig-cc"
85target = "x86_64-linux-musl"
86# Estático musl: lo lanza el navegador, así que no puede depender de encontrar un loader ni un
87# `libstdc++` que en este corpus ya nos costó una noche (ver el `[deps] runtime` de atuq).
88link = "static"
89flags = ["-p", "puriy-costura", "--bin", "puriy-costura"]