docs(process): PLAN — el sonido se NOMBRA, un nombre y punto
Mandato del autor: «yo solo quiero en la semantica en sonido darle el
nombre de un sonido y punto, y me da igual que sea generado o sea un wav;
todo lo demas es sobreingenieria». No es una simplificacion de
conveniencia: restaura la ley que sema.md:390 ya tenia escrita —
«components reference names; URLs and parameters live in one place»— y
que nada vigilaba.
LA MEDIDA que lo justifica, en runtime sobre los 71 packs: 214 reglas
autoran 33 firmas distintas, y las 8 primeras cubren el 76%. Dos firmas
—gain 0.05 y gain 0.03— explican 70 reglas ellas solas. El 43% de la
superficie perceptual del framework es un componente diciendo «mas
bajito». Ejes tocados: gain 165, contour 69, pitch 67, roughness 23 —
contour/pitch/roughness son del INTENT, y contour es un enum, luego 69
reglas borran el contorno que el intent acaba de poner y no pueden hacer
otra cosa. El guard que naci ayer para proteger el intent no mira
contour: esta ciego en el unico eje incomponible.
EL DISEÑO: un catalogo de nombres (fusion de SOUND_LIBRARY y
SOUND_TUNINGS), el tipo de la regla estrechado a nombre|SILENT, y el
nombre aplicado ANTES de los deltas de intent. Con el nombre debajo, D.7
y S-07 dejan de PODER existir — no se arreglan, se disuelven.
§7.1 registra un error mio corregido por el autor: la primera redaccion
abria con una instantanea del estado actual, declarada innegociable. Un
A/B necesita una referencia que merezca conservarse y la salida de hoy no
lo es; ademas git YA es esa instantanea y el compilador es mejor guard.
La instantanea se movio al CATALOGO, que es donde viven las decisiones.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
|
|
|
|
# PLAN — El sonido se NOMBRA: un nombre y punto
|
|
|
|
|
|
|
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
|
|
|
|
> ⛔ **SUPERADO EL MISMO DÍA (2026-08-06). No ejecutar nada de aquí.**
|
|
|
|
|
|
>
|
|
|
|
|
|
> Este plan entregó un modelo en el que un NOMBRE modificaba la base de familia
|
|
|
|
|
|
> y el intent modulaba después. Se ejecutó entero… y al oírlo, el autor lo
|
|
|
|
|
|
> rechazó: los dieciséis nombres sonaban prácticamente igual, porque cinco eran
|
|
|
|
|
|
> la misma nota a cinco volúmenes y las variantes se separaban 20 Hz. La
|
|
|
|
|
|
> directiva que lo sustituye fue literal: _«evento.intent = sonido, y punto y
|
|
|
|
|
|
> nada de mierdas de que si el intent modifica nada»_.
|
|
|
|
|
|
>
|
|
|
|
|
|
> **El modelo vigente** —el intent SELECCIONA un sonido entero, dos búsquedas,
|
|
|
|
|
|
> nada modula nada— vive en [`architecture/sema.md`](../architecture/sema.md)
|
|
|
|
|
|
> §the sound pack y en las páginas `/uix/docs/sound`. Este documento se conserva
|
|
|
|
|
|
> como crónica de por qué NO se hizo así: la lección es que un sistema de
|
|
|
|
|
|
> modulación produce variantes que difieren sobre el papel y son idénticas al
|
|
|
|
|
|
> oído, y que sólo se detecta escuchando.
|
|
|
|
|
|
|
docs(process): PLAN — el sonido se NOMBRA, un nombre y punto
Mandato del autor: «yo solo quiero en la semantica en sonido darle el
nombre de un sonido y punto, y me da igual que sea generado o sea un wav;
todo lo demas es sobreingenieria». No es una simplificacion de
conveniencia: restaura la ley que sema.md:390 ya tenia escrita —
«components reference names; URLs and parameters live in one place»— y
que nada vigilaba.
LA MEDIDA que lo justifica, en runtime sobre los 71 packs: 214 reglas
autoran 33 firmas distintas, y las 8 primeras cubren el 76%. Dos firmas
—gain 0.05 y gain 0.03— explican 70 reglas ellas solas. El 43% de la
superficie perceptual del framework es un componente diciendo «mas
bajito». Ejes tocados: gain 165, contour 69, pitch 67, roughness 23 —
contour/pitch/roughness son del INTENT, y contour es un enum, luego 69
reglas borran el contorno que el intent acaba de poner y no pueden hacer
otra cosa. El guard que naci ayer para proteger el intent no mira
contour: esta ciego en el unico eje incomponible.
EL DISEÑO: un catalogo de nombres (fusion de SOUND_LIBRARY y
SOUND_TUNINGS), el tipo de la regla estrechado a nombre|SILENT, y el
nombre aplicado ANTES de los deltas de intent. Con el nombre debajo, D.7
y S-07 dejan de PODER existir — no se arreglan, se disuelven.
§7.1 registra un error mio corregido por el autor: la primera redaccion
abria con una instantanea del estado actual, declarada innegociable. Un
A/B necesita una referencia que merezca conservarse y la salida de hoy no
lo es; ademas git YA es esa instantanea y el compilador es mejor guard.
La instantanea se movio al CATALOGO, que es donde viven las decisiones.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
|
|
|
|
> **Tipo**: plan de diseño + ejecución por fases (process — efímero, NO fuente de verdad).
|
|
|
|
|
|
> **Fecha**: 2026-08-06 · **Estado**: **EJECUTADO — F1…F5 ENTREGADAS** el mismo
|
|
|
|
|
|
> día, por orden directa del autor («aplícalo»). Queda **F6**: la doctrina
|
|
|
|
|
|
> (D.7 / S-07 retiradas con su motivo, `sema.md` §tunings reescrito, el límite
|
|
|
|
|
|
> del WAV de §3.2 escrito). El vocabulario de §5 se aplicó con las colapsaciones
|
|
|
|
|
|
> anotadas en §5.1 — reversibles editando UN fichero.
|
|
|
|
|
|
> **Kickoff para sesión nueva**: _«Lee `docs/process/PLAN-sound-names.md` y cierra
|
|
|
|
|
|
> F6.»_
|
|
|
|
|
|
> **Antecedentes obligatorios**: [`AUDIT-sema-2026-08-05.md`](./AUDIT-sema-2026-08-05.md)
|
|
|
|
|
|
> (44 hallazgos) · [`CONTINUE-sema-audit.md`](./CONTINUE-sema-audit.md) (la cola) ·
|
|
|
|
|
|
> [`architecture/sema.md`](../architecture/sema.md) · [`CANON.md`](../CANON.md).
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 1. El mandato (2026-08-06, palabras del autor)
|
|
|
|
|
|
|
|
|
|
|
|
> «Yo sólo quiero en la semántica en sonido darle el nombre de un sonido y punto,
|
|
|
|
|
|
> y me da igual que sea generado o sea un wav. Todo lo demás es una puta mierda
|
|
|
|
|
|
> sobreingeniería para algo que es anecdótico y que convierte al sistema en
|
|
|
|
|
|
> supercomplejo.»
|
|
|
|
|
|
|
|
|
|
|
|
Y antes, sobre los literales:
|
|
|
|
|
|
|
|
|
|
|
|
> «Hace ya que se hizo que los sonidos tenían que estar canonizados y se hizo un
|
|
|
|
|
|
> repositorio con los sonidos, y ahora veo que se meten valores y mierdas a nivel
|
|
|
|
|
|
> de componente.»
|
|
|
|
|
|
|
|
|
|
|
|
El mandato **no es una simplificación de conveniencia**: restaura la ley que ya
|
|
|
|
|
|
estaba escrita en [`sema.md:390`](../architecture/sema.md) —_«components reference
|
|
|
|
|
|
names; URLs and parameters live in one place»_— y que nada vigilaba.
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 2. La medida — por qué el mandato es correcto
|
|
|
|
|
|
|
|
|
|
|
|
Censo en runtime sobre los 71 packs (2026-08-06, HEAD `2f63525da`):
|
|
|
|
|
|
|
|
|
|
|
|
**214 reglas de cascada. 33 firmas distintas. Las 8 primeras cubren el 76%.**
|
|
|
|
|
|
|
|
|
|
|
|
| firma autorada | reglas |
|
|
|
|
|
|
| ------------------------------------------------- | ------ |
|
|
|
|
|
|
| `{ gain: 0.05 }` | 35 |
|
|
|
|
|
|
| `{ gain: 0.03 }` | 35 |
|
|
|
|
|
|
| _(sin sonido — sólo háptico/channels)_ | 34 |
|
|
|
|
|
|
| `{ gain: 0.08 }` | 17 |
|
|
|
|
|
|
| `{ contour:'descending', gain:0.05, pitch:−120 }` | 13 |
|
|
|
|
|
|
| `{ contour:'descending', gain:0.03, pitch:−80 }` | 11 |
|
|
|
|
|
|
| `SILENT` | 10 |
|
|
|
|
|
|
| `{ contour:'ascending', gain:0.18, pitch:−90 }` | 7 |
|
|
|
|
|
|
| … 25 firmas más, casi todas ×1 | 42 |
|
|
|
|
|
|
|
|
|
|
|
|
Anatomía de lo que dicen esas reglas:
|
|
|
|
|
|
|
|
|
|
|
|
- **92 de 214 (43%) no dicen más que un volumen.** Su contenido íntegro es `gain`.
|
|
|
|
|
|
- **2 de 214** nombran un WAV. De los 5 `.wav` embarcados, **3 no los usa nadie**
|
|
|
|
|
|
(`whoosh`, `pop`, `ding` — S-26, verificado).
|
|
|
|
|
|
- Ejes tocados: `gain` 165 · **`contour` 69** · **`pitch` 67** · `centroid` 30 ·
|
|
|
|
|
|
`decay` 29 · **`roughness` 23** · `duration` 23 · `attack` 22.
|
|
|
|
|
|
|
|
|
|
|
|
`pitch`, `contour` y `roughness` **son ejes del intent**. `contour` es un enum:
|
|
|
|
|
|
no admite `{op:'add'}`, sólo reemplazo — así que **69 reglas borran el contorno
|
|
|
|
|
|
que el intent acababa de poner, y no pueden hacer otra cosa**. El guard nacido el
|
|
|
|
|
|
2026-08-06 para proteger el intent (`d7-intent-survives.test.ts`) comprueba
|
|
|
|
|
|
`pitch`, `gain` y `roughness`: **está ciego justo en el único eje incomponible**.
|
|
|
|
|
|
|
|
|
|
|
|
Y `centroid` (30 usos) **es un eje de la FAMILIA**, no del intent: los 6 intents
|
|
|
|
|
|
lo tocan **cero** veces; las familias lo fijan (contact 2000 · commit 1800 ·
|
|
|
|
|
|
signal 2400 · emerge 1500 · shift 1400 Hz). Es la huella tímbrica que distingue
|
|
|
|
|
|
una familia de otra — y 5 componentes le suman +2800 por copia-pega, dejando su
|
|
|
|
|
|
`commit` en 4600 Hz, casi el doble de brillante que la familia más brillante del
|
|
|
|
|
|
mapa.
|
|
|
|
|
|
|
|
|
|
|
|
**Conclusión medida**: la capa de packs autora 33 sonidos usando una superficie
|
|
|
|
|
|
de 8 ejes continuos, invade los ejes del intent 159 veces y dedica el 43% de sus
|
|
|
|
|
|
reglas a decir «más bajito». El coste de entrada para «meter un sonido» es
|
|
|
|
|
|
conocer 5 capas de cascada, `replace` vs `add`, D.7, D.8, S-07 y la ley de
|
|
|
|
|
|
nombrado. **La complejidad no está pagando nada.**
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 3. El diseño
|
|
|
|
|
|
|
|
|
|
|
|
```ts
|
|
|
|
|
|
// HOY — color-picker, commit-set
|
|
|
|
|
|
sound: {
|
|
|
|
|
|
gain: { op: 'add', value: -0.25 },
|
|
|
|
|
|
centroid: { op: 'add', value: 2800 },
|
|
|
|
|
|
decay: { op: 'add', value: 20 }
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// OBJETIVO
|
|
|
|
|
|
sound: 'settle.bright'
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
Tres piezas, **ninguna nueva** — las dos primeras ya existen en el repo:
|
|
|
|
|
|
|
|
|
|
|
|
1. **UN catálogo de sonidos con nombre.** Se fusionan `SOUND_LIBRARY` (que ya
|
|
|
|
|
|
resuelve nombre → WAV con reserva sintética) y `SOUND_TUNINGS` (que ya es un
|
|
|
|
|
|
catálogo, sólo que de aritmética). Cada nombre es una definición completa:
|
|
|
|
|
|
receta sintética **o** sample con reserva. **Al consumidor le da igual cuál
|
|
|
|
|
|
sea** — que es literalmente el mandato. Los parámetros viven ahí y en ningún
|
|
|
|
|
|
otro sitio.
|
|
|
|
|
|
|
|
|
|
|
|
2. **El componente escribe un nombre, o `SILENT`.** El tipo de la regla pasa de
|
|
|
|
|
|
bolsa-de-8-ejes a `sound?: SoundName | typeof SILENT`. **La ley deja de ser
|
|
|
|
|
|
prosa: la impone el compilador.** Se acabaron `op:'add'`, el número desnudo y
|
|
|
|
|
|
el `centroid` copiado cinco veces.
|
|
|
|
|
|
|
|
|
|
|
|
> Precedente en el propio repo: el canal háptico YA funciona así.
|
|
|
|
|
|
> `haptic: { kind: 'tick' }` es un nombre categórico y el canal resuelve qué
|
|
|
|
|
|
> significa; nadie escribe milisegundos por componente.
|
|
|
|
|
|
|
|
|
|
|
|
3. **El nombre entra como BASE de la ocurrencia; el intent modula DESPUÉS**, en
|
|
|
|
|
|
el motor, invisible para el componente (§4, D-SN.1).
|
|
|
|
|
|
|
|
|
|
|
|
### 3.1 El reorden — la pieza que disuelve toda una clase de defectos
|
|
|
|
|
|
|
|
|
|
|
|
Orden **de hoy** (`resolver.ts:135-180`):
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
1 base de familia → 2 deltas de intent → 3 overrides de evento → 5a packs
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
El pack llega **el último** y se aplica en `replace`: por eso aplasta el intent.
|
|
|
|
|
|
D.7, S-07 y `d7-intent-survives.test.ts` existen los tres para vigilar esa
|
|
|
|
|
|
inversión.
|
|
|
|
|
|
|
|
|
|
|
|
Orden **propuesto**:
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
1 base = el NOMBRE que la cascada seleccione (o la base de familia si no hay)
|
|
|
|
|
|
2 deltas de intent
|
|
|
|
|
|
3 overrides de evento
|
|
|
|
|
|
5b cascada de app
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
La cascada sigue casando por selector igual que hoy (el `target` ya está en la
|
|
|
|
|
|
mano del resolver); lo único que cambia es **qué produce**: en vez de un delta
|
|
|
|
|
|
que pisa, **elige la base sobre la que el intent trabaja**.
|
|
|
|
|
|
|
|
|
|
|
|
Con el nombre DEBAJO, **D.7 y S-07 dejan de poder existir**. No se arreglan: se
|
|
|
|
|
|
disuelven. Un `commit-save` con `fulfill` sonará más brillante y más arriba que
|
|
|
|
|
|
con `neutral` **sin que ningún componente sepa que eso ocurre**.
|
|
|
|
|
|
|
|
|
|
|
|
### 3.2 El límite físico, ya medido
|
|
|
|
|
|
|
|
|
|
|
|
`playSample` ([`engine-sound.ts:694-698`](../../src/arts/sound/engine-sound.ts))
|
|
|
|
|
|
sólo lee **dos** campos: `sampleUrl` y `gain`. No hay `playbackRate` ni `detune`.
|
|
|
|
|
|
Luego **sobre un WAV el intent sólo puede mover el volumen**: medido, `risk` es
|
|
|
|
|
|
indistinguible de `neutral` (ambos gain 0.05; `risk` sólo aporta `roughness`, que
|
|
|
|
|
|
la ruta de sample ignora).
|
|
|
|
|
|
|
|
|
|
|
|
Consecuencia para el vocabulario: **un nombre-WAV que deba llevar carga
|
|
|
|
|
|
evaluativa necesita un fichero por intent** — que es exactamente lo que ya hace
|
|
|
|
|
|
la familia `signal` (`notification.ping` vs `alert.error`) y la razón de que D.7
|
|
|
|
|
|
la declare excepción. No es un defecto del plan: es física del audio, y hay que
|
|
|
|
|
|
escribirlo en la doctrina para que nadie lo redescubra.
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 4. Decisiones FIRMADAS (2026-08-06)
|
|
|
|
|
|
|
|
|
|
|
|
- **D-SN.1 — El intent SIGUE modulando encima, en el motor.** El nombre es la
|
|
|
|
|
|
base de la ocurrencia; la carga evaluativa se aplica después y es invisible al
|
|
|
|
|
|
componente. Es la tesis del libro con la complejidad en el piso que le toca:
|
|
|
|
|
|
**cero en el componente**. Sobre nombres-WAV, la modulación se reduce a volumen
|
|
|
|
|
|
(§3.2).
|
|
|
|
|
|
- **D-SN.2 — Plan firmado antes de ejecutar.** Este documento. Sin firma del
|
|
|
|
|
|
vocabulario (§5) no se toca código.
|
|
|
|
|
|
- **D-SN.3 — NO se congela el estado actual.** Es un framework en desarrollo: no
|
|
|
|
|
|
hay consumidor, no hay contrato de compatibilidad y la salida de hoy está
|
|
|
|
|
|
medida como defectuosa. No se hace A/B contra ella; la referencia es el
|
|
|
|
|
|
catálogo nuevo. Razonado en §7.1.
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 5. El vocabulario — PROPUESTA, PENDIENTE DE FIRMA
|
|
|
|
|
|
|
|
|
|
|
|
⚠️ **Esto es diseño del autor, no mío.** Lo que sigue es la colapsación mecánica
|
|
|
|
|
|
de las 33 firmas medidas; los NOMBRES son una propuesta a enmendar.
|
|
|
|
|
|
|
|
|
|
|
|
Las 33 firmas colapsan a ~12–15 nombres. Ejes reales que las separan: **nivel**
|
|
|
|
|
|
(3 escalones cubren 87 reglas), **dirección** (sube / baja / plana), y **carácter**
|
|
|
|
|
|
(un puñado de timbres con identidad propia).
|
|
|
|
|
|
|
|
|
|
|
|
| firma medida | reglas | nombre propuesto |
|
|
|
|
|
|
| --------------------------------- | ------ | -------------------- |
|
|
|
|
|
|
| `gain 0.03` | 35 | `subtle` |
|
|
|
|
|
|
| `gain 0.05` | 35 | `soft` |
|
|
|
|
|
|
| `gain 0.08` | 17 | `medium` |
|
|
|
|
|
|
| `gain 0.10 / 0.15` | 2 | `strong` |
|
|
|
|
|
|
| descending, −80, 0.03 | 11 | `subtle.fall` |
|
|
|
|
|
|
| descending, −120, 0.05 | 13 | `soft.fall` |
|
|
|
|
|
|
| descending, −150 | 4 | `deep.fall` |
|
|
|
|
|
|
| ascending, +60…+120 | 3 | `soft.rise` |
|
|
|
|
|
|
| pitch 1080 · centroid 5200 (aire) | 12 | `air` (3 niveles) |
|
|
|
|
|
|
| pitch 920 · centroid 4600 | 4 | `settle` |
|
|
|
|
|
|
| pitch 1040 · centroid 5400 · arc | 4 | `snap` |
|
|
|
|
|
|
| centroid +2800 (residuo de ayer) | 5 | → `settle` |
|
|
|
|
|
|
| centroid +3600 (residuo de ayer) | 2 | → `snap` |
|
|
|
|
|
|
| sample ping | 1 | `ping` |
|
|
|
|
|
|
| sample error | 1 | `error` |
|
|
|
|
|
|
| `SILENT` | 10 | `SILENT` (ya existe) |
|
|
|
|
|
|
|
|
|
|
|
|
### 5.1 Lo que se entregó, y las colapsaciones que lleva dentro
|
|
|
|
|
|
|
|
|
|
|
|
Catálogo final: **16 nombres** + `SILENT`, en `src/uix/sema/sound-names.ts`.
|
|
|
|
|
|
Niveles `subtle` · `soft` · `medium` · `strong` · `loud`; direcciones
|
|
|
|
|
|
`subtle.rise` · `soft.rise` · `subtle.fall` · `soft.fall` · `deep.fall`;
|
|
|
|
|
|
carácter `air` · `air.strong` · `settle` · `snap`; samples `ping` · `error`.
|
|
|
|
|
|
|
|
|
|
|
|
Los nombres NO llevan familia por delante (pregunta 1, resuelta por su motivo):
|
|
|
|
|
|
la ley `{family}.{tail}` existía porque un tuning era un delta SOBRE una familia.
|
|
|
|
|
|
Un nombre es una base, y el mismo `soft` sirve a un commit y a un emerge porque
|
|
|
|
|
|
la familia sigue poniendo su identidad debajo. Encabezarlos con familia sería
|
|
|
|
|
|
hoy la mentira, no la verdad.
|
|
|
|
|
|
|
|
|
|
|
|
Las 32 firmas medidas colapsan a esos 16 nombres. Estas son **todas** las
|
|
|
|
|
|
colapsaciones, con su consecuencia audible — cada una se revierte editando UNA
|
|
|
|
|
|
línea del catálogo:
|
|
|
|
|
|
|
|
|
|
|
|
| firma vieja | nombre | consecuencia |
|
|
|
|
|
|
| --------------------------------- | ------------- | -------------------------------------- |
|
|
|
|
|
|
| `gain 0.04` (tabs) | `subtle` | −0.01 |
|
|
|
|
|
|
| `gain 0.06` (popover dismiss) | `soft` | −0.01 |
|
|
|
|
|
|
| desc −100 / 0.03 (×3) | `subtle.fall` | pitch −80 en vez de −100 |
|
|
|
|
|
|
| desc −120 / 0.06 (×2) | `soft.fall` | −0.01 |
|
|
|
|
|
|
| desc sin pitch / 0.05 (×2) | `soft.fall` | gana la caída de −120 |
|
|
|
|
|
|
| asc +80 / 0.03 (editable) | `subtle.rise` | +60 en vez de +80 |
|
|
|
|
|
|
| asc +120 / 0.05 (stepper) | `soft.rise` | +80 en vez de +120 |
|
|
|
|
|
|
| `air` @ 0.10 (×3) | `air.strong` | +0.02 |
|
|
|
|
|
|
| delta `centroid +2800` (×5) | `settle` | ninguna — era esa firma, en aritmética |
|
|
|
|
|
|
| delta `centroid +3600` (×2) | `snap` | ninguna — ídem |
|
|
|
|
|
|
| proof-of-human confirm | `strong` | pierde su +600 de centroide |
|
|
|
|
|
|
| proof-of-human fail | `error` | pasa a ser el WAV de error |
|
|
|
|
|
|
| timeline reveal | `strong` | −0.02 |
|
|
|
|
|
|
| **calendar/chronos navegar (×7)** | `soft.rise` | **0.18 → 0.05** |
|
|
|
|
|
|
|
|
|
|
|
|
⚠️ La última es la única con consecuencia grande, y es deliberada: `gain 0.18`
|
|
|
|
|
|
era el valor más alto de todo el sistema —más que una alerta— para navegar un
|
|
|
|
|
|
calendario. Ninguna doctrina lo sostenía; era el residuo de
|
|
|
|
|
|
`soundTuning('commit.subtle', { gain: 0.18 })`, uno de los diez cabezas de
|
|
|
|
|
|
tuning que mentían (S-39). Si quieres que navegar suene fuerte, es una línea.
|
|
|
|
|
|
|
|
|
|
|
|
**Pregunta 3 (los 3 WAV muertos) — resuelta por omisión**: `whoosh`, `pop` y
|
|
|
|
|
|
`ding` NO entran al catálogo. Ningún pack los usaba y el catálogo es ahora el
|
|
|
|
|
|
conjunto cerrado de lo que un componente puede nombrar; meterlos sería
|
|
|
|
|
|
declararlos vivos sin que nadie los pida. Los ficheros siguen en
|
|
|
|
|
|
`static/sounds/` — retirarlos es decisión aparte.
|
|
|
|
|
|
|
|
|
|
|
|
**Las preguntas que quedaban, y cómo se cerraron:**
|
|
|
|
|
|
|
|
|
|
|
|
1. **¿Los nombres llevan familia por delante?** Hoy la ley de `SOUND_TUNINGS`
|
|
|
|
|
|
exige `{family}.{tail}` porque un tuning es un delta SOBRE una familia. Con
|
|
|
|
|
|
nombres que son BASES completas, esa razón desaparece: `soft` sirve a un
|
|
|
|
|
|
commit y a un emerge por igual. Mi lectura: **nombres sin familia** y la ley de
|
|
|
|
|
|
nombrado se retira con su motivo. Decide.
|
|
|
|
|
|
2. **¿`subtle`/`soft`/`medium`/`strong` es la escala, o prefieres otra?** Es la que
|
|
|
|
|
|
ya usa el catálogo de hoy.
|
|
|
|
|
|
3. **¿Los 3 WAV muertos (`whoosh`, `pop`, `ding`) entran al catálogo con nombre, o
|
|
|
|
|
|
se retiran?**
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 6. Qué muere y qué sobrevive
|
|
|
|
|
|
|
|
|
|
|
|
**Muere**
|
|
|
|
|
|
|
|
|
|
|
|
- `SOUND_TUNINGS`, `soundTuning()`, `op:'add'` y `{ gain: número }` en packs.
|
|
|
|
|
|
- Las 9 bolsas de literales inline de `4fccf1662` (color-picker, gradient-builder,
|
|
|
|
|
|
gradient-picker ×3, proof-of-human ×2, splitter) y las viejas de knob/timeline.
|
|
|
|
|
|
- **S-07 entero** (14 afinados en `replace`, ~150 usos) — disuelto por el reorden.
|
|
|
|
|
|
- **Q3 de la cola** (las 10 cabezas de tuning que mienten) — moot: serán nombres.
|
|
|
|
|
|
- La ley de nombrado `{family}.{tail}` y media `sounds-grammar.test.ts`.
|
|
|
|
|
|
- El invariante 3 de `pack-census.test.ts` → se reduce a «¿es un nombre vivo?».
|
|
|
|
|
|
|
|
|
|
|
|
**Sobrevive intacto**
|
|
|
|
|
|
|
|
|
|
|
|
- Morfo, soma, eidos, la proyección `data-event-*`, los holds, el háptico.
|
|
|
|
|
|
- El corazón semántico: **familia + intent deciden la percepción** — pero desde
|
|
|
|
|
|
el motor, no desde 71 ficheros.
|
|
|
|
|
|
- `SILENT` y su honra por el resolver.
|
|
|
|
|
|
- El censo de packs (invariantes 1, 2 y 4) y `d7-intent-survives.test.ts`, que
|
|
|
|
|
|
pasa de vigilar una inversión a **certificar que el reorden funciona**.
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 7. Fases — PENDIENTE DE FIRMA
|
|
|
|
|
|
|
|
|
|
|
|
| # | Fase | Verificación |
|
|
|
|
|
|
| ------ | ------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------- |
|
|
|
|
|
|
| **F1** | Catálogo unificado + `SoundName`. Sin tocar packs | `check` 75 · suites verdes |
|
|
|
|
|
|
| **F2** | **Instantánea del CATÁLOGO**: ~15 nombres × 6 intents, la firma resuelta de cada uno | La tabla existe; editar el catálogo la rompe |
|
|
|
|
|
|
| **F3** | Reorden del resolver (nombre = base, intent después) | La instantánea F2 certifica que el intent sobrevive a cada nombre |
|
|
|
|
|
|
| **F4** | Estrechar el tipo de regla a `SoundName \| SILENT` | Rojo en los 71 packs — **la enumeración es del compilador** |
|
|
|
|
|
|
| **F5** | Migración pack a pack, leyendo cada regla y su comentario | `check` a cero errores nuevos · censo verde |
|
|
|
|
|
|
| **F6** | Doctrina: D.7/S-07 retiradas con su motivo · `sema.md` §tunings reescrito · el límite del WAV (§3.2) escrito | `docs:check` 0 |
|
|
|
|
|
|
|
|
|
|
|
|
### 7.1 Por qué NO hay instantánea del estado actual (corregido 2026-08-06)
|
|
|
|
|
|
|
|
|
|
|
|
La primera redacción de este plan abría con una instantánea perceptual del
|
|
|
|
|
|
sistema de HOY, declarada innegociable, para poder hacer A/B durante la
|
|
|
|
|
|
migración. **Era un error, y el autor lo señaló**: un A/B necesita una
|
|
|
|
|
|
referencia que merezca conservarse, y la salida de hoy no lo es.
|
|
|
|
|
|
|
|
|
|
|
|
- 92 de 214 reglas son un recorte de volumen accidental; 69 aplastan el
|
|
|
|
|
|
`contour` del intent; 5 packs llevan un `centroid` copiado que deja su
|
|
|
|
|
|
`commit` en 4600 Hz. TextArea sonaba 6×/13× por encima de su firma escrita
|
|
|
|
|
|
hasta ayer, los toggles llevaban mudos desde mayo y todo lo que tiene
|
|
|
|
|
|
`roughness` se movió 1,6–2,7 dB anteayer. **Congelar eso es congelar el bug.**
|
|
|
|
|
|
- **La instantánea de §3.5 fue diseñada para un sistema que se quedaba como
|
|
|
|
|
|
estaba** («cualquier cambio en algo que el usuario percibe rompe el test»).
|
|
|
|
|
|
Esa premisa muere en cuanto lo que se sustituye es el modelo. Se importó la
|
|
|
|
|
|
conclusión sin volver a derivarla.
|
|
|
|
|
|
- **git YA es la instantánea.** Cada valor viejo es recuperable para siempre
|
|
|
|
|
|
(`git show 2f63525da`). Una tabla commiteada de números que estamos a punto de
|
|
|
|
|
|
borrar no añade nada.
|
|
|
|
|
|
- **El compilador es mejor guard que una instantánea.** F4 convierte cada regla
|
|
|
|
|
|
no conforme en error de tipos: enumeración del 100% por construcción. Una
|
|
|
|
|
|
instantánea sólo comprueba lo que alguien se acordó de meter en ella.
|
|
|
|
|
|
|
|
|
|
|
|
Comprobado además que no hay materia que preservar: de las **17 firmas que
|
|
|
|
|
|
aparecen ≤2 veces**, 5 ya son claves del catálogo (`emerge.medium`,
|
|
|
|
|
|
`emerge.exit`, `emerge.dismiss.passive`, `emerge.strong`, `commit.select.soft`),
|
|
|
|
|
|
3 son el residuo de `4fccf1662` (los `centroid` +2800/+3600/+600), 2 son samples
|
|
|
|
|
|
que **ya tienen nombre** (`ping` en chat-log, `error` en form) y las 7 restantes
|
|
|
|
|
|
son empujones de ±60…±120 de `pitch` sobre una clave del catálogo. Lo único
|
|
|
|
|
|
deliberado —**dirección** (sube/baja), **tres niveles** y **dos samples**—
|
|
|
|
|
|
sobrevive al nombrado trivialmente.
|
|
|
|
|
|
|
|
|
|
|
|
La instantánea sí se construye (F2), pero **sobre el catálogo, no sobre los
|
|
|
|
|
|
packs**: ~15 nombres × 6 intents ≈ 90 filas. Ese es el guard permanente que
|
|
|
|
|
|
§3.5 quería de verdad — fija qué suena cada NOMBRE, así que tocar el catálogo
|
|
|
|
|
|
sale en el diff. Es más pequeño, es estable, y no ancla en basura.
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 8. Riesgos
|
|
|
|
|
|
|
|
|
|
|
|
- **Pérdida de matices legítimos: MEDIDA Y DESCARTADA** (§7.1). Las 17 firmas
|
|
|
|
|
|
raras se reparten en claves del catálogo, residuo de ayer, samples ya
|
|
|
|
|
|
nombrados y empujones de pitch. Aun así F5 migra **leyendo cada regla y su
|
|
|
|
|
|
comentario**, que es donde vive el razonamiento — no en los números.
|
|
|
|
|
|
- **Rama compartida.** Otra sesión trabaja en `blocks`. F4/F5 tocan 71 ficheros:
|
|
|
|
|
|
clasificar «míos vs ajenos» por contenido del diff, siempre.
|
|
|
|
|
|
- **Sin flecos** (directiva del autor, 2026-08-06). El plan se ejecuta entero: no
|
|
|
|
|
|
se queda un tier a medio migrar ni conviven dos vocabularios. F4 es la puerta
|
|
|
|
|
|
que lo garantiza — mientras quede una regla sin nombre, el árbol no compila.
|
|
|
|
|
|
- **Se cruza con la cola abierta.** Q2 (5 reglas hápticas inertes) y Q4 (14
|
|
|
|
|
|
eventos huérfanos) son **independientes** — no los bloquea este plan. Q3 sí
|
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
|
|
|
|
queda absorbido. S-07 queda absorbido. **chronos: la exclusión de escritura se
|
|
|
|
|
|
levantó el 2026-08-10 (directiva del autor) — ya es accionable.**
|
docs(process): PLAN — el sonido se NOMBRA, un nombre y punto
Mandato del autor: «yo solo quiero en la semantica en sonido darle el
nombre de un sonido y punto, y me da igual que sea generado o sea un wav;
todo lo demas es sobreingenieria». No es una simplificacion de
conveniencia: restaura la ley que sema.md:390 ya tenia escrita —
«components reference names; URLs and parameters live in one place»— y
que nada vigilaba.
LA MEDIDA que lo justifica, en runtime sobre los 71 packs: 214 reglas
autoran 33 firmas distintas, y las 8 primeras cubren el 76%. Dos firmas
—gain 0.05 y gain 0.03— explican 70 reglas ellas solas. El 43% de la
superficie perceptual del framework es un componente diciendo «mas
bajito». Ejes tocados: gain 165, contour 69, pitch 67, roughness 23 —
contour/pitch/roughness son del INTENT, y contour es un enum, luego 69
reglas borran el contorno que el intent acaba de poner y no pueden hacer
otra cosa. El guard que naci ayer para proteger el intent no mira
contour: esta ciego en el unico eje incomponible.
EL DISEÑO: un catalogo de nombres (fusion de SOUND_LIBRARY y
SOUND_TUNINGS), el tipo de la regla estrechado a nombre|SILENT, y el
nombre aplicado ANTES de los deltas de intent. Con el nombre debajo, D.7
y S-07 dejan de PODER existir — no se arreglan, se disuelven.
§7.1 registra un error mio corregido por el autor: la primera redaccion
abria con una instantanea del estado actual, declarada innegociable. Un
A/B necesita una referencia que merezca conservarse y la salida de hoy no
lo es; ademas git YA es esa instantanea y el compilador es mejor guard.
La instantanea se movio al CATALOGO, que es donde viven las decisiones.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
|
|
|
|
- **`preload` y el fallback mudo** (S-04/S-24/S-25) siguen rotos. Si el catálogo
|
|
|
|
|
|
va a poblarse de WAVs, **S-24 debe arreglarse antes** o un 404 será invisible
|
|
|
|
|
|
para siempre.
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 9. Lo que este plan NO hace
|
|
|
|
|
|
|
|
|
|
|
|
No toca el eje del verbo. La medida sugiere que falta un piso de **verbo** en
|
|
|
|
|
|
`SEMA_MAP` (hoy sólo hay `families` e `intents`), y que por eso «un cierre baja»
|
|
|
|
|
|
se re-escribe en 16 packs. Con nombres, esas 16 pasan a decir `soft.fall` — el
|
|
|
|
|
|
síntoma se cura. **La causa —que la dirección de un cierre es un hecho del verbo,
|
|
|
|
|
|
no del componente— queda anotada aquí y sin abrir.** Es el siguiente eje, y es
|
|
|
|
|
|
otra conversación.
|