Files
hammer/docs/20-catalogo-publicable-y-completa.md
T
sergioandClaude Opus 5 e79b26970a 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>
2026-08-07 10:28:37 -04:00

11 KiB

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

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

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