|
|
|
|
|
# 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`.
|