sitio: la sección «las decisiones» — diez, con contra qué se tomaron

Faltaba lo que la página no decía y es lo que distingue a la distro: no QUÉ es,
sino QUÉ SE DECIDIÓ y contra qué. Diez fichas, cada una con tres lecturas de lo
mismo — frente a lo habitual, técnicamente, y en simple— para que sirva igual al
que quiere el detalle y al que quiere entender de qué se trata.

  01 fuentes clavadas por commit/sha256   06 sin systemd: arje y arranque por grafo
  02 reproducible bit a bit, y why-differs 07 romper a mano y volver (overlay+diario)
  03 el paquete es receta, no binario      08 Wayland-only y PipeWire
  04 se reconstruye a sí misma (mrustc→rustc) 09 lo ajeno enjaulado y FUERA del store
  05 musl estático con zig cc              10 hecha para que una IA la opere

La de los dos pisos no entra a la lista: es la sección de arriba y de ella cuelgan
las diez. Repetirla habría sido rellenar.

Ninguna ficha es opinión: todas salen de un ADR o de una decisión ya tomada en
`docs/` — 0006 fuentes pineadas, 0003 zig cc, 0007 arje, 0010 arranque por grafo,
0014 multi-origen con índice firmado, 0015 imágenes ajenas. Y las afirmaciones
técnicas se comprobaron en el código antes de publicarlas, no de memoria:
`--unshare-all` (que incluye la red) y `SOURCE_DATE_EPOCH=1` están en
`takana-build/src/sandbox.rs:415,453`.

⚠ El precio, dicho en el README del sitio: si una decisión cambia, esta página
miente hasta que alguien la toque. Se gana claridad en la landing y se paga en
mantenimiento.

