You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
svelte-kit-vice/continue.md

36 KiB

Continue

Fecha de corte: 2026-05-16. Rama: active-uix.

Actualizacion 2026-05-16:

  • 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.
    • 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:

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 (<script lang="ts">, v.langRef(...)) o menciones historicas explicitas.
  5. attachActiveUix(app) no crea sustitutos si faltan servicios requeridos.
  6. SoundChannel ya no registra listeners globales en el constructor; prima el contexto en prepare() solo cuando una senal sonora entra en el gesto.
  7. createActivePrefsDomProjection(...) proyecta dir, data-motion, data-sound y data-haptic; ActiveEidos proyecta data-theme, data-mode y data-density.
  8. SomaRuntime, registerMorfo y applyMapOverrides tienen optimizaciones basicas de churn/copia aplicadas.
  9. frontend retirado; ActiveApp ya no puede declarar un servicio visual shell heredado.
  10. themeDimension/densityDimension retiradas; el catalogo $prefs no ofrece dimensiones visuales UIX.

Pendiente P2

  1. Soma: la API canonica publica de parte es runtime.part(...). registerContract(...) ya no se llama desde Soma; registerMorfo(...) lo registra todo. createAttrs(...) queda solo como helper tipado para querySelector/tooling, no como mecanismo runtime.
  2. Morfo: los atributos data-* con valor libre ya se modelan con emit: 'value'; progress/meter declaran data-value, data-min y data-max en morfo y SomaRuntime lo cubre con test dedicado.
  3. Morfo translations: mantener translations en el morfo, commonRef para textos compartidos y langs.ts solo como constantes imperativas legacy.
  4. Frontend/ActiveApp: cerrado. frontend no existe como artefacto activo ni como servicio opt-in. Las preferencias transversales se proyectan desde arts/prefs; las visuales pertenecen a ActiveEidos.
  5. ActiveApp docs: actualizado que langs, dom, format y events son servicios opt-in; no hay servicio visual shell heredado.

Eidos cerrado para modulo general

  1. Primitivas visuales sin tocar componentes: layout ya queda incorporado al EidosConfig con containerWidth, containerPaddingInline, contentWidth y aspectRatio, y se genera en CSS/contrato como --container-width-*, --container-padding-inline, --content-width-* y --aspect-ratio-*.
  2. Mantener EidosConfig como authoring object persistible y CSS-only como modo valido mediante themeSource: 'css'.
  3. Density queda como primitive bridge: scale, spaceScale, controlScale y contentScale para compact, comfortable, spacious; ActiveEidos proyecta data-density y Eidos publica aliases activos como --density-space-scale.
  4. src/uix/eidos/generated/base.css queda como primer artefacto CSS generado desde EidosConfig base mediante npm run generate:eidos-css; index.css lo importa como foundation estatica.
  5. Cerrado: los tokens per-component de las recipes activas quedan como aliases estables y authorables en EidosConfig.recipes.
  6. Los CSS historicos de contracts/ y themes/base/ quedan retirados del arbol activo. El contrato se publica desde ActiveEidos.getCssContract() / renderContractCss() y el base desde generated/base.css.
  7. tokens/ ya no forma parte del entrypoint estatico. Las recipes CSS consumen los mismos custom properties, pero los valores salen de generated/base.css.
  8. ActiveEidos.listRecipes() y getRecipeTokens(component) exponen los aliases para editores de theme sin leer CSS. El tipado plano de recipes es intencional mientras no haya builder/consumer estructurado.
  9. No reintroducir engine visual separado, carpeta engine, ni wrapper Eidos sin contrato propio.

Pendiente de limpieza

  • Validacion navegador /uix cerrada despues de mover recipe tokens y retirar fuentes remotas: carga sin requestfailed, sin errores de consola y el toggle dark sigue aplicando data-theme, data-mode y estilos visuales.
  • Siguiente foco recomendado: reauditar componentes Eidos option C solo cuando se autorice explicitamente. No mezclar esa fase con runtime ni arquitectura general.
  • Warnings de toast resueltos; npm run check queda en 0 errores / 0 warnings.
  • No commitear logs temporales: .codex-vite-dialog*.log, debug.log, md.
  • Antes de seguir con componentes, releer src/uix/active_architecture.md, src/uix/active-uix/README.md, src/uix/eidos/README.md, src/uix/soma/README.md y este archivo.

Powered by TurnKey Linux.