8.6 KiB
CONTINUE — el hilo del audio: REDISEÑO en curso ($sound = orquestador)
Kickoff para la sesión siguiente: "Lee
docs/process/CONTINUE-sound-engine.mdy sigue por donde toque." Fecha: 2026-07-31 (tercera sesión) · Ramaalpha-0.1-sec-dom.
Lo que pasó el 2026-07-31 — giro de raíz
Se presentó el gate del reproductor (D-AP.1…13) y el usuario lo rechazó de
raíz: el sistema de sonido es un frankenstein — nació de los diseños de otros
módulos (sema, media-player) y se parchea en función de lo que había, en vez de
partir de su función: orquestador de TODOS los aspectos del sonido, como
motion / timers / scene. Los consumidores se adaptan al servicio, no al
revés. El rediseño se hizo clean-room y su gate quedó FIRMADO el mismo día
(aprobación del plan + D-SR.4/D-SR.7 explícitas).
Estado
| Iniciativa | Estado |
|---|---|
PLAN-sound-engine.md |
✅ CERRADA (histórica). Su §16.1 («la voz es del art») queda REVOCADA por el rediseño |
PLAN-sound-redesign.md |
✅ COMPLETA (las dos entregas, 2026-07-31) — sin commitear. E1: F0–F2 + escucha A/B del usuario («suena igual»). E2: F3 (media citizenship: sound.media(el) provee el transporte con la forma del puerto MediaProvider + foco + duckUiWhileContent + visibilidad content-aware + attach() opt-in) · F4 (MediaSession de la fuente activa) · F5 (factoría con EngineSoundPolicyOptions; contracts.ts y estudio sin tocar, declarado). AUDITADA (§9 del plan): AU-1…AU-9 resueltas — duck ahora PERSISTENTE (estado derivado, holder = ducker más reciente; test nacido en rojo) · guards post-dispose · re-registro idempotente por elemento · drift guard soma↔art · bundle medido (16,2 KB min / 5,6 KB gz) · 3 guards vistos fallar por mutación. 28 suites / 305 tests verdes · check 73 = baseline, 0 propios · docs:check 0 · prettier limpio en lo propio. Pendientes que exigen una página consumidora (llegan con el re-plan del player): medición Chrome del escenario mixto · prueba manual de teclas de medios |
PLAN-audio-player.md |
🗄️ ARCHIVO (hechos + análisis que el v2 referencia) |
PLAN-audio-player-v2.md |
✅ GATE FIRMADO 2026-07-31 («ok, continua»; H-9 = CABLEAR · D-AP2.7 = solo duck global). F1 ✅ · F2 ✅ COMPLETAS (2026-07-31; morfo 8/8 · player 18/18 · check 74=baseline 0 propios). Detalle F2 en la fila del plan; el commit de rate cabalga ratechange (patrón G-5 de nacimiento). ⚠️ translations:check BLOQUEADO POR AJENO (langs/components/palabras.ts con url: rompe el stripper del script; palabras = excluido, no se toca) — correr cuando se arregle. F3 ✅ COMPLETA (2026-07-31; player 10/10 · morfo 8/8 · check 74=baseline viva, 0 propios) — detalle en la fila F3 del plan: transporte por el servicio como default (pin con motor REAL) · metadata público (opts+types+wrapper) · nativeMediaProvider retirado (media-provider.ts = contrato puro; drift-guard borrado) · G-5 aplicado · formatDuration · 6 sub-providers+wrappers+exports · README (tablas al día). F4 ✅ (docblock del pack = doctrina D-AP2.7: el silencio lo posee el servicio vía duckUiWhileContent, receta escrita; la resta-de-gain v1 queda diseñada SIN cablear a propósito; stamp en navegador → F7). F5 EN CURSO — buffer-swap ✅ COMPLETO (29/29 · check 74=baseline 0 propios · eidos-lint limpio): el TimeSlider soma pasa secondaryValue={bufferedTime} y monta Slider.SecondaryRange; el div .mp-buffered + --media-buffered + --_mp-buffered + --_mp-rail RETIRADOS (css/provider/test/morfo-docblocks/READMEs al día); el look se conserva (42% → --slider-secondary-bg en scope). F5 ✅ COMPLETA (detalle en la fila F5 del plan: 6 wrappers + AudioLayout + <AudioPlayer> con metadata derivada + 4 variantes + tokens; 37/37 contratos · lint 0 inválidos · check 78 = baseline+4 ajenos NUEVOS de arts/connection, 0 propios). D-AP2.7 v2 FIRMADA Y EJECUTADA (2026-07-31, SIN COMMITEAR): el transporte del player es SILENCIOSO por defecto — pack D.5 (resta de gain; contact.silent nuevo en sounds.ts) sobre commits de botones + descendientes (contact de Buttons, commit-set de Sliders); commit-fail/commit-complete audibles; handle-drag conserva su resolver por mecanismo (declarado); voz reactivable en capa 5b. F7-construible ✅ COMMITEADO en c4d64ba98 (live badge localizado vía soma · demo con <AudioPlayer> + selector de variante + snippet en paridad · README eidos §modo-audio · component:audit --only media-player PASS · check 74 = baseline, 0 propios). QUEDAN — y todos exigen ojos o la máquina del usuario: F6 verificación VISUAL de las 4 variantes × light/dark × RTL (abrir /uix/components/media-player, chip audio, recorrer variantes; captura y MIRADA) · medición Chrome del escenario mixto (earcon + media, 1 contexto — patrón javascript_tool del §15 del plan del motor) · teclas de medios / pantalla de bloqueo (metadata en el SO) · stamp sema en navegador (data-event="commit-toggle-play" aterrizando en el play-button con la regla del pack casando). Nota demo: duckUiWhileContent se activa componiendo el app con defineEngineSound({duckUiWhileContent: 0.2}) — la demo actual no recompone el uix global; se muestra como receta en el README (decisión: no tocar la composición raíz de las demos desde la página del player). Después: F4 sema · F5 eidos (AudioLayout+AudioPlayer+variantes+buffer en Slider.SecondaryRange) · F6 formas · F7 demo+medición Chrome+teclas de medios. ⚠️ baseline de check fluctúa por la rama viva (~74, 0 propios; filtrar SIEMPRE con \\\\ e incluir consumidores). Lección F1: claves nuevas de ActiveProps van OPCIONALES o rompen todos los call-sites |
Qué es el rediseño (resumen; la verdad está en el plan)
$sound gobierna 7 dominios: sustrato (contexto único — se conserva, verificado)
· mezcla (master → buses ui/content; prefs.sound ↔ ui SOLO) ·
voces (calibración = dato del consumidor; sema registra la suya; default =
valores actuales, cero cambio audible) · ciudadanía de media (el servicio
PROVEE el transporte con la forma del puerto MediaProvider) · política/foco
(mixed/exclusive/duck; duckUiWhileContent sustituye el parche D-AP.7) ·
percepción (decode; analyser/picos v2) · MediaSession (del servicio).
Pendiente que solo puede hacer el usuario
Escucha A/B de F2✅ hecha: «suena igual» (2026-07-31).- Prueba manual de teclas de medios / pantalla de bloqueo — cuando exista una
página que consuma
sound.media()(el re-plan del player la traerá).
Por dónde sigue
Re-plan del reproductor sobre el servicio (iniciativa aparte, con su gate):
el player consume uix.sound.media(el, { metadata }) como su MediaProvider
(su adaptador nativo se retira al migrar — sin shims), hereda foco/MediaSession
del servicio, y sus hechos medidos (H-1 · H-9 · H-10/G-5 · gaps G-1/G-2/G-3 del
Slider) siguen siendo el terreno. El pin de asignabilidad handle↔puerto ya
existe (media-provider-drift.test.ts, lado soma). Al migrarlo quedan: la
medición Chrome del escenario mixto (earcon + media, 1 contexto) y la prueba de
teclas de medios.
Trampas de este repo (verificadas a base de perder tiempo)
- NO arrancar un dev server si el del usuario está vivo (
vite dev --forcereescribedeps→ dos runtimes →lifecycle_outside_component). Acoplarse al puerto 5173. Recuperación: parar node → borrarnode_modules/.vite/deps→npm run dev→ Ctrl+Shift+R. - El panel del navegador no pinta (viewport 0×0);
javascript_toolsí — con eso se midieron los contextos. - Un guard que no has visto fallar no vale — quitar el cableado y ver el rojo.
- Una medición no es un diagnóstico — README → CANON §8 → book-deviations → código, antes de acusar a una pieza.
- Filtrar
npm run checkcon cuidado: rutas con\\doble; un patrón con/no casa y da falsos «0 propios». - El árbol está compartido con otras sesiones —
git reset -q+ add solo lo propio, en un bloque atómico.contracts.test.tsviene modificado de otra sesión: no tocarlo en E1 (su filasoundno pinea métodos y sigue verdadera).
Ajenos y preexistentes detectados (NO tocados)
contracts.test.ts3 rojos ajenos:aura,menubar,radio-group.docs:check1 error ajeno:eidos/components/callout/README.md:23(«8 roles», son 9).temas/sema/_lib/audition.ts: 2 errores de tipos preexistentes.