F0 de `docs/process/PLAN-background.md`: la infraestructura que las fases
siguientes consumen, sin una sola regla de pintura todavía.
- **morfo `background`** (`scope: ['eidos']`, 0 eventos): tres partes — la pila,
la capa (`aria-hidden`) y la pausa. Ningún knob visual: no hay soma que cruzar,
así que cada eje de pintura es attr de wrapper (la llamada que `image.ts` ya
registró en su bloque comentado). La pausa es el BOTÓN compuesto, no un
contenedor de colocación: el patrón de `fab.ts` — el mismo `<button>` lleva
los dos markers — porque `[data-archetype='action']` paga cursor, anillo de
foco y 44px de suelo táctil, y eso no se le cuelga a un div. Textos
`pause`/`play` con las claves idénticas al catálogo (la trampa de chronos).
- **foundation**: `:where(:has(> [data-background]))` adopta a CUALQUIER padre
como anfitrión — posicionado y aislado — sin tocarle la receta. Un componente
no puede estilar a su padre, y la alternativa (que el consumidor recuerde
`position: relative`) es el footgun de las referencias: las capas desaparecen
y nada dice por qué. Especificidad 0 a propósito: el `position` propio de un
`Dialog.Content` sigue ganando. El bloque D12 gana el gemelo `:has` para que
el `on` de un fondo re-entinte al padre que lo hospeda.
- **`$adom`** gana los dos puertos que un fondo necesita y nadie tenía:
`ScrollProgress` (el 0→1 que `view()` recorre, hasta ahora privado dentro de
ScrollFrames) y `prefersReducedData` (la query estándar O el `saveData` de
Chromium — el gemelo de PESO del reduced-motion, honrado no descargando, nunca
escondiendo contenido).
Dos defectos propios, cazados por revisión adversaria y corregidos aquí: la
primera medición de `ScrollProgress` era síncrona dentro del `$effect` (la
regla 5 de timing — ahora se difiere al frame que el helper ya tenía), y el
stub de `matchMedia` ignoraba la query, así que la implementación podía pedir
`prefers-reduced-motion` con la suite entera en verde. Medido por mutación:
ahora mata 4 de 6.
Los tokens `--background-*` NO entran todavía: declararlos sin su receta rompe
tres guards de `recipe-css-contract` (medido con sonda, revertida). Viajan con
el CSS que los consume, en F1.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
active-uix is UIX's composition root: it hands morfo / soma / sema /
eidos the minimal services they need, without components knowing ActiveApp.
The reference moved to the docs corpus:docs/architecture/active-uix.md
— boot modes (createActiveUix / attachActiveUix), the minimum contracts per
module, the ownership & degradation rules, and the shell wiring example.