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 1389Shell 137Markdown 80Rust 802559 Definitions

⎇ f7aafc9d26c9e99410d97cd41361106340b602b1 docs/20-catalogo-publicable-y-completa.md Markdown · 248 lines · 14.5 KB History raw

docs: SDD 20 — limpiar el empalme de la sección de licencias 97eb1d4af · sergio ·

1# SDD 20 — El catálogo de lo que falta: hasta PUBLICABLE y hasta COMPLETA
2
3Escrito 2026-08-07, a pedido del usuario: «el catálogo de todo lo que falta hasta decir *la distro
4está publicable*, y lo de más hasta *la distro está completa*».
5
6Este documento es el **inventario**. El [SDD 21](21-manual-del-piloto.md) es el **manual de a pie**:
7qué tiene que hacer el usuario, en qué orden, en cada una de las tres etapas.
8
9Todo lo de acá está **medido contra el repo el 2026-08-07**, no estimado de memoria. Donde hay un
10número, hay un comando que lo produjo.
11
12---
13
14## Los dos codos, y por qué están donde están
15
16- **PUBLICABLE** = un extraño puede descargarla, instalarla, usarla y actualizarla, y nosotros
17  estamos en regla al dársela. **No** significa que tenga todo lo que uno querría.
18- **COMPLETA** = tiene lo que una persona espera de un sistema de escritorio para su día a día, sin
19  tener que salir a buscar nada fuera.
20
21La distancia entre los dos codos es enorme y **el orden importa**: casi todo lo caro (navegador,
22ofimática) está DESPUÉS del primer codo, y casi todo lo bloqueante (legal, claves, actualización)
23está ANTES. La trampa clásica es invertirlos — pasarse meses con el navegador y descubrir el día del
24anuncio que no se puede publicar.
25
26---
27
28# PARTE I — Hasta «la distro está PUBLICABLE»
29
30## I.1 Estado de construcción: esto ya está casi cerrado
31
32Medido con `docs/state/build-state*.json` (el grafo, no recuento a mano):
33
34| frente | nodos | sellados | en deuda |
35|---|---:|---:|---:|
36| corpus | 771 | 759 | **12** |
37| KDE | 968 | 952 | 12 |
38| GNOME | 853 | 840 | 13 |
39| COSMIC | 818 | 806 | 12 |
40
41Los perfiles `base` (51 nodos) y `cli` (74 nodos) están **al 100%, deuda 0**. KDE cierra 162/162.
42
43**La deuda real es una sola lista de 12 recetas, compartida por todos los frentes** (por eso el
44número se repite: es el mismo agujero visto desde cuatro grafos):
45
46```
47gtk4  libadwaita  gtksourceview  gtk4-hello  adwaita-hello  sourceview-hello
48hammer-edit  mirada-compositor  mirada-greeter  dwarves  llimphi-counter  wlr-randr
49```
50
51> ### ⚠️ CORREGIDO EL MISMO DÍA, MIDIENDO CONTRA EL WORKER
52> La primera versión de esta sección decía que las 12 «fallan en el worker por su rootfs: `python
53> OSError` en meson, `find_package` en cmake» y que el arreglo era declarar las herramientas en
54> `[deps]`. **Se probó y es falso.** cmake y meson corren perfectamente en el worker. Las causas son
55> **cuatro, distintas**, y ninguna es el rootfs. Se descubrió al construirlas de verdad en vez de
56> heredar el diagnóstico.
57
58**(a) Seis están bloqueadas por el muro del PIC — y el frente GNOME ya lo venció por otro camino.**
59`gtk4` del corpus es `link = "static"` y enlaza `libfontconfig.a`, que tiene **1122 reubicaciones
60no-PIC**: el enlace produce **13 032 errores** `relocation R_X86_64_64 cannot be used against local
61symbol`. No es una receta rota, es una imposibilidad estructural. Mientras tanto
62`recipes/incoming-gnome/gtk4.toml` —`link = "dynamic"` con las deps `-shared`— **está sellada**, y
63con ella `libadwaita` y `fontconfig-shared`.
64⇒ La cadena del corpus (`gtk4`, `libadwaita`, `gtksourceview`, `gtk4-hello`, `adwaita-hello`,
65`sourceview-hello`, `hammer-edit`) es un **duplicado superado** de la cadena dinámica de GNOME.
66Cerrarla no es «construirla»: es decidir si se **promueven las sombras `-shared` al corpus**, porque
67la resolución de deps es hermano→padre y una receta del corpus no ve a las de `incoming-gnome`.
68**Es una decisión de arquitectura, no una tarea** — y hay un aviso registrado de que promover a
69ciegas hace que variantes homónimas pisen recetas canónicas.
70
71**(b) `wlr-randr` — ✅ CERRADA HOY.** Le faltaban dos deps: `python3` (porque **meson es un script de
72Python**; sin intérprete la fase muere con exit 127, que se lee como «meson no está») y `libffi`
73(que la receta no usa: lo exige `wayland-client.pc` en su `Requires`). Auditadas las 1141 recetas,
74era **la única** con meson y sin python3.
75
76**(c) `dwarves` — frente propio, no deuda.** Falla porque nuestro `elfutils` entrega **sólo libelf**,
77deliberadamente: libdw arrastra argp/obstack/fts, «lo verdaderamente difícil en musl». Y no se
78arregla ampliando `elfutils`, porque de él cuelga **el kernel que ya reproduce bit a bit**; el camino
79correcto es una receta aparte `elfutils-libdw`. Sin urgencia: ningún perfil lo pide y el kernel
80desactiva `DEBUG_INFO_BTF` explícitamente por su ausencia. Se desbloquea cuando se quiera sched-ext.
81
82**(d) `mirada-compositor`, `mirada-greeter`, `llimphi-counter` — HUB-ONLY estructural.** Su `source`
83es `gitea@git.tawasuyu.net:...` por SSH y **el worker es sin secretos por diseño**. No es un fallo.
84`llimphi-counter` ni siquiera llega a construir: su `commit` es literalmente ceros, con el comentario
85«fijar al commit real» — es una receta sin terminar, y es de tawasuyu.
86
87### Y el hallazgo de fondo: nadie las estaba intentando
88El bucle del worker recorre `QUEUES="recipes/incoming recipes/incoming-go recipes/incoming-clib
89recipes/incoming-gnome-onda1 recipes/incoming-gnome-onda2 recipes/incoming-gnome recipes/incoming-kde"`
90— **el corpus (`recipes/`) no está en la lista**. Las 12 nunca se habían intentado en el worker. Buena
91parte de «la deuda» era de encolado, no técnica.
92
93## I.2 🚨 Lo legal — bloqueante
94
95### Licencias: de 0 a 1063 de 1141 en un día
96El 2026-08-07 se midió: **0 de 1141 recetas** declaraban licencia. (El informe previo decía «5 de
97771»; los dos números estaban mal — los «5» eran falsos positivos de `grep license`: el paquete
98`addlicense`, el paquete `cargo-bundle-licenses`, una línea de `install` y un comentario.)
99
100Ese mismo día se hizo lo estructural:
101- Campo `license` en la receta, **fuera de `hash_inputs`** ⇒ se puebla sobre recetas ya selladas sin
102  mover un solo `ArtifactHash`. Verificado en 40 recetas: 40 hashes idénticos, 0 cambiados.
103- `scripts/licencias.sh` mide de verdad (cuenta el campo, no la palabra) y siembra desde una tabla
104  curada.
105- Tabla curada por familias (toolchain, base C, gráficas, GNOME/GTK, Qt, KDE, X.Org, GnuPG,
106  freedesktop, kernel.org, PyPI) + el código propio de tawasuyu, que el usuario puso en **MIT**.
107
108**Estado al cierre del día: 1063 de 1141 (93%).** Cuatro escalones de evidencia, de peor a mejor:
109nombre (prohibido) → URL de fuente (familias) → API de licencias de GitHub → `Cargo.toml` del autor
110al tag exacto. Faltan 78. **Falta también** desambiguar ~55 SPDX obsoletos (`GPL-3.0` no dice si es
111`-only` u `-or-later`), que es trabajo humano: hay que leer cabeceras de fuentes.
112
113El cierre definitivo, para que la deuda no vuelva a abrirse con cada receta nueva, es capturar la
114licencia en la **fase de fetch**, que ya descarga y extrae cada tarball: ahí el dato pasa gratis.
115
116⚠️ **La regla que no se rompe**: no se rellena a ojo. Declarar mal una licencia es peor que dejarla
117vacía — convierte un hueco visible en una afirmación falsa. Concretamente se descartó el atajo
118«`k*` = KDE ⇒ LGPL»: en este catálogo `kail`, `kind`, `ko`, `kopia`, `krew`, `kustomize`, `kyverno`
119y toda la familia `kube*` son herramientas Go sin relación con KDE.
120
121### El texto de la licencia dentro del paquete — ✅ HECHO (y no donde yo dije)
122> **CORRECCIÓN.** Esto decía «va en `hammer pack`». El razonamiento del coste era correcto —las
123> fases SÍ entran al hash, así que hacerlo en la receta re-hashearía las 1141— pero **el sitio
124> estaba mal**: `pack` produce un `.swm`, una receta de transformación sobre fuente pública que por
125> diseño «NUNCA transporta binarios cocidos», e `install` REPRODUCE construyendo. **El canal de
126> paquetes de hammer no distribuye binarios.** Donde sí se entrega un binario es en la **imagen
127> instalable**, y ahí se hace ahora: `scripts/licencias-rootfs.sh` escribe
128> `/usr/share/licenses/<pkg>/` con el texto canónico de cada licencia de la expresión, más un
129> `MANIFEST.tsv` (1,0 MB para el perfil `cli`). Los 44 textos SPDX viven en `licenses/`.
130>
131> **Y VETA**: sale ≠0 si un paquete del rootfs no declara licencia. Al estrenarlo reveló que `base`
132> y `cli` llevaban 10 y 12 paquetes con binarios y licencia desconocida; hoy van 2 cada uno (`lsof`
133> y `tzdata`, que necesitan la vía `LicenseRef-` y siguen vetando a propósito).
134
135### Espejo de fuentes — la obligación que más se malentiende
136La GPL no pide «que el código exista en internet»: pide que **quien recibe el binario pueda obtener
137de nosotros la fuente correspondiente**. Hoy las recetas apuntan a URLs de terceros que se caen.
138
139Acá estamos inusualmente bien parados: cada receta pinea `tarball` + `sha256`, así que el espejo es
140mecánico **y encima verificable**. Pero tiene que existir **antes de la primera descarga**.
141
142### Marcas
143Redistribuir Firefox con su nombre y logo exige cumplir la política de marca de Mozilla (por eso
144Debian tuvo Iceweasel). Decidir por adelantado: cumplir o rebrandear. **No bloquea el primer
145lanzamiento** si se sale sin navegador propio.
146
147### La licencia de hammer — ✅ ya está
148`LICENSE` en la raíz y `license = "MIT"` en `Cargo.toml`. *(El SDD 19 decía que faltaba; era falso.)*
149
150## I.3 Infraestructura pública
151
1521. **Espejo de paquetes e imágenes.** Dimensionado real: el store son 128 G, pero **el 79% es
153   información de depuración** ⇒ separando `-debug` en paquetes aparte el espejo baja a **~30 G**.
1542. **Cadena de firma de release.** Hoy hay firma de índice. Falta el nivel de arriba: **clave raíz
155   fuera de línea**, claves de firma rotables y un procedimiento escrito para cuando se filtre una.
156   Firma sin gestión de claves es teatro.
1573. **Evidencia de reproducibilidad publicada.** Es *el* diferenciador: publicar junto a cada imagen
158   los `ArtifactHash` de toda su clausura, para que un tercero reconstruya y compare. Es lo que
159   convierte «somos reproducibles» en un hecho comprobable por un extraño.
1604. **Respuesta a seguridad**: un canal para reportes y —lo importante— la capacidad **demostrada** de
161   empujar una actualización y que llegue. Ensayar el ciclo completo con un CVE de mentira.
162
163## I.4 Que se pueda instalar y usar
164
1651. **Imagen instalable validada en METAL**, no sólo en QEMU. Está a medio camino: el USB de KDE en
166   metal está **en curso** y falta re-quemarlo. Reglas ya pagadas caro: validar imágenes de
167   escritorio **con pantalla**, nunca sólo `-nographic`; `/dev/console` es el serial, así que cada
168   capa debe escribir a `/dev/tty0`; y **nunca quemar a un NVMe**.
1692. **Matriz de hardware honesta**: en qué se probó y en qué no. Vale más «probado en estas 3
170   máquinas» que «debería funcionar».
1713. **Actualización en sitio probada de verdad**: instalar N, actualizar a N+1, y que arranque. Y
172   **rollback**, que con un store direccionado por contenido debería ser barato — es la ventaja
173   natural de esta arquitectura y conviene que sea función de primera clase.
1744. **Documentación mínima**: instalar, gestionar paquetes, reportar un fallo.
1755. **Sitio de descarga** con sumas y firmas, y las instrucciones para verificarlas.
176
177## I.5 Lo que falta de sistema para que no se note pobre
178
179Presente ya: `networkmanager`, `pipewire`, `wireplumber`, `polkit`, `seatd`, `upower`, `tzdata`,
180`fontconfig`. **Falta**: `cups` (impresión), `bluez` (bluetooth), y tipografías/locales revisados.
181
182---
183
184# PARTE II — De PUBLICABLE a «la distro está COMPLETA»
185
186Acá está el trabajo grande, y conviene decir los tamaños en voz alta.
187
188## II.1 WMs Wayland ligeros — barato, alto retorno
189**Medido: no hay ninguno.** De toda la familia sólo existen `foot` (terminal) y `mako`
190(notificaciones). Falta la base entera:
191
192- **`wlroots`** primero: es la biblioteca de la que cuelgan casi todos.
193- **Compositores**: `sway`, `labwc`, `river`, `niri`.
194- **La barra y los accesorios, sin los cuales un WM no se usa**: `waybar`, `fuzzel`/`wofi`,
195  `swaybg`, `swayidle`, `swaylock`, `grim`, `slurp`, `wl-clipboard`.
196
197Son **baratos comparados con los escritorios completos**: no hay una torre de C debajo. Es la mejor
198relación esfuerzo/resultado que queda en el proyecto.
199
200## II.2 Aplicaciones gráficas de terceros — **medido: cero**
201No hay ni una. Por coste creciente:
202
203- **Barato** (y es lo que hace que la distro se sienta usable): visor de imágenes (`imv`), lector PDF
204  (`zathura`), reproductor (`mpv`), gestor de archivos, editor de texto gráfico, emulador de terminal
205  adicional (`alacritty`, `kitty`).
206- **Caro**: **LibreOffice**.
207- **El más caro de todo el catálogo**: **un navegador**. Firefox es Rust + C++ + su propio sistema de
208  build, y arrastra cbindgen, nasm, nodejs y una cadena de `*-sys` con C++ — que es **justo la
209  frontera que el techo MSRV del sandbox (1.96) no cruza todavía**. Presupuestarlo como un frente
210  propio, no como «una receta más».
211
212## II.3 Deuda técnica de fondo que conviene cerrar antes de crecer
213
214- **Las 16 recetas con `compiler = "gcc"`** (contadas parseando TOML; `grep` cuenta comentarios).
215  Las 12 de Rust son **un solo problema**: falta el unwinder de libgcc.
216- **No-determinismo en 92 paquetes**, todos por rutas `/src` incrustadas en secciones `.debug_*`. El
217  arreglo (`-ffile-prefix-map` global) re-hashea ~720 recetas: decisión de arquitectura, no remiendo.
218- **La carrera del árbol de fuentes (ADR 0012)**, pendiente y **sin decidir**: dos builds de la misma
219  dependencia se pisan. Aviso registrado: *un lock sólo en la extracción parece correcto y NO lo es.*
220- **El multi-init**: los inits del catálogo **compiten** con arje-zero, no se apilan.
221
222## II.4 Sostenibilidad — lo que decide si sobrevive al primer mes
223Versionado y cadencia escritos; **reconstrucción desde cero en una máquina limpia, cronometrada** —
224la prueba de que el proyecto no depende de un laptop concreto, que es exactamente la preocupación que
225originó el respaldo del 2026-08-07.
226
227---
228
229# PARTE III — El resumen ejecutivo
230
231**Para PUBLICABLE falta, en una línea cada uno:**
232
2331. Arreglar el entorno del worker → caen las 12 recetas en deuda.
2342. Terminar las licencias (913) e inyectar el texto en `hammer pack`.
2353. Montar el espejo de fuentes.
2364. Clave raíz fuera de línea y procedimiento de rotación.
2375. Imagen validada en metal (re-quemar el USB).
2386. Actualización N→N+1 probada, con rollback.
2397. Espejo de paquetes (~30 G separando `-debug`), sitio, sumas y firmas.
2408. `cups` y `bluez`.
2419. Documentación mínima y un canal de reportes.
242
243**Se puede publicar SIN**: navegador propio, ofimática, y el reconstructor independiente. Son
244objetivos, no requisitos.
245
246**Para COMPLETA falta, además**: wlroots + los WMs ligeros y sus accesorios, el juego de aplicaciones
247gráficas, LibreOffice, el navegador, y cerrar la deuda de fondo (gcc, determinismo `.debug_`,
248ADR 0012).

