gioser

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…

TOML 1572Shell 203Rust 109Markdown 993728 Sutichaykuna

docs: SDD 20 (catálogo hasta publicable y hasta completa) + SDD 21 (manual del piloto)

Pedido del usuario: «el catálogo de todo lo que falta hasta decir la distro está
publicable, y lo de más hasta la distro está completa. Y un tipo manual, todos los pasos
que tengo que ir haciendo en las tres etapas que marcan esos dos codos.»

SDD 20 = el inventario, medido contra el repo (grafo, no recuento a mano). SDD 21 = el
manual de a pie, un comando por vez, marcando qué puede hacer el agente y qué es del
usuario.

LO QUE APARECIÓ AL MEDIR, y que no se sabía:

· La deuda de construcción NO son 12+12+13+12 recetas: es UNA lista de 12 vista desde
  cuatro grafos (la cadena GUI de la cascada de mesa). Un solo arreglo —declarar python3 y
  cmake en `[deps]`, no engordar el rootfs del worker— las destraba todas. `base` y `cli`
  ya están al 100%, KDE cierra 162/162.

· De WMs Wayland ligeros no hay NINGUNO: sólo `foot` y `mako`. Falta wlroots entero, los
  compositores y todos los accesorios (waybar, fuzzel, swaybg, grim, slurp, wl-clipboard).

· De aplicaciones gráficas de terceros hay CERO. Ni visor de imágenes ni lector de PDF.

· Firefox no es «una receta más»: su cadena de `*-sys` con C++ es justo la frontera que el
  techo MSRV del sandbox (1.96) no cruza. Antes de Firefox hay que subir el techo; empezar
  por la receta es empezar por el final.

· El texto de la licencia va inyectado en `hammer pack`, NO en la fase install: las fases
  entran al ArtifactHash, así que hacerlo en la receta re-hashearía las 1141. Pack es aguas
  abajo y sale gratis. Misma lógica que hizo pagable el campo `license`.

Dos correcciones al SDD 19, que escribí yo ayer y tenía mal:
· «5 de 771 recetas declaran licencia» — falso por partida doble. El número real era 0 de
  1141; los «5» eran falsos positivos de `grep license` (nombres de paquete, una línea de
  install, un comentario) y 771 son los nodos del grafo del corpus, no las recetas.
· «El repo no declara licencia» — falso: hay LICENSE (MIT) en la raíz y en Cargo.toml. No
  lo miré antes de escribirlo.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

e79b26970a19aeab699999a8853cda17d5a60a38 · ruwaq sergio · (2 killa ñawpaq) · tayta 346cd5970 · kay commitpi sach'ata qhaway

Semántico sayk'uy

Mana ima sutichaypas t'ikrakurqanchu: qillqalla, yachachiylla utaq willaylla t'ikrakurqan.

3 qillqakuna · +476 −5

diff --git a/docs/19-lanzamiento-publico.md b/docs/19-lanzamiento-publico.md
index 9d72c903..4f9da2d7 100644
--- a/docs/19-lanzamiento-publico.md
+++ b/docs/19-lanzamiento-publico.md
@@ -52,9 +52,20 @@ Ordenado por dependencia, no por gusto.
 
 Esto es lo que más fácil se pasa por alto y lo que puede obligar a bajar una descarga ya publicada.
 
-### 2.1 Metadatos de licencia: **5 de 771 recetas los declaran**
-Medido el 2026-08-07: `grep -l license recipes/*.toml` da **5**. O sea que la distro no sabe bajo qué
-términos redistribuye el 99% de lo que empaqueta.
+### 2.1 Metadatos de licencia: eran **0 de 1141**; hoy van 228
+> **CORRECCIÓN (mismo día).** Este párrafo decía «5 de 771 recetas los declaran», contado con
+> `grep -l license recipes/*.toml`. **Los dos números estaban mal.** Los «5» eran falsos positivos:
+> el paquete `addlicense`, el paquete `cargo-bundle-licenses`, una línea `install .../licenses/` y un
+> comentario — `grep -l <palabra>` sobre TOML cuenta comentarios y nombres, no campos. Y las recetas
+> son **1141**, no 771 (771 son los nodos del grafo del corpus). El número real era **0 de 1141**.
+>
+> **Estado actual**: campo `license` implementado **fuera de `hash_inputs`** (se puebla sobre recetas
+> ya selladas sin mover un `ArtifactHash`; verificado en 40 recetas, 40 idénticos), `scripts/licencias.sh`
+> que cuenta el campo de verdad, y **228 sembradas** desde una tabla curada. Faltan 913, casi todas
+> CLIs Go/Rust — automatizables desde `Cargo.toml` y los `LICENSE` de los módulos Go.
+>
+> El catálogo completo está en [SDD 20](20-catalogo-publicable-y-completa.md); los pasos, en
+> [SDD 21](21-manual-del-piloto.md).
 
 Hace falta:
 - Un campo de licencia **obligatorio** en la receta (con validación en `hammer`, no por convención).
