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/codex-full-audit.md

24 KiB

Codex full audit - arquitectura y framework

Fecha: 2026-05-27
Repo: G:\dev\svelte\vicen
Rama observada: active-uix

Veredicto ejecutivo

La arquitectura principal esta bien orientada: ActiveApp compone servicios, ActiveUix actua como raiz UIX, Morfo/Soma/Sema/Eidos mantienen una separacion reconocible, y las reglas de alias/runes estan bastante alineadas. Hay buenas barreras: arts no importa uix, active-uix no importa Soma ni Eidos, Soma no importa Eidos, y active-app/active-uix pasan sus suites propias.

Pero el sistema no esta contractualmente sano todavia. El npm test global falla por Words, hay drift real entre docs y codigo, Morfo importa Sema aunque su README lo prohibe, algunos Eidos vuelven a exponer Provider publicamente, y el reporte de componentes declara 34/107 componentes como NEEDS-WORK. Ademas, la entrada documentada $active-app/services no coincide con el alias real ni con el codigo vivo, lo que hace que la documentacion de composicion sea peligrosa para consumidores.

Alcance revisado

Documentacion y contratos revisados:

  • src/docs/GUIA_IMPLEMENTACION_SEMAUIX.md
  • src/docs/LIBRO_VARIACIONES_Y_EXTENSIONES.md
  • src/uix/active_architecture.md
  • src/uix/README.md
  • src/uix/active-uix/README.md
  • src/uix/morfo/README.md
  • src/uix/sema/README.md
  • src/uix/soma/README.md
  • src/uix/soma/SOMA_ARCHITECTURE.md
  • src/uix/soma/COMPONENT_GUIDE.md
  • src/uix/eidos/README.md
  • src/uix/eidos/components/README.md
  • web/routes/uix/lib/COMPONENT_AUDIT_GUIDE.md
  • web/routes/uix/lib/DEMO_AUTHORING_GUIDE.md
  • README de src/arts/*, con foco especial en src/arts/active-app
  • README de src/libs/* y src/svrs/* relevantes
  • README de Words en Morfo/Soma/Sema/Eidos

Tambien se revisaron configs, import graph, tests y reportes generados.

Comandos ejecutados

  • npm run test - falla: 1 fichero fallido, 2 tests fallidos en src/uix/contracts.test.ts.
  • npx vitest run src/uix/contracts.test.ts - falla con las mismas 2 violaciones.
  • npx vitest run src/arts/active-app/test - pasa: 8 ficheros, 54 tests.
  • npx vitest run src/uix/active-uix/active-uix.svelte.test.ts - pasa: 1 fichero, 25 tests.
  • npm run check - exit 0, pero con 24 warnings Svelte y errores de carga de configs dentro de tmp/lexical.
  • npm run build - exit 0, pero conserva warnings de Svelte/Vite.
  • npm run component:audit - exit 0, 107 componentes: 73 PASS, 34 NEEDS-WORK, 0 BROKEN.
  • npm run translations:check - exit 0: 218 refs, 76 catalogos, 0 errors, 0 warnings.
  • npm run morfo:vocabulary - exit 0, pero 107 warnings de vocabulario y 9 eventos con nombre no canonico.
  • Escaneos estaticos de imports entre arts, active-app, active-uix, morfo, soma, sema y eidos.

Hallazgos P0

P0-1 - La suite global falla por drift contractual de Words

Evidencia:

  • src/uix/contracts.test.ts:537 falla en guards hardcoded Soma component data attrs with morfo contracts.
  • src/uix/contracts.test.ts:548 falla en guards component translation namespaces as kebab-case.
  • Atributos Soma no declarados en Morfo:
    • src/uix/soma/components/words/engine/render.ts: data-words-find-match, data-words-find-active, data-words-indent
    • src/uix/soma/components/words/engine/serialize-html.ts: data-language
    • src/uix/soma/components/words/words-provider.svelte.ts: data-words-heading-picker, data-words-toolbar-family, data-words-toolbar-family-panel, data-words-code-language-picker, data-words-code-language-panel
  • Claves i18n no kebab-case:
    • components.words.bubbleMenu
    • components.words.slashMenu
    • components.words.linkEditor
    • components.words.findReplace
  • Las rutas aparecen en src/uix/morfo/components/words.ts:14-17, :390, :413, :476, :498, y en src/uix/soma/components/words/words-provider.svelte.ts:1715, :1804, :2075, :2178.

Impacto:

Morfo deja de ser la fuente de verdad para el DOM y para las rutas de texto. Eso rompe el modelo declarado en src/uix/README.md: Morfo declara, Soma transcribe, Sema proyecta, Eidos lee. Tambien bloquea CI porque npm run test queda rojo.

Recomendacion:

  1. Declarar esos data-* en src/uix/morfo/components/words.ts si son parte publica estable, o retirarlos/renombrarlos en Soma si son internos.
  2. Normalizar las rutas i18n a kebab-case, por ejemplo components.words.bubble-menu, y sincronizar catalogos.
  3. Revisar el README de Words: hoy afirma que esas claves fueron normalizadas a camelCase, pero el contrato actual exige kebab-case.

Hallazgos P1

P1-1 - Morfo importa Sema aunque su contrato lo prohibe

Evidencia:

  • src/uix/morfo/README.md:824 dice que Morfo es TypeScript declarativo puro, sin imports de $uix/sema, $adom ni $libs/reactive.
  • Imports reales:
    • src/uix/morfo/compile.ts:48-49 importa ../sema/durations y ../sema/types.
    • src/uix/morfo/types.ts:39-41 importa ../sema/types, ../sema/channels y ../sema/durations.
    • src/uix/morfo/selectors.ts:34 importa ../sema/types.
    • src/uix/morfo/schema.ts:31-33 importa $sium.

Impacto:

La capa declarativa queda acoplada a la capa perceptiva. Si Sema cambia sus tipos/canales/duraciones, Morfo cambia con ella. Eso invierte parte del flujo arquitectonico: Morfo deberia declarar el lenguaje que Sema consume, no depender de Sema para poder describirlo.

Recomendacion:

Mover los tipos compartidos a un contrato neutro, por ejemplo src/uix/contracts o un submodulo morfo/semantic-contracts.ts. Sema puede implementar esos contratos, pero Morfo no deberia importar desde Sema. Revisar si $sium se acepta como validador puro o si el README debe afinar la regla.

P1-2 - Eidos vuelve a exponer Provider publicamente en 6 componentes

Evidencia:

  • src/uix/eidos/components/README.md:21-27 prohibe <X.Provider> y Provider publico.
  • src/uix/eidos/components/README.md:40 exige asignacion explicita, no Object.assign.
  • Violaciones:
    • src/uix/eidos/components/announce/index.ts:12
    • src/uix/eidos/components/clipboard/index.ts:13
    • src/uix/eidos/components/feed/index.ts:19
    • src/uix/eidos/components/drag-drop/index.ts:15
    • src/uix/eidos/components/tree-grid/index.ts:53
    • src/uix/eidos/components/tree-view/index.ts:53

Impacto:

La API publica vuelve a tener dos formas mentales: root visual y Provider. Eso contradice la "disciplined option C" y perpetua el split retirado flat vs Provider compound.

Recomendacion:

Eliminar .Provider de los namespaces publicos. El root visual debe ser el provider visual si corresponde, y las partes adjuntas deben ser solo las partes publicas esperadas (Trigger, Content, Item, etc.).

P1-3 - La entrada documentada $active-app/services no coincide con el codigo

Evidencia:

  • src/arts/active-app/README.md:57 documenta $active-app/services como path de service factories.
  • src/arts/active-app/index.ts:8 repite esa promesa.
  • src/arts/active-app/README.md:106-107 dice que service-factories/ se exporta desde $active-app/services.
  • Config real:
    • svelte.config.js:19 y vite.config.ts:13 solo definen $active-app -> src/arts/active-app.
    • Por tanto $active-app/services resuelve a src/arts/active-app/services.ts, que es el contrato de schema, no las fabricas.
  • Codigo vivo:
    • src/uix/active-uix/services.ts:24 importa desde $active-app/service-factories.
    • src/arts/README.md:148 tambien usa $active-app/service-factories.
  • Prueba directa:
    • Importar defineActiveLangs desde ./src/arts/active-app/services.ts lanza SyntaxError: ... does not provide an export named 'defineActiveLangs'.

Impacto:

La documentacion guia al consumidor a un import path que no funciona. Es una violacion fuerte de API publica, aunque no rompe build porque muchos ejemplos estan dentro de strings de documentacion.

Recomendacion:

Elegir una sola direccion:

  • O se corrige toda la doc a $active-app/service-factories.
  • O se crea un alias real y estable $active-app/services hacia src/arts/active-app/service-factories, y se mueve el contrato actual services.ts a otro nombre (schema.ts, contracts.ts, etc.).

Despues, anadir un test que compile los snippets publicos o al menos valide los import paths documentados.

P1-4 - 34 de 107 componentes quedan en NEEDS-WORK

Evidencia:

npm run component:audit genero tmp/component-audit.md:

  • Total: 107 componentes.
  • PASS: 73.
  • NEEDS-WORK: 34.
  • BROKEN: 0.

Componentes NEEDS-WORK:

alert-dialog, announce, avatar-group, badge, button, card, clipboard, command, drag-drop, feed, format-date, format-number, grid-list, image, link-preview, listbox, menubar, navigation-menu, password-field, range-calendar, relative-time, s-text, s-text-virtual-list, search-field, skeleton, spinner, table, textarea, time-range-field, trans, tree-grid, tree-view, virtual-grid, virtual-list.

Ejemplos de errores:

  • alert-dialog: falta selector root [data-alert-dialog].
  • Muchos Eidos: falta README.md.
  • Varios interactivos: falta :focus-visible.
  • Varias demos: falta somaSnippet.
  • table, textarea, tree-grid: referencias a --color-* no declaradas.
  • Interactivos sin URL APG declarada.

Impacto:

El framework no esta en estado de completitud auditada. La auditoria automatica no marca BROKEN, pero NEEDS-WORK en 34 componentes es suficiente para considerar incompleta la implementacion de la arquitectura de componentes.

Recomendacion:

Convertir el reporte en backlog cerrado por severidad: primero selectores root/contrato DOM, luego foco/a11y, luego snippets/demo, luego READMEs. Si el estado esperado del repo es "todo auditado", hacer que component:audit falle cuando haya NEEDS-WORK.

P1-5 - Drift doctrinal entre docs: 7 familias vs 8 familias Sema

Evidencia:

  • src/docs/GUIA_IMPLEMENTACION_SEMAUIX.md:15: "7 familias. Sin excepciones."
  • src/uix/active_architecture.md:329: enumera 7 familias.
  • src/docs/LIBRO_VARIACIONES_Y_EXTENSIONES.md:673: dice 8 familias, incluyendo delegate.
  • src/uix/sema/README.md:576 y :636-638 documentan delegate.

Impacto:

Los autores de componentes no tienen una fuente unica para saber si delegate es canonico o extension experimental. Esto afecta Morfo, validadores, morfo:vocabulary, packs Sema y naming de eventos.

Recomendacion:

Consolidar la doctrina: si delegate es vigente, actualizar la guia base y active_architecture. Si es extension, marcarlo como extension con gating y validacion explicita.

P1-6 - npm run check sale verde con ruido que deberia limpiarse

Evidencia:

npm run check devuelve exit 0, pero reporta:

  • 24 warnings Svelte en 7 ficheros.
  • Warnings a11y por elementos con handlers de puntero sin rol.
  • Variables enlazadas que se actualizan sin $state(...).
  • href="#" invalido en demo de navigation-menu.
  • table demo captura solo valores iniciales de selectionMode y multiSort.
  • trans demo tiene cierre implicito de <span>.
  • Errores de carga de config dentro de tmp/lexical por dependencias no instaladas (svelte-preprocess, @sveltejs/adapter-auto).

Impacto:

La senal de check queda degradada: el comando dice "0 errors", pero imprime errores de carga externos y warnings que apuntan a bugs reales de demo.

Recomendacion:

Mover tmp/lexical fuera del workspace escaneado o configurar exclusion real para svelte-check. Corregir warnings de rutas UIX y demos. Para CI, definir si warnings Svelte deben fallar.

P1-7 - Documentacion de estado obsoleta en active_architecture

Evidencia:

src/uix/active_architecture.md contiene un "Estado actual (2026-05-17)" que presenta partes como pendientes o cerradas con conteos historicos, mientras src/docs/LIBRO_VARIACIONES_Y_EXTENSIONES.md documenta cambios posteriores del 2026-05-27: persistencia, a11ySemantic, familias permitidas y patrones polimorficos.

Impacto:

El documento que deberia orientar la arquitectura activa mezcla estado antiguo con reglas vigentes. Esto multiplica decisiones contradictorias en capas sensibles como Sema y Eidos.

Recomendacion:

Separar "historial" de "contrato vigente". El contrato vigente debe decir en una pagina corta que docs son canonicos y cuales son libro/historia.

Hallazgos P2

P2-1 - morfo:vocabulary produce demasiado warning estructural

Evidencia:

npm run morfo:vocabulary reporta:

  • 107 warnings de enums data-* divergentes.
  • 9 eventos de words que no siguen la forma {family}-{verb}[-{variant}]: words.commit-content, words.commit-format, words.commit-link, words.commit-unlink, words.commit-slash-command, words.commit-check, words.commit-history, words.commit-clear, words.signal-invalid-input.

Impacto:

El comando no distingue bien entre vocabularios legitimamente nuevos y drift real. Al ser solo warning, se acumula ruido y el contrato pierde capacidad de bloquear regresiones.

Recomendacion:

Promover vocabularios recurrentes a CANONICAL_VOCABULARIES o marcarlos como extension aceptada con razon. Separar warnings esperados de violaciones reales.

P2-2 - arts tiene excepciones de dependencia que contradicen la regla amplia

Evidencia de import graph productivo entre artes, excluyendo active-app:

  • src/arts/auth/client.ts -> $http
  • src/arts/bus/engine-bus.ts -> $logger
  • src/arts/perm/types.ts -> $http
  • src/arts/prefs/dom-projection.ts -> $adom
  • src/arts/session/bus-helpers.ts -> $bus
  • src/arts/session/http-integration.ts -> $http
  • src/arts/session/types.ts -> $storage
  • src/arts/sium/engine-resolver.ts -> $langs
  • src/arts/sium/engine-sium.ts -> $langs

Muchas estan documentadas y parecen intencionales. El problema es que src/arts/active-app/README.md formula una regla mas dura: los arts no deben conocer sibling arts; ese conocimiento pertenece a active-app.

Impacto:

La arquitectura real ya tiene una lista de excepciones. Si no se formalizan, las futuras dependencias cruzadas se justificaran por precedente.

Recomendacion:

Crear una matriz permitida de dependencias entre arts. Diferenciar:

  • Contratos puros aceptados ($libs/*).
  • Infraestructuras core aceptadas ($logger, $bus, $timer).
  • Bridges opcionales aceptados (prefs/dom-projection -> adom).
  • Dependencias prohibidas.

P2-3 - active-app/service-builder.ts importa Svelte en un .ts

Evidencia:

src/arts/active-app/service-builder.ts importa untrack desde svelte. El comentario explica que se usa para construir lazy services dentro de scopes reactivos sin capturar mutaciones.

Impacto:

Probablemente es una decision practica correcta, pero hace que el core builder de active-app tenga dependencia Svelte aunque no sea .svelte.ts. Si la meta es que solo Active* reactivos carguen Svelte, esto debe documentarse como excepcion.

Recomendacion:

Mantener si es necesario, pero documentarlo en active-app como parte del contrato del builder. Alternativa: aislar el untrack en un adaptador Svelte inyectable si se quiere preservar un builder completamente puro.

P2-4 - src/arts/README.md promete sideEffects, pero package.json no lo tiene

Evidencia:

  • src/arts/README.md:267 dice que package.json declara "sideEffects": ["**/*.css", "**/*.svelte"].
  • package.json no contiene sideEffects.

Impacto:

La politica de tree-shaking y preservacion de CSS/Svelte no esta codificada. En un paquete privado puede no doler hoy, pero contradice el documento de bundle policy.

Recomendacion:

Anadir el campo si la politica sigue vigente, o retirar/ajustar la regla del README.

P2-5 - Documentacion stale en format/currency

Evidencia:

src/arts/format/currency/README.md usa $formats/currency y describe src/arts/formats/currency/, pero el alias real es $format y la ruta real es src/arts/format/currency.

Impacto:

Consumidores que copien esos snippets importaran desde un alias inexistente.

Recomendacion:

Corregir el README y anadir un chequeo simple de aliases en snippets de documentacion publica.

P2-6 - Build pasa, pero hay senales de bundle/ruido a vigilar

Evidencia:

npm run build pasa, pero:

  • Repite warnings de Svelte/Vite ya vistos en check.
  • Un asset CSS de cliente aparece alrededor de 824 kB sin gzip.
  • Rollup avisa que un comentario /* @__PURE__ */ en src/uix/soma/components/command/command-provider.svelte.ts esta en una posicion que no puede interpretar y sera removido.