Las fichas se armaron con un guion de un solo uso, que no entra al repo: la página
sigue siendo la única fuente y no hay generador que mantener. Renumerados los
sellos (el código pasa a 03, estado 04, paquetes 05, frontera 06) y la barra suma
su enlace. 142 pares es/en emparejados, etiquetas balanceadas, cero anclas rotas,
y lo servido coincide con el disco.
This commit is contained in:
Sergio
2026-09-22 03:00:28 +00:00
parent c8fcd04945
commit 29c244612c
2 changed files with 166 additions and 4 deletions
+13
View File
@@ -11,6 +11,19 @@ las fuentes de Google en cada visita sería una contradicción barata.
| `fuentes.css` + `fuentes/` | las ocho caras `@font-face`, servidas de acá |
| `simbolo.svg` | el favicon — el martillo tocapu 7×7, derivado de `docs/marca/simbolo-fondo-claro.svg` |
## La sección «las decisiones»
Diez fichas, cada una con tres lecturas de lo mismo: contra qué se decide, qué implica por dentro,
y qué quiere decir sin jerga. **No son opinión: cada una sale de un ADR o de una decisión ya tomada
en `docs/`** — fuentes clavadas (ADR 0006), `zig cc` (0003), `arje` de init (0007) y el arranque por
grafo (0010), multi-origen con índice firmado (0014), imágenes ajenas enjauladas (0015), y las de
Wayland-only y PipeWire, que viven en los frentes de escritorio y audio.
**Si una decisión cambia, esta página miente hasta que alguien la toque.** Es el precio de
explicar el diseño en una landing y no en un doc generado: se gana claridad y se paga en
mantenimiento. Las fichas se armaron con un guion de un solo uso — la página es la fuente, no hay
generador que mantener.
La paleta y la tipografía salen de **`docs/marca/README.md`** y no se inventan acá. La única
desviación, deliberada: en tema claro el texto de acento usa un brasa oscurecido (`#9E3F16`), porque
el `#DF6B2A` de la marca sobre alpaca da 2,9:1 y no se lee. Las combinaciones de la página están
+153 -4
View File
@@ -109,6 +109,24 @@ ul.limpia{list-style:none;margin:.4rem 0 1rem}
ul.limpia li{position:relative;padding-left:1.15rem;margin-bottom:.45rem;color:var(--tenue);font-size:.95rem}
ul.limpia li::before{content:"";position:absolute;left:0;top:.62em;width:7px;height:2px;background:var(--brasa)}
/* las decisiones: cada una es una ficha con tres lecturas de lo mismo —
contra qué se decide, qué implica por dentro, y qué quiere decir sin jerga */
.decisiones{display:grid;gap:.85rem;margin-top:1.5rem}
.decision{border:1px solid var(--linea);border-radius:14px;background:var(--papel);
padding:1.15rem 1.3rem}
.decision h3{font-size:1.08rem;line-height:1.3;margin-bottom:.85rem;
display:flex;gap:.65rem;align-items:baseline}
.decision .num{font:500 .72rem/1 var(--mono);letter-spacing:.1em;color:var(--acento);flex:0 0 auto}
.decision dl{margin:0}
.decision dt{font:500 .65rem/1 var(--mono);letter-spacing:.16em;text-transform:uppercase;
color:var(--debil);margin-bottom:.32rem}
.decision dd{margin:0 0 .9rem;color:var(--tenue);font-size:.93rem}
.decision dd:last-child{margin-bottom:0}
.decision dt.simple{color:var(--acento)}
.decision dd.simple{color:var(--texto);border-left:2px solid var(--acento);padding-left:.8rem}
@media(max-width:600px){.decision{padding:1rem 1.05rem}
.decision h3{flex-direction:column;gap:.25rem}}
.marco{border:1px solid var(--linea);border-radius:14px;background:var(--papel);
padding:1.3rem 1.4rem;margin-bottom:1rem;position:relative;overflow:hidden}
.marco::before{content:"";position:absolute;inset:0 0 auto 0;height:3px;
@@ -181,6 +199,7 @@ footer.pie{border-top:1px solid var(--linea);background:var(--papel);padding:2.6
<a class="marca" href="/"><svg class="simbolo" viewBox="0 0 748 748"><use href="#tocapu"/></svg>takana</a>
<nav class="enlaces">
<a href="#pisos"><span data-l="es">Los dos pisos</span><span data-l="en">The two floors</span></a>
<a href="#decisiones"><span data-l="es">Las decisiones</span><span data-l="en">The decisions</span></a>
<a href="#codigo"><span data-l="es">El código</span><span data-l="en">The code</span></a>
<a href="#estado"><span data-l="es">El estado</span><span data-l="en">State</span></a>
<a href="#paquetes"><span data-l="es">Paquetes</span><span data-l="en">Packages</span></a>
@@ -230,8 +249,138 @@ footer.pie{border-top:1px solid var(--linea);background:var(--papel);padding:2.6
</div>
</div></section>
<section class="franja" id="decisiones"><div class="envoltura">
<p class="sello"><svg class="simbolo" viewBox="0 0 748 748"><use href="#tocapu"/></svg><span data-l="es">02 · las decisiones</span><span data-l="en">02 · the decisions</span></p>
<h2><span data-l="es">Diez decisiones, y contra qué se tomaron</span><span data-l="en">Ten decisions, and what they were taken against</span></h2>
<p>
<span data-l="es">La primera es la de arriba —los dos pisos— y de ella cuelga todo lo demás. Estas son las otras diez. De cada una: <strong>en qué se aparta de lo que hace una distro tradicional</strong>, <strong>qué implica por dentro</strong> y <strong>qué quiere decir sin jerga</strong>. Ninguna es gratis; todas se pagan en algún lado, y acá está dicho dónde.</span>
<span data-l="en">The first one is above — the two floors — and everything else hangs off it. These are the other ten. For each: <strong>how it departs from what a traditional distro does</strong>, <strong>what it involves under the hood</strong> and <strong>what it means without jargon</strong>. None is free; each is paid for somewhere, and that is said here.</span>
</p>
<div class="decisiones">
<article class="decision">
<h3><span class="num">01</span><span data-l="es">Todo se compila desde fuente, y la fuente está clavada</span><span data-l="en">Everything is compiled from source, and the source is pinned</span></h3>
<dl>
<dt><span data-l="es">Frente a lo habitual</span><span data-l="en">Compared to the usual</span></dt>
<dd><span data-l="es">Una distro normal te entrega un binario que compiló otra persona en otra máquina; lo que verificás es la firma de quien lo subió, no lo que hay adentro.</span><span data-l="en">A normal distro hands you a binary somebody else compiled on another machine; what you verify is the signature of whoever uploaded it, not what is inside.</span></dd>
<dt><span data-l="es">Técnicamente</span><span data-l="en">Technically</span></dt>
<dd><span data-l="es">Cada receta fija su fuente por <em>commit</em> de git o por <code>sha256</code> — nunca contra una rama viva. El hash del artefacto se deriva de la receta entera: fuente, compilador, banderas, fases de build y los hashes de cada dependencia. <code>takana hash</code> lo calcula sin construir nada.</span><span data-l="en">Each recipe pins its source by git <em>commit</em> or <code>sha256</code> — never against a live branch. The artefact hash is derived from the whole recipe: source, compiler, flags, build phases and the hash of every dependency. <code>takana hash</code> computes it without building anything.</span></dd>
<dt class="simple"><span data-l="es">En simple</span><span data-l="en">In plain words</span></dt>
<dd class="simple"><span data-l="es">Nadie te manda comida hecha: te manda la receta y la cocina tu máquina. Y la receta dice exactamente qué ingredientes, no «harina» a secas.</span><span data-l="en">Nobody sends you cooked food: they send the recipe and your machine cooks it. And the recipe names the exact ingredients, not just «flour».</span></dd>
</dl>
</article>
<article class="decision">
<h3><span class="num">02</span><span data-l="es">Reproducible bit a bit — y cuando no, se dice por qué</span><span data-l="en">Bit-for-bit reproducible — and when it isn't, it says why</span></h3>
<dl>
<dt><span data-l="es">Frente a lo habitual</span><span data-l="en">Compared to the usual</span></dt>
<dd><span data-l="es">Compilar el mismo paquete dos veces casi nunca da el mismo fichero, y en la práctica nadie lo comprueba: la diferencia se acepta como normal.</span><span data-l="en">Building the same package twice almost never yields the same file, and in practice nobody checks: the difference is accepted as normal.</span></dd>
<dt><span data-l="es">Técnicamente</span><span data-l="en">Technically</span></dt>
<dd><span data-l="es">El build corre aislado con <code>bubblewrap</code>, sin red y con la fecha fijada. Cuando dos artefactos difieren, <code>why-differs</code> desciende sólo por donde los hashes no coinciden y <strong>nombra la causa</strong>: un mtime dentro de un <code>.gz</code>, la cabecera <code>ar</code> de un <code>.a</code>, qué sección ELF cambió, una ruta del árbol de build filtrada al binario.</span><span data-l="en">Builds run sandboxed with <code>bubblewrap</code>, without network and with a fixed date. When two artefacts differ, <code>why-differs</code> descends only where the hashes disagree and <strong>names the cause</strong>: an mtime inside a <code>.gz</code>, the <code>ar</code> header of a <code>.a</code>, which ELF section changed, a build-tree path leaked into the binary.</span></dd>
<dt class="simple"><span data-l="es">En simple</span><span data-l="en">In plain words</span></dt>
<dd class="simple"><span data-l="es">Si dos personas hacen el mismo paquete, tiene que salir el mismo fichero. Y si sale distinto, el sistema te dice en qué — no te deja adivinando.</span><span data-l="en">If two people build the same package, the same file must come out. And if it doesn't, the system tells you where it differed — it doesn't leave you guessing.</span></dd>
</dl>
</article>
<article class="decision">
<h3><span class="num">03</span><span data-l="es">Un paquete es una receta, no un binario</span><span data-l="en">A package is a recipe, not a binary</span></h3>
<dl>
<dt><span data-l="es">Frente a lo habitual</span><span data-l="en">Compared to the usual</span></dt>
<dd><span data-l="es">El repositorio te manda el programa ya hecho, así que hay que confiar en el repositorio — y en cada espejo suyo.</span><span data-l="en">The repository sends you the finished program, so you have to trust the repository — and every one of its mirrors.</span></dd>
<dt><span data-l="es">Técnicamente</span><span data-l="en">Technically</span></dt>
<dd><span data-l="es">El índice va firmado con Ed25519 y ancla el <code>digest</code> de cada paquete. <code>install</code> resuelve el nombre, verifica la firma, <strong>reconstruye desde fuente</strong> y recién entonces hidrata. <code>--repo</code> acepta varios orígenes separados por comas y los prueba en orden.</span><span data-l="en">The index is Ed25519-signed and anchors each package's <code>digest</code>. <code>install</code> resolves the name, verifies the signature, <strong>rebuilds from source</strong> and only then hydrates. <code>--repo</code> takes several comma-separated origins and tries them in order.</span></dd>
<dt class="simple"><span data-l="es">En simple</span><span data-l="en">In plain words</span></dt>
<dd class="simple"><span data-l="es">El sitio del que bajás no necesita ser de fiar, porque no te da el resultado: te da las instrucciones, y se comprueba que sean las firmadas.</span><span data-l="en">The site you download from doesn't need to be trustworthy, because it doesn't give you the result: it gives you the instructions, and they are checked against the signed ones.</span></dd>
</dl>
</article>
<article class="decision">
<h3><span class="num">04</span><span data-l="es">Se reconstruye a sí misma, sin creerle a ningún binario</span><span data-l="en">It rebuilds itself, without trusting anybody's binary</span></h3>
<dl>
<dt><span data-l="es">Frente a lo habitual</span><span data-l="en">Compared to the usual</span></dt>
<dd><span data-l="es">El compilador de tu distro salió de un binario que compiló otra máquina, que salió de otro, hacia atrás sin fondo. Ese primer eslabón se cree por fe.</span><span data-l="en">Your distro's compiler came from a binary built by another machine, which came from another, backwards without end. That first link is taken on faith.</span></dd>
<dt><span data-l="es">Técnicamente</span><span data-l="en">Technically</span></dt>
<dd><span data-l="es">Cadena de Rust pura de <code>mrustc</code> a <code>rustc</code>, kernel Linux compilado acá que arranca la máquina, y el toolchain reconstruyéndose a sí mismo dentro de una máquina virtual. Hecho dos veces: mismo resultado, bit por bit.</span><span data-l="en">A pure Rust chain from <code>mrustc</code> to <code>rustc</code>, a Linux kernel built here that boots the machine, and the toolchain rebuilding itself inside a virtual machine. Done twice: same result, bit for bit.</span></dd>
<dt class="simple"><span data-l="es">En simple</span><span data-l="en">In plain words</span></dt>
<dd class="simple"><span data-l="es">La distro se puede fabricar a sí misma casi desde cero. No queda un eslabón que haya que aceptar sin poder mirarlo.</span><span data-l="en">The distro can manufacture itself from near zero. No link is left that you must accept without being able to look at it.</span></dd>
</dl>
</article>
<article class="decision">
<h3><span class="num">05</span><span data-l="es">musl, estático, y <code>zig cc</code> de compilador</span><span data-l="en">musl, static, and <code>zig cc</code> as the compiler</span></h3>
<dl>
<dt><span data-l="es">Frente a lo habitual</span><span data-l="en">Compared to the usual</span></dt>
<dd><span data-l="es">Lo habitual es glibc y enlazado dinámico: actualizar una librería puede romper un programa que no tocaste, y descubrirlo al arrancarlo.</span><span data-l="en">The usual is glibc and dynamic linking: updating one library can break a program you never touched, and you find out when you launch it.</span></dd>
<dt><span data-l="es">Técnicamente</span><span data-l="en">Technically</span></dt>
<dd><span data-l="es"><code>zig cc</code> es el compilador por defecto del laboratorio —trae los headers y la libc de cada target, sin cross-toolchain a mano— y es reemplazable receta por receta. El rootfs del lab se ancla a una imagen pineada por <code>sha256</code>, no se resuelve con un gestor de paquetes.</span><span data-l="en"><code>zig cc</code> is the lab's default compiler — it brings each target's headers and libc, with no hand-built cross-toolchain — and is replaceable recipe by recipe. The lab rootfs is pinned to an image by <code>sha256</code>, not resolved by a package manager.</span></dd>
<dt class="simple"><span data-l="es">En simple</span><span data-l="en">In plain words</span></dt>
<dd class="simple"><span data-l="es">Cada programa se lleva sus piezas adentro, así que tocar uno no rompe a los demás. Y el código de la libc es lo bastante chico como para leerlo.</span><span data-l="en">Each program carries its pieces inside, so touching one doesn't break the others. And the libc's code is small enough to actually read.</span></dd>
</dl>
</article>
<article class="decision">
<h3><span class="num">06</span><span data-l="es">Sin systemd: el init es propio y el arranque es un grafo</span><span data-l="en">No systemd: the init is our own and boot is a graph</span></h3>
<dl>
<dt><span data-l="es">Frente a lo habitual</span><span data-l="en">Compared to the usual</span></dt>
<dd><span data-l="es">El arranque lo gobierna un binario grande con formato de unidades propio y un registro binario que hay que consultar con su propia herramienta.</span><span data-l="en">Boot is governed by a large binary with its own unit format and a binary log you must query with its own tool.</span></dd>
<dt><span data-l="es">Técnicamente</span><span data-l="en">Technically</span></dt>
<dd><span data-l="es"><code>arje-zero</code> es el proceso número uno, estático contra musl. Los servicios se declaran en <em>Cards</em> JSON, con supervisión y reintento con backoff, y hablan por un socket Unix con <code>SO_PEERCRED</code>. El menú de arranque es la navegación del grafo de estados del sistema.</span><span data-l="en"><code>arje-zero</code> is process number one, statically linked against musl. Services are declared in JSON <em>Cards</em>, with supervision and backoff restarts, and talk over a Unix socket with <code>SO_PEERCRED</code>. The boot menu is navigation of the system's state graph.</span></dd>
<dt class="simple"><span data-l="es">En simple</span><span data-l="en">In plain words</span></dt>
<dd class="simple"><span data-l="es">Lo que enciende tu máquina se puede leer con un editor de texto y contar de memoria. No hay una pieza central que decida por vos y te cueste inspeccionar.</span><span data-l="en">What starts your machine can be read in a text editor and held in your head. There is no central piece deciding for you that is hard to inspect.</span></dd>
</dl>
</article>
<article class="decision">
<h3><span class="num">07</span><span data-l="es">Romper a mano está permitido — y se puede volver</span><span data-l="en">Breaking things by hand is allowed — and you can come back</span></h3>
<dl>
<dt><span data-l="es">Frente a lo habitual</span><span data-l="en">Compared to the usual</span></dt>
<dd><span data-l="es">Las inmutables no te dejan tocar sin aprender antes un lenguaje declarativo; las clásicas te dejan tocar y después el gestor de paquetes pierde el rastro de lo que hiciste.</span><span data-l="en">Immutable ones won't let you touch anything until you learn a declarative language; classic ones let you touch and then the package manager loses track of what you did.</span></dd>
<dt><span data-l="es">Técnicamente</span><span data-l="en">Technically</span></dt>
<dd><span data-l="es"><code>try</code> monta un overlay sobre el FHS real; <code>commit</code> lo promueve y <code>discard</code> lo tira. Un demonio <code>fanotify</code> registra cada cambio a mano y calcula el delta contra la base limpia; <code>export</code> lo convierte en un manifiesto compartible.</span><span data-l="en"><code>try</code> mounts an overlay over the real FHS; <code>commit</code> promotes it and <code>discard</code> throws it away. A <code>fanotify</code> daemon records every hand edit and computes the delta against the clean base; <code>export</code> turns it into a shareable manifest.</span></dd>
<dt class="simple"><span data-l="es">En simple</span><span data-l="en">In plain words</span></dt>
<dd class="simple"><span data-l="es">Probá lo que quieras: si sale mal se desmonta la capa y listo. Y lo que cambiaste a mano queda anotado solo — el registro <em>es</em> tu configuración, sin que hayas escrito ninguna.</span><span data-l="en">Try whatever you want: if it goes wrong the layer is unmounted and that's it. And what you changed by hand gets written down on its own — the log <em>is</em> your configuration, without you having written one.</span></dd>
</dl>
</article>
<article class="decision">
<h3><span class="num">08</span><span data-l="es">Wayland y nada más; el audio es PipeWire</span><span data-l="en">Wayland and nothing else; audio is PipeWire</span></h3>
<dl>
<dt><span data-l="es">Frente a lo habitual</span><span data-l="en">Compared to the usual</span></dt>
<dd><span data-l="es">Casi todas arrastran X11 y varios servidores de audio a la vez por compatibilidad, y mantienen los dos caminos para siempre.</span><span data-l="en">Almost all of them drag X11 and several audio servers along for compatibility, and maintain both paths forever.</span></dd>
<dt><span data-l="es">Técnicamente</span><span data-l="en">Technically</span></dt>
<dd><span data-l="es">Ninguna receta del catálogo publica <code>libGL.so</code> de escritorio ni GLX: las aplicaciones de gráficos van por EGL, y a las que no sabían hubo que portarlas. El audio es <code>pipewire</code> con <code>wireplumber</code>, como servicio de sesión, sin capa de compatibilidad permanente.</span><span data-l="en">No recipe in the catalogue ships a desktop <code>libGL.so</code> or GLX: graphics applications go through EGL, and the ones that didn't know how had to be ported. Audio is <code>pipewire</code> with <code>wireplumber</code>, as a session service, with no permanent compatibility layer.</span></dd>
<dt class="simple"><span data-l="es">En simple</span><span data-l="en">In plain words</span></dt>
<dd class="simple"><span data-l="es">Se eligió el camino nuevo y se borró el viejo, en vez de cargar los dos para siempre. Cuesta más al principio y se paga una sola vez.</span><span data-l="en">The new path was chosen and the old one deleted, instead of carrying both forever. It costs more up front and is paid only once.</span></dd>
</dl>
</article>
<article class="decision">
<h3><span class="num">09</span><span data-l="es">Lo ajeno corre enjaulado, y fuera del almacén</span><span data-l="en">Foreign software runs caged, and outside the store</span></h3>
<dl>
<dt><span data-l="es">Frente a lo habitual</span><span data-l="en">Compared to the usual</span></dt>
<dd><span data-l="es">O se mezclan binarios de terceros con los del sistema —y ya no se sabe de dónde salió cada cosa—, o directamente no hay forma de correrlos.</span><span data-l="en">Either third-party binaries get mixed in with the system's — and then you no longer know where anything came from — or there is simply no way to run them.</span></dd>
<dt><span data-l="es">Técnicamente</span><span data-l="en">Technically</span></dt>
<dd><span data-l="es">Un rootfs de otra distribución se trae pineado por <code>digest</code> y corre enjaulado con <code>bubblewrap</code> sobre el mismo kernel, sin compartir un solo <code>.so</code> con el anfitrión. <strong>No entra al store</strong>: no reproduce desde fuente, y meterlo ahí haría que el almacén mienta.</span><span data-l="en">Another distribution's rootfs is fetched pinned by <code>digest</code> and runs caged with <code>bubblewrap</code> on the same kernel, without sharing a single <code>.so</code> with the host. <strong>It does not enter the store</strong>: it does not reproduce from source, and putting it there would make the store lie.</span></dd>
<dt class="simple"><span data-l="es">En simple</span><span data-l="en">In plain words</span></dt>
<dd class="simple"><span data-l="es">Lo que no se puede cocinar acá igual se usa, pero en su propia caja y sin mezclarse. Así el catálogo no dice «esto es mío» de algo que no lo es.</span><span data-l="en">What cannot be cooked here is still used, but in its own box and unmixed. That way the catalogue never claims as its own something that isn't.</span></dd>
</dl>
</article>
<article class="decision">
<h3><span class="num">10</span><span data-l="es">Hecha para que una IA la opere, con el humano decidiendo</span><span data-l="en">Built for an AI to operate it, with the human deciding</span></h3>
<dl>
<dt><span data-l="es">Frente a lo habitual</span><span data-l="en">Compared to the usual</span></dt>
<dd><span data-l="es">Están pensadas para manos humanas: la automatización termina simulando a una persona —parsear salidas, adivinar formatos— y el sistema esconde su estado en bases binarias.</span><span data-l="en">They are designed for human hands: automation ends up simulating a person — parsing output, guessing formats — and the system hides its state in binary databases.</span></dd>
<dt><span data-l="es">Técnicamente</span><span data-l="en">Technically</span></dt>
<dd><span data-l="es">Todo el estado del sistema es texto plano y binarios inspeccionables con <code>readelf</code> u <code>objdump</code>; nada de bases de configuración opacas. Hay un bus por socket Unix por el que un agente dispara compilaciones, escucha fallos y propone cambios — siempre contra un overlay, nunca contra el sistema vivo.</span><span data-l="en">All system state is plain text and binaries inspectable with <code>readelf</code> or <code>objdump</code>; no opaque configuration databases. There is a Unix-socket bus through which an agent triggers builds, listens for failures and proposes changes — always against an overlay, never against the live system.</span></dd>
<dt class="simple"><span data-l="es">En simple</span><span data-l="en">In plain words</span></dt>
<dd class="simple"><span data-l="es">Un asistente puede entender y cambiar el sistema entero sin adivinar nada, y cada cosa que hace es reversible y queda anotada. Propone; vos disponés.</span><span data-l="en">An assistant can understand and change the whole system without guessing, and everything it does is reversible and recorded. It proposes; you decide.</span></dd>
</dl>
</article>
</div>
</div></section>
<section class="franja" id="codigo"><div class="envoltura">
<p class="sello"><svg class="simbolo" viewBox="0 0 748 748"><use href="#tocapu"/></svg><span data-l="es">02 · el código</span><span data-l="en">02 · the code</span></p>
<p class="sello"><svg class="simbolo" viewBox="0 0 748 748"><use href="#tocapu"/></svg><span data-l="es">03 · el código</span><span data-l="en">03 · the code</span></p>
<h2><span data-l="es">Dónde vive el repositorio</span><span data-l="en">Where the repository lives</span></h2>
<p>
<span data-l="es">Todo —el CLI, el laboratorio, el catálogo de recetas y el diseño completo— está en un solo repositorio, bajo licencia MIT.</span>
@@ -268,7 +417,7 @@ footer.pie{border-top:1px solid var(--linea);background:var(--papel);padding:2.6
</div></section>
<section class="franja" id="estado"><div class="envoltura">
<p class="sello"><svg class="simbolo" viewBox="0 0 748 748"><use href="#tocapu"/></svg><span data-l="es">03 · el estado, medido</span><span data-l="en">03 · the state, measured</span></p>
<p class="sello"><svg class="simbolo" viewBox="0 0 748 748"><use href="#tocapu"/></svg><span data-l="es">04 · el estado, medido</span><span data-l="en">04 · the state, measured</span></p>
<h2><span data-l="es">Qué anda y qué no</span><span data-l="en">What works and what doesn't</span></h2>
<table>
<thead><tr>
@@ -300,7 +449,7 @@ footer.pie{border-top:1px solid var(--linea);background:var(--papel);padding:2.6
</div></section>
<section class="franja" id="paquetes"><div class="envoltura">
<p class="sello"><svg class="simbolo" viewBox="0 0 748 748"><use href="#tocapu"/></svg><span data-l="es">04 · los paquetes</span><span data-l="en">04 · the packages</span></p>
<p class="sello"><svg class="simbolo" viewBox="0 0 748 748"><use href="#tocapu"/></svg><span data-l="es">05 · los paquetes</span><span data-l="en">05 · the packages</span></p>
<h2><span data-l="es">El repositorio de paquetes</span><span data-l="en">The package repository</span></h2>
<p>
<span data-l="es">El índice está firmado y cada paquete trae la <em>receta</em> de su contenido, no el binario cocinado: <code>install</code> resuelve el nombre, verifica la firma del índice y <strong>reconstruye desde fuente</strong> antes de hidratar. Un origen de descarga no necesita ser de confianza — lo que se verifica es el contenido.</span>
@@ -323,7 +472,7 @@ footer.pie{border-top:1px solid var(--linea);background:var(--papel);padding:2.6
</div></section>
<section class="franja"><div class="envoltura">
<p class="sello"><svg class="simbolo" viewBox="0 0 748 748"><use href="#tocapu"/></svg><span data-l="es">05 · la frontera</span><span data-l="en">05 · the border</span></p>
<p class="sello"><svg class="simbolo" viewBox="0 0 748 748"><use href="#tocapu"/></svg><span data-l="es">06 · la frontera</span><span data-l="en">06 · the border</span></p>
<h2><span data-l="es">Qué tiene que ver con tawasuyu</span><span data-l="en">How it relates to tawasuyu</span></h2>
<p>
<span data-l="es"><strong>takana es el suelo; tawasuyu es lo que se para encima.</strong> No son dos mundos sueltos: comparten el almacén direccionado por contenido (BLAKE3), un bus entre el init de tawasuyu y el demonio de takana con contrato por bytes, el grafo de arranque, y <code>arje</code> —el proceso número uno de tawasuyu— como init de las imágenes, estático contra musl.</span>