20-catalogo-publicable-y-completa.md

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 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

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):

frentenodosselladosen deuda
corpus77175912
KDE96895212
GNOME85384013
COSMIC81880612

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

⚠️ CORREGIDO EL MISMO DÍA, MIDIENDO CONTRA EL WORKER

La primera versión de esta sección decía que las 12 «fallan en el worker por su rootfs: python OSError en meson, find_package en cmake» y que el arreglo era declarar las herramientas en [deps]. Se probó y es falso. cmake y meson corren perfectamente en el worker. Las causas son cuatro, distintas, y ninguna es el rootfs. Se descubrió al construirlas de verdad en vez de heredar el diagnóstico.

(a) Seis están bloqueadas por el muro del PIC — y el frente GNOME ya lo venció por otro camino. gtk4 del corpus es link = "static" y enlaza libfontconfig.a, que tiene 1122 reubicaciones no-PIC: el enlace produce 13 032 errores relocation R_X86_64_64 cannot be used against local symbol. No es una receta rota, es una imposibilidad estructural. Mientras tanto recipes/incoming-gnome/gtk4.toml —link = "dynamic" con las deps -shared— está sellada, y con ella libadwaita y fontconfig-shared. ⇒ La cadena del corpus (gtk4, libadwaita, gtksourceview, gtk4-hello, adwaita-hello, sourceview-hello, hammer-edit) es un duplicado superado de la cadena dinámica de GNOME. Cerrarla no es «construirla»: es decidir si se promueven las sombras -shared al corpus, porque la resolución de deps es hermano→padre y una receta del corpus no ve a las de incoming-gnome. Es una decisión de arquitectura, no una tarea — y hay un aviso registrado de que promover a ciegas hace que variantes homónimas pisen recetas canónicas.

