# active_architecture.md — session snapshot (May 2026) Pulled out of `src/uix/active_architecture.md` so that doc reads as a timeless architecture reference. This is the dated session framing (the "Handoff 2026-05-14" §0 minus its contract table, which stayed as reference) plus the "Estado actual (2026-05-17)" §10 status snapshot. Kept for traceability; the rules it fixed live in `active-uix/README` (ownership/degradation) and `contracts.ts` (the table). --- ## Handoff 2026-05-14 (framing) Estado acordado al cierre de la sesión: - **No tocar componentes Eidos** hasta cerrar de nuevo la arquitectura. - **Contratos mínimos fijados antes de seguir** (tabla autoritativa en `src/uix/contracts.ts`, validada con `src/uix/contracts.test.ts`). - **Regla de composition roots cerrada**: solo `ActiveApp` y `ActiveUix` standalone crean servicios compartidos. Preguntas cerradas tras la revisión: `ActiveUix` expone `uix.prefs` bruto; `Dom` standalone puede usar `disabledDom`, attach exige `app.dom`; `Sema` fuera de UIX necesita `dom`/`projector` o `visual:false`; `Eidos` = `ActiveEidos`; `Soma` no necesita `ActiveSoma`; `langs`↔`prefs.language` / `format`↔`prefs.locale`; `prefs` es el nombre canónico; `attachActiveUix` exige `langs`+`dom`; la ruta docs sincroniza prefs y no muta `html[dir]`/`uix.langs` directamente. Hallazgos P1 resueltos: `createActiveUix({dom:false})` crea `disabledDom` y se lo pasa a `EngineSemantic`; `ActiveUix.dom` siempre existe; `ActiveUix` no proyecta prefs al DOM (lo hace `ActivePrefsDomProjection` / `ActiveEidos`); ownership DOM P1 cerrado (live regions, observers, foco/scroll imperativo vía `ActiveDom`); `SoundChannel` no registra listeners globales en el constructor; Sema ya no propaga `motion`/`color`/`presence`. Hallazgos P2/P3: standalone usa `createSvelteEngineBus`; attach no re-suscribe `prefs.language → langs`. Contexto `frontend` cerrado: `arts/frontend` retirado; no reaparece como fuente de `locale`; `prefs.locale`→`format`, `prefs.language`→`langs`, `prefs.direction`→ `html[dir]` vía `ActivePrefsDomProjection`. (These rules are now stated, timeless, in `src/uix/active-uix/README.md` §"Reglas de ownership y degradación".) --- ## Estado actual (2026-05-17) **Implementado y verificado** (snapshot at that date): `morfo` (115 components, sium validator, ~265 archetype-classified part declarations, doctrinal event shape); `soma/morfo/runtime` (`part`/`partProps`/`keydown`/`trigger`, provider inheritance dropped, domain engines moved to `src/libs`); `sema` (`EngineSemantic` + `chans/`, 8 families × 6 intents, SoundChannel with prepare-time priming, HapticChannel opt-in); `eidos` (`ActiveEidos`, color hierarchy + intents over 12-step scales, discrete `Size`, recipe aliases, `EidosConfigDocument` persistence); `adom`; `active-uix` + `active-app` (two boot modes, Props bridge V2). **Pendiente (at that date — several since DONE):** afilar `EidosConfig.recipes`; reparar demos/rutas en `Provider`/flat-snippets; `persistence` field *(since done)*; holds-by-intent; topbar-mute → `SoundChannel.masterGain`; polymorphic events *(since done)*; `a11ySemantic` per event *(since done)*. **Layers ya muertos:** `src/lib/`, `src/uix/terra/`, `src/uix/air/`, `src/routes/test`.