# Continue Fecha de corte: 2026-05-16. Rama: `active-uix`. Arranque rapido para mañana: - Rama `active-uix` queda por delante de `gita/active-uix` con los commits de limpieza de Soma/UIX ya hechos y validados. - Ultimos commits relevantes: - `Keep Soma internals off public alias` - `Narrow Soma root barrel` - `Remove Soma common langs facade` - `Guard Sema runtime boundaries` - `Inject ActiveDom into Soma scroll lock` - `Record Soma scroll lock validation` - Validacion final del bloque: - `npm run check` -> 0 errores, 0 warnings. - `npm run test` -> 233 archivos, 2248 tests OK. - Estado arquitectonico cerrado hoy: - Dentro de Soma no se importa desde `$soma/*`; el alias publico queda para consumidores externos y tests de superficie. - `$soma` raiz solo expone el scope `Soma` y su error de contexto; helpers publicos se consumen desde subpaths explicitos. - `soma/core/langs.ts` eliminado; `common.*` pertenece a `src/uix/langs.ts`. - Sema queda protegido contra listeners globales nativos y `console.*`. - `ScrollLock` de Soma inyecta `ActiveDom` hacia `BodyScrollLock`. - Lo primero para continuar: 1. Cerrado el primer barrido de wrappers publicos `.svelte` frente a providers. Si se retoma esta linea, continuar con validacion navegador de rutas `/uix/components/*`, no repetir el barrido estatico salvo que cambien wrappers. 2. Decidir si el directorio vacio `src/uix/soma/components/avatar/` se borra o se deja como placeholder documentado. Hoy Avatar es `eidos` scope. Decidido: no hay accion versionable; solo existe un directorio local vacio (`components/`) y Git no lo registra. No crear placeholder Soma. 3. Si se sigue con Sium: abordar P0 de integridad (`isPlainObjectRecord`, `email`, `regex` con flags mutables, doc de `ctx.rootValue`). 4. Mantener fuera de commits los logs sueltos (`.codex-vite-*`, `debug.log`) salvo que el usuario pida conservarlos. Actualizacion 2026-05-16: - Barrido de wrappers publicos Soma frente a providers cerrado: - `DateField.Provider` y `TimeField.Provider` vuelven a materializar su root publico por defecto (`
`) y aceptan `ref` / `restProps`, coherente con su morfo (`kind: public`, `defaultElement: 'div'`). - `DateField` ya respeta la prop `dir`; la direccion efectiva se pasa al provider y a la navegacion de segmentos en vez de ignorarse y leer solo `soma.prefs`. - `DatePicker`, `DateRangePicker`, `TimePicker` y `TimeRangePicker` mantienen root virtual: sus props root ya no anuncian `PrimitiveDivAttrs` ni `child` con `props: {}`. - `ColorPicker.Area` ya aplica de verdad los overrides locales `xChannel` / `yChannel`; antes los tipos los exponian pero el wrapper los descartaba. - Guardias nuevas en `src/uix/contracts.test.ts` para roots publicos Date/Time Field y roots virtuales picker. - Validado: `npx vitest run src/uix/contracts.test.ts` + tests focales de date/time pickers/fields -> 52 tests OK; `color-picker-provider` -> 5 tests OK; `npm run check` -> 0 errores / 0 warnings; `npm run test` -> 233 archivos, 2251 tests OK. - Soma queda en estado funcionalmente cubierto a nivel provider/runtime: `npm run check` -> 0 errores / 0 warnings, `npm run test` -> 233 archivos, 2242 tests OK, y la guardia de `*-provider.svelte.ts` sin test directo devuelve `NO_MISSING_PROVIDER_TESTS`. - Lo que falta para cerrar Soma de verdad no es mas cobertura de providers, sino las capas exteriores: 1. Auditar wrappers Svelte publicos (`*.svelte`) frente a sus providers: props bindables, snippets, forwarding de attrs, eventos y defaults. 2. Auditar barrels publicos (`index.ts`, `exports.ts`) para que no expongan clases runtime internas, reexports muertos ni fachadas sobre `$libs`. 3. Validar rutas `/uix/components/*` con navegador: sin `pageerror`, sin errores de consola, sin warnings de traduccion inesperados y con flujos basicos interactivos. 4. Sincronizar inventario/documentacion Soma con el estado real: componente activo, visual-native, wrapper publico, provider runtime y tests. 5. Mantener la doctrina DOM actual: escrituras gestionadas, listeners globales, focus/scroll imperativos y portal/query global pasan por `ActiveDom`; lecturas locales (`getBoundingClientRect`, `contains`, `closest`, `scrollTop`, etc.) siguen siendo responsabilidad del componente. 6. Dejar optimizaciones de rendimiento para despues de cerrar API publica y wrappers: virtualizacion compartida, datetime compartido y micro-churn del runtime solo si aparecen datos reales o tests que lo justifiquen. - Auditoria `src/arts/sium/kimi-audit.md` leida y evaluada. Mi veredicto: buena auditoria, bastante alineada con el rol real de Sium como codec + validador + introspeccion para Active, pero con dos matices: - La prioridad critica correcta es integridad de datos, no ampliar Sium hasta parecerse a Zod. - Algunos fixes descritos como "1 linea" no lo son si queremos mantener contratos `decodeSync`, `~sium` y `Form.AutoFields` coherentes. - Sium P0 recomendado, sin cambios breaking: 1. Corregir `isPlainObjectRecord(...)` para aceptar solo objetos planos. No usar `value.constructor === Object` como unica regla: preferir `Object.getPrototypeOf(value) === Object.prototype || null` para no romper objetos null-prototype y reducir falsos positivos. 2. Mejorar `email()` con una regex conservadora de producto, no RFC completa: dominio sin puntos dobles y TLD practico de 2+ caracteres. 3. Cachear `regex(pattern)` sin mutar `lastIndex`. Si el pattern trae `g` o `y`, clonar sin flags mutables o resetear antes de probar. 4. Alinear README con `ctx.rootValue`: hoy solo es seguro en refines de objeto ya decodificado. Las validaciones cross-field deben vivir en el object refine, no en field refines. 5. Revisar `optional/nullable/defaulted` con schema interno async. El problema es real, pero la solucion no es mover un `if`: `createSchema.decodeSync` lanza por `spec.async === true` antes de entrar en `decodeImpl`. Hace falta una decision de runtime (`syncShortCircuit`, decodeSync custom por wrapper, o semantica documentada de "schema async siempre async"). - Sium P1 coordinado con consumidores: 1. No cambiar `lazy()` a `kind: 'lazy'` hasta que `src/uix/soma/components/form/components/form-auto-fields.svelte` sepa renderizar/posponer ese kind. Hoy `SchemaKind` no incluye `lazy`. 2. Anadir refinements pequenos y utiles: `finite`, `safe`, `positive`, `nonempty`, `uuid` solo si hay uso inmediato en Active/Form. 3. Anadir utilidades de objeto (`partial`, `pick`, `omit`, `extend`) y estructuras (`tuple`, `record`) cuando AutoFields y `~sium.shape` tengan contrato de introspeccion claro. 4. Considerar `preprocess` y `coerce` como features de formularios, no como ampliacion generalista. - Sium P2 interno: 1. Cerrado: `types/_helpers.ts` incorpora `createDomainValueSchema(...)` y `createDomainRangeSchema(...)`. `colorValue`, `dateValue`, `timeValue`, `dateRange` y `timeRange` comparten ahora el patron identity codec + guard + widget + range order sin mover esa logica a `core`. 2. Unificar paths sync/async de combinadores solo con tests amplios; es zona sensible por `SiumAsyncSchemaError`. 3. Documentar limites de `lazy()` con inputs ciclicos o anadir proteccion `WeakSet` si empieza a recibir datos no confiables. - Validacion Sium domain factory: - `npx vitest run src/arts/sium/test/color.test.ts src/arts/sium/test/date.test.ts src/arts/sium/test/time.test.ts src/arts/sium/test/standard-schema.test.ts` -> 4 archivos, 122 tests OK. - `npm run check` -> 0 errores, 0 warnings. - Criterio de cierre para Sium antes de tocar consumidores UI: - Tests focales de `src/arts/sium` verdes. - `npm run check` sin warnings. - README y tipos `SchemaKind`/`SiumShape` sincronizados. - `Form.AutoFields` actualizado antes de cualquier kind nuevo visible en `~sium`. - Ninguna feature nueva entra si solo duplica Zod/Valibot sin consumidor propio de Active. - Soma public surface: - Cerrado: el wrapper publico de Select pasa de `components/select-provider.svelte` a `components/select.svelte`. El runtime interno sigue en `select-provider.svelte.ts`. - Cerrado: `Command`, `Form` y `Table` ya no reexportan motores de `$libs`. Los consumidores deben importar `computeFuzzyScore` desde `$libs/strings`, `createForm` desde `$libs/forms` y `createTable`/tipos desde `$libs/datagrid`. - Guardia nueva en `src/uix/contracts.test.ts`: ningun barrel publico de Soma puede exportar desde `*provider.svelte` ni desde `$libs/*`. - Guardia nueva adicional: cada `Provider` publico debe salir de `components/{component}.svelte`; no se permiten nombres especiales para el wrapper raiz. - Documentacion corregida: `AlertDialog` ya importa `createForm` desde `$libs/forms`, no desde `$soma/components/form`. - Documentacion corregida: `ColorField` ya no marca `ColorPicker` como planned, y los links a docs planned inexistentes de `ColorRange*` quedan como texto sin enlace. - Guardia nueva: los links relativos entre README de componentes Soma deben apuntar a documentos existentes. - Cerrado: los imports internos de produccion de Soma ya no usan el alias publico `$soma`; Drawer, Toast, Toggle, Switch, Dismissal, Floating y `types` pasan a imports relativos. - Guardia nueva: `src/uix/contracts.test.ts` rechaza imports internos de Soma hacia su propio alias publico, dejando `$soma/*` para consumidores externos y tests de superficie. - Cerrado: el barrel raiz `$soma` queda limitado al scope `Soma` y su error de contexto. Helpers como `provider`, `keyboard`, `runtime.svelte`, `types`, `css`, `id`, `props`, `components`, `layers` y `datetime` se consumen desde sus subpaths explicitos. - Cerrado: eliminado `soma/core/langs.ts`, que era una fachada muerta sobre `src/uix/langs.ts`. El vocabulario `common.*` pertenece a UIX y `ActiveUix` lo registra; Soma solo lo referencia mediante `v.commonRef`. - Guardia nueva: Sema no puede registrar listeners globales nativos (`document/window.addEventListener`) ni usar `console.*` en produccion; los canales deben pasar por servicios inyectados y logger. - Cerrado: `ScrollLock` de Soma recibe ahora `ActiveDom` del scope y lo pasa a `BodyScrollLock`; el helper de ADom resuelve document/window/listeners desde el runtime inyectado, con fallback nativo solo para uso standalone y tests. - Validacion global tras inyectar `ActiveDom` en `ScrollLock`: - `npm run test` -> 233 archivos, 2248 tests OK. - `npm run check` -> 0 errores, 0 warnings. - Documentacion corregida: README, arquitectura y comentario de `core/soma.svelte.ts` ya no recomiendan que el propio Soma importe desde `$soma/*`. - Smoke Playwright de rutas `/uix` actuales cerrado: `/uix`, Accordion, Checkbox, Collapsible, Dialog, Drawer, Popover, RadioGroup, Switch, Tabs, Toast, Toggle y Tooltip cargan con HTTP 200, sin `pageerror`, sin errores/warnings de consola y sin `requestfailed`. - Validacion global posterior: - `npm run test` -> 233 archivos, 2245 tests OK. - `npm run check` -> 0 errores, 0 warnings. - Validacion global tras limpiar alias/barrels/fachadas: - `npm run test` -> 233 archivos, 2248 tests OK. - `npm run check` -> 0 errores, 0 warnings. Actualizacion 2026-05-15: - Auditoria Soma/Eidos ampliada aplicada por fases y empujada: - Cobertura nueva para Select, Popover, Toast y RangeCalendar. - Las clases runtime internas `DialogProvider`, `DrawerProvider` y `PopoverProvider` dejan de exportarse desde los barrels publicos; los wrappers siguen usandolas por import directo. - `computeCommandScore` ya no se reexporta desde Command; el algoritmo vive como `computeFuzzyScore` en `src/libs/strings`. - `table-core` se mueve a `src/libs/datagrid` con su test. - `form-core` se mueve a `src/libs/forms`, usa el Standard Schema comun de `src/libs/standard-schema.ts`, elimina la copia local de Soma y anade tests de dirty/touched/reset, issues y submit async. - Inventario de Soma actualizado: ya no lista como planned componentes que existen en el arbol activo. - `SelectType`/`ScrollAlignment` y el resto de tipos publicos de componentes salen de `types.ts`; los barrels ya no exportan contratos desde `*-provider.svelte.ts`. - `Dismissal` y `SafePolygon` usan `uix.timers` cuando Soma lo tiene disponible, con fallback nativo solo para uso standalone fuera de UIX. - Cobertura nueva para Combobox: selección single/multiple, `inputValue` y filtrado de items disabled. - Cobertura nueva para DatePicker, DateRangePicker y TimePicker: registro runtime, cierre controlado tras selección y escritura de sliders de hora al valor compartido. - Cobertura nueva para TimeRangePicker: valores por endpoint, sliders y cierre al completar ambos extremos. - Cobertura nueva para TimeRangeField: validación de rango y foco de label via `ActiveDom`. - Cobertura nueva para TimeField: validación, sync de segmentos 12h y commit solo cuando los segmentos de tiempo renderizados estan completos. - Correccion TimeField: el announcer se inicializa con `$effect` en vez de `onMount()` dentro de la clase, y `datetime` separa `areAllTimeSegmentsFilledDOM(...)` del helper de fecha. - Cobertura nueva para DateRangeField: validación de rango y foco de label via `ActiveDom`. - Cobertura ampliada para DateFieldProvider: validación, sync de segmentos date/time y commit solo cuando los segmentos renderizados estan completos. - Correccion DateField: el announcer se inicializa con `$effect` en vez de `onMount()` dentro de la clase. - Cobertura nueva para VirtualList: cálculo de ventana, `scrollToIndex` y compensación anti-jump. - Correccion VirtualList: la compensación de mediciones dinámicas sobre viewports internos pasa por `ActiveDom.scrollTo(...)` y usa `scrollOffset + delta` como fuente reactiva. - Cobertura nueva para VirtualGrid: cálculo de ventana 2D y `scrollToCell` via `ActiveDom`. - Cobertura nueva para NumberField: parsing localizable, teclado spinbutton, triggers, props ARIA y scrubber. - Correccion NumberField: el root expone `dir` efectivo (`prop -> prefs`) en lugar del prop crudo. - Cobertura nueva para FileUpload: aceptación/rechazo de ficheros, dropzone, input oculto, items, progress, remove y clear. - Cobertura nueva para ColorField: commit por segmentos, edición hex con teclado, selector de formato, input oculto y foco de label via `ActiveDom`. - Cobertura nueva para ColorPicker: helpers de canales, trigger/value/hidden, area 2D, slider de canal y swatches con commit/cierre. - Cobertura nueva para NavigationMenu: timers UIX de apertura/cierre, enlace item/trigger/content, foco por teclado, list y link props. - Cobertura nueva para TreeGrid: expansión, selección/rango, filas visibles bajo ancestros colapsados, navegación, row/cell/header y expand trigger. - Cobertura nueva para DropdownMenu: trigger open/close, scoping de items, item select, checkbox/radio groups, submenu delayed/open y group/separator. - Cobertura nueva para ContextMenu: apertura por `contextmenu` con anchor virtual, scoping de items, item select, checkbox/radio, submenu delayed/open y group/separator. - Cobertura nueva para Menubar: coordinación de menús hermanos, hover-follow, navegación horizontal entre triggers y cambio de menú desde content. - Cobertura nueva para Listbox: props ARIA root, selección, navegación, typeahead, indicador de item y grupos. - Cobertura nueva para TreeView: expansión/selección, navegación root, typeahead, props de ramas/hojas y partes auxiliares. - Cobertura nueva para Accordion: modo single/multiple, eventos open/close por item, navegación de triggers y props de header/content. - Cobertura nueva para Checkbox: commits check/uncheck, estado indeterminate, hidden input y sincronización con CheckboxGroup. - Cobertura nueva para RadioGroup: roving tabindex, selección síncrona, navegación con auto-select, hidden input y guardas readonly/disabled. - Cobertura nueva para Switch: commit-toggle runtime, keyboard, hidden input, integración con FieldProvider y thumb. - Cobertura nueva para Toggle: commit-toggle runtime, attrs DOM via `ActiveDom`, integración con FieldProvider y guardas readonly/disabled. - Cobertura nueva para ToggleGroup: modos single/multiple, roving tabindex y navegación de items saltando disabled. - Cobertura nueva para Tabs: registro de trigger/content, activacion automatic/manual, navegacion roving, fallback tab stop y partes list/content/indicator. - Cobertura nueva para Slider: contrato provider/range/thumb/tick, snapping/clamping, drag pointer confirmado y teclado de thumb. - Cobertura nueva para Progress y Meter: `data-value/data-min/data-max` emitidos por morfo/runtime, estados derivados e indicador sincronizado. - Cobertura nueva para Collapsible: refs cruzadas trigger/content, eventos `expand/collapse` y guardas disabled. - Cobertura nueva para Clipboard: copia via `uix.clipboard`, reset con `uix.timers`, labels traducidos/override y errores `onError`. - Cobertura nueva para Tooltip: delay/close con `uix.timers`, skip-delay de grupo, focus/blur, disabled y partes trigger/content/arrow. - Cobertura nueva para Field: wiring de partes/ARIA, input guardado por disabled/readonly e integración con parent Form. - Cobertura nueva para SearchField: props root/input/clear, input/submit/ clear, foco y OR-merge con Field. - Cobertura nueva para Pagination: rangos/ellipsis, clamp reactivo, slice, triggers prev/next, item selected y disabled global. - Cobertura nueva para Breadcrumb: label/labelledby, separator, link current con mirror al item y ellipsis decorativo/interactivo. - Cobertura nueva para Toolbar: roving focus, focusin, group single/multiple y separator. - Cobertura nueva para Stepper: conteo/estado de steps, attrs runtime, selección lineal/no lineal, teclado y prev/next/completed. - Cobertura nueva para ScrollArea: medición de overflow, viewport, visibilidad/timers de scrollbar, track click, thumb y corner. - Cobertura nueva para Splitter: registro de paneles, clamp, collapse/expand y resize por pointer/teclado con attrs ARIA/data. - Cobertura nueva para PinInput: props del input oculto, merge con Field, patrón/paste, completion y estado de celdas/caret. - Cobertura nueva para RatingGroup: slider attrs, merge con Field, half hover/click, clearable y teclado LTR/RTL. - Cobertura nueva para TagGroup: labels/root grid, roving por DOM renderizado, selección/removal, link y remove button. - Cobertura nueva para Announce: alternancia polite/assertive, timers UIX, regiones ARIA declarativas y uso standalone. - Cobertura nueva para Feed: attrs APG feed/article/title, navegación PageUp/PageDown, threads anidados y sentinel IntersectionObserver. - Cobertura nueva para TagsInput: add/paste/blur, navegación de tags, delete/clear triggers y props de input/control. - Cobertura nueva para Editable: activación preview/trigger, foco via `ActiveDom`, commit/cancel por teclado/blur y guards disabled/readonly. - Cobertura nueva para AlertDialog: contratos action/cancel, labels traducidos/override y cierre delegado al Dialog base. - Cobertura nueva para Carousel: detección de slides, navegación por trigger/teclado, props de partes e intervalos autoplay via `uix.timers`. - Cobertura nueva para GridList: merge con Field, selección/rango básico, navegación/typeahead, celdas focusables y checkbox de fila. - Cobertura nueva para LinkPreview: delays open/close con `uix.timers`, touch guard, content hover/cancelClose y props Floating/Arrow. - Cobertura nueva para Table: root/section/header/cell props desde `$libs/datagrid`, selección de fila y disclosure `RowDetail`. - Cobertura nueva para Form: submit inválido con foco via `ActiveDom`, attrs runtime y partes Submit/Reset/ErrorSummary sobre `$libs/forms`. - Cobertura nueva para ToastProvider: viewport hotkey via `ActiveDom`, runtime por item, ARIA/parts, auto-dismiss y close action. - Cobertura nueva para DragDrop: ruta de teclado start/nav/drop, filtros `accept`, prevención de drag, cancel y preview. - Validado por fase: - `npm run check` -> 0 errores, 0 warnings. - `npm run test` -> 233 archivos, 2242 tests OK. - tests focales de Select/Popover/Toast/RangeCalendar -> 11 tests OK. - tests focales Dialog/Drawer/Popover/Select -> 10 tests OK. - `command-provider.svelte.test.ts` -> 2 tests OK. - `$libs/datagrid/table-core.svelte.test.ts` -> 8 tests OK. - `$libs/forms/form-core.svelte.test.ts` -> 3 tests OK. - `combobox-provider.svelte.test.ts` -> 3 tests OK. - tests focales DatePicker/DateRangePicker/TimePicker -> 7 tests OK. - `time-range-picker-provider.svelte.test.ts` -> 3 tests OK. - `time-range-field-provider.svelte.test.ts` -> 3 tests OK. - `time-field-provider.svelte.test.ts` -> 3 tests OK. - `date-range-field-provider.svelte.test.ts` -> 3 tests OK. - `date-field-provider.svelte.test.ts` -> 7 tests OK. - `virtual-list-provider.svelte.test.ts` -> 3 tests OK. - `virtual-grid-provider.svelte.test.ts` -> 2 tests OK. - `number-field-provider.svelte.test.ts` -> 4 tests OK. - `file-upload-provider.svelte.test.ts` -> 4 tests OK. - `color-field-provider.svelte.test.ts` -> 4 tests OK. - `color-picker-provider.svelte.test.ts` -> 4 tests OK. - `navigation-menu-provider.svelte.test.ts` -> 4 tests OK. - `tree-grid-provider.svelte.test.ts` -> 4 tests OK. - `dropdown-menu-provider.svelte.test.ts` -> 6 tests OK. - `context-menu-provider.svelte.test.ts` -> 6 tests OK. - `menubar-provider.svelte.test.ts` -> 4 tests OK. - `listbox-provider.svelte.test.ts` -> 4 tests OK. - `tree-view-provider.svelte.test.ts` -> 4 tests OK. - `accordion-provider.svelte.test.ts` -> 4 tests OK. - `checkbox-provider.svelte.test.ts` -> 4 tests OK. - `radio-group-provider.svelte.test.ts` -> 4 tests OK. - `switch-provider.svelte.test.ts` -> 5 tests OK. - `toggle-provider.svelte.test.ts` -> 4 tests OK. - `toggle-group-provider.svelte.test.ts` -> 4 tests OK. - `tabs-provider.svelte.test.ts` -> 4 tests OK. - `slider-provider.svelte.test.ts` -> 4 tests OK. - `progress-provider.svelte.test.ts` + `meter-provider.svelte.test.ts` -> 4 tests OK. - `collapsible-provider.svelte.test.ts` -> 3 tests OK. - `clipboard-provider.svelte.test.ts` -> 2 tests OK. - `tooltip-provider.svelte.test.ts` -> 3 tests OK. - `field-provider.svelte.test.ts` -> 3 tests OK. - `search-field-provider.svelte.test.ts` -> 3 tests OK. - `pagination-provider.svelte.test.ts` -> 3 tests OK. - `breadcrumb-provider.svelte.test.ts` -> 3 tests OK. - `toolbar-provider.svelte.test.ts` -> 3 tests OK. - `stepper-provider.svelte.test.ts` -> 3 tests OK. - `scroll-area-provider.svelte.test.ts` -> 3 tests OK. - `splitter-provider.svelte.test.ts` -> 3 tests OK. - `pin-input-provider.svelte.test.ts` -> 3 tests OK. - `rating-group-provider.svelte.test.ts` -> 3 tests OK. - `tag-group-provider.svelte.test.ts` -> 3 tests OK. - `announce-provider.svelte.test.ts` -> 3 tests OK. - `feed-provider.svelte.test.ts` -> 3 tests OK. - `tags-input-provider.svelte.test.ts` -> 3 tests OK. - `editable-provider.svelte.test.ts` -> 3 tests OK. - `alert-dialog-provider.svelte.test.ts` -> 2 tests OK. - `carousel-provider.svelte.test.ts` -> 3 tests OK. - `grid-list-provider.svelte.test.ts` -> 3 tests OK. - `link-preview-provider.svelte.test.ts` -> 2 tests OK. - `table-provider.svelte.test.ts` -> 2 tests OK. - `form-provider.svelte.test.ts` -> 2 tests OK. - `toast-provider.svelte.test.ts` -> 2 tests OK. - `drag-drop-provider.svelte.test.ts` -> 2 tests OK. - guardia `*-provider.svelte.ts` sin test directo -> `NO_MISSING_PROVIDER_TESTS`. - guardia `rg "from './.*provider\\.svelte'" src/uix/soma/components -g 'exports.ts'` -> 0 resultados; Select ya no conserva el wrapper publico con nombre `select-provider.svelte`. - Commits nuevos empujados: - `a3bcb66c` — `Refresh UIX audit follow-up docs` - `25870b4e` — `Expand Soma component coverage` - `e1a21269` — `Hide internal Soma provider classes from barrels` - `4829ce13` — `Move command scorer to shared strings lib` - `02c1fb43` — `Move table core to datagrid lib` - `d319ec6b` — `Move form core to forms lib` - `701f83d6` — `Document Soma coverage and domain lib split` - `3050d273` — `Align Select public types and Soma inventory` - `eaeebd69` — `Route Soma layer timers through UIX scheduler` - `9fa00fa2` — `Move Soma public types out of providers` - `05f87dc4` — `Add Combobox provider coverage` - Auditoria UIX post-Soma/Eidos aplicada parcialmente: - `SoundChannel` ya no usa `document.addEventListener/removeEventListener` directamente para el unlock listener; consume una superficie DOM inyectada compatible con `ActiveDom.listen(...)` y `ActiveDom.getDocument(...)`. - Se rompe el ciclo type-only `sema/types.ts <-> sema-map.ts` moviendo ids, signatures y overrides de canales a `src/uix/sema/channels.ts`. - Se rompe el ciclo type-only de Floating moviendo `Side`, `Align`, `Boundary`, `SIDE_OPTIONS` y `ALIGN_OPTIONS` a `src/uix/soma/layers/floating/placement.ts`. - Tests iniciales añadidos para los puntos de mayor riesgo de Soma: Dialog, Drawer, Command, Calendar y DateField. - Validado: - `npm run check` -> 0 errores, 0 warnings. - `npx vitest run src/uix/sema src/uix/soma/layers/floating` -> 117 tests OK. - `npx vitest run` focal de los 5 nuevos tests Soma -> 16 tests OK. - Commits nuevos empujados: - `802ebce6` — `Tighten sema channel and floating contracts` - `c6d24eee` — `Add high-risk Soma provider tests` - `Intent` queda como vocabulario unico en `src/uix/intent.ts`. No existen alias `EidosIntent`, `UixIntent`, `ToastIntent` ni `SemaIntent`; Sema usa `IntentBinding` / `IntentPolicy` cuando necesita especializar el contrato del evento, pero el intent canonico no pertenece a una capa concreta. - `MorfoData` valida nombres `data-*`: solo acepta atributos publicos lowercase kebab-case; `data-_*` queda reservado para estado privado del provider y no puede declararse en morfo. - `frontend` queda eliminado del arbol activo: no hay `src/arts/frontend`, factory `defineActiveFrontend`, alias `$frontend`, ruta `/active/docs/fend` ni servicio `services.frontend`. Las referencias documentales restantes son notas explicitas de retirada o usos genericos de la palabra frontend. - `themeDimension(...)` y `densityDimension(...)` fueron retiradas del catalogo publico de `$prefs`. Las preferencias visuales `theme/mode/density` son entradas de `ActiveEidos`; `prefs` mantiene solo dimensiones transversales o custom via primitivas genericas. - `SemaActiveChannel` fue eliminado. La unica fuente publica para canales es `SemaChannelId`. - Verificaciones ejecutadas despues de la retirada: - `npm run check` -> 0 errores, 0 warnings. - `npm run test` -> 165 archivos, 2002 tests OK. - Commits nuevos empujados: - `a4cbe0c0` — `Tighten intent and morfo contracts` - `fbacd113` — `Remove frontend art` - `68dd40ef` — `Remove visual prefs dimensions` Actualizacion 2026-05-14: - Revision post-cambios aplicada. La supuesta perdida de proyeccion cross-modal queda resuelta como aclaracion de ownership: la proyeccion vive en `arts/prefs` mediante `createActivePrefsDomProjection(...)`, no en `ActiveUix`. - Documentacion de ecosistema actualizada en `src/uix/*` y `src/arts/*`: ownership de prefs/proyeccion/Eidos, naming canonico (`langs`, `events`, `active-app`, `storage`, `connection`, `session`, `cache`, `timer`, `logger`) y marcas historicas en docs de diseno antiguas. - Archivos documentales de revision retirados. Las conclusiones vigentes quedan absorbidas por `src/uix/active_architecture.md`, los README de capa y `src/uix/contracts.ts`. - Limpieza Eidos CSS/runtime aplicada: `index.css` ya solo importa fonts, `generated/base.css`, `archetypes.css`, `events.css` y recipes activas. Se retiraron CSS historicos de `contracts/`, `themes/base/`, `tokens/motion.css`, `tokens/index.css` y los token files de componentes. - Migracion Eidos recipe tokens aplicada: los aliases `--{component}-*` viven en `EidosConfig.recipes`, el tema base los define en `src/uix/eidos/lib/recipes/base.ts`, y `generated/base.css` los publica desde `npm run generate:eidos-css`. - Superficie de consulta de recipes aplicada: `ActiveEidos.listRecipes()` y `getRecipeTokens(component)` exponen aliases para editores de theme sin inspeccionar CSS ni devolver handles mutables del config interno. - La shell `/uix` ya no carga fuentes remotas; reutiliza las fuentes locales de Eidos (`Instrument Sans`, `Azeret Mono`) para que las validaciones Playwright no dependan de red externa. - `src/uix/contracts.test.ts` ahora incluye guardias de regresion para que `ActiveUix` no vuelva a bootear Soma/Eidos, los providers Soma no usen `registerContract/registerPart`, y la shell `/uix` no escriba `prefs.theme`. - Naming `langs`: constantes runtime y diagnosticos ya usan `langs` / `langs.mono`; se corrigieron menciones documentales residuales `[lang]` y `lang.mono`. - Contrato directo fuera de `ActiveUix` aclarado: `EngineSemantic` con visual activo necesita `dom` o `projector` y falla con `SemaConfigError` si faltan; `ADom` directo solo usa `disabledDom` cuando el caller lo pide. - `src/arts/prefs/README.md` reescrito al modelo actual schema-based. Se elimina la arquitectura historica de capabilities como guia principal; las dimensiones visuales `theme/mode/density` pertenecen a `ActiveEidos`. - `src/uix/morfo/README.md` actualizado: fija `translations`, `commonRef`, registro via `registerMorfo` y `soma.runtime(...)` como contrato vigente. - `frontend` retirado como artefacto: no queda factory, alias ni ruta activa. - Validacion global ejecutada: `npm run check`, tests focales UIX/arts y `npm run build` pasan. Solo queda el warning de chunks grandes del build. - Eidos general queda cerrado sin tocar componentes: no hay `EngineEidos`, wrapper `Eidos`, `eidos/engine` ni `eidos/core/headless`; se anade guardia de regresion en `contracts.test.ts`. - `recipes` queda como `RecipeTokenSet` plano por decision: subir a tipo estructurado solo cuando exista builder/consumer real que lo necesite. - Commits nuevos empujados: - `694eb5c5` — `Clarify prefs projection contract` - `223cdf9e` — `Align sema docs with channel ownership` - `3dc775f4` — `Update UIX architecture notes` - `b1215549` — `Fix UIX docs theme and popover dismiss` - `6da10987` — `Prune legacy Eidos CSS runtime` - `d822597f` — `Generate Eidos recipe tokens from config` - `65958538` — `Expose Eidos recipe token queries` - `4233be62` — `Update UIX continuation notes` - `2df58074` — `Use local fonts in UIX docs` - `8ad04714` — `Refresh UIX architecture docs` - `e2ba371b` — `Add UIX architecture regression guards` - `71e05765` — `Align langs diagnostic wording` - `607dfdbb` — `Clarify direct UIX service contracts` - `475ac775` — `Refresh prefs architecture docs` - `35958a49` — `Clarify morfo translation contract` - `bd37e5dd` — `Clarify legacy frontend density docs` - Validado de nuevo: - `npx vitest run src/uix/contracts.test.ts src/arts/prefs/test/dom-projection.test.ts src/uix/active-uix/active-uix.svelte.test.ts src/uix/eidos/active-eidos.test.ts src/uix/soma/runtime.svelte.test.ts` -> 79 tests OK. - `npx vitest run src/uix/sema/engine.test.ts src/uix/soma/runtime.svelte.test.ts` -> 48 tests OK. - `npx vitest run src/uix/eidos/active-eidos-config.test.ts src/uix/eidos/generated-css.test.ts src/uix/eidos/active-eidos.test.ts src/uix/contracts.test.ts` -> 52 tests OK. - `npm run check` -> 0 errores, 0 warnings. - `npx vitest run src/uix/contracts.test.ts` -> 12 tests OK. - `npm run check` tras wording `langs` -> 0 errores, 0 warnings. - Playwright `/uix`: toggle dark actualiza `html[data-theme="base-dark"]`, `html[data-mode="dark"]` y mantiene `html[data-density="comfortable"]`; sin `pageerror`, sin errores de consola y sin `requestfailed`. ## Estado validado - `ActiveUix` ya no crea ni conoce `Soma` ni `Eidos`. - Solo `ActiveApp` y `createActiveUix(...)` standalone crean servicios compartidos. - `attachActiveUix(app)` reutiliza servicios de `ActiveApp` y falla temprano si faltan `langs` o `dom`. - El servicio runtime de traducciones se llama `langs`. No confundir: - `prefs.language` alimenta `langs`. - `prefs.locale` alimenta `format`. - `prefs.direction`, `prefs.motion`, `prefs.sound` y `prefs.haptic` se proyectan mediante `createActivePrefsDomProjection(...)`. - `events` es el nombre publico del motor perceptivo en `ActiveUix`; `semantic` queda solo como payload de `morfo.events[].semantic`. - `ActiveEidos` queda aplanado: no existe engine visual separado ni directorio `engine` bajo Eidos. - Los helpers de configuracion/render/persistencia de Eidos viven en `src/uix/eidos/lib`. - `ActiveEidos` asume configuracion, validacion, contrato CSS, render, persistencia y scope visual. - Shells UIX deben pasar modo/densidad visuales a `ActiveEidos` mediante `modeSource`/`densitySource`; no escribir `prefs.theme`. - Los componentes Eidos siguen congelados salvo orden explicita. Validaciones ejecutadas en esta fase: - `npx vitest run src/uix/eidos/active-eidos.test.ts src/uix/eidos/active-eidos-config.test.ts` -> 37 tests OK. - `npx vitest run src/arts/adom/test/active-dom.test.ts src/uix/soma/runtime.svelte.test.ts src/uix/morfo/registry.test.ts src/uix/sema/resolver.test.ts src/uix/sema/chans/sound.test.ts src/uix/sema/chans/visual.test.ts src/uix/eidos/active-eidos.test.ts src/uix/eidos/active-eidos-config.test.ts src/uix/contracts.test.ts` -> 115 tests OK. - `npm run check` -> 0 errores, 0 warnings. ## Arquitectura acordada La regla central queda asi: ```text ActiveApp o ActiveUix standalone crean servicios. ActiveUix expone servicios y prefs. Morfo declara contrato y translations. Soma consume ActiveUix/Soma scope y transcribe morfo al DOM via uix.dom. Sema/events emite ocurrencias perceptivas; no debe inventar servicios. ActiveEidos consume ActiveUix y resuelve config/tokens/CSS runtime. Los componentes no crean servicios compartidos. ``` `portal` queda como preferencia/target generico de `ActiveUix`; Soma lo adapta a su `portalTo`. No usar nombres como `somaPortalTo` en `ActiveUix`. ## P1 cerrado 1. Ownership DOM P1 cerrado. - Corregido: `TextSelection` ya escribe/restaura `user-select` via `ActiveDom.apply`. - Corregido: announcers/live regions de Soma y descripciones ocultas de date/time usan `ActiveDom.writeNode/writeText/removeNode`. - Correcto: `ActiveUix` prefs, `SomaRuntime`, `VisualChannel`/`DomSignalProjector` y `ActiveEidos` usan `ActiveDom`. - Barrido P1 sin escrituras directas de produccion restantes; quedan lecturas DOM y fixtures de tests. 2. Tabla de contratos minimos cerrada como codigo/tests: `src/uix/contracts.ts` + `src/uix/contracts.test.ts` cubren `ActiveUix`, `SomaRuntime`, `EngineSemantic/events`, `ActiveEidos` y `Morfo`. 3. Sema queda purgado de las slices visuales `motion`, `color` y `presence`. El mapa canonico resuelve solo `hold`, `sound` y `haptic`; Eidos reacciona visualmente a `data-event-*` y a sus propios tokens CSS. 4. Naming `langs` revisado en mensajes/docs/tipos principales. Quedan solo usos tecnicos validos (`