--- title: Eje agéntico de activeUIX — informe para revisión externa type: process / informe audience: evaluadores externos (IAs u humanos) SIN acceso al repositorio status: snapshot 2026-07-21 — las decisiones firmadas son vinculantes; las propuestas no purpose: someter el diseño a crítica externa — encontrar lo que se nos escapa --- # Eje agéntico de activeUIX — informe para revisión externa ## 0 · Propósito y cómo evaluar este informe Estamos diseñando la **dimensión agéntica** de un ecosistema de componentes UI: que un agente LLM pueda **ser invocado desde y participar en** cualquier componente del ecosistema (un editor de documentos, un calendario, un chat, un formulario), con semántica, permisos, undo y accesibilidad de primera clase. Este informe es **autocontenido**: no necesitas acceso al código. Contiene el contexto del ecosistema (§1–§2), la tesis de diseño (§3), las decisiones ya firmadas (§4), las propuestas en revisión (§5), los defectos que una auto-crítica adversarial ya encontró y cómo se corrigieron (§6), las amenazas abiertas (§7), el estado del estudio de referencias (§8) y las preguntas concretas que te hacemos (§9). Un glosario mínimo cierra el documento (§10). **Qué te pedimos**: no repitas lo que §6 ya encontró — búscanos lo que está MÁS ALLÁ. Desafía las tesis (§3, §5), no solo los detalles. Si conoces un patrón de la industria o un fallo de diseño que este documento no contempla, eso es exactamente lo que buscamos. --- ## 1 · El ecosistema anfitrión (contexto mínimo suficiente) **activeUIX** es un sistema de componentes Svelte 5 (headless-first, cero dependencias externas de runtime) construido sobre un contrato declarativo y cuatro capas con responsabilidades disjuntas: - **morfo** — el ADN declarativo de cada componente: partes, atributos `data-*`, ARIA, teclado, y **eventos con semántica declarada** (familia/intent/verbo). No ejecuta nada. Es el único punto de articulación entre capas. - **soma** — el comportamiento headless. Un runtime interpreta el morfo; el *provider* de cada componente aporta estado y handlers. Todo evento pasa por `runtime.trigger(evento)`, que secuencia: prewrite → emisión semántica → handler → derivación de atributos al DOM por efectos. - **sema** — el motor perceptivo: un vocabulario canónico (8 familias de evento, 6 intents, verbos por familia) y canales de expresión (sonido, háptica) más un *stamp* visual transitorio (`data-event-*`) durante una ventana («hold»). No conoce el DOM más allá de un proyector inyectado. - **eidos** — la capa visual: CSS que selecciona exclusivamente contra los atributos que el morfo promete. Theming completo (tokens, roles, 33 escalas de color, densidad, modo). Reglas duras del ecosistema relevantes para este diseño: 1. **El estado es la única fuente de verdad; el DOM es derivación.** 2. **El DOM es el canal universal entre capas** (atributos declarados). 3. **Regla 2-de-3**: extender el contrato morfo solo se justifica si ≥2 capas lo consumen. 4. **Cero dependencia externa**: el framework implementa lo que necesita (tiene posicionamiento propio tipo floating-ui, motor de animación propio, i18n propio, validación de esquemas propia, bus de eventos propio…). Cuando adopta un protocolo abierto, lo reimplementa con paridad verificada. 5. **Guard mecánico**: cada sistema nace con su verificador automático (lint del contrato CSS, checks por tier, auditoría por componente). 6. **Nada destructivo corre por defecto sin registro explícito.** Además de las capas, el ecosistema tiene **arts** (artefactos de runtime inyectables): `bus` (eventos tipados), `orca` (orquestación declarativa de acciones sobre eventos, con dependencias, transacciones y compensación LIFO), `sium` (esquemas de validación, interop Standard Schema), `perm` (autorización server-authoritative con guard ``), `session`/`auth`, `http`, `connection` (realtime websocket), `storage`, `prefs` (preferencias: intención de usuario × entorno × valor efectivo), `motion`, `scene` (efectos ambient WebGL), `adom` (DOM reactivo), `timer`, `logger`. Convención: `Engine*` = núcleo puro sin estado reactivo; `Active*` = envoltorio reactivo. Los arts NUNCA importan de las capas UIX; cuando necesitan algo del DOM u otra capa, reciben un **puerto estructural** inyectado. Sobre las capas hay **tiers**: *canon* (componentes con contrato completo, ~110), *packs* (decoración hoja opt-in), *blocks* (composiciones de función de página). Regla de admisión: todo lo que tenga superficie de contrato se construye en el canon ANTES de que un tier lo componga. Los **ejes ortogonales** existentes (sonido, idioma, tema, motion) siguen todos el mismo patrón: un motor (art o capa) + un módulo por componente (`sema/components/{x}.ts`, `langs/components/{x}.ts`…) + cableado en la raíz de composición + vocabulario en el canon + guard mecánico. **El eje agéntico debe instanciar este patrón, no inventar otro.** --- ## 2 · El fundamento semántico ya existente: la familia `delegate` El vocabulario semántico del ecosistema proviene de un libro de diseño propio («Diseñando lo que ocurre»). Su 8ª familia, **`delegate`**, responde a la pregunta perceptiva **«¿quién actúa ahora?»** y define el ciclo de vida completo de una delegación: ``` delegate.offer → el sistema ofrece encargarse de algo delegate.plan → el sistema propone un plan o curso de acción delegate.authorize → el usuario concede permiso o alcance delegate.act → el sistema actúa por el usuario delegate.review → el sistema espera revisión antes de aplicar delegate.escalate → el sistema pide intervención humana delegate.return → el control vuelve al usuario ``` Doctrina clave del libro (cap. 29): **no es una familia de IA** (macros, reglas, workflows y aprobaciones también delegan); no tiene intent (tono evaluativo) por defecto — el intent aparece en el RESULTADO que la acción delegada produce; y los riesgos de diseño canónicos son: no distinguir sugerencia/plan/autorización/ejecución, no explicitar alcance, no ofrecer cancelación, no dejar claro cuándo vuelve el control. La secuencia canónica del «sistema que propone y aplica cambios» (Apéndice C del libro) es literal: ``` delegate.plan → signal.warn+risk → delegate.review → delegate.authorize → delegate.act → sustain.processing → commit.apply+affirm ``` Estado en el código: la familia está declarada (tipos, verbos, política de intent, holds) pero **ningún componente la emite todavía** — es la única familia sin materializar. Existen tres reservas previas firmadas: `Aura` (componente canónico futuro: indicador visual de agente activo, materializa `delegate`+`sustain`), «delegate-family ↔ agent chat» (sobre la familia de componentes de chat ya construida), y «soporte agentivo» en `palabras` (el editor de documentos por bloques — un agente rellena contenido). --- ## 3 · La tesis de diseño > **No es un componente; es un eje.** Un componente-agente monolítico que > conociera a cada componente invertiría la dirección de dependencias. El eje > se descompone como los demás ejes ortogonales: un **motor** (art `$agent`) + > un **contrato de participación por componente** (manifiesto de capacidades) > + un **registro en runtime** + unas pocas **superficies UI** propias > (indicador de presencia, tarjeta de revisión, panel copiloto). La regla de oro (versión corregida tras la auto-crítica): > El agente actúa a través de la **misma API pública** del provider que usaría > el código de la aplicación — la ruta de llamada no se bifurca. Pero la > **concreción semántica depende del actor**: los eventos del componente > declaran capacidad `delegate` (mecanismo de eventos polimórficos ya > sancionado en el contrato morfo, `allowedFamilies`) y el provider concreta > `{family:'delegate', verb:'act'}` cuando la invocación llega con contexto de > actor agente. Así sema suena, eidos pinta y la accesibilidad anuncia — con > la respuesta correcta a «¿quién actúa?». Si una capacidad necesita una > puerta que la API pública no tiene, esa puerta se promociona al componente; > nunca se bifurca la cadena. --- ## 4 · Decisiones FIRMADAS (vinculantes) ### D-AG.1 — Nombre y hogar del motor | Sub | Decisión | Rationale | | --- | --- | --- | | 1a | Arte **`agent`** (alias `$agent`), `EngineAgent` (núcleo puro) + `ActiveAgent` (reactivo, contrato estándar `ActiveEngine`) | Convención descriptiva de la mayoría de arts; los nombres propios se reservan a piezas de rol abstracto | | 1b | **Factory feature-scoped a nivel app** (`defineActiveAgent(...)`, patrón de auth/session/perm: construcción explícita en la aplicación). Nada en la superficie UIX en v1; promoción futura a accessor `uix.agent` cuando exista consumidor canónico | El agente no es core; precedente firmado del motor de escenas (factory primero, promoción después); la raíz UIX standalone no puede construir sus dependencias | | 1c | **Adaptadores de proveedor LLM en `$agent/adapters/*` fuera del barrel principal** (quien no los importa no los paga — precedente `$logger/adapters`). Un **transporte determinista scriptado** es ciudadano de primera clase (tests sin mocks, demos estáticas) | Resuelve la tensión zero-dependence ↔ proveedor: el motor solo conoce el puerto estructural `AgentTransport`; los formatos provider-shaped viven en adaptadores opcionales | ### D-AG.2 — Protocolo de transporte y eventos | Sub | Decisión | Rationale | | --- | --- | --- | | 2a | **Protocolo de eventos PROPIO, espejo de la taxonomía AG-UI**: 5 categorías — ciclo de run · deltas de mensaje · tool-calls (args en streaming + resultado) · estado · custom. Nombres alineados con el canon semántico donde corresponda. AG-UI queda como *baseline de paridad* (mismo patrón que se usó con floating-ui) | El protocolo ES el contrato; el transporte es fontanería. Espejo propio da libertad de vocabulario manteniendo verificabilidad contra el estándar de facto | | 2b | **El streaming lo posee cada adaptador** (fetch + ReadableStream/SSE parseado localmente). Los arts `http` y `connection` quedan intactos | El cliente HTTP del ecosistema no tiene streaming hoy; dárselo es una iniciativa colateral que no debe gatear este track | | 2c | **Estado como snapshot-por-turno en v1**: los `reads` viajan como snapshot al abrir cada turno. La categoría snapshot/delta queda **reservada tipada** en el wire; los deltas (JSON Patch) llegan con la generalización sin romper el protocolo | Evita maquinaria de sincronización sin consumidor, sin pintarse en una esquina | --- ## 5 · Decisiones PROPUESTAS (en revisión — desafíalas) ### N1 · El sustantivo primario es el Run Un **Run** = una delegación completa gobernada por el ciclo `delegate` (principio, presupuesto, resultado, devolución de control). La **Conversation** es una superficie que *encadena* runs — el chat es un consumidor del agente, no su núcleo. Permite agentes sin chat (el caso «rellena mi documento» es un run sin conversación). ``` Conversation (opcional) └── Run (la unidad primaria) ├── Turn (un intercambio con el modelo) │ └── CapabilityCall (un delegate.act sobre un componente) └── Context (snapshot de reads al abrir el turno) ``` ### N2 · La máquina de estados del run = los verbos delegate, literal ``` ┌─────────── escalated ──────────┐ ▼ │ offered → planned → reviewing → authorized → acting ─┤ │ │ (opcional por (siempre, │ ▼ │ │ política) aunque auto) ▼ returned ← control SIEMPRE vuelve └─────────┴──── cancelled ─────────────────────────┘ ``` - `review` es opcional por política (N5); `authorize` existe siempre, aunque sea automático — la transición queda registrada aunque no haya UI. - `returned` es el único cierre sano («todo proceso abierto necesita salida»); `escalated` no es terminal — espera humana que desemboca en continuar o cancelar. - **Interrupción del usuario = `return` inmediato, nunca un error.** - Cada transición emite su semántica (N6): el estado del run es observable perceptualmente, no solo un enum. ### N3 · El tool-loop Vive en `EngineAgent`, en cliente, v1 (consecuencia de D-AG.1c/2b). Acts **secuenciales** (el paralelismo complica undo y narración perceptiva sin consumidor que lo pida). Fallos tipados → verbos: recuperable→reintento acotado · alcance-insuficiente→`escalate` · abortado→`return`. **Presupuestos de primera clase**: máx. acts por run, máx. turns, timeout, `AbortSignal` inyectado en cada capacidad; agotamiento → `escalate` automático, jamás silencio. (Verificado: los guards de re-entrada del orquestador del ecosistema NO alcanzan un loop que se origina fuera del bus — el presupuesto debe ser del motor.) ### N4 · Elicitación (el agente pregunta a mitad de run) El agente suspende, hace una pregunta **tipada** (esquema sium de la respuesta esperada) y reanuda con la respuesta. Modelada dentro de `escalated`, con dos salidas: respuesta → continúa · silencio/cancelar → `returned`. En v1 entra como categoría reservada del protocolo; se materializa con la superficie de conversación. Sinergia propia del ecosistema: el generador de formularios por esquema puede auto-renderizar la pregunta. ### N5 · Autonomía: la política del agente | Nivel | Ciclo efectivo | | --- | --- | | `suggest` | offered → planned → *(fin: solo propone)* | | `review` | … → reviewing → authorized → acting (default recomendado) | | `auto` | … → authorized(auto) → acting — **solo capacidades reversibles** | Resolución estilo prefs: la app fija el techo, el usuario ajusta por debajo, la capacidad puede exigir MÁS control (nunca menos). Deny-overrides. **Irreversible ⇒ review siempre, no negociable.** ### N6 · Semántica del run (quién emite qué) - El **motor no emite nada** (es un art; no conoce el DOM). Expone el run como estado reactivo observable. - Las **superficies del agente** (Aura, review-card, conversación) declaran en SUS contratos morfo los eventos del ciclo (`delegate-offer/plan/review/ authorize/escalate/return`); `sustain-processing` pertenece a Aura con persistencia ligada al estado del run. - Los **componentes actuados** concretan `{family:'delegate', verb:'act'}` en sus eventos existentes vía eventos polimórficos, cuando la invocación llega con **contexto de actor** (`actor:'agent'` + id de run en cada CapabilityCall — contrato del motor). ### N7 · Identidad del agente Multi-instancia por construcción (la factory lo da gratis), **singleton por convención en v1**. Cada instancia lleva `identity` (nombre + descripción, que el modelo necesita como system-context). Ningún «registro de agentes» hasta que exista el segundo. ### N8 · Memoria v1: `ActiveAgent` posee conversación/runs **en memoria** (snapshot()). Un refresh mata el run en curso → `returned` con huella (los acts aplicados persisten en el componente; no hay corrupción porque los acts son transaccionales del lado del componente). Persistencia (historial entre sesiones, audit-trail) = adapter de storage opcional, **diferida con hueco declarado**. Restricción conocida: el orquestador del ecosistema prohíbe ser store — el audit-trail necesita vehículo propio o no existe. ### D-AG.3 (abierta) · El contrato de capacidades — la bisagra motor↔componentes | Sub | Recomendación (no firmada) | Alternativas | | --- | --- | --- | | 3a | Contrato **estructural en el arte**: `AgentCapability`/`AgentRead` (ids string, args Standard-Schema, handler opaco — patrón puerto). Los manifiestos del lado UIX lo satisfacen tipando contra la API del provider | Registro entero del lado UIX con el arte ciego · manifiesto dentro del morfo (descartado: viola 2-de-3) | | 3b | **Emisor sium→JSON Schema** + `description` obligatoria por read/act/arg | Backend consume la forma propietaria del validador · JSON Schema a mano (drift) | | 3c | Registro **por instancia con id estable** + predicado reactivo `available` por act + evento capabilities-changed entre turnos | Estático por montaje · mono-instancia v1 (colapsa con dos editores) | | 3d | **Resultado tipado (sium)** + clases de fallo mapeadas a verbos (retry/escalate/return) | Texto libre · ok/fail binario | ### Cola restante (aún sin proponer en detalle) Superficies propias (Aura · review-card con su socio obligatorio `signal.warn+risk` · panel copiloto como block · slot de actividad de tool en el chat) · doctrina de amenazas (§7) · secuencia de fases del track · **delegado al track del editor**: los 4 ejes de su integración (formato que emite el agente · one-shot vs streaming · por dónde entra · alcance de escritura) y la provenance en su modelo de documento. --- ## 6 · Lo que la auto-crítica adversarial ya encontró (no lo repitas — supéralo) Sometimos la propuesta v1 a un panel adversarial (7 lentes, 43 agentes, cada hallazgo verificado contra el repositorio intentando refutarlo): 34 confirmados (6 críticos), 4 refutados. **Las correcciones ya están integradas en §3–§5.** Resumen de lo confirmado, por tema: **Críticos (corregidos en el diseño actual)** 1. La emisión `delegate` no tenía dueño (la «regla de oro» original era contradictoria) → resuelto con eventos polimórficos + contexto de actor (N6). 2. El registro de providers al montar invertía la dirección de dependencias (canon → eje opcional) → manifiestos como datos estáticos + binding de instancia sin conocimiento provider→agente (D-AG.3a/3c). 3. La provenance «persistente» como atributo DOM no puede persistir (el DOM es derivación) → provenance = campo del modelo de contenido; el atributo es pintura derivada. (Delegado al track del editor.) 4. Usar el orquestador como ejecutor violaba su invariante («los artefactos no consumen orca; solo la app registra acciones») → ruta por defecto: llamada directa a la API del provider; orquestación reservada a cadenas multi-componente registradas por la app. 5. Sin política de concurrencia usuario↔agente (el streaming roba el caret y destruye el redo del editor) → política pendiente de detallar en el track del editor; primitivas del motor: pausa/abort/return (N3). 6. La secuencia construía el framework genérico antes que el piloto y pre-firmaba decisiones ajenas → v1 mínimo, generalización al 2º consumidor. **Mayores (agrupados)**: APIs programáticas del editor semánticamente mudas (no emiten eventos — hay que promocionarlas); el «pack sema por familia» no existe como concepto (el carácter es por-evento/por-componente); `perm` es error de categoría para capacidades cliente-locales (split: consentimiento local × perm solo para scopes de servidor); compensación del orquestador ≠ undo de usuario (la reversión la da la historia nativa del componente); un run debe ser UN paso de undo (falta puerta transaccional pública en el editor); sin presupuestos anti-runaway (→ N3); vocabulario de scopes indefinido y sin guard que audite la veracidad del manifiesto; falta la fila de degradación («con agente ausente, todo funciona al 100%»); `reads` sin doctrina de consentimiento (contenido del usuario viaja al LLM); sin transporte determinista (→ D-AG.1c); coste del streaming sin medir; a11y sin resolver (anuncios de acciones del agente; el indicador visual no puede desaparecer bajo reduced-motion); exposición prematura en la raíz UIX (→ D-AG.1b); backend server-authoritative contradecía una decisión previa («el transporte es de la app») → transporte app-land (D-AG.1c/2b); ningún guard mecánico en el plan (pendiente de la secuencia). **Refutados** (el diseño original resistió): la lectura de la regla 2-de-3 para el atributo de provenance; la ruta de acceso del indicador Aura a su motor de efectos (ya estaba firmada); el orden de fases de Aura; la preocupación por targets DOM en la emisión. --- ## 7 · Amenazas identificadas y AÚN SIN RESOLVER (aquí queremos tu mejor crítica) 1. **Inyección de prompt**: los `reads` inyectan al modelo contenido no autorado por el usuario (documentos importados, mensajes de otros participantes, texto pegado) y la salida del modelo se convierte en `acts`. No hay modelo de amenaza: ¿etiquetado de origen del contexto? ¿gating de acts cuando el contexto contiene material no confiable? ¿qué hacen bien otros? 2. **TOCTOU**: nada liga el plan revisado al estado sobre el que `act` ejecuta. Entre review y act el documento puede cambiar (el propio usuario, otro run). ¿Fingerprint/versión del estado en la autorización? ¿re-review automático si el estado derivó? 3. **Persistencia y recuperación del run**: recarga a mitad de stream, runs huérfanos, audit-trail sin vehículo de almacenamiento decidido. 4. **Identidad de instancia y ensamblaje de contexto a escala**: con decenas de componentes montados (el caso formulario), ¿qué reads entran en el prompt, con qué presupuesto de tokens, y cómo direcciona el modelo la instancia concreta? 5. **La costura con el proveedor LLM**: resuelta estructuralmente (adaptadores fuera del barrel), pero sin diseñar los adaptadores concretos ni la estrategia de paridad entre proveedores (formatos de tool-call divergen). --- ## 8 · Referencias externas Dos pasadas de investigación web sobre fuentes primarias. **Nota de método**: la segunda pasada extrajo 25 claims citados de documentación oficial, pero su fase de verificación adversarial falló por límite de infraestructura — los marcamos «(sin verificar)»; todos citan fuente primaria. ### 8.1 · Convergencias de la primera pasada (moldearon las decisiones §4–§5) - **Taxonomía de eventos de protocolo** (AG-UI como formalización más limpia) → D-AG.2a. · **Frontend tool calling** como contrato más load-bearing (CopilotKit `useCopilotAction`, Vercel AI SDK tools, MCP tools) → D-AG.3. - **Registro de contexto legible** (CopilotKit `useCopilotReadable`) → los `reads`. · **HITL en dos formas** (aprobación previa + interrupción tipada a mitad de run — LangGraph interrupts, MCP elicitation) → N4. - **Generative UI** (actividad de tools en el transcript) — hueco reconocido en nuestra superficie de chat. · **Proyección model-facing** (descripciones + JSON Schema) → D-AG.3b. ### 8.2 · Hallazgos de la pasada profunda (sin verificar; fuente primaria citada) **AG-UI** (docs.ag-ui.com — CopilotKit es su autor; afirma adopción de Google/LangChain/AWS/Microsoft/Mastra/PydanticAI → candidato a estándar de facto): - **17 tipos de evento en 5 categorías**: 5 de ciclo de run (RUN_STARTED/FINISHED/ERROR, STEP_STARTED/FINISHED), 3 de texto (TEXT_MESSAGE_START/CONTENT/END), 4 de tool-calls (TOOL_CALL_START/ARGS/END/RESULT), 3 de estado (STATE_SNAPSHOT, STATE_DELTA, MESSAGES_SNAPSHOT), 2 especiales (RAW, CUSTOM). → Nuestro baseline de paridad para D-AG.2a ya tiene lista concreta. - Patrón triple **start/content/end** para todo streaming; los args de tool llegan como deltas de JSON parcial (permite pintar la actividad mientras el modelo aún genera). - Estado: **snapshot + delta JSON Patch (RFC 6902)**, aplicación secuencial, y **resincronización por re-snapshot** (no por replay de eventos) — valida nuestra D-AG.2c (snapshot primero, delta reservado). - **Tools frontend se declaran por-run** (`RunAgentInput.tools`, campo reservado a tools del cliente) y el resultado vuelve como **mensaje `role:'tool'`** en el historial — el roundtrip se cierra por la vía de mensajes, no por canal aparte. → Informa el mapeo wire de D-AG.3d. - **DESAFÍA N2/N4**: AG-UI modela el HITL como *caso particular de frontend tool calling* (una «confirmation tool» que el frontend renderiza y cuya decisión vuelve como resultado) — **no tiene primitiva de protocolo para aprobaciones**; los interrupts se reanudan iniciando un run nuevo con un array `resume`. Nosotros elevamos review/authorize/escalate a estados observables del run porque nuestra semántica (`delegate`) lo exige. Es una divergencia deliberada — pregunta 3/12 al evaluador. **CopilotKit** (docs.copilotkit.ai): - `useCopilotReadable`: pares **descripción-natural + valor**, composición **jerárquica** (parentId refleja el árbol de componentes), **gating por-readable** (`available: enabled|disabled`), serialización custom (`convert`) y `categories`. → Valida D-AG.3b/3c; la jerarquía padre-hijo de contexto es una idea que NO teníamos (candidata para el ensamblaje de contexto de §7.4). - Plataformas: React/Next GA, Angular/Vue/React-Native, **Svelte ausente** — evidencia directa del hueco de oportunidad. **MCP Apps (SEP-1865, estatus Final)** (modelcontextprotocol.io): - UI embebida como **recursos `ui://` predeclarados** referenciados por tools; comunicación iframe↔host **reutilizando JSON-RPC de MCP** (rechazado el «objeto API global» inyectado); **sandboxing obligatorio** + mensajería auditable; y **el HOST controla la autorización** de tool-calls iniciadas desde la UI (no el servidor ni la UI). → Alinea con N5 («la app fija el techo») y aporta doctrina de seguridad para superficies embebidas. ### 8.3 · Huecos que nadie cubre bien (oportunidades) **Semántica perceptiva de la delegación** (familia `delegate` + sonido/motion/hold — nadie tiene un equivalente), **undo transaccional de un run**, **accesibilidad de acciones de agente** (anuncios de «quién actúa», reduced-motion del indicador), **provenance de contenido** como doctrina, y **ecosistema Svelte-nativo** (vacío confirmado en la referencia principal). *(Pendiente: re-verificación adversarial de los claims 8.2 y fichas de Vercel AI SDK/AI Elements, assistant-ui, OpenAI Apps SDK/ChatKit, LangGraph, generative-UI y kits headless — la pasada profunda cubrió a fondo AG-UI/CopilotKit/MCP Apps antes del fallo de infraestructura.)* --- ## 9 · Preguntas concretas al evaluador 1. **La tesis** (§3): ¿«eje con motor propio» es el modelo correcto, o hay uno superior (p. ej. protocolo puro sin motor, agente 100% backend con la UI como terminal tonto, o UI generada dinámicamente sin manifiestos)? 2. **N1**: ¿Run como sustantivo primario — conoces casos reales donde este modelo rompa y Conversation-primero sea estructuralmente necesario? 3. **N2**: ¿La máquina estados=verbos es completa? ¿Faltan estados (paused, resuming, degraded, partial-failure)? ¿Es correcto que `escalated` no sea terminal? 4. **N3**: ¿Loop en cliente v1 — qué riesgos reales (seguridad, consistencia, coste) vs loop en servidor? ¿Qué presupuesto falta (rate, coste en tokens, sandboxing de args)? 5. **N5**: ¿El modelo de autonomía de 3 niveles con deny-overrides tiene agujeros conocidos? ¿Cómo manejan otros la escalada de privilegios mid-conversation? 6. **N6**: ¿La concreción semántica por actor (mismo evento, familia polimórfica) tiene agujeros — p. ej. acts que disparan cascadas de eventos secundarios, o composiciones donde el actor se pierde? 7. **D-AG.2c**: ¿Snapshot-por-turno es suficiente en la práctica, o los deltas de estado son imprescindibles antes de lo que creemos (¿casos límite de staleness?)? 8. **Amenazas §7**: para inyección de prompt y TOCTOU en agentes-en-UI, ¿qué patrones concretos de mitigación existen ya en la industria? 9. **Identidad de instancia** (§7.4): ¿cómo resuelven otros el direccionado de N instancias del mismo tipo de componente y el presupuesto de contexto? 10. **Referencias**: ¿qué framework/protocolo/paper relevante NO está en §8? 11. **A11y**: ¿qué exige (o exigirá) WCAG/ARIA para acciones autónomas de agente en la UI? ¿Hay precedente de anuncios de «quién actúa»? 12. **Lo que no preguntamos**: ¿qué pregunta deberíamos estar haciendo y no está en esta lista? --- ## 10 · Glosario mínimo | Término | Significado | | --- | --- | | morfo / soma / sema / eidos | Las 4 capas: contrato declarativo / comportamiento headless / semántica perceptiva / visual | | provider | La clase soma que da vida a un componente (estado + handlers) | | `runtime.trigger(e)` | La única vía de disparo de eventos declarados: prewrite → emisión semántica → handler → derivación DOM | | familia / intent / verbo | Clasificación semántica canónica de todo evento (8 familias · 6 intents · verbos por familia) | | `delegate` | La familia del reparto de acción («¿quién actúa ahora?») — §2 | | eventos polimórficos (`allowedFamilies`) | Mecanismo morfo por el que un evento declara varias familias posibles y el provider concreta cuál en runtime | | hold / stamp | Ventana perceptiva en la que sema estampa `data-event-*` en el DOM y eidos reacciona | | arts | Artefactos de runtime inyectables (bus, orca, sium, perm, http, storage, prefs…) | | orca | Orquestador declarativo: acciones sobre eventos del bus, con transacciones y compensación — solo la APP registra acciones | | sium | Motor de esquemas/validación propio (interop Standard Schema) | | prefs | Preferencias: intención de usuario × entorno × valor efectivo | | tier canon / packs / blocks | Componentes con contrato / decoración opt-in / composiciones de página | | Aura | Componente canónico reservado: indicador visual de agente activo (materializa delegate+sustain) | | palabras | El editor de documentos por bloques del ecosistema (primer consumidor del eje) | | manifiesto agéntico | El contrato de participación de un componente: `reads` (estado legible) + `acts` (capacidades tipadas) | | Run / Turn / CapabilityCall | Unidad de delegación / intercambio con el modelo / invocación de una capacidad |