sergioandClaude Opus 5 51c6830f58 audio: wireplumber (b3:39a9a06c) + lua (b3:e6c35f98) — y el Devices vacío es del KERNEL
Cierra el gestor de sesión de PipeWire, que es lo que separa «PipeWire acepta clientes»
de «PipeWire tiene dispositivos». Su política está escrita en Lua, así que arrastró una
receta de Lua que hubo que autorar entera.

LO QUE LA RECETA DE LUA TIENE QUE INVENTAR: el Makefile de upstream sólo produce
liblua.a y los binarios — **no hay regla de .so ni fichero pkg-config**, los agrega cada
distro. Acá la compartida se enlaza a mano desde la .a con --whole-archive (una estática
sólo aporta lo referenciado y hay que llevarse todo) y el .pc se escribe con los TRES
nombres que se usan por ahí, porque wireplumber prueba lua-5.4, lua5.4 y lua54 en orden.
`-fPIC` no es opcional: libwplua es un objeto compartido.

Dos símbolos más en libelogind (tawasuyu 087230054 → re-pineado 749edfe41):
sd_uid_get_seats y sd_uid_get_state, que module-logind.c de wireplumber usa para saber si
el usuario está en un asiento antes de tomar los dispositivos. Van 28 símbolos sd-*.

**EL `Devices:` VACÍO DE wpctl NO ES UN FALLO DE wireplumber: el kernel no tiene ALSA.**
recipes/linux-metal.toml:111 lo apaga explícito (`-d SOUND -d SND`), así que no hay
/dev/snd que enumerar. Y esto NO se dio por supuesto: se agregó una ich9-intel-hda
emulada a QEMU (AUDIO=1, ahora el default de run-qemu-desktop.sh) justo porque un
«Devices: vacío» se lee IGUAL si wireplumber funciona sobre una VM sin hardware que si no
funciona. Con tarjeta y sin ALSA en el kernel, el resultado no cambia — la ambigüedad
queda resuelta. Encender el sonido en la distro es una decisión con costo (re-sellar el
kernel, rehacer la imagen metal) y queda a la vista en vez de escondida en un default.

Bug propio destapado en el camino: el bloque de wireplumber quedó DUPLICADO en
gnome-start y había DOS wireplumber peleándose el grafo. El síntoma no era un error sino
una lista de clientes que se lee normal si no se cuenta: dos «WirePlumber» con pids
distintos en wpctl status.

Y una nota de ADR 0012 que costó un rato: la cascada de libelogind cortó a mitad y dejó
el `output/` de mutter a medio hacer; el reintento moría con «error opening
'...c.o.d': No such file or directory». Un `rm -rf output` en el configure NO alcanzó
—el árbol tenía estado viejo más allá del build dir—; lo que lo arregló fue BORRAR
work/sources/mutter-* para que el fetch lo re-extraiga limpio.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-29 20:40:12 -04:00

hammer

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 comparta el sistema.

hammer no es otro gestor de paquetes inmutable. Es una arquitectura de dos mundos:

  • El laboratorio compila desde fuentes upstream (commits fijados), de forma determinista y aislada (bubblewrap + zig cc + musl estático), y direcciona cada artefacto por su hash (BLAKE3) en un content-addressed store.
  • El userland es un Linux clásico, mutable, con FHS de verdad (/bin, /lib, /etc). Los binarios se hidratan desde el store por hardlinks. Puedes pisar archivos en caliente, romper cosas con un rm -rf, y revertir cuando quieras.

Entre ambos mundos viven las tres piezas que hacen a hammer distinto:

  1. Overlay de experimentación — prueba cambios sobre el sistema real con red de seguridad; hammer try / commit / discard.
  2. Diario de mutaciones — un daemon fanotify registra todo lo que tú (o la IA) cambiáis a mano. Vives imperativamente; el sistema genera el delta contra la base limpia. El diario es tu configuración — sin ser declarativa.
  3. Manifiesto .swm — compartes la receta de la mutación (parche de fuente + flags + ediciones de config), no el binario cocinado. El receptor reproduce y verifica; no confía en tu binario.

Encima de todo corre el bus de agente (/run/agent.sock): la IA habla un protocolo pequeño y legible, dispara compilaciones, inyecta en el overlay, escucha fallos y reacciona. Tú tienes la última palabra.

Estado

Fase de arranque. Validamos la capa AI-nativa sobre Alpine (musl + FHS ya cocidos) antes de bajar a distro propia. Ver docs/10-roadmap.md.

Documentación de diseño (SDD)

Toda la arquitectura está en docs/. Empieza por docs/00-vision.md y docs/01-architecture.md.

Estructura

crates/
  hammer-core   tipos compartidos: Recipe, Swm, hashing CAS, store
  hammer-build  el laboratorio: sandbox + compilación + hidratación
  hammer-cli    el binario `hammer` (build, hydrate, try, commit, apply, export…)
  hammerd       daemon: bus de agente + diario de mutaciones
docs/           SDDs y ADRs

Stack

Capa Decisión
Base de validación Alpine (musl + FHS mutable)
Tooling / daemons Rust (estático-musl)
Compilador del lab zig cc por defecto, pluggable por receta
Sandbox de build bubblewrap (namespaces)
Direccionamiento BLAKE3 content-addressed store
Despliegue Hidratación por hardlinks + patchelf

Filosofía

La automatización es mi empleada en el sótano, pero en el piso de arriba mando yo.

Eficiencia matemática en la manufactura, libertad biológica en la ejecución.

S
Description
No description provided
Readme MIT
113 MiB
Languages
Rust 53.6%
Shell 33.7%
Python 8.5%
C 4.1%
C++ 0.1%