@@ -75,8 +86,10 @@ después.
 Redistribuir Firefox con su nombre y logo requiere cumplir la política de marca de Mozilla; por eso
 Debian tuvo Iceweasel. Lo mismo con otros. Decidir por adelantado: cumplir o rebrandear.
 
-### 2.4 La licencia de hammer mismo
-El repo no declara una. Sin eso, legalmente nadie puede contribuir ni derivar.
+### 2.4 La licencia de hammer mismo — ✅ ya está
+> **CORRECCIÓN (mismo día).** Este punto decía «el repo no declara una». **Es falso**: hay un
+> `LICENSE` (MIT) en la raíz y `license = "MIT"` en `Cargo.toml`. No lo miré antes de escribirlo.
+> Este punto no bloquea nada.
 
 ---
 
diff --git a/docs/20-catalogo-publicable-y-completa.md b/docs/20-catalogo-publicable-y-completa.md
new file mode 100644
index 00000000..548cf272
--- /dev/null
+++ b/docs/20-catalogo-publicable-y-completa.md
@@ -0,0 +1,202 @@
+# SDD 20 — El catálogo de lo que falta: hasta PUBLICABLE y hasta COMPLETA
+
+Escrito 2026-08-07, a pedido del usuario: «el catálogo de todo lo que falta hasta decir *la distro
+está publicable*, y lo de más hasta *la distro está completa*».
+
+Este documento es el **inventario**. El [SDD 21](21-manual-del-piloto.md) es el **manual de a pie**:
+qué tiene que hacer el usuario, en qué orden, en cada una de las tres etapas.
+
+Todo lo de acá está **medido contra el repo el 2026-08-07**, no estimado de memoria. Donde hay un
+número, hay un comando que lo produjo.
+
+---
+
+## Los dos codos, y por qué están donde están
+
+- **PUBLICABLE** = un extraño puede descargarla, instalarla, usarla y actualizarla, y nosotros
+  estamos en regla al dársela. **No** significa que tenga todo lo que uno querría.
+- **COMPLETA** = tiene lo que una persona espera de un sistema de escritorio para su día a día, sin
+  tener que salir a buscar nada fuera.
+
+La distancia entre los dos codos es enorme y **el orden importa**: casi todo lo caro (navegador,
+ofimática) está DESPUÉS del primer codo, y casi todo lo bloqueante (legal, claves, actualización)
+está ANTES. La trampa clásica es invertirlos — pasarse meses con el navegador y descubrir el día del
+anuncio que no se puede publicar.
+
+---
+
+# PARTE I — Hasta «la distro está PUBLICABLE»
+
+## I.1 Estado de construcción: esto ya está casi cerrado
+
+Medido con `docs/state/build-state*.json` (el grafo, no recuento a mano):
+
+| frente | nodos | sellados | en deuda |
+|---|---:|---:|---:|
+| corpus | 771 | 759 | **12** |
+| KDE | 968 | 952 | 12 |
+| GNOME | 853 | 840 | 13 |
+| COSMIC | 818 | 806 | 12 |
+
+Los perfiles `base` (51 nodos) y `cli` (74 nodos) están **al 100%, deuda 0**. KDE cierra 162/162.
+
+**La deuda real es una sola lista de 12 recetas, compartida por todos los frentes** (por eso el
+número se repite: es el mismo agujero visto desde cuatro grafos):
+
+```
+gtk4  libadwaita  gtksourceview  gtk4-hello  adwaita-hello  sourceview-hello
+hammer-edit  mirada-compositor  mirada-greeter  dwarves  llimphi-counter  wlr-randr
+```
+
+Es **la cadena GUI de la cascada de mesa**, y tiene una causa conocida y un bloqueo conocido:
+
+> No se pueden construir en el laptop por el **zig-skew** (rompe cairo), y **fallan en el worker por
+> su rootfs**: `python OSError` en meson y `find_package` en cmake, porque el worker no trae python3
+> ni cmake. El arreglo correcto **no es engordar el rootfs del worker** sino declarar las
+> herramientas en `[deps]` de cada receta. Ver la nota `rootfs-laptop-worker-divergen`.
+
+**Esto es el primer trabajo técnico a hacer, y desbloquea las 12 de una vez.**
+
+## I.2 🚨 Lo legal — bloqueante
+
+### Licencias: de 0 a 228 de 1141 hoy, faltan 913
+El 2026-08-07 se midió: **0 de 1141 recetas** declaraban licencia. (El informe previo decía «5 de
+771»; los dos números estaban mal — los «5» eran falsos positivos de `grep license`: el paquete
+`addlicense`, el paquete `cargo-bundle-licenses`, una línea de `install` y un comentario.)
+
+Ese mismo día se hizo lo estructural:
+- Campo `license` en la receta, **fuera de `hash_inputs`** ⇒ se puebla sobre recetas ya selladas sin
+  mover un solo `ArtifactHash`. Verificado en 40 recetas: 40 hashes idénticos, 0 cambiados.
+- `scripts/licencias.sh` mide de verdad (cuenta el campo, no la palabra) y siembra desde una tabla
+  curada.
+- 228 sembradas: todo el toolchain, la base C, las gráficas, GNOME/GTK, Qt, KDE Frameworks y Plasma.
+
+**Falta**: las 913 restantes, casi todas CLIs Go/Rust importados en masa. Buena noticia: **ésas sí se
+automatizan con evidencia real y sin red** — `Cargo.toml` trae el campo `license` y los módulos Go
+traen su `LICENSE` en el árbol. El cierre definitivo es capturarlo en la **fase de fetch**, que ya
+descarga y extrae cada tarball.
+
+⚠️ **La regla que no se rompe**: no se rellena a ojo. Declarar mal una licencia es peor que dejarla
+vacía — convierte un hueco visible en una afirmación falsa. Concretamente se descartó el atajo
+«`k*` = KDE ⇒ LGPL»: en este catálogo `kail`, `kind`, `ko`, `kopia`, `krew`, `kustomize`, `kyverno`
+y toda la familia `kube*` son herramientas Go sin relación con KDE.
+
+### El texto de la licencia dentro del paquete
+La GPL obliga a acompañar el binario del texto. **Dónde se inyecta decide el precio**: en la fase
+`install` de la receta re-hashearía las 1141 (las fases SÍ entran al hash); en **`hammer pack`** es
+gratis, porque pack es aguas abajo del `ArtifactHash`. Va en pack.
+
+### Espejo de fuentes — la obligación que más se malentiende
+La GPL no pide «que el código exista en internet»: pide que **quien recibe el binario pueda obtener
+de nosotros la fuente correspondiente**. Hoy las recetas apuntan a URLs de terceros que se caen.
+
+Acá estamos inusualmente bien parados: cada receta pinea `tarball` + `sha256`, así que el espejo es
+mecánico **y encima verificable**. Pero tiene que existir **antes de la primera descarga**.
+
+### Marcas
+Redistribuir Firefox con su nombre y logo exige cumplir la política de marca de Mozilla (por eso
+Debian tuvo Iceweasel). Decidir por adelantado: cumplir o rebrandear. **No bloquea el primer
+lanzamiento** si se sale sin navegador propio.
+
+### La licencia de hammer — ✅ ya está
+`LICENSE` en la raíz y `license = "MIT"` en `Cargo.toml`. *(El SDD 19 decía que faltaba; era falso.)*
+
+## I.3 Infraestructura pública
+
+1. **Espejo de paquetes e imágenes.** Dimensionado real: el store son 128 G, pero **el 79% es
+   información de depuración** ⇒ separando `-debug` en paquetes aparte el espejo baja a **~30 G**.
+2. **Cadena de firma de release.** Hoy hay firma de índice. Falta el nivel de arriba: **clave raíz
+   fuera de línea**, claves de firma rotables y un procedimiento escrito para cuando se filtre una.
+   Firma sin gestión de claves es teatro.
+3. **Evidencia de reproducibilidad publicada.** Es *el* diferenciador: publicar junto a cada imagen
+   los `ArtifactHash` de toda su clausura, para que un tercero reconstruya y compare. Es lo que
+   convierte «somos reproducibles» en un hecho comprobable por un extraño.
+4. **Respuesta a seguridad**: un canal para reportes y —lo importante— la capacidad **demostrada** de
+   empujar una actualización y que llegue. Ensayar el ciclo completo con un CVE de mentira.
+
+## I.4 Que se pueda instalar y usar
+
+1. **Imagen instalable validada en METAL**, no sólo en QEMU. Está a medio camino: el USB de KDE en
+   metal está **en curso** y falta re-quemarlo. Reglas ya pagadas caro: validar imágenes de
+   escritorio **con pantalla**, nunca sólo `-nographic`; `/dev/console` es el serial, así que cada
+   capa debe escribir a `/dev/tty0`; y **nunca quemar a un NVMe**.
+2. **Matriz de hardware honesta**: en qué se probó y en qué no. Vale más «probado en estas 3
+   máquinas» que «debería funcionar».
+3. **Actualización en sitio probada de verdad**: instalar N, actualizar a N+1, y que arranque. Y
+   **rollback**, que con un store direccionado por contenido debería ser barato — es la ventaja
+   natural de esta arquitectura y conviene que sea función de primera clase.
+4. **Documentación mínima**: instalar, gestionar paquetes, reportar un fallo.
+5. **Sitio de descarga** con sumas y firmas, y las instrucciones para verificarlas.
+
+## I.5 Lo que falta de sistema para que no se note pobre
+
+Presente ya: `networkmanager`, `pipewire`, `wireplumber`, `polkit`, `seatd`, `upower`, `tzdata`,
+`fontconfig`. **Falta**: `cups` (impresión), `bluez` (bluetooth), y tipografías/locales revisados.
+
+---
+
+# PARTE II — De PUBLICABLE a «la distro está COMPLETA»
+
+Acá está el trabajo grande, y conviene decir los tamaños en voz alta.
+
+## II.1 WMs Wayland ligeros — barato, alto retorno
+**Medido: no hay ninguno.** De toda la familia sólo existen `foot` (terminal) y `mako`
+(notificaciones). Falta la base entera:
+
+- **`wlroots`** primero: es la biblioteca de la que cuelgan casi todos.
+- **Compositores**: `sway`, `labwc`, `river`, `niri`.
+- **La barra y los accesorios, sin los cuales un WM no se usa**: `waybar`, `fuzzel`/`wofi`,
+  `swaybg`, `swayidle`, `swaylock`, `grim`, `slurp`, `wl-clipboard`.
+
+Son **baratos comparados con los escritorios completos**: no hay una torre de C debajo. Es la mejor
+relación esfuerzo/resultado que queda en el proyecto.
+
+## II.2 Aplicaciones gráficas de terceros — **medido: cero**
+No hay ni una. Por coste creciente:
+
+- **Barato** (y es lo que hace que la distro se sienta usable): visor de imágenes (`imv`), lector PDF
+  (`zathura`), reproductor (`mpv`), gestor de archivos, editor de texto gráfico, emulador de terminal
+  adicional (`alacritty`, `kitty`).
+- **Caro**: **LibreOffice**.
+- **El más caro de todo el catálogo**: **un navegador**. Firefox es Rust + C++ + su propio sistema de
+  build, y arrastra cbindgen, nasm, nodejs y una cadena de `*-sys` con C++ — que es **justo la
+  frontera que el techo MSRV del sandbox (1.96) no cruza todavía**. Presupuestarlo como un frente
+  propio, no como «una receta más».
+
+## II.3 Deuda técnica de fondo que conviene cerrar antes de crecer
+
+- **Las 16 recetas con `compiler = "gcc"`** (contadas parseando TOML; `grep` cuenta comentarios).
+  Las 12 de Rust son **un solo problema**: falta el unwinder de libgcc.
+- **No-determinismo en 92 paquetes**, todos por rutas `/src` incrustadas en secciones `.debug_*`. El
+  arreglo (`-ffile-prefix-map` global) re-hashea ~720 recetas: decisión de arquitectura, no remiendo.
+- **La carrera del árbol de fuentes (ADR 0012)**, pendiente y **sin decidir**: dos builds de la misma
+  dependencia se pisan. Aviso registrado: *un lock sólo en la extracción parece correcto y NO lo es.*
+- **El multi-init**: los inits del catálogo **compiten** con arje-zero, no se apilan.
+
+## II.4 Sostenibilidad — lo que decide si sobrevive al primer mes
+Versionado y cadencia escritos; **reconstrucción desde cero en una máquina limpia, cronometrada** —
+la prueba de que el proyecto no depende de un laptop concreto, que es exactamente la preocupación que
+originó el respaldo del 2026-08-07.
+
+---
+
+# PARTE III — El resumen ejecutivo
+
+**Para PUBLICABLE falta, en una línea cada uno:**
+
+1. Arreglar el entorno del worker → caen las 12 recetas en deuda.
+2. Terminar las licencias (913) e inyectar el texto en `hammer pack`.
+3. Montar el espejo de fuentes.
+4. Clave raíz fuera de línea y procedimiento de rotación.
+5. Imagen validada en metal (re-quemar el USB).
+6. Actualización N→N+1 probada, con rollback.
+7. Espejo de paquetes (~30 G separando `-debug`), sitio, sumas y firmas.
+8. `cups` y `bluez`.
+9. Documentación mínima y un canal de reportes.
+
+**Se puede publicar SIN**: navegador propio, ofimática, y el reconstructor independiente. Son
+objetivos, no requisitos.
+
+**Para COMPLETA falta, además**: wlroots + los WMs ligeros y sus accesorios, el juego de aplicaciones
+gráficas, LibreOffice, el navegador, y cerrar la deuda de fondo (gcc, determinismo `.debug_`,
+ADR 0012).
diff --git a/docs/21-manual-del-piloto.md b/docs/21-manual-del-piloto.md
new file mode 100644
index 00000000..25062ab5
--- /dev/null
+++ b/docs/21-manual-del-piloto.md
@@ -0,0 +1,256 @@
+# SDD 21 — Manual del piloto: qué hago yo, paso a paso
+
+Escrito 2026-08-07, a pedido del usuario: «un tipo manual, todos los pasos que tengo que ir haciendo
+en las tres etapas que marcan esos dos codos».
+
+El inventario de lo que falta está en el [SDD 20](20-catalogo-publicable-y-completa.md). **Esto es lo
+otro**: lo que hace el humano, en orden, con el comando al lado y el motivo debajo. Un comando por
+vez — nada de bloques largos para pegar a ciegas.
+
+**Convención**: `$` = lo tecleás vos. Si un paso puede hacerlo el agente solo, dice **[agente]** y
+sólo tenés que pedirlo.
+
+---
+
+# ETAPA 0 — La rutina, siempre
+
+Esto no es una etapa con final: es lo que se hace cada vez que se enciende la máquina. Si algo de
+acá falla, todo lo demás corre sobre arena.
+
+### 0.1 Después de CADA reinicio: dos comprobaciones
+
+```
+$ git -C ~/hammer fsck
+```
+Un crash puede dejar el `.git` corrupto. Si esto grita, **parar y avisar antes de seguir trabajando**:
+un commit encima de un repo roto empeora el problema.
+
+```
+$ pgrep -x crond
+```
+Si no imprime un número, **el latido está muerto y no se nota**: la cosecha del worker, la siembra de
+recetas y la regeneración del grafo dejan de correr en silencio. arje-zero como PID 1 no arranca
+cronie, así que pasa en cada arranque. Se revive con:
+
+```
+$ sudo /usr/bin/crond -s
+```
+Tiene que ser esa ruta y ese flag. **`rc-service` FALLA** — ya se probó.
+
+### 0.2 El disco, una vez al día
+
+```
+$ df -h /home
+```
+Por debajo de **50 G libres**, actuar. La válvula es:
+
+```
+$ cd ~/hammer && ./scripts/store-gc.sh --aplicar
+```
+⚠️ **En PRIMER PLANO, mirando la pantalla.** No en segundo plano, no con `&`, no con `nohup`. El
+2026-08-07 este script informó «364 artefactos borrados, 24G liberados» **sin haber borrado ninguno**
+— corriendo en segundo plano el borrado no se materializaba y el `echo` se creía el `rm`. Ahora lleva
+un guardián que recuenta sobre el disco y sale con error si sobrevivió algo, pero la regla de correrlo
+en primer plano sigue en pie.
+
+Recupera ~24 G por ciclo de trabajo (los artefactos *superados*). Si hace falta más, el orden de
+reservas, de barata a cara, está en la nota `capacidad-disco-proyeccion`.
+
+### 0.3 El respaldo
+
+```
+$ cd ~/hammer && ./scripts/respaldo-storagebox.sh
+```
+**Es interrumpible y continuable**: podés cortarlo con Ctrl-C o apagar el laptop cuando quieras, y al
+relanzarlo sigue donde quedó — incluso a mitad de un fichero grande. Corré esto siempre que vayas a
+tener la máquina encendida un rato largo.
+
+Dato medido en la oficina el 2026-08-07: el uplink da **8 Mbps de subida, iguales por cable y por
+wifi** ⇒ el cuello está en la conexión del local, no en tu laptop, y **enchufar el cable no cambia
+nada**. Los 128 G del store no caben en una sentada; por eso el script sube primero el *cerebro*
+(estado + repo, que es lo que no se puede perder) y después el store.
+
+### 0.4 El worker
+
+```
+$ hcloud server list
+```
+Si `hworker-1` aparece, está facturando. Se apaga solo: lleva un *dead-man* propio que lo **borra**
+(no lo apaga — apagado seguiría facturando) tras 1 hora sin builds. Para ver si está trabajando de
+verdad **mirá los procesos, no la carga**: durante el `sleep 180` del bucle la carga marca 0 y parece
+idle sin estarlo.
+
+---
+
+# ETAPA 1 — De hoy a «la distro está PUBLICABLE»
+
+El orden está elegido para que lo bloqueante vaya primero y lo caro después. **La trampa clásica es
+invertirlo**: pasarse meses con el navegador y descubrir el día del anuncio que no se puede publicar.
+
+### Paso 1 — Destrabar las 12 recetas en deuda
+**[agente]** Es un solo agujero visto desde cuatro grafos: la cadena GUI de la cascada de mesa. No se
+pueden construir en el laptop (zig-skew rompe cairo) y fallan en el worker porque su rootfs no trae
+python3 ni cmake.
+
+El arreglo correcto es **declarar las herramientas en `[deps]` de cada receta, NO engordar el rootfs
+del worker**. Engordarlo parece más rápido y es justo lo que rompe la reproducibilidad: el build
+pasaría a depender de qué hay instalado en una máquina concreta.
+
+Vos: pedirlo, y tener el worker arriba.
+
+### Paso 2 — Terminar las licencias
+**[agente]** Quedan 913 de 1141, casi todas CLIs Go/Rust. Se automatiza con evidencia real y sin red:
+`Cargo.toml` trae el campo `license` y los módulos Go traen su `LICENSE` en el árbol.
+
+Para ver dónde estamos en cualquier momento:
+```
+$ cd ~/hammer && ./scripts/licencias.sh
+```
+
+**Lo que te toca decidir a vos**: cuando una licencia sea ambigua, se deja vacía. No se rellena a
+ojo. Un hueco contado es deuda; un hueco rellenado a ojo es una mentira sobre la que alguien va a
+construir.
+
+### Paso 3 — El texto de la licencia dentro del paquete
+**[agente]** Va en `hammer pack`, **no** en la fase `install` de las recetas. Las fases entran al
+`ArtifactHash`, así que hacerlo ahí re-hashearía las 1141; pack es aguas abajo y sale gratis.
+
+### Paso 4 — El espejo de fuentes
+**[agente]** construye; **vos** decidís dónde vive y pagás el alojamiento.
+
+Es la obligación de la GPL que más se malinterpreta: no es «que el código exista en internet», es que
+quien recibe el binario pueda obtener **de nosotros** la fuente correspondiente. Como cada receta
+pinea `tarball` + `sha256`, es mecánico y encima verificable. **Tiene que existir antes de la primera
+descarga pública.**
+
+Decisión tuya: el Storage Box ya tiene 1 TiB y sobra sitio — puede servir de espejo de fuentes sin
+gastar un euro más, pero no está pensado para servir tráfico web. Conviene decidirlo antes.
+
+### Paso 5 — Las claves de firma 🔑 **esto es tuyo, no delegable**
+Hoy hay firma de índice; falta el nivel de arriba. Hace falta:
+
+1. Generar una **clave raíz fuera de línea** — en una máquina que no esté en internet, y que **nunca**
+   toque este laptop ni el worker.
+2. Guardar el respaldo de esa clave **en papel o en un medio que no esté conectado**, en otro sitio
+   físico.
+3. Generar claves de firma intermedias, rotables, firmadas por la raíz.
+4. Escribir el procedimiento de qué hacer si se filtra una.
+
+**Por qué te toca a vos**: una clave raíz que un agente puede leer no es una clave raíz. Y firma sin
+gestión de claves es teatro — peor que no firmar, porque da confianza falsa.
+
+### Paso 6 — La imagen en metal
+Falta **re-quemar el USB** (está a medias).
+
+```
+$ lsblk -o NAME,SIZE,TRAN,MODEL
+```
+⚠️ **Identificá el disco por tamaño/modelo/transporte, NUNCA por nombre.** Los nombres bailan entre
+arranques. Y **jamás quemar a un NVMe**: ahí vive tu sistema.
+
+Al validar imágenes de escritorio, **con pantalla, nunca sólo `-nographic`**. Dos trampas ya pagadas
+caro: `/dev/console` es el serial, así que cada capa tiene que escribir a `/dev/tty0` para que la
+veas; y para COSMIC en QEMU `-vga none` es **obligatorio** (virtio-gpu suma una VGA ⇒ dos salidas, y
+el panel se ancla en la que no estás capturando), con `-smp 8` porque el panel tiene deadline de
+arranque.
+
+### Paso 7 — Probar la actualización de verdad
+**[agente]** monta el ensayo; **vos** mirás el resultado. Instalar N, actualizar a N+1, que arranque.
+Y **rollback**, que con un store direccionado por contenido debería ser barato — es la ventaja
+natural de esta arquitectura, y conviene que sea función de primera clase antes de publicar, no
+después.
+
+### Paso 8 — `cups` y `bluez`
+**[agente]**. Impresión y bluetooth. Sin esto la distro se siente incompleta aunque todo lo demás ande.
+
+### Paso 9 — La infraestructura pública
+- Espejo de paquetes: **~30 G** separando los `-debug` en paquetes aparte (el 79% del store es
+  información de depuración). **Vos**: contratar el alojamiento.
+- Sitio de descarga con sumas y firmas, y las instrucciones para verificarlas.
+- **Publicar la evidencia de reproducibilidad**: los `ArtifactHash` de la clausura de cada imagen.
+  Esto es *el* diferenciador — es lo que convierte «somos reproducibles» en algo que un extraño puede
+  comprobar. No lo dejes para después: es lo único que nadie más está ofreciendo.
+- Un canal de reportes y una dirección para avisos de seguridad.
+
+### Paso 10 — Antes de anunciar: el ensayo general
+Ensayar el ciclo completo de seguridad **con un CVE de mentira**: detectar, construir, firmar,
+publicar, y que le llegue a una máquina instalada. Si esto no está ensayado, el primer CVE real te
+encuentra improvisando.
+
+---
+
+# ETAPA 2 — De PUBLICABLE a «la distro está COMPLETA»
+
+Acá ya estás publicado y tenés usuarios. Cambia el modo de trabajo: **cada cosa que agregues tiene
+que llegarles por el canal de actualización**, así que la Etapa 1 §7 tiene que estar sólida.
+
+### Paso 1 — Los WMs Wayland ligeros (empezá por acá)
+Es la mejor relación esfuerzo/resultado que queda: no hay una torre de C debajo. En orden:
+
+1. **`wlroots`** — la base de la que cuelgan casi todos. Sin esto no hay nada más.
+2. Los compositores: **`sway`**, `labwc`, `river`, `niri`.
+3. Los accesorios, **sin los cuales un WM no se usa de verdad**: `waybar`, `fuzzel`/`wofi`, `swaybg`,
+   `swayidle`, `swaylock`, `grim`, `slurp`, `wl-clipboard`.
+
+Hoy de toda esa familia sólo existen `foot` y `mako`.
+
+### Paso 2 — Las aplicaciones baratas, que son las que más se notan
+`imv` (imágenes), `zathura` (PDF), `mpv` (vídeo), un gestor de archivos, un editor gráfico. Cada una
+es una tarde, y juntas cambian por completo la sensación de la distro. **Medido: hoy no hay ninguna
+aplicación gráfica de terceros.**
+
+### Paso 3 — La deuda de fondo, antes de crecer más
+- Las **16 recetas con `compiler = "gcc"`**. Las 12 de Rust son un solo problema: falta el unwinder
+  de libgcc.
+- El **no-determinismo de 92 paquetes** (rutas `/src` en secciones `.debug_*`). El arreglo global
+  re-hashea ~720 recetas ⇒ **es una decisión tuya de arquitectura**, y conviene tomarla cuando el
+  corpus sea lo más chico posible. Cada mes que pasa es más caro.
+- **ADR 0012, la carrera del árbol de fuentes**: pendiente y sin decidir. Aviso registrado: *un lock
+  sólo en la extracción parece correcto y NO lo es.*
+
+### Paso 4 — LibreOffice
+Caro pero acotado. Antes que el navegador.
+
+### Paso 5 — El navegador 🏔️
+**Presupuestalo como un frente propio, no como una receta.** Firefox es Rust + C++ + su propio
+sistema de build, y arrastra cbindgen, nasm, nodejs y una cadena de `*-sys` con C++ — que es justo la
+frontera que el techo MSRV del sandbox (1.96) no cruza todavía. O sea que **antes de Firefox hay que
+subir el techo del sandbox**; empezar por la receta es empezar por el final.
+
+**Decisión tuya y de las primeras**: marca. Redistribuir Firefox con su nombre y logo exige cumplir
+la política de Mozilla (por eso Debian tuvo Iceweasel). Cumplir o rebrandear — pero decidido antes de
+construir, no después.
+
+---
+
+# ETAPA 3 — Después de COMPLETA: que siga viva
+
+La distro deja de ser un proyecto de construcción y pasa a ser uno de **mantenimiento**. Lo que hay
+que sostener:
+
+1. **Cadencia de release** escrita y cumplida. Una distro sin ritmo previsible pierde usuarios aunque
+   sea técnicamente mejor.
+2. **Seguridad continua**: seguir CVEs de lo empaquetado y publicar actualizaciones. Esto no se
+   pausa. Es el compromiso real que asumís al publicar.
+3. **La reconstrucción desde cero, cronometrada, en una máquina limpia.** Repetirla periódicamente:
+   es la prueba de que el proyecto no depende de este laptop — que es exactamente la preocupación que
+   originó el respaldo del 2026-08-07. Si un día deja de funcionar, te enterás por el ensayo y no por
+   una desgracia.
+4. **El reconstructor independiente**: otra máquina, idealmente de otra persona, que reconstruya y
+   compare hashes en continuo. Es el objetivo final del invariante de hammer — el día que un tercero
+   confirme bit a bit lo que publicamos, la promesa deja de ser nuestra palabra.
+5. **Contribuciones de fuera**: si llega gente, hace falta cómo aceptar recetas sin bajar el listón
+   (revisión, firma, y que el aporte no rompa la reproducibilidad).
+
+---
+
+## Lo que yo haría el lunes que viene
+
+En este orden, y sin saltarse:
+
+1. `pgrep -x crond` y revivirlo. Sin latido no hay cosecha.
+2. Dejar corriendo el respaldo mientras trabajás.
+3. Pedir el arreglo del rootfs del worker → caen las 12 recetas en deuda.
+4. Pedir la automatización de las 913 licencias.
+5. **Generar la clave raíz fuera de línea.** Es lo único de la lista que no puede hacer nadie más que
+   vos, y es el que más tarda en poder empezarse si se posterga.