Impacto:

No bloquea, pero indica que el build no esta limpio y que faltan budgets o umbrales para assets grandes.

Recomendacion:

Registrar budgets de bundle y limpiar warnings del build. Revisar el origen del CSS grande y el comentario pure en command-provider.

P2-7 - Demos UIX contienen bugs de reactividad/a11y

Evidencia:

npm run check y npm run build reportan:

  • web/routes/uix/components/navigation-menu/+page.svelte: enlaces href="#".
  • web/routes/uix/components/table/+page.svelte:104: selectionMode y multiSort capturados solo al inicializar.
  • web/routes/uix/components/trans/+page.svelte:375: cierre implicito de span.
  • Rutas de demo genericas en web/routes/demos/*.svelte: handlers de puntero sin rol y refs no reactivas.

Impacto:

Aunque sean demos, son la superficie de validacion del framework. Bugs ahi pueden ocultar errores del componente o ensenar patrones incorrectos.

Recomendacion:

Limpiar las demos antes de usarlas como material de contrato o referencia.

Hallazgos P3

P3-1 - Muchos README de Eidos faltan por componente

El reporte de componentes y el inventario indican que varios directorios Eidos no tienen README.md: announce, badge, button, card, clipboard, command, drag-drop, feed, grid-list, image, link-preview, listbox, menubar, navigation-menu, password-field, range-calendar, s-text, s-text-virtual-list, skeleton, spinner, table, textarea, time-range-field, tree-grid, tree-view, virtual-grid, virtual-list, entre otros.

Impacto:

Reduce trazabilidad por modulo, especialmente porque el usuario pidio auditar README por modulo y porque la guia de componente exige documentar contrato, comparativa y decisiones.

P3-2 - AGENTS.md esta parcialmente viejo frente a aliases actuales

AGENTS.md menciona alias historicos (@/ling, @/logr, @/glob, @/actx) como criticos, pero los configs actuales exponen sobre todo aliases de arts, libs, svrs y uix. La instruccion general de mantener svelte.config.js y vite.config.ts sincronizados si se cumple; lo viejo es el inventario concreto.

Impacto:

Bajo para runtime, medio para agentes/humanos que usen AGENTS.md como mapa.

Evaluacion por capas

ActiveApp

Estado general: solido como composition root, con una deuda de API docs.

Lo que esta bien:

  • Core: logger, bus, timers, orca, prefs.
  • Servicios opt-in con schema y topological builder.
  • Presets de orca separados.
  • Dispose en orden razonable.
  • Suite propia verde: 54 tests.

Riesgos:

  • Path publico de service factories documentado como $active-app/services, pero codigo real usa $active-app/service-factories.
  • service-builder.ts depende de svelte/untrack; probablemente justificado, pero debe declararse como excepcion de core.
  • La regla "arts no conocen siblings" necesita matriz de excepciones.

ActiveUix

Estado general: bueno y alineado con la intencion de asentarse sobre ActiveApp.

Lo que esta bien:

  • createActiveUix(...) standalone compone servicios locales.
  • attachActiveUix(app) exige langs y dom y no compensa servicios faltantes.
  • No importa Soma ni Eidos.
  • defineUixServices(...) crea la slice de servicios necesaria para ActiveApp.
  • Suite propia verde: 25 tests.

Riesgos:

  • Depende del problema de naming de service factories en active-app.
  • El contrato de events esta bien nombrado, pero la doctrina Sema aun esta en drift.

Arts

Estado general: arquitectura razonable, con excepciones de dependencia que necesitan formalizacion.

Lo que esta bien:

  • Import graph: arts -> uix es 0.
  • Muchos modulos separan engine puro y active wrapper.
  • auth/session/perm/cache/http/storage tienen docs de seguridad bastante claras.
  • active-app centraliza presets y composicion.

Riesgos:

  • Algunas dependencias sibling son utiles pero no estan expresadas como matriz permitida.
  • Bundle policy de sideEffects no esta codificada.
  • format/currency README tiene alias/ruta vieja.

Morfo

Estado general: el concepto es correcto, la implementacion viola la pureza.

Lo que esta bien:

  • Define contratos DOM/eventos/partes con bastante cobertura.
  • translations:check esta verde.
  • semaSelector existe y los packs Sema lo usan en general.

Riesgos:

  • Importa tipos de Sema y $sium.
  • Words tiene drift actual contra los tests de contrato.
  • morfo:vocabulary produce demasiado ruido para ser una barrera fuerte.

Soma

Estado general: el headless runtime mantiene buena separacion de Eidos, pero Words se salio del contrato Morfo.

Lo que esta bien:

  • No se detecto import de Eidos desde Soma.
  • No se detecto import directo de $libs/dom desde Soma/Eidos; se usa $adom.
  • Los tests globales pasan en casi todo salvo el contrato de Words.

Riesgos:

  • Hardcoded data-* en Words no declarados en Morfo.
  • Warnings en demos de Table apuntan a reactividad incorrecta.

Sema

Estado general: potente, pero la doctrina no esta consolidada.

Lo que esta bien:

  • Packs usan semaSelector en vez de selectores inventados.
  • Visual/Sound/Haptic estan modelados como canales.
  • defineEngineSemantic encaja con ActiveUix.events.

Riesgos:

  • 7 vs 8 familias no resuelto.
  • Warnings de nombres de eventos Words.
  • Morfo depende de Sema para tipos.

Eidos

Estado general: wrapper visual bien encaminado, pero con regresiones en API y completitud.

Lo que esta bien:

  • No se detecto Object.assign.
  • No se detecto Eidos components importando ActiveUix directamente.
  • ActiveEidos separa tema/modo/densidad de prefs.

Riesgos:

  • 6 componentes exponen .Provider.
  • 34 componentes NEEDS-WORK afectan Eidos/demos/contratos.
  • Muchos README por componente faltan.

Checks positivos importantes

  • svelte.config.js y vite.config.ts tienen aliases sincronizados.
  • Runes mode esta forzado por dynamicCompileOptions.
  • npm run build pasa.
  • npm run check no reporta errores TypeScript/Svelte fatales.
  • translations:check pasa sin warnings.
  • active-app y active-uix pasan tests focalizados.
  • No hay arts -> uix.
  • No se encontro Soma -> Eidos.
  • No se encontro Eidos components -> ActiveUix.
  • No se encontro ActiveUix -> Soma/Eidos.
  • No se encontro $libs/dom directo desde Soma/Eidos.

Orden recomendado de reparacion

  1. Corregir Words hasta que src/uix/contracts.test.ts pase.
  2. Resolver el path publico de service factories de active-app.
  3. Sacar imports de Sema desde Morfo.
  4. Eliminar .Provider publico en Eidos.
  5. Cerrar los 34 NEEDS-WORK del component audit por prioridad.
  6. Consolidar docs canonicas: familias Sema, estado actual, Words i18n, active-app service path.
  7. Limpiar npm run check y npm run build de warnings conocidos.
  8. Formalizar matriz de dependencias permitidas entre arts.
  9. Codificar sideEffects o retirar esa politica del README.
  10. Anadir tests de snippets/import paths publicos para que la doc no pueda prometer alias rotos.

Cierre

La arquitectura no necesita una reescritura: necesita cerrar contratos. Las piezas principales estan bien ubicadas, pero ahora mismo los tests y la documentacion muestran que algunas capas estan adelantandose unas a otras. El mayor riesgo no es que falte funcionalidad; es que el contrato escrito, el contrato testeado y el codigo runtime no siempre son el mismo contrato.

Powered by TurnKey Linux.