You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
svelte-kit-vice/docs/process/CONTINUE-sema-audit.md

276 lines
17 KiB

docs(process): handoff del hilo de sema — lo cerrado, la cola y como medirlo `CONTINUE-sema-audit.md`, autosuficiente para arrancar una sesion nueva sin releer las 24 000 lineas del corpus. Registra: - Las seis entregas de esta sesion con su commit, y por que cada una fue necesaria (el silencio como valor, el tremolo en serie, el saneamiento documental, contact-press, D.7 sin versos sueltos, y la regla de cascada que dejaba de alcanzar ancestros). - Las decisiones FIRMADAS que nadie debe re-litigar: `contact-press` (deroga el anexo Tabla 1, con la reversion escrita en el test), la enmienda de D.7 por su motivo —familias sin `base.sound` fuera de la prohibicion— y la reescritura de D.8 —`activeChannels` es default, no prohibicion—. - La COLA en orden de dano, con su evidencia: las 17 reglas de 212 que no disparan o disparan mal (textarea 6x/13x, navigation-menu, gradient-picker, chronos, tree-view mudo por teclado, 5 inertes, 10 con tuning de familia ajena) · los silenciosos (`preload` colgado que ademas abre contexto en el boot, `masterGain` que no hace nada, fallback de sample sin diagnostico, 3 WAV muertos, la rama de tipos que deja pasar un `gain` string) · el interruptor Sound de las demos · el `announce` que no compila · la instantanea perceptual · la recalibracion tras el fix del AM · y los dos ejes (el `contact` ausente en 84 de 91 morfos, `Toolbar.Button` sin componer). - **S-07 marcado como NO TOCAR** sin reabrirlo: decision explicita del usuario. - Como se verifica audio en este repo, que es donde mas tiempo se perdio: render offline replicando el grafo, A/B dentro del MISMO componente, y contar osciladores solo responde «llego algo al motor», nunca «se oye». - Las lecciones de metodo que costaron caro, incluida la propia: medir la envolvente NO es medir la salida, y por eso declare un silencio que a −13.9 dBFS era lo mas fuerte de la interfaz. Baseline al cierre: check 75 · docs:check 0/617 · sema+morfo+sound 369/369. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2 months ago
# CONTINUE — auditoría del sistema semántico y sus arreglos
> **Kickoff para la sesión siguiente**: _«Lee `docs/process/CONTINUE-sema-audit.md`
> y sigue por la cola de §3, empezando por las 17 reglas.»_
> **Fecha**: 2026-08-06 · Rama `alpha-0.1-dir-prefs` (compartida — otra sesión
> trabaja en `blocks`; `git reset -q` + add sólo lo propio, siempre).
> **Fuente de verdad de los hallazgos**: [`AUDIT-sema-2026-08-05.md`](./AUDIT-sema-2026-08-05.md)
> — 44 confirmados tras refutación adversarial, con fichero, línea y evidencia.
> Este documento sólo dice **qué se cerró, qué queda y cómo medirlo**.
---
## 1. Cómo empezó, para que nadie repita el camino
El usuario oyó que «no se oyen muchos componentes: Switch, Toggle, algunos
botones de la toolbar». El diagnóstico inicial fue **incorrecto por medir a
medias** y la corrección la dio él: _«el silent emitía sonido, ese era el
problema»_. Tenía razón, y de ahí salió todo lo demás.
Lecciones de método que costaron tiempo real y que valen para cualquier hilo
de este repo:
- **Medir la envolvente NO es medir la salida.** Se midió la automatización del
`AudioParam` (0.0001) y se declaró silencio; la salida real de esa misma firma
con intent `risk` era **−13.9 dBFS**, más fuerte que un botón. Para verificar
audio: **render offline replicando el grafo** (`OfflineAudioContext`) y medir
el pico de muestra. Contar osciladores miente.
- **«Lee toda la documentación» es precondición, no consejo.** Se le preguntó al
usuario por D.8 sin haber leído `sema.md` §componentes continuos, que contenía
la respuesta. La lectura completa del corpus de sema + motor son ~24 000 líneas
en 42 ficheros; el núcleo indispensable está en §5.
- **Un guard que no has visto fallar no vale.** Los cuatro guards nuevos de esta
sesión nacieron en rojo. Dos de ellos **corrigieron el arreglo** que estaban
vigilando (ver §2.4).
- **El árbol está compartido.** Clasificar siempre «míos vs ajenos» por
contenido del diff, nunca por confianza.
---
## 2. Lo cerrado en esta sesión
| # | Qué | Commit |
| --- | ---------------------------------------------------------------------------- | ----------- |
| 2.1 | El silencio deja de ser aritmética: **`SILENT`**, valor canónico | `24d30ee1a` |
| 2.2 | La rugosidad pasa a **trémolo EN SERIE** (era aditivo sobre el `AudioParam`) | `316452263` |
| 2.3 | Saneamiento documental: deriva propia, copias podridas, dos leyes muertas | `432106f1f` |
| 2.4 | **`contact-press`** en los toggles + D.7 canónica + **D.8 reescrita** | `b9d73c19b` |
| 2.5 | D.7 sin versos sueltos (7 infractores) + guard del intent | `4fccf1662` |
| 2.6 | Una regla de cascada casa con SU objetivo, **nunca con un ancestro** (S-01) | `ccfea0f10` |
### 2.1 `SILENT` — el silencio es un VALOR, no una resta
Había tres claves silenciadoras (`commit.silent`, `emerge.silent`,
`contact.silent`), cada una restando el gain base de SU familia. No eran
silencio: eran un número, y las capas posteriores mueven números. Medido: un
toggle «silenciado» con intent `risk` salía a **−13.9 dBFS** y con `threat` a
**−6.7**, frente a **−9.3** de un botón normal — porque los deltas de intent
suman **rugosidad** (`risk` +0.2, `threat` +0.4), eso cruzaba el umbral del AM,
y el modulador estaba conectado al `AudioParam` de la envolvente.
Hoy: `SILENT` (exportado por `$uix/sema`) se declara en el slice del canal y el
**resolver lo honra retirando ese canal**. Absorbente: ningún delta lo resucita.
Se levanta sólo REEMPLAZANDO el slice con una firma completa.
### 2.2 El trémolo, en serie
`modulatorGain.connect(envelope.gain)` — conectar a un `AudioParam` **suma**.
Ahora hay una etapa de ganancia en serie a `1 - depth` con el modulador sobre su
propio `.gain`. Medido viejo→nuevo: el clic de cierre de cada earcon de `signal`
**0.0666 → 0.0002**; la cola de `commit+risk` 0.263 → 0.103; y
`commit.subtle`+`threat` de RMS **0.143 → 0.018** (era 7× su nivel declarado).
**Contrapartida declarada**: los earcons con rugosidad bajan 1.6–2.7 dB.
### 2.4 Decisiones FIRMADAS — no re-litigar
- **`contact-press`** (directiva del autor). Los tres toggles declaran los dos
momentos del libro: el CONTACTO habla (`contact.soft`, gain 0.08 — el «click
breve opcional» del cap. 22) y el COMMIT calla (`SILENT`, cap. 23: «sonido:
cierre opcional»). ⚠️ Deroga el anexo Tabla 1, que decía «un único evento; el
contacto es implícito»; la reversión está escrita en `compile.test.ts`.
- **D.7 canónica, con enmienda por su motivo**: no se canoniza un sample sobre un
evento cuya familia **tenga `base.sound`**. `handle`/`sustain`/`delegate` salen
de la lista — sin base no hay nada que aplastar, y los 14 usos de `sound()`
sobre `handle` son la única fuente sonora del gesto.
- **D.8 reescrita**: `activeChannels` es el DEFAULT de la familia, no una
prohibición. `channels` ajusta en las dos direcciones; **ampliar exige
justificación perceptual escrita**. Lo prohibido es declarar una firma de canal
que la activación no incluye (regla inerte).
### 2.5 El hallazgo que conecta dos capas
Al arreglar D.7 con `soundTuning('commit.soft', …)`, **el guard lo tumbó**: un
afinado de escalera trae su `gain` como **número desnudo**, y eso se aplica en
modo `replace` igual que el sample. **D.7 y S-07 son el mismo defecto en dos
capas.** Las 9 reglas corregidas **componen** (`gain: { op: 'add', value: -0.25 }`).
---
## 3. LA COLA — por dónde seguir, en orden
docs(sema)!: retirar D.7 y S-07 — el orden hace imposible lo que prohibian F6 del PLAN-sound-names, y el motivo importa mas que el borrado: no se derogan por cambio de opinion, se DISUELVEN. La doctrina del autor que las origino sigue siendo cierta; lo que cambia es quien la sostiene. D.7 prohibia canonizar un sample sobre un evento cuya familia tuviera base.sound, porque sound() devolvia una firma COMPLETA y la cascada la aplicaba en replace DESPUES del intent: un fulfill perdia su +300 Hz ascendente. S-07 era el mismo defecto una capa mas abajo — el gain desnudo de los 14 afinados de escalera — y seguia ABIERTO por decision del autor. Con el nombre aplicado ANTES de los deltas de intent no queda ninguna capa posterior que pueda pisarlos. Aplastar el perfil evaluativo ya no esta prohibido: es INEXPRESABLE. Y S-07 pierde su premisa entera, porque SOUND_TUNINGS ya no existe. LO QUE SE CONSERVA, con su sitio nuevo escrito: el silencio como firma valida (SILENT), el criterio de cuando crear un pack, y los samples como recurso de producto (el catalogo los admite con nombre; la app autora los suyos por overrides.cascade, que sigue abierto a proposito). LO UNICO DE D.7 QUE HAY QUE SEGUIR SABIENDO, y por eso queda escrito en tres sitios: playSample lee EXACTAMENTE dos campos, sampleUrl y gain. No hay playbackRate ni detune. Sobre un .wav el intent solo mueve el volumen — medido, risk es indistinguible de neutral porque solo aporta roughness y la ruta de sample lo ignora. Un sample con carga evaluativa necesita UN FICHERO POR INTENT, que es lo que hace signal con ping frente a error y la verdadera razon de que fuese la excepcion. Es fisica del audio, no politica. Tocado: book-deviations §D.7 + §S-07 · sema.md §the sound catalogue (reescrita entera, con el orden y el limite del WAV) · CLAUDE.md §sema doctrine · los dos README del art · CONTINUE-sema-audit §3.0/§3.1/§3.6, que es el handoff vivo y estaba describiendo una cola que ya no existe. ⚠️ Prettier reformatea entero book-deviations.md y sema.md porque NO estaban formateados en HEAD; reaplicado a mano para que el diff sea solo lo mio. Mismo motivo por el que CLAUDE.md y arts/README.md van con 1-2 lineas en vez de 30. VERIFICADO: sema+morfo+sound 437/437 · check 75 = baseline · docs:check 0/618 · prettier limpio en los ficheros que toque. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
> **ACTUALIZADO 2026-08-06 tarde.** §3.1 está CERRADA y §3.6 quedó absorbida por
> un eje nuevo que abrió el autor: **el sonido se NOMBRA**
> ([`PLAN-sound-names.md`](./PLAN-sound-names.md), F1–F6 entregadas). Ver §3.0
> antes que nada; lo que sigue vivo es §3.2, §3.3, §3.4, §3.5 y §3.7.
### 3.0 Lo cerrado el 2026-08-06 por la tarde
| Commit | Qué |
| ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `f7a7564b3` | **`allowedTargets`** — el morfo declara a qué partes puede viajar el estampado. Simétrico de `allowedFamilies`, con invariante en `schema.ts`. Resolvió las 12 divergencias que el censo destapó (calendar ×5, pagination ×5, rating-group, toolbar) |
| `0c1d945ba` | **S-12 textarea** (medido 0.30→0.05 y 0.40+risk→0.03) y **S-13 tree-view** (el teclado ya emite) |
| `2f63525da` | **`pack-census.test.ts`** — 4 invariantes mecánicos por regla; nació en rojo, reprodujo la auditoría y destapó dos clases nuevas |
| `7154fb77e` · `769e426c5` | **El sonido se NOMBRA**: catálogo de 16 nombres, tipo estrechado a `SoundName \| SILENT`, reorden del resolver (el nombre ANTES del intent), 71 packs migrados |
docs: el corpus entero deja de describir un sistema que ya no existe Tras rehacer el sonido dos veces en un dia, la doctrina escrita seguia explicando la cascada de cinco capas, los tunings y la modulacion por intent — exactamente la clase de mentira que esta sesion entera se dedico a perseguir en el codigo. 23 ficheros al dia. FUENTES DE DOCTRINA - `architecture/sema.md` — la seccion de resolucion ya no numera seis capas para el sonido: enuncia las dos busquedas y dice que el sonido NO participa de la cascada, que es el diseño. La convencion de deltas se acota al haptico y a `hold`, que son los unicos que aun tienen numeros. La seccion del catalogo se reescribe como «el sound pack»: bases y variantes, el pack por defecto sin binarios, el guard de distinguibilidad con la razon de por que existe (se detecto por OIDO, no por test), y por que una biblioteca nombrada por componente hay que TRADUCIRLA. - `CANON.md` §7 — la fila del sonido dice ahora «un nombre, y solo cuando difiere de su familia», y se añade que el intent SELECCIONA, con el motivo perceptual: reconocemos sonidos, no desplazamientos de parametro. - `CLAUDE.md` — la doctrina operativa pasa de tres reglas a seis, y todas enunciadas por su mecanismo: las dos busquedas, que NADIE escribe un parametro, el tier del verbo que vacia los packs, el guard de distinguibilidad, el limite fisico de las grabaciones y los gestos por repeticion. - `book-deviations` D.7/S-07 — dejan de explicarse por «el nombre va debajo del intent» (modelo intermedio, tambien muerto) y se explican por la ausencia de aritmetica. Y D.8 corrige la tabla de canales: `handle` suena, y los tres resolvers de gesto que la entrada citaba como justificacion ya no existen. PROCESO - `PLAN-sound-names.md` se marca SUPERADO EL MISMO DIA, con la leccion escrita arriba del todo: un sistema de modulacion produce variantes que difieren sobre el papel y son identicas al oido, y eso solo se detecta escuchando. Se conserva como cronica de por que NO se hizo asi. - `CONTINUE-sema-audit.md` gana §3.0-bis con el modelo vigente, los tres commits y dos avisos que la siguiente sesion necesita: que nada se ha oido sobre un componente real, y que el catalogo es una PROPUESTA. COMPONENTES — 16 READMEs citaban nombres de tuning que ya no existen (`commit.subtle`, `emerge.exit.soft`, `handle.pickup.air`…). Migrados a los nombres vivos. ⚠️ Distingui los que eran pares FAMILIA.VERBO (`commit.set`, `emerge.open`) y esos no se tocan: siguen siendo correctos. ⚠️ `chronos/SPEC.md` lo migre y lo REVERTI al darme cuenta: es de escritura excluida, asi que sigue citando nombres muertos — decision tuya. VERIFICADO: docs:check 0/618 · check sin errores nuevos · las unicas referencias a `SOUND_TUNINGS` que quedan son las de S-07, deliberadas: citan lo que ya no existe para explicar por que dejo de existir. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
### 3.0-bis El sonido se REHIZO otra vez, y esta es la versión buena
⚠️ Lo de §3.0 sobre el catálogo de nombres **quedó superado el mismo día**. Al
oírlo, el autor rechazó el modelo de modulación entero: _«evento.intent =
sonido, y punto»_. Modelo vigente, en dos líneas:
```
nombre = per-emit ?? cascada ?? pack ?? morfo ?? familia[verbo] ?? familia.default
sonido = pack[`${nombre}.${intent}`] ?? pack[nombre] ?? nada
```
| Commit | Qué |
| --- | --- |
| `86fa9a1b7` | El sonido se ELIGE: tabla por verbo en el mapa, catálogo de 10 bases + 6 variantes diseñadas, resolver de dos búsquedas, guard de **distinguibilidad**, gestos por repetición (mueren los 3 resolvers), 135 reglas de pack borradas (de ~165 a 30) |
| `11b54025d` | Pack de ejemplo `ui-mp3` con los ficheros del autor, recortados y normalizados (arrancaban hasta a 347 ms) + `applySoundPack()` |
| `4f1b9d423` · `05d422ef4` | Las cuatro páginas de `/uix/docs/sound` |
**Nada de esto se ha oído en producción todavía** — está medido en el grafo de
audio, no con un oído sobre un componente real. Y el catálogo es una PROPUESTA:
que `open` suene a lo que debe sonar un panel abriéndose es decisión del autor,
y se afina en un fichero.
docs(sema)!: retirar D.7 y S-07 — el orden hace imposible lo que prohibian F6 del PLAN-sound-names, y el motivo importa mas que el borrado: no se derogan por cambio de opinion, se DISUELVEN. La doctrina del autor que las origino sigue siendo cierta; lo que cambia es quien la sostiene. D.7 prohibia canonizar un sample sobre un evento cuya familia tuviera base.sound, porque sound() devolvia una firma COMPLETA y la cascada la aplicaba en replace DESPUES del intent: un fulfill perdia su +300 Hz ascendente. S-07 era el mismo defecto una capa mas abajo — el gain desnudo de los 14 afinados de escalera — y seguia ABIERTO por decision del autor. Con el nombre aplicado ANTES de los deltas de intent no queda ninguna capa posterior que pueda pisarlos. Aplastar el perfil evaluativo ya no esta prohibido: es INEXPRESABLE. Y S-07 pierde su premisa entera, porque SOUND_TUNINGS ya no existe. LO QUE SE CONSERVA, con su sitio nuevo escrito: el silencio como firma valida (SILENT), el criterio de cuando crear un pack, y los samples como recurso de producto (el catalogo los admite con nombre; la app autora los suyos por overrides.cascade, que sigue abierto a proposito). LO UNICO DE D.7 QUE HAY QUE SEGUIR SABIENDO, y por eso queda escrito en tres sitios: playSample lee EXACTAMENTE dos campos, sampleUrl y gain. No hay playbackRate ni detune. Sobre un .wav el intent solo mueve el volumen — medido, risk es indistinguible de neutral porque solo aporta roughness y la ruta de sample lo ignora. Un sample con carga evaluativa necesita UN FICHERO POR INTENT, que es lo que hace signal con ping frente a error y la verdadera razon de que fuese la excepcion. Es fisica del audio, no politica. Tocado: book-deviations §D.7 + §S-07 · sema.md §the sound catalogue (reescrita entera, con el orden y el limite del WAV) · CLAUDE.md §sema doctrine · los dos README del art · CONTINUE-sema-audit §3.0/§3.1/§3.6, que es el handoff vivo y estaba describiendo una cola que ya no existe. ⚠️ Prettier reformatea entero book-deviations.md y sema.md porque NO estaban formateados en HEAD; reaplicado a mano para que el diff sea solo lo mio. Mismo motivo por el que CLAUDE.md y arts/README.md van con 1-2 lineas en vez de 30. VERIFICADO: sema+morfo+sound 437/437 · check 75 = baseline · docs:check 0/618 · prettier limpio en los ficheros que toque. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
**Disuelto, no arreglado**: `SOUND_TUNINGS` retirado ⇒ **S-07 deja de existir**
(era su premisa) y **las 10 cabezas de tuning que mentían son hoy nombres**. D.7
retirada por el mismo motivo — con el nombre debajo del intent, aplastar el
perfil evaluativo es inexpresable. Razonado en
[`book-deviations.md`](../decisions/book-deviations.md) §D.7.
fix(sema,morfo,soma): una superficie no admite dos ocurrencias, y el nombre ya no miente `data-event-*` es UNA RANURA por elemento. Tres auditorias independientes encontraron el mismo defecto y ninguna lo cerro: fable S1 (2026-07-01, con el README diciendo «findings executed»), sema S-17 (2026-08-05, midio el estampado del knob muriendo a los 24ms de un hold de 240) y blocks A-36/A-65 (reproducido en navegador, dos estampados a 1,1ms). Lo que faltaba no era diagnostico: nadie podia distinguir una redireccion legitima de una deriva, porque la opcion que redirigia se llamaba `fallbackTarget` y hacia lo contrario de lo que decia. EL NOMBRE PRIMERO. `fallbackTarget` -> `targetOverride` (202 apariciones, 64 ficheros, dirigido con `git ls-files`). Siempre GANO sobre el ref registrado; el nombre honesto es la precondicion para auditarlo. Las cronicas conservan el viejo por diseño. LA PROPIEDAD. `unstampEventAttrs` recibia el signal y lo DESCARTABA, asi que la ocurrencia que terminaba antes borraba a la que tenia la ranura. Ahora comprueba `data-event-id`. Con eso, `replace` deja de ser el comportamiento roto y pasa a ser el suelo correcto. A-36, SIN `regime`. Los cuatro overlays cedian el estampado del `open` al trigger por un workaround de la era `sequence: 'pre'`; con `post` el content ya esta montado. Retirado el override (float-panel migrado `pre`->`post`, ultimo fuera de la doctrina que sema.md escribe). Medido en /blocks/site-header/preview a 375px: contact-activate en el TRIGGER +18,7ms y open en el CONTENT +20,6ms, con press-squeeze y slide-from-right-full corriendo. Antes: los dos en el trigger, press-squeeze jamas. `regime` DEFINIDO — y son dos valores, no cuatro. `replace` (default) y `queue`, este solo para las 4 parejas irreducibles: los tres toggles (el provider ES el boton) y el knob. `collapse` retirado (su caso murio con la propiedad: medido, 0 huecos en 5 emisiones a 72ms) y `lock` retirado (significaria «un cierre que no se anuncia»), con sus 4 declaraciones muertas. El guard de `queue` PASO EN VERDE SIENDO INCORRECTO: con timers falsos no hay animaciones, asi que awaitExpression volvia al instante. El navegador midio el commit encolado llegando 1,6s tarde. `queue` espera el HOLD, no la expresion. Medir la envolvente no es medir la salida. `renderAttrs` — los attrs que no son partes. Vaciar ACTIVE_DEV_TRACK (palabras y chronos ya no estan excluidos) destapo 23 `data-palabras-*` que ningun morfo declaraba y que palabras.css SI estiliza: aterrizan en el arbol que el usuario escribio, asi que no pueden ser partes. Campo nuevo con la linea afilada —si el consumidor puede componerlo, es una PARTE— y 3 consumidores (palabras, waveform, aura). Declarado en types.ts Y en el esquema sium: la leccion de MorfoElement. Ademas: 5 selectores muertos en el predicado del focus-scope de palabras (barrido de todo el repo: aparecian solo ahi) · RTL-1 real en palabras-chrome (inset logico + translate fisico = doble volteo; rtl:check 1->0) · el union inline al `Direction` canonico, que destapo que el censo de direccion grepea el NOMBRE del tipo · deuda de chronos (scope, barrel, README). Y de la cola: S-36 (barrel 68->71 + guard), S-31 (vibrate(NaN)), S5 (la preferencia de reduced-motion del usuario ya gana a los channels del morfo), SO2 (el warn que el JSDoc prometia), SO4 (validar el target antes del prewrite). Todos los guards nuevos vistos fallar antes de arreglar nada. Base: check 74 (= base) · sema+morfo+contracts 454 verdes / 6 ajenos preexistentes · soma navegador 1258/1259 (el rojo es un timeout ajeno, reproducido con los cambios en stash) · docs:check 0/618 · rtl:check 0/177. Handoff: docs/process/CONTINUE-perceptual-surface.md Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
✅ **Renombrar `fallbackTarget` → `targetOverride`: HECHO el 2026-08-10** (202
apariciones, 64 ficheros; crónicas conservan el nombre viejo por diseño). Y dejó
de ser cosmético: es la PRECONDICIÓN del censo de emisión. Mientras la opción se
leía como un fallback, un provider que apuntaba a otra PARTE era
indistinguible de uno que apuntaba a la instancia correcta de la parte
declarada. Con el nombre honesto, el runtime puede afirmar la diferencia
(`assertTargetOverride`) y el guard censarla.
docs(sema)!: retirar D.7 y S-07 — el orden hace imposible lo que prohibian F6 del PLAN-sound-names, y el motivo importa mas que el borrado: no se derogan por cambio de opinion, se DISUELVEN. La doctrina del autor que las origino sigue siendo cierta; lo que cambia es quien la sostiene. D.7 prohibia canonizar un sample sobre un evento cuya familia tuviera base.sound, porque sound() devolvia una firma COMPLETA y la cascada la aplicaba en replace DESPUES del intent: un fulfill perdia su +300 Hz ascendente. S-07 era el mismo defecto una capa mas abajo — el gain desnudo de los 14 afinados de escalera — y seguia ABIERTO por decision del autor. Con el nombre aplicado ANTES de los deltas de intent no queda ninguna capa posterior que pueda pisarlos. Aplastar el perfil evaluativo ya no esta prohibido: es INEXPRESABLE. Y S-07 pierde su premisa entera, porque SOUND_TUNINGS ya no existe. LO QUE SE CONSERVA, con su sitio nuevo escrito: el silencio como firma valida (SILENT), el criterio de cuando crear un pack, y los samples como recurso de producto (el catalogo los admite con nombre; la app autora los suyos por overrides.cascade, que sigue abierto a proposito). LO UNICO DE D.7 QUE HAY QUE SEGUIR SABIENDO, y por eso queda escrito en tres sitios: playSample lee EXACTAMENTE dos campos, sampleUrl y gain. No hay playbackRate ni detune. Sobre un .wav el intent solo mueve el volumen — medido, risk es indistinguible de neutral porque solo aporta roughness y la ruta de sample lo ignora. Un sample con carga evaluativa necesita UN FICHERO POR INTENT, que es lo que hace signal con ping frente a error y la verdadera razon de que fuese la excepcion. Es fisica del audio, no politica. Tocado: book-deviations §D.7 + §S-07 · sema.md §the sound catalogue (reescrita entera, con el orden y el limite del WAV) · CLAUDE.md §sema doctrine · los dos README del art · CONTINUE-sema-audit §3.0/§3.1/§3.6, que es el handoff vivo y estaba describiendo una cola que ya no existe. ⚠️ Prettier reformatea entero book-deviations.md y sema.md porque NO estaban formateados en HEAD; reaplicado a mano para que el diff sea solo lo mio. Mismo motivo por el que CLAUDE.md y arts/README.md van con 1-2 lineas en vez de 30. VERIFICADO: sema+morfo+sound 437/437 · check 75 = baseline · docs:check 0/618 · prettier limpio en los ficheros que toque. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
### 3.1 Las 17 reglas — CERRADA
Cerrada salvo tres decisiones que el autor no ha tomado y que viven como
**excepciones FIRMADAS** en `pack-census.test.ts` (el waiver registra, no
bendice; borrarlo es lo que cierra cada una):
| Pendiente | Estado |
| ------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **5 reglas hápticas inertes** (S-30/S-38) | D.8 exige `channels` con justificación escrita, o borrar. ⚠️ Ampliar **destapa S-31**: `shift`/`emerge` no tienen `base.haptic`, así que las firmas parciales (`{kind:'tick'}`) resuelven a `vibrate(NaN)` — hay que completarlas en el mismo commit |
| **gradient-picker `commit-reset`** (S-14) | Verbo delegado: el `Picker` compuesto ya emite el suyo. Es 1 de **6 casos idénticos** (color/date/date-range/gradient/time/time-range) |
| **tooltip `present`/`dismiss`/`dismiss-escape`** | HALLAZGO NUEVO, no está entre los 44: **no existe una sola llamada `trigger(` en `soma/components/tooltip`**. Su regla casa por familia, así que nada dispara y el silencio de hoy es accidental, no el declarado |
Censo de eventos huérfanos (medido): **14 de 249** en 104 morfos con soma. Tres
clases — verbo delegado (6), punto de extensión documentado en prosa
(virtual-list / virtual-grid `handle-scroll*`, que merecerían un `emission: 'app'`
fix(sema,morfo,soma): una superficie no admite dos ocurrencias, y el nombre ya no miente `data-event-*` es UNA RANURA por elemento. Tres auditorias independientes encontraron el mismo defecto y ninguna lo cerro: fable S1 (2026-07-01, con el README diciendo «findings executed»), sema S-17 (2026-08-05, midio el estampado del knob muriendo a los 24ms de un hold de 240) y blocks A-36/A-65 (reproducido en navegador, dos estampados a 1,1ms). Lo que faltaba no era diagnostico: nadie podia distinguir una redireccion legitima de una deriva, porque la opcion que redirigia se llamaba `fallbackTarget` y hacia lo contrario de lo que decia. EL NOMBRE PRIMERO. `fallbackTarget` -> `targetOverride` (202 apariciones, 64 ficheros, dirigido con `git ls-files`). Siempre GANO sobre el ref registrado; el nombre honesto es la precondicion para auditarlo. Las cronicas conservan el viejo por diseño. LA PROPIEDAD. `unstampEventAttrs` recibia el signal y lo DESCARTABA, asi que la ocurrencia que terminaba antes borraba a la que tenia la ranura. Ahora comprueba `data-event-id`. Con eso, `replace` deja de ser el comportamiento roto y pasa a ser el suelo correcto. A-36, SIN `regime`. Los cuatro overlays cedian el estampado del `open` al trigger por un workaround de la era `sequence: 'pre'`; con `post` el content ya esta montado. Retirado el override (float-panel migrado `pre`->`post`, ultimo fuera de la doctrina que sema.md escribe). Medido en /blocks/site-header/preview a 375px: contact-activate en el TRIGGER +18,7ms y open en el CONTENT +20,6ms, con press-squeeze y slide-from-right-full corriendo. Antes: los dos en el trigger, press-squeeze jamas. `regime` DEFINIDO — y son dos valores, no cuatro. `replace` (default) y `queue`, este solo para las 4 parejas irreducibles: los tres toggles (el provider ES el boton) y el knob. `collapse` retirado (su caso murio con la propiedad: medido, 0 huecos en 5 emisiones a 72ms) y `lock` retirado (significaria «un cierre que no se anuncia»), con sus 4 declaraciones muertas. El guard de `queue` PASO EN VERDE SIENDO INCORRECTO: con timers falsos no hay animaciones, asi que awaitExpression volvia al instante. El navegador midio el commit encolado llegando 1,6s tarde. `queue` espera el HOLD, no la expresion. Medir la envolvente no es medir la salida. `renderAttrs` — los attrs que no son partes. Vaciar ACTIVE_DEV_TRACK (palabras y chronos ya no estan excluidos) destapo 23 `data-palabras-*` que ningun morfo declaraba y que palabras.css SI estiliza: aterrizan en el arbol que el usuario escribio, asi que no pueden ser partes. Campo nuevo con la linea afilada —si el consumidor puede componerlo, es una PARTE— y 3 consumidores (palabras, waveform, aura). Declarado en types.ts Y en el esquema sium: la leccion de MorfoElement. Ademas: 5 selectores muertos en el predicado del focus-scope de palabras (barrido de todo el repo: aparecian solo ahi) · RTL-1 real en palabras-chrome (inset logico + translate fisico = doble volteo; rtl:check 1->0) · el union inline al `Direction` canonico, que destapo que el censo de direccion grepea el NOMBRE del tipo · deuda de chronos (scope, barrel, README). Y de la cola: S-36 (barrel 68->71 + guard), S-31 (vibrate(NaN)), S5 (la preferencia de reduced-motion del usuario ya gana a los channels del morfo), SO2 (el warn que el JSDoc prometia), SO4 (validar el target antes del prewrite). Todos los guards nuevos vistos fallar antes de arreglar nada. Base: check 74 (= base) · sema+morfo+contracts 454 verdes / 6 ajenos preexistentes · soma navegador 1258/1259 (el rojo es un timeout ajeno, reproducido con los cambios en stash) · docs:check 0/618 · rtl:check 0/177. Handoff: docs/process/CONTINUE-perceptual-surface.md Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
declarado) y contrato muerto (tooltip). Más chronos ×2 (la exclusión de escritura
se levantó el 2026-08-10 — ya accionables).
docs(process): handoff del hilo de sema — lo cerrado, la cola y como medirlo `CONTINUE-sema-audit.md`, autosuficiente para arrancar una sesion nueva sin releer las 24 000 lineas del corpus. Registra: - Las seis entregas de esta sesion con su commit, y por que cada una fue necesaria (el silencio como valor, el tremolo en serie, el saneamiento documental, contact-press, D.7 sin versos sueltos, y la regla de cascada que dejaba de alcanzar ancestros). - Las decisiones FIRMADAS que nadie debe re-litigar: `contact-press` (deroga el anexo Tabla 1, con la reversion escrita en el test), la enmienda de D.7 por su motivo —familias sin `base.sound` fuera de la prohibicion— y la reescritura de D.8 —`activeChannels` es default, no prohibicion—. - La COLA en orden de dano, con su evidencia: las 17 reglas de 212 que no disparan o disparan mal (textarea 6x/13x, navigation-menu, gradient-picker, chronos, tree-view mudo por teclado, 5 inertes, 10 con tuning de familia ajena) · los silenciosos (`preload` colgado que ademas abre contexto en el boot, `masterGain` que no hace nada, fallback de sample sin diagnostico, 3 WAV muertos, la rama de tipos que deja pasar un `gain` string) · el interruptor Sound de las demos · el `announce` que no compila · la instantanea perceptual · la recalibracion tras el fix del AM · y los dos ejes (el `contact` ausente en 84 de 91 morfos, `Toolbar.Button` sin componer). - **S-07 marcado como NO TOCAR** sin reabrirlo: decision explicita del usuario. - Como se verifica audio en este repo, que es donde mas tiempo se perdio: render offline replicando el grafo, A/B dentro del MISMO componente, y contar osciladores solo responde «llego algo al motor», nunca «se oye». - Las lecciones de metodo que costaron caro, incluida la propia: medir la envolvente NO es medir la salida, y por eso declare un silencio que a −13.9 dBFS era lo mas fuerte de la interfaz. Baseline al cierre: check 75 · docs:check 0/617 · sema+morfo+sound 369/369. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2 months ago
### 3.2 Los silenciosos
- **`preload()` se cuelga en `resume()`** fuera de un gesto → no precarga nada
Y abre un `AudioContext` en el arranque de la página (`engine-sound.ts:248`).
- **Las opciones de motor se descartan en silencio**: `createActiveUix({ events:
{ sound: { masterGain: 0.5 } } })` compila y **no hace nada** — `EngineSemantic`
filtra las claves antes de construir el canal (`engine.ts:299-319`). El aviso
que existe en `SoundChannel` no llega a dispararse.
- **El fallback de sample es mudo**: 4 salidas de fallo sin un diagnóstico, y el
catálogo `SOUND_DIAGNOSTIC_EVENTS` no tiene evento para ello. Un 404, un CORS o
un códec no soportado quedan enmascarados para siempre.
- **3 de los 5 WAV son código muerto**: `whoosh`, `pop`, `ding` no los referencia
ningún pack.
- **Tipos**: la rama `Record<string, DeltaValue>` de `SemaSignatureOverride`
desactiva toda comprobación de clave y valor — un `gain` de tipo _string_ llega
hasta el audio.
- **`applyMapOverrides` se traga las erratas de ruta** y crea ramas fantasma.
### 3.3 El interruptor Sound del topbar de las demos no silencia nada
`web/routes/uix/+layout@.svelte` no pasa `preferences` al canal, que se queda en
`'full'`. El framework sí lo soporta. Medido y sin tocar (viene del hilo del
audio, `CONTINUE-sound-engine.md`).
### 3.4 El `announce` no compila
`AnnounceFn` toma la prioridad en una bolsa de opciones y `uix.announce` la toma
posicional; y **ninguna raíz cablea el canal**, así que activarlo cae en el
fallback que añade un SEGUNDO par de live regions. `sema.md` ya enseña el
adaptador de una línea; falta la decisión de código.
### 3.5 La instantánea perceptual ← la que impide que todo esto vuelva
Guard propuesto y aprobado: una **tabla commiteada con la firma resuelta de cada
(componente, evento, intent neutral)** — gain, hold, háptico. Cualquier cambio en
algo que el usuario percibe rompe el test hasta que la instantánea se actualice
**en el mismo commit**, así que el cambio aparece en el diff en vez de esconderse
dentro de un pack. Habría cazado de golpe toda la clase 3.1.
docs(sema)!: retirar D.7 y S-07 — el orden hace imposible lo que prohibian F6 del PLAN-sound-names, y el motivo importa mas que el borrado: no se derogan por cambio de opinion, se DISUELVEN. La doctrina del autor que las origino sigue siendo cierta; lo que cambia es quien la sostiene. D.7 prohibia canonizar un sample sobre un evento cuya familia tuviera base.sound, porque sound() devolvia una firma COMPLETA y la cascada la aplicaba en replace DESPUES del intent: un fulfill perdia su +300 Hz ascendente. S-07 era el mismo defecto una capa mas abajo — el gain desnudo de los 14 afinados de escalera — y seguia ABIERTO por decision del autor. Con el nombre aplicado ANTES de los deltas de intent no queda ninguna capa posterior que pueda pisarlos. Aplastar el perfil evaluativo ya no esta prohibido: es INEXPRESABLE. Y S-07 pierde su premisa entera, porque SOUND_TUNINGS ya no existe. LO QUE SE CONSERVA, con su sitio nuevo escrito: el silencio como firma valida (SILENT), el criterio de cuando crear un pack, y los samples como recurso de producto (el catalogo los admite con nombre; la app autora los suyos por overrides.cascade, que sigue abierto a proposito). LO UNICO DE D.7 QUE HAY QUE SEGUIR SABIENDO, y por eso queda escrito en tres sitios: playSample lee EXACTAMENTE dos campos, sampleUrl y gain. No hay playbackRate ni detune. Sobre un .wav el intent solo mueve el volumen — medido, risk es indistinguible de neutral porque solo aporta roughness y la ruta de sample lo ignora. Un sample con carga evaluativa necesita UN FICHERO POR INTENT, que es lo que hace signal con ping frente a error y la verdadera razon de que fuese la excepcion. Es fisica del audio, no politica. Tocado: book-deviations §D.7 + §S-07 · sema.md §the sound catalogue (reescrita entera, con el orden y el limite del WAV) · CLAUDE.md §sema doctrine · los dos README del art · CONTINUE-sema-audit §3.0/§3.1/§3.6, que es el handoff vivo y estaba describiendo una cola que ya no existe. ⚠️ Prettier reformatea entero book-deviations.md y sema.md porque NO estaban formateados en HEAD; reaplicado a mano para que el diff sea solo lo mio. Mismo motivo por el que CLAUDE.md y arts/README.md van con 1-2 lineas en vez de 30. VERIFICADO: sema+morfo+sound 437/437 · check 75 = baseline · docs:check 0/618 · prettier limpio en los ficheros que toque. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
### 3.6 Recalibrar los gains — ABSORBIDA por el catálogo de nombres
docs(process): handoff del hilo de sema — lo cerrado, la cola y como medirlo `CONTINUE-sema-audit.md`, autosuficiente para arrancar una sesion nueva sin releer las 24 000 lineas del corpus. Registra: - Las seis entregas de esta sesion con su commit, y por que cada una fue necesaria (el silencio como valor, el tremolo en serie, el saneamiento documental, contact-press, D.7 sin versos sueltos, y la regla de cascada que dejaba de alcanzar ancestros). - Las decisiones FIRMADAS que nadie debe re-litigar: `contact-press` (deroga el anexo Tabla 1, con la reversion escrita en el test), la enmienda de D.7 por su motivo —familias sin `base.sound` fuera de la prohibicion— y la reescritura de D.8 —`activeChannels` es default, no prohibicion—. - La COLA en orden de dano, con su evidencia: las 17 reglas de 212 que no disparan o disparan mal (textarea 6x/13x, navigation-menu, gradient-picker, chronos, tree-view mudo por teclado, 5 inertes, 10 con tuning de familia ajena) · los silenciosos (`preload` colgado que ademas abre contexto en el boot, `masterGain` que no hace nada, fallback de sample sin diagnostico, 3 WAV muertos, la rama de tipos que deja pasar un `gain` string) · el interruptor Sound de las demos · el `announce` que no compila · la instantanea perceptual · la recalibracion tras el fix del AM · y los dos ejes (el `contact` ausente en 84 de 91 morfos, `Toolbar.Button` sin componer). - **S-07 marcado como NO TOCAR** sin reabrirlo: decision explicita del usuario. - Como se verifica audio en este repo, que es donde mas tiempo se perdio: render offline replicando el grafo, A/B dentro del MISMO componente, y contar osciladores solo responde «llego algo al motor», nunca «se oye». - Las lecciones de metodo que costaron caro, incluida la propia: medir la envolvente NO es medir la salida, y por eso declare un silencio que a −13.9 dBFS era lo mas fuerte de la interfaz. Baseline al cierre: check 75 · docs:check 0/617 · sema+morfo+sound 369/369. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2 months ago
Los earcons con rugosidad bajaron 1.6–2.7 dB porque el trémolo ya no suma nivel.
Es corrección, no pérdida, pero cambia el volumen percibido de `signal` y de todo
docs(sema)!: retirar D.7 y S-07 — el orden hace imposible lo que prohibian F6 del PLAN-sound-names, y el motivo importa mas que el borrado: no se derogan por cambio de opinion, se DISUELVEN. La doctrina del autor que las origino sigue siendo cierta; lo que cambia es quien la sostiene. D.7 prohibia canonizar un sample sobre un evento cuya familia tuviera base.sound, porque sound() devolvia una firma COMPLETA y la cascada la aplicaba en replace DESPUES del intent: un fulfill perdia su +300 Hz ascendente. S-07 era el mismo defecto una capa mas abajo — el gain desnudo de los 14 afinados de escalera — y seguia ABIERTO por decision del autor. Con el nombre aplicado ANTES de los deltas de intent no queda ninguna capa posterior que pueda pisarlos. Aplastar el perfil evaluativo ya no esta prohibido: es INEXPRESABLE. Y S-07 pierde su premisa entera, porque SOUND_TUNINGS ya no existe. LO QUE SE CONSERVA, con su sitio nuevo escrito: el silencio como firma valida (SILENT), el criterio de cuando crear un pack, y los samples como recurso de producto (el catalogo los admite con nombre; la app autora los suyos por overrides.cascade, que sigue abierto a proposito). LO UNICO DE D.7 QUE HAY QUE SEGUIR SABIENDO, y por eso queda escrito en tres sitios: playSample lee EXACTAMENTE dos campos, sampleUrl y gain. No hay playbackRate ni detune. Sobre un .wav el intent solo mueve el volumen — medido, risk es indistinguible de neutral porque solo aporta roughness y la ruta de sample lo ignora. Un sample con carga evaluativa necesita UN FICHERO POR INTENT, que es lo que hace signal con ping frente a error y la verdadera razon de que fuese la excepcion. Es fisica del audio, no politica. Tocado: book-deviations §D.7 + §S-07 · sema.md §the sound catalogue (reescrita entera, con el orden y el limite del WAV) · CLAUDE.md §sema doctrine · los dos README del art · CONTINUE-sema-audit §3.0/§3.1/§3.6, que es el handoff vivo y estaba describiendo una cola que ya no existe. ⚠️ Prettier reformatea entero book-deviations.md y sema.md porque NO estaban formateados en HEAD; reaplicado a mano para que el diff sea solo lo mio. Mismo motivo por el que CLAUDE.md y arts/README.md van con 1-2 lineas en vez de 30. VERIFICADO: sema+morfo+sound 437/437 · check 75 = baseline · docs:check 0/618 · prettier limpio en los ficheros que toque. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
`risk`/`threat`.
Sigue siendo decisión de catálogo — y **ahora el catálogo existe**: los niveles
viven en 16 nombres dentro de `src/uix/sema/sound-names.ts`, así que recalibrar
es editar ese fichero y ver el diff en `sound-names.test.ts`, que instantanea qué
suena cada nombre bajo cada intent. Antes había que tocar 71 packs a ciegas.
docs(process): handoff del hilo de sema — lo cerrado, la cola y como medirlo `CONTINUE-sema-audit.md`, autosuficiente para arrancar una sesion nueva sin releer las 24 000 lineas del corpus. Registra: - Las seis entregas de esta sesion con su commit, y por que cada una fue necesaria (el silencio como valor, el tremolo en serie, el saneamiento documental, contact-press, D.7 sin versos sueltos, y la regla de cascada que dejaba de alcanzar ancestros). - Las decisiones FIRMADAS que nadie debe re-litigar: `contact-press` (deroga el anexo Tabla 1, con la reversion escrita en el test), la enmienda de D.7 por su motivo —familias sin `base.sound` fuera de la prohibicion— y la reescritura de D.8 —`activeChannels` es default, no prohibicion—. - La COLA en orden de dano, con su evidencia: las 17 reglas de 212 que no disparan o disparan mal (textarea 6x/13x, navigation-menu, gradient-picker, chronos, tree-view mudo por teclado, 5 inertes, 10 con tuning de familia ajena) · los silenciosos (`preload` colgado que ademas abre contexto en el boot, `masterGain` que no hace nada, fallback de sample sin diagnostico, 3 WAV muertos, la rama de tipos que deja pasar un `gain` string) · el interruptor Sound de las demos · el `announce` que no compila · la instantanea perceptual · la recalibracion tras el fix del AM · y los dos ejes (el `contact` ausente en 84 de 91 morfos, `Toolbar.Button` sin componer). - **S-07 marcado como NO TOCAR** sin reabrirlo: decision explicita del usuario. - Como se verifica audio en este repo, que es donde mas tiempo se perdio: render offline replicando el grafo, A/B dentro del MISMO componente, y contar osciladores solo responde «llego algo al motor», nunca «se oye». - Las lecciones de metodo que costaron caro, incluida la propia: medir la envolvente NO es medir la salida, y por eso declare un silencio que a −13.9 dBFS era lo mas fuerte de la interfaz. Baseline al cierre: check 75 · docs:check 0/617 · sema+morfo+sound 369/369. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2 months ago
### 3.7 Ejes, no tareas
- **`contact` está ausente en 84 de los 91 morfos con eventos.** Hoy lo expresan
7 (los tres toggles de esta sesión + button, file-upload, navigation-menu,
palabras). El libro le dedica el capítulo 22 entero y CANON §8 lo pone como
regla 1: «contact precede al resultado cuando hay acción directa». Es el eje que
explica por qué media interfaz no responde al «¿me has sentido?».
- **`Toolbar.Button` reimplementa su `<button>`** en vez de componer el de soma:
por eso nunca ha sonado, y no se arregla bajando un gain.
### 3.8 NO TOCAR sin reabrirlo — S-07
Los 14 afinados del catálogo fijan `gain` como número desnudo, que se aplica en
`replace` y borra el perfil evaluativo del intent (~150 usos). El usuario lo dejó
para tratarlo «más detenidamente». Las 9 reglas de §2.5 ya componen; **el resto
del catálogo sigue igual y es deliberado**.
---
## 4. Cómo verificar en este hilo
- **Audio**: render offline replicando el grafo de `synthesize` y medir pico /
RMS / amplitud en el corte. El patrón exacto está en los mensajes de
`316452263` y `24d30ee1a`.
- **A/B siempre dentro del MISMO componente.** Comparar un Button de otra página
con el transporte del player produjo una contradicción falsa (registrado en
`CONTINUE-sound-engine.md`).
- **Emisión y estampado**: `MutationObserver` sobre `data-event*` del subárbol.
- **Silencio**: contar osciladores es válido para «¿llegó algo al motor?», NO
para «¿se oye?».
- **Mutear antes de reproducir y parar al terminar** — el Chrome que suena es el
del usuario.
docs(sema)!: retirar D.7 y S-07 — el orden hace imposible lo que prohibian F6 del PLAN-sound-names, y el motivo importa mas que el borrado: no se derogan por cambio de opinion, se DISUELVEN. La doctrina del autor que las origino sigue siendo cierta; lo que cambia es quien la sostiene. D.7 prohibia canonizar un sample sobre un evento cuya familia tuviera base.sound, porque sound() devolvia una firma COMPLETA y la cascada la aplicaba en replace DESPUES del intent: un fulfill perdia su +300 Hz ascendente. S-07 era el mismo defecto una capa mas abajo — el gain desnudo de los 14 afinados de escalera — y seguia ABIERTO por decision del autor. Con el nombre aplicado ANTES de los deltas de intent no queda ninguna capa posterior que pueda pisarlos. Aplastar el perfil evaluativo ya no esta prohibido: es INEXPRESABLE. Y S-07 pierde su premisa entera, porque SOUND_TUNINGS ya no existe. LO QUE SE CONSERVA, con su sitio nuevo escrito: el silencio como firma valida (SILENT), el criterio de cuando crear un pack, y los samples como recurso de producto (el catalogo los admite con nombre; la app autora los suyos por overrides.cascade, que sigue abierto a proposito). LO UNICO DE D.7 QUE HAY QUE SEGUIR SABIENDO, y por eso queda escrito en tres sitios: playSample lee EXACTAMENTE dos campos, sampleUrl y gain. No hay playbackRate ni detune. Sobre un .wav el intent solo mueve el volumen — medido, risk es indistinguible de neutral porque solo aporta roughness y la ruta de sample lo ignora. Un sample con carga evaluativa necesita UN FICHERO POR INTENT, que es lo que hace signal con ping frente a error y la verdadera razon de que fuese la excepcion. Es fisica del audio, no politica. Tocado: book-deviations §D.7 + §S-07 · sema.md §the sound catalogue (reescrita entera, con el orden y el limite del WAV) · CLAUDE.md §sema doctrine · los dos README del art · CONTINUE-sema-audit §3.0/§3.1/§3.6, que es el handoff vivo y estaba describiendo una cola que ya no existe. ⚠️ Prettier reformatea entero book-deviations.md y sema.md porque NO estaban formateados en HEAD; reaplicado a mano para que el diff sea solo lo mio. Mismo motivo por el que CLAUDE.md y arts/README.md van con 1-2 lineas en vez de 30. VERIFICADO: sema+morfo+sound 437/437 · check 75 = baseline · docs:check 0/618 · prettier limpio en los ficheros que toque. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
- Guards: `sound-names.test.ts` (la instantánea del catálogo) ·
`pack-census.test.ts` (4 invariantes por regla) · `sounds-grammar.test.ts`
(ningún pack AUTORA) · `cascade-scope.test.ts` · `chans/sound.test.ts` ·
`engine-sound.test.ts`.
**Baseline actual** (2026-08-06 tarde, HEAD `769e426c5`): `check` **75** ·
`docs:check` **0/618** · sema+morfo+sound **437/437**. La suite completa deja 6
fallos en `contracts.test.ts` que son AJENOS y preexistentes (medido con y sin
los cambios de este hilo).
docs(process): handoff del hilo de sema — lo cerrado, la cola y como medirlo `CONTINUE-sema-audit.md`, autosuficiente para arrancar una sesion nueva sin releer las 24 000 lineas del corpus. Registra: - Las seis entregas de esta sesion con su commit, y por que cada una fue necesaria (el silencio como valor, el tremolo en serie, el saneamiento documental, contact-press, D.7 sin versos sueltos, y la regla de cascada que dejaba de alcanzar ancestros). - Las decisiones FIRMADAS que nadie debe re-litigar: `contact-press` (deroga el anexo Tabla 1, con la reversion escrita en el test), la enmienda de D.7 por su motivo —familias sin `base.sound` fuera de la prohibicion— y la reescritura de D.8 —`activeChannels` es default, no prohibicion—. - La COLA en orden de dano, con su evidencia: las 17 reglas de 212 que no disparan o disparan mal (textarea 6x/13x, navigation-menu, gradient-picker, chronos, tree-view mudo por teclado, 5 inertes, 10 con tuning de familia ajena) · los silenciosos (`preload` colgado que ademas abre contexto en el boot, `masterGain` que no hace nada, fallback de sample sin diagnostico, 3 WAV muertos, la rama de tipos que deja pasar un `gain` string) · el interruptor Sound de las demos · el `announce` que no compila · la instantanea perceptual · la recalibracion tras el fix del AM · y los dos ejes (el `contact` ausente en 84 de 91 morfos, `Toolbar.Button` sin componer). - **S-07 marcado como NO TOCAR** sin reabrirlo: decision explicita del usuario. - Como se verifica audio en este repo, que es donde mas tiempo se perdio: render offline replicando el grafo, A/B dentro del MISMO componente, y contar osciladores solo responde «llego algo al motor», nunca «se oye». - Las lecciones de metodo que costaron caro, incluida la propia: medir la envolvente NO es medir la salida, y por eso declare un silencio que a −13.9 dBFS era lo mas fuerte de la interfaz. Baseline al cierre: check 75 · docs:check 0/617 · sema+morfo+sound 369/369. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2 months ago
---
## 5. El corpus, si hay que releerlo
Núcleo indispensable (leído entero el 2026-08-06): `PLAN-sound-engine.md` ·
`PLAN-sound-redesign.md` · `CONTINUE-sound-engine.md` · `architecture/sema.md` ·
`CANON.md` · `theming/channels.md` · `arts/sound/README.md` ·
`decisions/book-deviations.md` (D.5 · D.7 · D.8 · D.9 · D.12).
El **libro** está en `docs/Disenando_lo_que_ocurre_FINAL.pdf` y el manuscrito en
`src/docs/*.docx`. El PDF no se puede renderizar aquí; el `.docx` es un zip —
extraer `word/document.xml` y quitar etiquetas da el texto completo. Capítulos
que decidieron cosas en esta sesión: **5 §11** y **7 §13** (el silencio es firma
válida), **20** (coordinación multicanal), **22** (contact) y **23** (commit, con
su tabla de canales y el emparejamiento del Toggle).

Powered by TurnKey Linux.