El motor SI emitia: pulsar un boton de un block estampa
`data-event=contact-activate` con `family=contact` y `phase=active`, porque el
morfo del `Button` declara ese evento (verbo `activate`, secuencia `pre`, sin
intent a proposito — una pulsacion no carga intencion evaluativa). Lo que
faltaba era el otro lado: la seccion arrancaba UIX **sin `events` y con cero
packs de sema**, frente a los 69 de `/uix`. El evento salia a una sala sin
altavoces. Viene de F0, cuando el arranque se monto como «espejo minimo» de
`/uix` y sema se quedo fuera.
Un framework semantico cuya propia galeria no suena no esta demostrando lo que
existe para demostrar, asi que los canales van ENCENDIDOS aqui: `sound` y
`haptic` a true en las dos cadenas de arranque (galeria y previews).
La lista de packs es DERIVADA del barrel (`Object.values(packs)`), no escrita a
mano, y eso es deliberado: la lista a mano del otro arnes se quedo atras dos
veces — `69c108d2a` tuvo que anadir «los 25 packs que faltaban en la composicion
de demos». Una lista derivada no puede quedarse atras. El barrel recomienda
importar solo los que usas por tree-shaking; aqui no aplica, porque esto no es
un producto sino la galeria del framework y un block compone lo que quiera del
canon.
Verificado espiando la Web Audio API en un clic real dentro del block: al cargar
1 AudioContext y 0 fuentes; tras pulsar, 2 fuentes y 3 nodos de ganancia mas. Y
las 15 demos cargan limpias con los 69 packs, cero errores de pagina.
Gates: blocks:check verde (15) · svelte-check sin errores en lo tocado ·
prettier limpio.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>