(b) wlr-randr — ✅ CERRADA HOY. Le faltaban dos deps: python3 (porque meson es un script de Python; sin intérprete la fase muere con exit 127, que se lee como «meson no está») y libffi (que la receta no usa: lo exige wayland-client.pc en su Requires). Auditadas las 1141 recetas, era la única con meson y sin python3.

(c) dwarves — frente propio, no deuda. Falla porque nuestro elfutils entrega sólo libelf, deliberadamente: libdw arrastra argp/obstack/fts, «lo verdaderamente difícil en musl». Y no se arregla ampliando elfutils, porque de él cuelga el kernel que ya reproduce bit a bit; el camino correcto es una receta aparte elfutils-libdw. Sin urgencia: ningún perfil lo pide y el kernel desactiva DEBUG_INFO_BTF explícitamente por su ausencia. Se desbloquea cuando se quiera sched-ext.

(d) mirada-compositor, mirada-greeter, llimphi-counter — HUB-ONLY estructural. Su source es gitea@git.tawasuyu.net:... por SSH y el worker es sin secretos por diseño. No es un fallo. llimphi-counter ni siquiera llega a construir: su commit es literalmente ceros, con el comentario «fijar al commit real» — es una receta sin terminar, y es de tawasuyu.

Y el hallazgo de fondo: nadie las estaba intentando

