Tres cosas que el mismo hilo destapo, de la mas visible a la mas de fondo.
1) LOS TOGGLES SUENAN OTRA VEZ (directiva de autor 2026-08-05)
switch, toggle y toggle-group llevaban SILENCIADOS desde el 2026-05-26: su pack
aplicaba un tuning que restaba exactamente el gain base de la familia commit
(0.3 - 0.3 = 0). Medido en navegador: pico 0.0001, el suelo de la rampa. Un
silencio por defecto no se percibe como sobriedad sino como componente roto.
Pasan a `commit.medium` (gain 0.1): audible, y un tercio de una pulsacion de
boton (contact base 0.25) para que un flip no pese mas que una activacion. Los
deltas de intent siguen montando encima (threat +0.1, fulfill +0.05). El
haptico ligero no cambia. Medido despues: switch pico 0.1.
Conservan el silencio, con su justificacion intacta, solo los dos donde el
silencio ES la firma: tooltip (revela al pasar el raton, sonaria en cada cruce)
y media-player (su propia salida ES audio — D-AP2.7, decision del hilo de audio).
2) EMITIR SILENCIO YA NO CUESTA
`SoundChannel.handle` cortaba DESPUES de resolver la firma, asi que un tuning
silenciador levantaba dos osciladores, un filtro y una envolvente programada
para no sonar, en cada interaccion. Ahora corta antes de sintetizar cuando la
ganancia resuelta es <= 0. El corte mira la ganancia RESUELTA, no el tuning, asi
que un intent que la devuelve por encima de 0 (threat, fulfill) suena igual.
Fijado con test propio, verificado en ROJO quitando el corto.
3) EL AFINADO SE NOMBRA POR LA FAMILIA QUE MODIFICA
El catalogo mezclaba tres ejes en el primer segmento —familia (emerge.*,
contact.silent), componente (tooltip.*, tabs.*) y la categoria huerfana form.*—
sin regla declarada y sin guard que mirara. `form.commit.soft/subtle` entro el
2026-05-19 (09e261878, el commit que CREA sounds.ts) nombrando con verdad a
siete controles de formulario; el 2026-05-26, 2d562f378 lo extendio a menus y
arboles en la misma pasada que escribia la doctrina: 7 -> 29 consumidores en un
commit, 50 hoy, de los que exactamente UNO era el Form. El D.6 de ese commit
llego a poner el nombre correcto —commit.select— en la linea que usaba la clave
incorrecta.
form.commit.soft -> commit.soft
form.commit.subtle -> commit.subtle
form.toggle.silent -> commit.silent
tooltip.silent -> emerge.silent
tabs.select.soft -> commit.select.soft
131 ocurrencias en 68 ficheros, dirigido por `git ls-files` — nunca por recorrido
de directorio: hay 3 worktrees vivos y build/ con 449 apariciones mas que un sed
recursivo habria corrompido en silencio.
La cola queda LIBRE a proposito: media-player aplica el silenciador al
commit-set de un slider, no a un toggle — la cola describe la FIRMA, no el
evento, asi que cerrarla contra el vocabulario de verbos fabricaria otra
mentira. Por eso emerge.* no se toca pese a que `exit` no sea verbo canonico.
Quedan tres silenciadores, uno por familia con base audible, con el mismo
nombre: contact.silent (-0.25), commit.silent (-0.3), emerge.silent (-0.2).
Eso convierte la coherencia en INVARIANTE:
- `sounds-grammar.test.ts` (guard nuevo): cabeza ∈ SEMA_FAMILIES; forma
{family}.{tail}; y todo {family}.silent resta EXACTAMENTE el gain base de su
familia, leido de sema-map.ts —nunca copiado—. Verificado en ROJO: el guard
calculo solo el -0.4 esperado de signal.
- Ley escrita en sema.md § Tuning naming shapes, junto a la seccion hermana que
ya legislaba los nombres de EVENTO.
- vocabularies.md —"the ONE place the closed sets are spelled out"— pasa a
enumerar los 14 afinados por familia; el generador los extrae del const y
docs:check vigila su frescura.
- D.5 gana las dos notas: el renombrado y la reversion del silencio.
VERIFICACION: check 75 (linea base exacta) · sema 198/198 · docs:check 0/615 ·
navegador antes/despues (switch 0.0001 -> 0.1; button 0.25 sin tocar) · los 25
avisos de prettier entre lo tocado son deriva YA en HEAD, ninguno mio.
Cronica NO reescrita (4 ficheros): AUDIT-blocks-2026-08-01, PLAN-audio-player,
handoffs-claude-md y audit/components/date-field registran lo que ERA cierto.
DESVIACION DECLARADA: sema/components/chronos.ts entra con 6 sustituciones
mecanicas —chronos es de escritura excluida, pero dejarlo fuera rompia el
type-check del repo.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
UIX separates the layers most frameworks keep glued together: morfo
declares the contract, soma executes behavior, sema projects the
perceptual signal, eidos paints — composed by active-uix.
The thesis moved to the docs corpus:docs/architecture/overview.md
— the central idea, the layers one by one, how a component executes
(SomaRuntime · Provider · Effects · EngineSemantic · channels · ADom), what
makes UIX different, what it is NOT, the dependency rules and the 2-of-3
rule, and the suggested reading order.
Quick pointers: semantic canon in docs/CANON.md;
deep architecture in active_architecture.md;
layer entry points under morfo/ · soma/ · sema/ · eidos/ · active-uix/.