La proyeccion cross-modal (dir · lang · data-motion/sound/haptic sobre <html>)
era cableado manual de cada app: solo 4 de ~13 boots de la demo la tenian, y el
estampado per-componente del valor de prefs actuaba de SUSTITUTO de la
proyeccion que faltaba. Para que el flip de P3 pueda soltar prefs del atributo,
el ambiente tiene que llegar al DOM una vez y siempre:
- createActiveUix la crea por defecto (opt-out `projectPrefs: false` cuando la
app posee <html>: i18n por routing, proyeccion propia). En attach es opt-IN —
el inverso — porque el host puede gobernar el documento.
- Se dispone la PRIMERA en dispose(), antes de que prefs/dom mueran debajo.
- Los 3 cableados manuales commiteables se borran EN ESTE MISMO commit (uix,
blocks, BootUix); el de web/routes/alpha se edita en arbol pero no se
commitea nunca (regla de la rama). Borrarlos junto a la automatica evita el
agujero medido del doble montaje: dispose() BORRA los attrs gestionados sin
restaurar.
Y LA SEMILLA, que es lo que hace la automatica segura: sin ella, el boot
REESCRIBIRIA un <html dir="rtl"> puesto a mano (el escenario 013ceac57) con el
valor derivado del idioma. `readPrefsEnvironmentFromDom` lee <html dir> UNA vez
al boot (SSR-safe: {} sin document; auto/vacio = "la pagina no declaro") y la
dimension direction la honra con la precedencia:
intent del usuario > semilla del entorno > derivacion(idioma) > default
Una declaracion a nivel de pagina es una AFIRMACION explicita; el enlace por
idioma es una heuristica — la afirmacion gana. Lo que pase la app en
options.prefs.environment pisa la semilla.
Un guard viejo fijaba el comportamiento anterior ("does not auto-project…") —
es exactamente lo que la decision D2 (firmada 2026-08-05) revierte. Pasa a
fijar el nuevo contrato: se proyectan SOLO los attrs cross-modales; data-theme/
mode/density siguen prohibidos (son de eidos).
Tests: semilla y precedencia 6/6 (dom-environment.test.ts) · proyeccion
automatica, opt-out, adopcion del dir a mano y limpieza en dispose (4 nuevos en
active-uix.svelte.test.ts) · suites active-uix + prefs 79/79.
Verificado en Chrome por el camino real: el toggle del topbar mueve <html dir>
via prefs->proyeccion AUTOMATICA (ltr -> rtl -> auto) con el cableado manual ya
borrado, en /uix y en /blocks; <html lang> viaja con el.
check 77 = linea base · rtl:check 1 (palabras) · docs:check 0/566.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>