El bucle del worker recorre QUEUES="recipes/incoming recipes/incoming-go recipes/incoming-clib recipes/incoming-gnome-onda1 recipes/incoming-gnome-onda2 recipes/incoming-gnome recipes/incoming-kde" — el corpus (recipes/) no está en la lista. Las 12 nunca se habían intentado en el worker. Buena parte de «la deuda» era de encolado, no técnica.

I.2 🚨 Lo legal — bloqueante

Licencias: de 0 a 1063 de 1141 en un día

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:

Estado al cierre del día: 1063 de 1141 (93%). Cuatro escalones de evidencia, de peor a mejor: nombre (prohibido) → URL de fuente (familias) → API de licencias de GitHub → Cargo.toml del autor al tag exacto. Faltan 78. Falta también desambiguar ~55 SPDX obsoletos (GPL-3.0 no dice si es -only u -or-later), que es trabajo humano: hay que leer cabeceras de fuentes.

El cierre definitivo, para que la deuda no vuelva a abrirse con cada receta nueva, es capturar la licencia en la fase de fetch, que ya descarga y extrae cada tarball: ahí el dato pasa gratis.

⚠️ 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 — ✅ HECHO (y no donde yo dije)

CORRECCIÓN. Esto decía «va en hammer pack». El razonamiento del coste era correcto —las fases SÍ entran al hash, así que hacerlo en la receta re-hashearía las 1141— pero el sitio estaba mal: pack produce un .swm, una receta de transformación sobre fuente pública que por diseño «NUNCA transporta binarios cocidos», e install REPRODUCE construyendo. El canal de paquetes de hammer no distribuye binarios. Donde sí se entrega un binario es en la imagen instalable, y ahí se hace ahora: scripts/licencias-rootfs.sh escribe /usr/share/licenses/<pkg>/ con el texto canónico de cada licencia de la expresión, más un MANIFEST.tsv (1,0 MB para el perfil cli). Los 44 textos SPDX viven en licenses/.

Y VETA: sale ≠0 si un paquete del rootfs no declara licencia. Al estrenarlo reveló que base y cli llevaban 10 y 12 paquetes con binarios y licencia desconocida; hoy van 2 cada uno (lsof y tzdata, que necesitan la vía LicenseRef- y siguen vetando a propósito).

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:

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:

II.3 Deuda técnica de fondo que conviene cerrar antes de crecer

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).