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.mdsrc/docs/LIBRO_VARIACIONES_Y_EXTENSIONES.mdsrc/uix/active_architecture.mdsrc/uix/README.mdsrc/uix/active-uix/README.mdsrc/uix/morfo/README.mdsrc/uix/sema/README.mdsrc/uix/soma/README.mdsrc/uix/soma/SOMA_ARCHITECTURE.mdsrc/uix/soma/COMPONENT_GUIDE.mdsrc/uix/eidos/README.mdsrc/uix/eidos/components/README.mdweb/routes/uix/lib/COMPONENT_AUDIT_GUIDE.mdweb/routes/uix/lib/DEMO_AUTHORING_GUIDE.md- README de
src/arts/*, con foco especial ensrc/arts/active-app - README de
src/libs/*ysrc/svrs/*relevantes - README de
Wordsen 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 ensrc/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 detmp/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,semayeidos.
Hallazgos P0
P0-1 - La suite global falla por drift contractual de Words
Evidencia:
src/uix/contracts.test.ts:537falla enguards hardcoded Soma component data attrs with morfo contracts.src/uix/contracts.test.ts:548falla enguards 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-indentsrc/uix/soma/components/words/engine/serialize-html.ts:data-languagesrc/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.bubbleMenucomponents.words.slashMenucomponents.words.linkEditorcomponents.words.findReplace
- Las rutas aparecen en
src/uix/morfo/components/words.ts:14-17,:390,:413,:476,:498, y ensrc/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:
- Declarar esos
data-*ensrc/uix/morfo/components/words.tssi son parte publica estable, o retirarlos/renombrarlos en Soma si son internos. - Normalizar las rutas i18n a kebab-case, por ejemplo
components.words.bubble-menu, y sincronizar catalogos. - 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:824dice que Morfo es TypeScript declarativo puro, sin imports de$uix/sema,$adomni$libs/reactive.- Imports reales:
src/uix/morfo/compile.ts:48-49importa../sema/durationsy../sema/types.src/uix/morfo/types.ts:39-41importa../sema/types,../sema/channelsy../sema/durations.src/uix/morfo/selectors.ts:34importa../sema/types.src/uix/morfo/schema.ts:31-33importa$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-27prohibe<X.Provider>yProviderpublico.src/uix/eidos/components/README.md:40exige asignacion explicita, noObject.assign.- Violaciones:
src/uix/eidos/components/announce/index.ts:12src/uix/eidos/components/clipboard/index.ts:13src/uix/eidos/components/feed/index.ts:19src/uix/eidos/components/drag-drop/index.ts:15src/uix/eidos/components/tree-grid/index.ts:53src/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:57documenta$active-app/servicescomo path de service factories.src/arts/active-app/index.ts:8repite esa promesa.src/arts/active-app/README.md:106-107dice queservice-factories/se exporta desde$active-app/services.- Config real:
svelte.config.js:19yvite.config.ts:13solo definen$active-app -> src/arts/active-app.- Por tanto
$active-app/servicesresuelve asrc/arts/active-app/services.ts, que es el contrato de schema, no las fabricas.
- Codigo vivo:
src/uix/active-uix/services.ts:24importa desde$active-app/service-factories.src/arts/README.md:148tambien usa$active-app/service-factories.
- Prueba directa:
- Importar
defineActiveLangsdesde./src/arts/active-app/services.tslanzaSyntaxError: ... does not provide an export named 'defineActiveLangs'.
- Importar
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/serviceshaciasrc/arts/active-app/service-factories, y se mueve el contrato actualservices.tsa 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, incluyendodelegate.src/uix/sema/README.md:576y:636-638documentandelegate.
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 denavigation-menu.tabledemo captura solo valores iniciales deselectionModeymultiSort.transdemo tiene cierre implicito de<span>.- Errores de carga de config dentro de
tmp/lexicalpor 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
wordsque 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 -> $httpsrc/arts/bus/engine-bus.ts -> $loggersrc/arts/perm/types.ts -> $httpsrc/arts/prefs/dom-projection.ts -> $adomsrc/arts/session/bus-helpers.ts -> $bussrc/arts/session/http-integration.ts -> $httpsrc/arts/session/types.ts -> $storagesrc/arts/sium/engine-resolver.ts -> $langssrc/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:267dice quepackage.jsondeclara"sideEffects": ["**/*.css", "**/*.svelte"].package.jsonno contienesideEffects.
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__ */ensrc/uix/soma/components/command/command-provider.svelte.tsesta 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: enlaceshref="#".web/routes/uix/components/table/+page.svelte:104:selectionModeymultiSortcapturados solo al inicializar.web/routes/uix/components/trans/+page.svelte:375: cierre implicito despan.- 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.tsdepende desvelte/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)exigelangsydomy no compensa servicios faltantes.- No importa Soma ni Eidos.
defineUixServices(...)crea la slice de servicios necesaria paraActiveApp.- Suite propia verde: 25 tests.
Riesgos:
- Depende del problema de naming de service factories en
active-app. - El contrato de
eventsesta 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 -> uixes 0. - Muchos modulos separan engine puro y active wrapper.
auth/session/perm/cache/http/storagetienen docs de seguridad bastante claras.active-appcentraliza presets y composicion.
Riesgos:
- Algunas dependencias sibling son utiles pero no estan expresadas como matriz permitida.
- Bundle policy de
sideEffectsno esta codificada. format/currencyREADME 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:checkesta verde.semaSelectorexiste y los packs Sema lo usan en general.
Riesgos:
- Importa tipos de Sema y
$sium. Wordstiene drift actual contra los tests de contrato.morfo:vocabularyproduce 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/domdesde 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
semaSelectoren vez de selectores inventados. - Visual/Sound/Haptic estan modelados como canales.
defineEngineSemanticencaja conActiveUix.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
ActiveUixdirectamente. ActiveEidossepara tema/modo/densidad deprefs.
Riesgos:
- 6 componentes exponen
.Provider. - 34 componentes NEEDS-WORK afectan Eidos/demos/contratos.
- Muchos README por componente faltan.
Checks positivos importantes
svelte.config.jsyvite.config.tstienen aliases sincronizados.- Runes mode esta forzado por
dynamicCompileOptions. npm run buildpasa.npm run checkno reporta errores TypeScript/Svelte fatales.translations:checkpasa sin warnings.active-appyactive-uixpasan 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/domdirecto desde Soma/Eidos.
Orden recomendado de reparacion
- Corregir
Wordshasta quesrc/uix/contracts.test.tspase. - Resolver el path publico de service factories de
active-app. - Sacar imports de Sema desde Morfo.
- Eliminar
.Providerpublico en Eidos. - Cerrar los 34
NEEDS-WORKdel component audit por prioridad. - Consolidar docs canonicas: familias Sema, estado actual, Words i18n,
active-appservice path. - Limpiar
npm run checkynpm run buildde warnings conocidos. - Formalizar matriz de dependencias permitidas entre
arts. - Codificar
sideEffectso retirar esa politica del README. - 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.