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/docs/process/PLAN-agent.md

442 lines
103 KiB

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

---
title: PLAN — Eje agéntico ($agent) · track del agente como tal
type: process / plan de ejecución
status: v2.2 — D-AG.1/D-AG.2 + bloque §3 + ⚖️1/⚖️2/⚖️3 FIRMADOS (2026-07-21). F0 desbloqueada.
date: 2026-07-21
docs:
informe: INFORME-eje-agentico-revision-externa.md
triage: TRIAGE-revision-externa-agente.md
doctrina-futura: docs/architecture/agent.md (F0, no existe aún)
scope: |
ESTE track = el agente como tal (motor, protocolo, contratos, ciclo, semántica,
superficies propias). La integración en palabras (4 ejes F-B, provenance en su
modelo, puertas mudas, transact, concurrencia espacial) pertenece al TRACK DE
PALABRAS, que consume el contrato definido aquí.
provenance: |
Ids entre corchetes = origen: N* (propuesta propia) · G* (Gemini) · C* (ChatGPT)
· F* (Fable) · Z* (z.ai). Detalle y veredictos en el triage.
---
# PLAN — Eje agéntico (`$agent`)
## §1 · Tesis y principios (doctrina, no negociable sin re-firma)
1. **Es un eje, no un componente**: motor (art) + contrato de participación por
componente + registro + superficies propias. Instancia el patrón de eje
ortogonal existente (motor + módulo-por-componente + wiring + canon + guard).
2. **Regla de oro**: el agente actúa por la MISMA API pública del provider; la
ruta de llamada no se bifurca, pero la **concreción semántica depende del
actor** (eventos polimórficos `allowedFamilies` → `{family:'delegate',
verb:'act'}` cuando el actor es el agente). Puerta ausente ⇒ se promociona
al componente; nunca bypass.
3. **Actor-agnóstico** (libro cap. 29): macro, regla, workflow o LLM — todos
son «otro actor». Nada del eje depende de un proveedor LLM concreto.
4. **Degradación total**: con el eje ausente, todo componente funciona al 100%.
Fila §0 de contratos mínimos obligatoria en F0.
5. **Presupuestos cliente = cortesía de UX, no frontera de seguridad** [F4a]:
la frontera vive donde vive la credencial (proxy/backend). Se declara así
de honesto en la doctrina.
## §2 · Decisiones FIRMADAS (2026-07-21, vinculantes)
| D | Decisión |
| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **D-AG.1a** | Arte `agent` · `$agent` · `EngineAgent` (puro) + `ActiveAgent` (reactivo, contrato ActiveEngine) |
| **D-AG.1b** | Factory feature-scoped `defineActiveAgent(...)` a nivel app (patrón auth/session); NADA en ActiveUix v1; promoción a accessor `uix.agent` con el consumidor canónico (precedente scene-D4) |
| **D-AG.1c** | Adaptadores de proveedor en `$agent/adapters/*` fuera del barrel (precedente `$logger/adapters`); **ScriptedAgentTransport determinista first-class** (tests sin mocks, demos estáticas) |
| **D-AG.2a** | Protocolo de eventos PROPIO espejo de AG-UI (5 categorías: run · deltas · tool-calls · estado · custom), nombres alineados con el canon; AG-UI = baseline de paridad (patrón ethereal) |
| **D-AG.2b** | El streaming lo posee cada adaptador (fetch+ReadableStream/SSE local); `$http`/`$connection` intactos |
| **D-AG.2c** | Estado = snapshot-por-turno v1; categoría snapshot/delta RESERVADA tipada; JSON Patch en la generalización |
Enmiendas menores a D-AG.2 aceptadas en triage (no alteran lo firmado, se
firman con el bloque §3): dirección tipada del canal de estado [F7], mapeo
wire de review/elicitación como confirmation-tool [F3e], versionado de
protocolo y manifiestos en el handshake del run [F12].
## §3 · Decisiones A FIRMAR (consolidadas del triage)
> Cada bloque es una decisión firmable. ⚖️ marca las bifurcaciones con
> alternativas reales donde hace falta TU elección; el resto lleva la forma
> recomendada ya consensuada por la revisión cruzada.
### D-AG.3 — Modelo de dominio y sesión [N1 · G1 · C1 · C3 · F2]
- **La escalera, documentada**: `ActiveAgent` = **sesión** (larga vida,
contexto entre runs — «hazlo otra vez en la sección 2») → `Run` =
**delegación** (presupuesto, autorización, agrupado de undo, devolución de
control) → `Turn` = coordinación → `CapabilityCall` = **mutación** (lo único
que toca el mundo). Conversation = superficie opcional que encadena runs.
- **Run degenerado**: una sola call auto-autorizada (macro/regla/workflow —
el caso no-IA del libro) es un Run válido y barato.
- **`initiative`** [C3]: `'user' | 'system' | 'scheduled'` en la identidad del
Run, viajando en el contexto de actor de cada call. Alimenta política
(D-AG.7), a11y y audit. El verbo de entrada la insinúa (`offer`-first =
iniciativa del sistema).
- **Reservas** (huecos declarados, no construidos): `parentRunId` (sub-runs /
agente-como-capacidad / A2A) [C6]; identidad de usuario en el vocabulario de
actor (multiusuario, llega con `connection`) [F12].
- ✅ **Modo ambiental** (always-on) [F2a·G1·C6] — **FIRMADO ⚖️1: fuera del eje
v1, RESERVADO CON NOMBRE**: `Subscription`/watcher que emite `delegate.offer`;
micro-runs coalescidos = diseño futuro (F5). Deja constancia para que no
crezca un segundo sistema de agencia paralelo por la puerta de atrás.
### D-AG.4 — Máquina de estados del run [N2 · C2 · G4 · G5 · F3]
- Estados = verbos `delegate`, **como custodia del control, no fases
cognitivas** [C2]: el ciclo plan→tool→plan del modelo vive DENTRO de
`acting`.
- **`reviewing` re-entrante** desde `acting` [C2·F3a] (aprobaciones
parciales/incrementales).
- **La autorización fija alcance** [F3a]: `authorized` deriva del plan un
**allowlist de capacidades + presupuesto**; un act fuera de alcance ⇒
`escalate` automático a re-review (ni fallo ni silencio). Sin esto, la
review es teatro.
- **`returned` con outcome tipado** [F3b·G4]: `completed | partial |
rolled-back | aborted | error`, con `reason` (p. ej. `superseded` — la
premisa cambió por mutación externa; `budget-exhausted`; `killed`).
**Política de fallo a mitad de secuencia — FIRMADO ⚖️3: rollback a
inicio-de-run por defecto** (el usuario autorizó el plan entero, no la
mitad; reversión vía historia nativa); una capacidad puede DECLARAR en su
manifiesto que admite cierre parcial cuando tenga sentido.
- **`escalated`**: no terminal; `reason` tipado (`elicitation |
insufficient-scope | budget-exhausted | out-of-plan`) [F3d]; **timeout →
auto-return** (escalada abandonada) [G5].
- **Pausa sin verbo nuevo** [F3c]: pausa = `return` con contexto reanudable;
reanudar = run nuevo encadenado en la sesión (coincide con el `resume` de
AG-UI — la mecánica wire y nuestra semántica convergen).
- **Interrupción del usuario = `return` inmediato**, jamás error.
- **Kill switch global** [F12]: primitiva del motor (`disable()`) → todos los
runs `returned(aborted)`. Cubre «agente presente pero desactivado YA».
### D-AG.5 — Tool-loop y presupuestos [N3 · G2 · G3 · F4]
- Loop en `EngineAgent`, cliente, v1; **portabilidad a servidor como requisito
explícito** del núcleo (sin DOM, sin runes en el Engine) [F1c].
- Acts **secuenciales** v1. Fallos tipados → verbos (recuperable→retry acotado
· alcance→`escalate` · abortado→`return`); clase **`unknown-capability`**
(tool alucinada) devuelta como tool-result para auto-corrección, acotada por
presupuesto [F4c].
- **Presupuestos first-class**: máx. acts/run · máx. turns · timeout
(uix.timers) · **tokens/contexto con política de truncado local**
(FIFO + resumen) [G3·Z2] · `AbortSignal` en cada capacidad. Agotamiento ⇒
`escalate`, jamás silencio. (Los guards de orca NO alcanzan este loop —
verificado.)
- **Idempotencia** [G2·Z3]: dedupe por `toolCallId` en la puerta de capacidad;
reintento tras timeout de red devuelve el resultado cacheado, nunca
re-ejecuta.
- **Topología de credenciales** [F4a]: adapter-proxy hacia el backend del app
como topología de primera clase documentada; directo-a-proveedor desde el
navegador = footgun señalado a gritos.
### D-AG.6 — Contrato de capacidades y reads [D-AG.3 previa · G7 · G11 · C5 · F1a · F4c · F5a · F9]
- **6a Hogar**: contrato estructural en el arte (`AgentCapability`/`AgentRead`:
ids string, args Standard-Schema vía sium, handler opaco — patrón
MotionDom/SceneDom); los manifiestos uix (`src/uix/agent/components/{x}.ts`)
lo satisfacen tipando contra la API del provider. El handler opaco da
location-transparency gratis (reserva distribuida) [C6].
- **6b Proyección model-facing**: emisor **sium→JSON Schema** + `description`
obligatoria por read/act/arg. **Límites de tamaño por arg** en el contrato
[F4c].
- **6c Instancias y contexto — push→pull** [F9·G11]: índice siempre presente
(id estable + tipo + etiqueta + resumen de una línea, jerárquico — valida el
parentId de CopilotKit) + reads profundos como capacidad pull
(`read(instanceId)`) + **priorización por foco/viewport** (señal UIX-nativa)
- ambigüedad de direccionado ⇒ **elicitación**, no heurística. `available`
reactivo por act + `capabilities-changed` entre turnos; call pendiente
contra capacidad revocada ⇒ fallo tipado → escalate [C13a].
- **6d Resultados**: tipados con sium; los RESULTADOS de reads/acts con
contenido de terceros son tan no-confiables como un documento importado
(misma doctrina de origen) [F4c].
- **6e Traits** [C5]: annotations para el razonador (coste, latencia,
estabilidad, staleness) — precedente MCP tool annotations.
- **6f OCC** [G7·F8d]: cada read exporta `_version`; cada act la exige; mismatch
⇒ `StateStaleError` recuperable (re-read → re-plan).
- **6g Altitud** [C4]: capacidades = mutaciones MECÁNICAS del mundo, pocas y a
la altura correcta (`replaceRange`, no 12 micro-inserts). Operaciones
semánticas (`summarize`, `translate`) = cognición del modelo; «skills»
agent-side reutilizables (equivalente MCP prompts) = tier RESERVADO.
- **6h Tiers de madurez del manifiesto** [F1a]: `reads-only` → `acts
reversibles` → `acts completos`; el guard audita el tier declarado; los ~110
componentes entran incrementalmente sin gatear el eje.
- **6i Reversibilidad POR-EFECTO** [F5a]: no por-capacidad; efectos externos
(enviar/publicar/notificar) = irreversibles por definición; la autoridad de
reversión es la historia nativa del componente (nunca compensación de orca).
### D-AG.7 — Autorización, consentimiento y política [N5 · G8 · G9 · C3 · F5 · F8]
- Tres niveles (`suggest | review | auto`), resolución estilo prefs (app =
techo, usuario ajusta por debajo, la capacidad exige MÁS control, nunca
menos), **deny-overrides**; irreversible ⇒ review SIEMPRE.
- **Riesgo dinámico por payload** [G9]: el manifiesto declara clasificador de
riesgo sobre args; `auto` escala a `review` por invocación.
- **Origen del contexto en la resolución** [F8b — la unificación]: cada read
lleva etiqueta de origen (`authored-by-user | imported | third-party |
other-participant`); **cualquier origen no-confiable en el turno BAJA el
techo** (⇒ `review`, o `suggest` para capacidades sensibles). §7.1 del
informe deja de ser amenaza abierta: es una fila más de esta resolución.
- **`initiative` afecta techos** [C3]: iniciativa autónoma (`system` /
`scheduled`) ⇒ defaults más estrictos que la pedida por el usuario.
- **Autorización vinculada al estado, no a la prosa** [F8d]: la review computa
contra fingerprint F de los reads relevantes; la autorización se liga a F +
**TTL**; deriva ⇒ recomputar diff (idéntico → re-aprobación automática
opcional; distinto → re-review). Cierra TOCTOU (§7.2 del informe).
- **Fatiga de aprobación** [F5b]: grants persistentes («siempre permitir X»)
con TTL y alcance explícito (sesión/componente/tipo de act); la review
muestra **el cambio concreto propuesto en el dominio del app, nunca prosa**
(enmendado 2026-07-22 — el contenido de la review es del APP; ver doctrina
«The review surface» en agent.md §7).
- **`capabilities-changed` ⇒ re-gate** de grants [F5c].
- **perm** solo para scopes que tocan servidor (aplicado en el proxy/tool-loop
server-side); el caso base es política local sin dependencia de perm.
- **`reads` = sujetos de permiso simétricos a `acts`** (consentimiento de qué
viaja al modelo; componentes sensibles no registran reads).
### D-AG.8 — Semántica, actor y a11y [N6 · G6 · G12 · F1b · F6 · F11]
- El motor NO emite (art sin DOM); expone el run como estado reactivo. Las
**superficies** declaran el ciclo en sus morfos (`delegate-*`;
`sustain-processing` es de Aura, stateBound, limpiado al cerrar). Los
**componentes actuados** concretan `delegate.act` vía `allowedFamilies` con
contexto de actor.
- **Acuñación del actor** [F6b]: el contexto de run es un **token opaco
emitido solo por el motor** por CapabilityCall — no un literal construible;
el guard verifica que nadie en el canon fabrica actores a mano.
- ✅ **Propagación causal del actor** [G6·F6a] — **FIRMADO ⚖️2: híbrido (d)**.
El actor es un **token opaco acuñado solo por el motor** (F6b), llevado como
UN slot reservado en el **envelope causal que el framework ya propaga**
(`OrcaEventMeta` en la vía orca; el bag `context` del envelope de bus en la
vía bus), heredado profundidad-a-profundidad **igual que `traceId` ya lo
hace**, y leído por sema SÍNCRONAMENTE vía un campo `actor?: ActorToken` en
`TriggerOptions → SemanticSignal` (verificado: legible antes del primer
`await` de `EngineSemantic.emit` para `pre`/`coincident`). AsyncContext/ALS
(la cadena `als.ts` de orca) es **auto-relleno oportunista, NUNCA la
garantía** — en navegador degrada a root, que sema no tolera. Esto COMPARTE
el primitivo de propagación con la traza OTel de D-AG.9 (run=trace,
CapabilityCall=span, **actor=baggage**) sin bifurcar la agencia (⚖️1). La
hipótesis OTel-baggage se confirma, corregida por el caveat browser-await:
la fiabilidad viene del envelope explícito; lo ambiental es azúcar.
**Enmiendas vinculantes del stress-test**:
1. **Justificación corregida**: explícito gana a ambiental por integridad de
**AUDIT / provenance de efectos secundarios** (WAL D-AG.9 + traza OTel),
NO por anuncio síncrono per-emit — el anuncio va COALESCIDO POR PLAN por
Aura (WCAG 4.1.3), nunca per-act, y `data-actor` es pintura derivada del
MODELO (eidos lee el estado reactivo del run). Sema lee `signal.message`
verbatim y NO resuelve el token de actor.
2. **Hogar del tipo**: el tipo branded `ActorToken` vive en una **hoja bajo
orca Y agent** (`$libs` o arte-hoja) para evitar el ciclo orca→agent; la
autoridad de acuñar/resolver queda en `EngineAgent`. La vía bus lleva el
actor en el bag `context` sin tipar → su defensa anti-forja es el lint de
`agent-check` (D-AG.11), no el sistema de tipos.
3. **«Ya propaga» corregido**: el contexto causal NO cruza hoy la
suscripción bus→orca (solo `payload`), ni `publishCausedBy`
(solo causation/correlation), ni `withOptionalEnvelopeFields`; incluso
`traceId` se re-enraiza ahí. El retrofit es **acotado y presupuestado en
~6 costuras**: `OrcaEventMeta.actor`, `OrcaALSContext.actor`, forwarding
de `ctx.emit`, copia en `buildChildEnvelope`, forwarding de
`busEnvelope.context.actor` en la suscripción, y `publishCausedBy` +
`withOptionalEnvelopeFields` con merge del padre.
4. **Garantía acotada + fasing**: la garantía síncrona/autoritativa se
entrega para el **puente A→B autorado explícitamente** que hila
`opts.actor`. Agente-mueve-componente-de-stock por la API pública NO tiene
call-site → en navegador (ALS muerto) resuelve al **sentinel `USER`
branded** = best-effort, fuera de v1, NO se cierra con plumbing pervasivo
en providers. La atribución IN-SCOPE viaja por el `data-actor` derivado
del modelo (sin hilar `opts.actor`); la baggage del envelope es
específicamente para **efectos secundarios out-of-scope + audit**.
**F1 construye SOLO el primitivo** (ActorToken branded + sentinel USER +
registro privado + guard anti-forja + `actor?` en TriggerOptions leído en
el prepare-loop de emit). **El retrofit de propagación (enmienda 3) se
DIFIERE** a la fase con un consumidor real de cascada async out-of-scope
(F3+), gateado por el drift-check del guard (ambiental nunca es el único
portador en un puente cross-componente).
- **Run sin superficie = prohibido por encima de suggest** [F1b]: autonomía >
`suggest` exige superficie de presencia registrada (Aura mínima); el motor
rehúsa (o advierte) al entrar en `acting` sin ella. Verificable.
- **Write-scope declarado** [G10]: el run declara su alcance de escritura
(componente | parte | rango); hold y pintura aplican solo a ese scope.
(Materialización por componente → track palabras.)
- **Contrato a11y del eje** [F11·G12·Z11]:
1. UNA live region `polite` propiedad de Aura; anuncios **atribuidos**
(«Agente: …») y **coalescidos por lote/plan** — jamás por delta ni por
act individual (WCAG 4.1.3).
2. **No-robo-de-foco como invariante del MOTOR** (WCAG 3.2.1/3.2.2), no
cortesía de cada superficie.
3. `aria-busy` en la región mutándose durante streaming; anuncio de
completitud al cerrar.
4. Elicitaciones **posponibles**, no modales por defecto (WCAG 2.2.4).
5. **Salida global por teclado** (doctrina Esc): cancelar/return alcanzable
sin ratón. Aura `reduce: 'static-frame'`, jamás `hide`.
Oportunidad §8.3: nadie tiene este patrón — documentarlo es fijarlo.
### D-AG.9 — Persistencia, audit y observabilidad [N8 · F10 · F12]
- v1: sesión en memoria (`snapshot()`) **+ journal write-ahead mínimo por run**
vía `$storage` (sessionStorage vale): autorizaciones + acts aplicados;
detección de runs huérfanos al recargar [F12]. (Orca no puede ser store —
verificado.)
- **Puerto de trazas con forma OTel GenAI** [F10]: run = trace, CapabilityCall
= span — el puerto se define YA, el vehículo de almacenamiento llega
después. Responde §7.3 del informe. **Comparte el primitivo de propagación
con el actor** (⚖️2, D-AG.8): un solo carrier de contexto causal, cargas
distintas (traza = export async/tolerante a pérdida; actor = lectura
síncrona/autoritativa). En el borde de export se emite una etiqueta
no-autoritativa (`'agent'`) para observabilidad; el token resoluble nunca se
serializa (anti-forja F6b).
- Persistencia de conversaciones/historial entre sesiones: adapter `$storage`
opcional, diferida con hueco.
### D-AG.10 — i18n del agente [F12 · cruce con eje langs]
`identity`/system-context lleva el locale efectivo (`prefs.language`); el
idioma en que el agente responde y en que se ANUNCIA (live region, superficies de review del app)
sigue el eje langs como cualquier superficie. Los textos del eje (anuncios,
estados) = catálogos `langs/components/` normales.
### D-AG.11 — Guard mecánico `agent-check` [F1a · F5a · F6b · F12 · crítica previa]
Nace CON el árbol de manifiestos (no después). Audita: manifiesto ↔ API
pública real (drift tipado) · tier de madurez declarado [F1a] · veracidad de
reversibilidad por-efecto (review-always para APIs de reemplazo destructivo)
[F5a] · **calidad model-facing** (descriptions no vacías, args descritos,
clases de fallo declaradas — determina si el modelo usa bien las capacidades)
[F12] · anti-falsificación de actor (ningún sitio del canon construye
contextos a mano) [F6b] · no-bypass (todo act mapea a puerta emisora).
## §4 · Secuencia de fases
> Regla heredada del precedente blocks/scene: decisiones firmadas ANTES de
> código; guard en la misma fase que crea la superficie que vigila; doctrina
> con gate propio.
| Fase | Contenido | Verifica / guard |
| ----------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **F0 · Doctrina** ✅ (doc) | `docs/architecture/agent.md` ESCRITA + registrada en el índice: capítulo comparativo (matriz 6 refs + bibliografía de seguridad) · tesis+principios · dominio+máquina de estados · contrato de participación · **fila §0** · actor primitivo (⚖️2) · autorización · a11y · amenazas. **Corrección**: la fila §0 vive en la DOCTRINA (§4 del doc), no en `src/uix/contracts.ts` — el agente es un arte APP-level (D-AG.1b), no una capa UIX; su degradación se verifica en la suite del arte (`arts:check`) cuando F1 cree `arts/agent`, no en el boundary-test de UIX | `docs:check` ✅ 0/0 · (degradación → `arts:check` en F1) |
| **F1 · Motor mínimo** ✅ (2026-07-21) | **ENTREGADO** — `src/libs/actor` (ActorToken branded + sentinel `USER_ACTOR`) · `src/arts/agent` (24º arte, alias `$agent`): `EngineAgent` (máquina D-AG.4 completa — suggest/review/auto, escalated con reason+timeout, returned outcome-tipado, cancelled pre-autorización, kill switch, autorización journaled incluso auto; loop D-AG.5 — acts secuenciales, fallos→verbos, unknown-capability acotado, idempotencia por callId, presupuestos acts/turns/wall-clock, AbortSignal; techo por origen no-confiable F8b; acuñación de actor con registro privado WeakMap — forjados resuelven a null) + `ActiveAgent` (sesión reactiva, contrato ActiveEngine, `activeRun` para Aura) + puerto `AgentTransport` + protocolo v1 (`protocol.ts`: 5 categorías + dirección tipada + reservas state/elicitación + versionado) + `ScriptedAgentTransport` (`$agent/adapters/scripted`, fuera del barrel) + journal WAL (memory + webStorage, detección de huérfanos) + puerto de trazas OTel (run=trace, call=span, label no-autoritativa) + emisor sium→JSON Schema (`toJsonSchema`, nota de promoción a $sium al 2º consumidor) + costura `actor?` en `TriggerOptions→SemanticSignal` (runtime copia verbatim; sema no resuelve) + **`defineActiveAgent`** (service-factory app-level D-AG.1b: adapta el `ActiveTimers` del core al puerto `AgentTimersPort` + logger del core — cero setTimeout a pelo en runtime; tests con puerto manual determinista + flush `settle()` nombrado). | ✅ suite 18/18 · ✅ arts:check 0/0 (24 arts) · ✅ portabilidad (Engine sin DOM/runes) · ✅ anti-forja testeado · ✅ sema 178/178 · check: 0 errores propios |
| **F2 · Piloto palabras** | ESTE track entrega: capacidad tipada contra la API de palabras + OCC (\_version) + write-scope + journal. El TRACK PALABRAS entrega su lado (4 ejes F-B firmados allí, puertas mudas promocionadas, `api.transact`, concurrencia espacial). Corre contra ScriptedAgentTransport | run end-to-end en demo estática · un run = un undo · Playwright |
| **F3 · Semántica + superficies** ✅ CERRADA (2026-07-22) | `allowedFamilies` delegate en el 1er componente actuado (→ REUBICADO a F2: su hogar natural es el piloto, el primer componente actuado real) · **Aura** (dueña de sustain-processing; live region; reduce static-frame) · ~~review-card~~ **DESCARTADA como componente** (anclaje dev-tools; resolución 2026-07-22 con el usuario: framework = estados del ciclo expresados + afordancias authorize/reject/cancel — que Aura YA da — + semántica de «propuesto por otro actor»; el CONTENIDO de la review es del APP en su propio dominio; una tarjeta-diff es legítima a nivel de una app concreta, jamás canon — doctrina «The review surface» en agent.md §7) · pack sema de los eventos de superficie (resuelto: family-default, decisión firmada de capa 1). **Progreso 2026-07-21 — Aura fases 0–1 ✅**: decisión de pertenencia (SOMA; compose-first: orb=$scene en eidos, cancel=Button asChild, región propia espejo de Announce) + **morfo `aura.ts`** — EL PRIMER morfo del repo con eventos familia `delegate` (delegate-offer · delegate-escalate untilAction · delegate-return, los tres con requiresLiveRegion) + `sustain-processing` stateBound (dueña Aura, target indicator) + 5 partes (provider/indicator/status/**region** role=status aria-live=polite aria-atomic/cancel trigger) + texts (estados + anuncios atribuidos «Agent: …») + `expression: 'family-default'` (el perfil bajo de delegate es decisión firmada de capa 1; la modulación por intent de §F6 es visual → eidos/scene). Verificado: morfo:vocabulary limpio (solo WARN preexistente de cropper) · esquemas 114/114. Gotcha de convención: la clave de `stateRef` debe ser un VALOR representativo del vocabulario declarado (precedente progress/file-upload), no un nombre conceptual. **Fase 2 soma ✅ (2026-07-21)**: `soma/components/aura/` completo — provider raíz con puerto estructural `AuraAgentSource` (duck-type de ActiveAgent; soma NO importa $agent — degradación total: sin agente = idle válido), watcher de transiciones en constructor ($effect + untrack, cero write-loops), mapeo custody-of-control (authorized→acting; terminales→idle), `sustain-processing` stateBound con clearSignal al salir + guard de carrera (si el run avanzó antes de resolver el emit), `delegate-escalate` untilAction + clear en resolución, `delegate-return` = anuncio único consolidado atribuido en la Region PROPIA (role=status/polite/atomic — sin doble anuncio por la vía compartida), cancel() = salida global (disabled en idle, aria-label langs) + 5 wrappers + types + exports + README + catálogo `langs/components/aura.ts` (es/en) registrado + barrel soma. **Test 6/6** con `EngineSemantic({visual:false})` REAL (la degradación explícita del §0) — prueba emits/persistencias/clears de verdad; contracts sweep verde (solo los 2 fallos AJENOS preexistentes); svelte-check 0 errores propios. **Fases 4–5 eidos+recipe ✅ (2026-07-21)**: `eidos/components/aura/` completo — root `<Aura>` (data-size responsive sm/md/lg) · `<Aura.Indicator>` = el orb: **aurora `$scene` real** montada con el patrón de ciudadanía del pack (engine por superficie DOM WeakMap — eidos NO importa $packs, frontera dura), params modulados por estado según §F6 (velocidad/amplitud/hue: idle .35/.45 neutral → acting 1.2/1 primary → escalated 1.7/1.15 **threat**; reviewing **risk** — mapeo canon de intents), colores vía `eidos.resolveToken('--color-{role}-solid')` (jamás getComputedStyle), fallback = gradiente radial CSS del recipe (ES el render bajo reduced-motion static-frame del engine / SSR / effect off — la presencia nunca desaparece) · `<Aura.Cancel>` compone `<Button>` vía child/asChild (defaults diferidos al Button canónico — regla de la casa, sin ghost/neutral hardcodeado) · Status/Region passthrough · recipe `aura.css` sin @keyframes (R-4.5: el movimiento es del scene) + región sr-only + tokens `aura` en base.ts (orb-size por talla, tinte por estado en slots de rol re-tintables por tema). **Gates**: generate:eidos-css ✓ · api-contract+lint+visual-attrs+generated-css 25/25 · recipe-css-contract 30/30 · eidos-lint aura CERO inválidos · check 0 errores propios. **Fase 6 demo ✅ + VERIFICADA (2026-07-21)**: `web/routes/uix/components/aura/+page.svelte` — v2 9 pestañas con harness compartido (SystemAxes/MotionPanel/SemaPanel/DemoTrace); **la demo compone el MOTOR REAL** (`createActiveAgent` + transporte con COMPUERTAS deterministas — botones «Model responds»/«Act completes», cero timers, cero estados falseados); drivers del ciclo completo (auto/review/suggest × user/system, run irreversible→escalada, authorize/reject, approve/deny, Stop = el Cancel del componente). **Verificación**: consola 0 errores · ciclo COMPLETO conducido en vivo (planned→acting→returned→idle con «Agente: terminó — control devuelto» atribuido y en es; escalada con stamp `data-event-family="delegate"` PERSISTENTE untilAction → deny → stamp delegate-return en hold → auto-limpieza a null — **primera estampa delegate del ecosistema verificada en DOM**); review path (reviewing espera→authorize→acting); computed styles decisivos (orb 20/28px por talla, tinte neutral→primary oklch(0.56 0.18 306)→threat oklch(0.63 0.19 23), opacity .5 idle); **pixel-check en Chrome REAL con capturas**: página entera + orb en acting con la AURORA WEBGL PINTANDO dentro del canvas (27×27 DPR-ajustado), Cancel = Button real (data-button, asChild); Region role=status/polite con el anuncio; screenshot del pane cuelga (limitación documentada §13 de la guía — vía sancionada usada); smoke scoped **PASS** (gotcha: MSYS_NO_PATHCONV=1 para SMOKE_SCOPE en Git Bash); check 0 errores propios. **Corrección de tamaño (2026-07-21, señalada por el usuario)**: los orb-size iniciales (14/20/28px) eran INVENTADOS — violación de «never improvise» + magic numbers. Corregido con derivación canónica: `--aura-orb-size-{k}: var(--avatar-size-{k})` (sm 32 / md 40 / lg 48) — Avatar = la primitiva de disco de presencia/identidad; un tema que retoca avatares retoca el orb. Verificado en navegador (32/40/48 computados + look real). **Promoción `uix.scene` (D4) ✅ EJECUTADA (2026-07-21)**: `defineEngineScene` (service-factories, espejo de motion, junto a dom) · `defineUixServices` la registra · superficie ActiveUix (standalone crea con dom real / undefined con dom disabled; attach lee `app.scene` ?? fallback con `ownsScene`; getter; dispose en orden events→scene→motion; types con doc) · `contracts.ts` (fila + publicSurface) + expectativa del boundary-test · `ActiveEidos.scene` accessor · el indicator PREFIERE `eidos.scene` (presupuesto global) con WeakMap fallback fuera del árbol · scene/README + arts/README actualizados (el pack conserva sus engines propios — packs no consumen uix). Gotcha del guard: exportar la clase provider en el barrel soma exige indirection `internals.ts` (literal `provider.svelte` prohibido en exports.ts — precedente calendar). Gates: contracts 67/69 (2 fallos AJENOS conocidos) · arts:check 24 · check 0 propios · navegador: canvas montado por la vía compartida tras reload. **Fases 7–8 ✅ (2026-07-22) — AURA COMPLETA (0–8), `component:audit` PASS**: README eidos con comparativa (5 refs — thinking-indicators/CopilotKit/Vercel useChat.status/presencia colaborativa Figma-Docs/assistant-ui; paisaje escaso reconocido, §8.3 «nadie tiene esto») + Decisiones + excepción R-1.5 documentada (único focusable = Cancel, focus del Button) + Gaps con disposición (diferir×3/descartar). Fixes del audit: opacity `0.5`→`var(--opacity-50)` (R-4.2); `apg: 'none — …'` en el morfo (A-1.4). Gates: **component:audit PASS 1/0/0** (2 warnings heurísticos D-1.5/D-4.3 = falsos positivos por usar el harness compartido DemoTrace/SemaPanel, bajo umbral) · morfo:vocabulary limpio · eidos-lint aura 0 inválidos · recipe-contract verde. **Primer componente del eje agéntico cerrado de punta a punta.** Commit F1+F3(0–6): `6be7195f0`. **F3 CERRADA (2026-07-22)**: review resuelta como doctrina (sin componente nuevo — split framework/app en agent.md §7) y allowedFamilies reubicada a F2. Commit fases 7–8: `2c175c5d9`. **Siguiente**: F4 por la vía del chat (2º consumidor no gateado: participante con provenance por modelo de mensaje + composer como entrada de delegación + manifiestos + agent-check) · F2 piloto palabras cuando su track firme los 4 ejes. | `component:audit` de ambas · morfo-check · axe/SR pass del contrato a11y |
| **F4 · Generalización** | Árbol `src/uix/agent/components/` + registro por instancia (índice push→pull) + **`agent-check`** (D-AG.11) + 2º consumidor (chat agéntico: participante + redactor + slot de actividad de tool) + elicitación materializada (Form.AutoFields) + promoción `uix.agent` (cierra D-AG.1b) | `agent-check` verde · 2 manifiestos reales (**dueños firmados §5b: `form` + `table`/`tree-grid`**) · fila §0 attach |
| **F4a · Marco de integración APP** ✅ (2026-07-22) | **Auditoría completa del track** (encargo del usuario: divergencias + marco independiente del componente). Divergencias CAZADAS y CORREGIDAS (4 firmadas sin implementar): initiative→techo (C3: system/scheduled clampa auto→review) · presupuesto de contexto D-AG.5 (maxContextBytes, FIFO-trim byte-based, el goal sobrevive; resumen diferido) · tope por-arg F4c (maxArgBytes→invalid-args tipado) · schema de resultado D-AG.6d (`result?` Standard-Schema; mismatch = recoverable, no cuenta como act). Divergencias ESTRUCTURALES resueltas: **integración bus** (patrón session EXACTO: el arte posee el vocabulario `agent.*` en consts + bus-helpers tipados publican con bus INYECTADO; `defineActiveAgent` cablea `core.bus`; source='agent', **correlationId=runId** = la costura causal ligera sin el retrofit de 6 costuras) · **orca app-land** (el APP registra acciones sobre `agent.run.closed/escalated` — invariante intacto; probado con orca REAL) · **página del arte `/active/docs/agnt`** (convención de la casa que faltaba: sección Delegation en nav, artículo + **playground VIVO** con los 4 motores puros reales compuestos en página — bus log en vivo, journal WAL, contador orca, kill switch reactivo, compuertas deterministas). Gates: agent 26/26 (integration.test: spine motor→bus→orca real + los 4 fixes) · smoke agnt PASS · check 0 propios · verificado en pane + Chrome real (ciclo completo, orca archiva, kill oculta drivers). Divergencias DIFERIDAS con disposición: resumen semántico de contexto (F5) · superseded producido por OCC (F2, lado componente) · wiring identity.locale←prefs (F4 con uix.agent) · journal por defecto en factory (app decide vehículo). **Auditoría de conformidad bus/orca ✅ (2026-07-22, pregunta del usuario)**: contraste punto-a-punto contra los README de ambos — conforme en 12/13 (module-events consts+types+bus-helpers = patrón documentado literal · envelope correlationId · Rule 5 payloads planos clonables · eventos-como-constantes · module→bus/action→ctx.emit · artifacts-no-consumen-orca · Rule 7 N/A a module events). **1 no-conformidad real corregida**: `goal` (contenido del usuario) viajaba en `AgentRunBusPayload` — viola higiene de credenciales del bus («pasa correlationId y que el suscriptor resuelva del módulo») y §Events de orca («no unnecessary private data — la acción resuelve del módulo al ejecutar»). Fix: payload = SOLO metadata; el suscriptor resuelve vía `App.agent.run(runId)` (testeado en el spine con orca real: `'goal' in payload === false` + resolución del módulo). Página agnt documenta la higiene + recomendación `configureEvent('agent.run.state', { queuePolicy: ORCA_QUEUE_REPLACE_QUEUED })` (evento frecuente → doctrina de colas de orca; constante verificada). **Carril de INICIATIVA documentado (2026-07-22, pregunta del usuario «¿el bus como eje?»)**: el bus es eje en TRES direcciones — observar (vocabulario `agent.*`) · reaccionar (orca) · **iniciar** (hecho de dominio → acción orca → `App.agent.start({initiative:'system'})` → clamp auto→review por construcción); lo que NO es: vehículo de la delegación (capacidades=handlers no clonables, turnos=request/response del protocolo, contenido en el módulo). Sección «The bus as the initiative axis» + ejemplo en la página. **Adaptador REAL `openai-chat` (2026-07-22)**: `$agent/adapters/openai-chat` (fuera del barrel, D-AG.1c) — dialecto OpenAI chat-completions (Ollama/llama.cpp/LM Studio/proxy), SSE→protocolo v1, sanitización de nombres con puntos (ida y vuelta), **re-pairing de `tool_calls`** al reproducir el transcript (el motor no anota los tool_calls del assistant — memoria por callId en el adaptador), fetch inyectable. **Fix cazado en vivo**: Ollama reutiliza `index:0` para TODAS las calls del stream → call nueva se detecta por `id` distinto (no por index), `call-end` por call arrancada; sin el fix los args se concatenaban (JSON inválido → invalid-args en motor + 400 en replay). Tests 4 (protocolo+nombres · spine motor-sobre-cable con re-pairing verificado en el body del turno 2 · index-reuse split · transport-error close) = agent 30/30. **Demo viva en la página agnt contra qwen3-coder:30b REAL (Ollama 11434; el 8080 del usuario es Open WebUI, API keys off)**: capacidades doc.set-title/append-line (reversibles, sium) + doc.clear (irreversible→escalada), read snapshot-por-turno del doc, streaming en vivo, controles authorize/escalation. **Ciclo entero verificado en navegador**: planned→authorized→acting→returned(completed,done), 3 acts, 2 turnos, doc mutado («Notas activeUIX» + 2 líneas), respuesta final en es (identity.locale), rastro completo en bus (opened/state×4/act.applied×3/closed, correlationId=run-1), CORS preflight 204, consola 0. GOTCHAS: pane oculto no dispara clicks reales (click sintético como sonda) · sesión paralela regenerando rutas mata runs en vuelo (full reload) · CPU inference 30B ≈ 2-3 min/turno. **Aura como superficie de presencia de la demo real ✅ (2026-07-22, corrección del usuario)**: el feedback de «¿está pensando?» NO se improvisa con chips — ES Aura (para eso se construyó). La sección real de la página agnt bootea un uix standalone mínimo (`createActiveUix({langs sium+secs, defaultLocale es})` + `setActiveUix` + `Soma.create()` + `ActiveEidos.create({applyDom, modeSource→tema del shell})` + `eidos/index.css`) — legítimo: un APP compone AMBOS tiers, la demo ES el app. Motor llama → `createActiveAgent` (mismas opciones: bus+journal; `activeRun` reactivo = AuraAgentSource; stream vía `.engine.onEvent`) y `<Aura {agent}><Indicator/><Status/><Region/><Cancel>` montada; los botones authorize/escalation quedan como afordancias app-level (doctrina §7: Aura da estados+cancel, la review es del app). **Verificado sobre el run real**: idle «Inactivo» → planned «Propone un plan» (langs es resuelto) → … → returned con announcement en Region **«Agente: terminó — control devuelto»** + doc mutado + answer es; Cancel=Button disabled-en-idle; consola 0. Gotcha entorno: canvas 300×150 sin dimensionar en pane oculto (rAF congelado — el orb pinta en Chrome visible; pixel-verificado en F3). **Presencia perceptible + superficie radial ✅ (2026-07-22, diseño del usuario)**: `Aura.Indicator` default pasa al efecto `orb` de $scene (anillo vivo con ruido + luz orbitando — el aurora-banda leía estático a 32-48px; el usuario eligió el orb existente tras descartar mi `halo` inventado, que nació sin verificación visual — lección re-aprendida: Chrome real ANTES de enseñar). Modulación §F6: estado→energía (forceHoverState/hoverIntensity/rotateOnHover) + rol→delta de hue OKLCH ($color.safeParseColor). `aurora` queda variante (commit `d008605fa`). Patrón «Aura al centro de un OnionMenu» (trigger snippet = orb; sectores contextuales reviewing→Authorize/Reject · escalated→Approve/Deny · activo→Stop; auto-open con RE-ASERCIÓN mientras la custodia espera — un cierre externo re-abre) vivo en agnt §Real model + documentado en README de aura. **E2E verificado en Chrome real contra qwen**: la escalada real abre el anillo (orb ROJO al centro, Approve teal / Deny) → Deny → returned(aborted, user-cancel) + announcement + documento INTACTO. | agent suite 30/30 · smoke · check |
| **F5 · Reservas** (cada una con gate propio, ninguna en v1) | deltas JSON Patch · skills semánticas (6g) · modo ambiental (si D-AG.3 lo firma dentro) · sub-runs/A2A · multiusuario · `svrs/agent` (solo si un consumidor real exige autoridad de servidor — respeta «transport app-land») | — |
## §5 · D-AG.12 — el contrato como REFERENCIA ✅ FIRMADA (2026-07-23)
Pregunta original del usuario (2026-07-22): «¿es el mejor diseño o podemos ir
más allá y establecer una referencia?». Firmada tras investigación a fondo el
2026-07-23 (precedente externo verificado a esa fecha, no de memoria).
### D-AG.12a — la spec y su conformance
Se extrae de `docs/architecture/agent.md` una **especificación normativa** —
«el contrato de delegación», en `docs/spec/` — con:
- lenguaje RFC-2119 e **IDs de requisito estables** (`AG-1…n`),
- **escalera de estabilidad por sección**: `stable | provisional | reserved`,
- **versionado por fecha** (patrón MCP: la fecha marca el último cambio
incompatible),
- la doctrina se queda como el PORQUÉ; la spec es el QUÉ.
**Conformance en DOS vehículos, no uno** (la distinción es la que evita que
«suite de conformance» sea retórica — un lint del propio repo no acredita a
nadie):
| Estrato | Vehículo | Naturaleza |
| ------------------------- | ------------------------------------------------------- | ------------------------------------------------------- |
| Wire protocol v1 | **kit de fixtures** (semilla: `ScriptedAgentTransport`) | PORTABLE — un tercero lo corre contra SU implementación |
| Contrato de participación | **`agent-check`** (D-AG.11) | lint del repo sobre manifiestos |
Ambos **citan IDs de requisito en sus fallos**. Sin eso la suite no acredita.
**Estado inicial: DRAFT.** La spec se escribe ANTES de F4b para que F4b se
construya CONTRA ella (spec-first), no después para describir lo que salió.
### D-AG.12b — las dos reclamaciones de frontera
Se nombran en la spec **con marcador de estado explícito** (`claimed` vs
`shipped`), porque hoy ninguna está materializada:
- **contexto por atención** — reads push→pull priorizadas por focus/viewport
(señal UIX-nativa; F4). Hoy `claimed`.
- **delegación como transacción** — run = grupo de undo + OCC + write-scope +
`superseded` (⚖️3 + F2). Hoy `claimed`.
### Gate de promoción a 1.0 / «referencia»
**≥2 FORMAS DE DOMINIO distintas**, no «2º consumidor» (corrección firmada el
2026-07-23; ver §5b) + las dos claims con estado `shipped` + kit de fixtures
en verde. Precedente externo que lo respalda: **MCP** ya no promueve a Final
sin escenario en la suite (SEP-2484) y opera lifecycle formal
Active→Deprecated→Removed con ventana de 12 meses; **AG-UI** se volvió
referencia por ADOPCIÓN (AWS Bedrock AgentCore, Microsoft Agent Framework),
no por publicar suite. Conclusión: la spec se escribe antes para gobernar; el
título de referencia se gana después, con consumidores y claims reales.
Posición honesta que la spec DEBE declarar: acts secuenciales v1 ·
cliente-first con portabilidad exigida (`svrs/agent` diferido a consumidor
real) · generalidad en prueba.
## §5b · Quién prueba el eje — FIRMADO (2026-07-23)
El gate de F4 pedía «2 manifiestos reales» **sin asignar dueños**. Esto
rellena ese hueco; no enmienda nada firmado.
**Criterio** (el que sustituye a «el que esté disponible»):
> El probador debe ser aquel cuyo manifiesto sea el **más difícil de
> expresar** — un formato lo decide su caso peor, no su caso fácil.
Aplicado, y con una razón que no es de conveniencia sino de **anatomía del
propio contrato**: los args de una capacidad SON schemas (sium →
`toJsonSchema`, F1 construido) y un run ES una transacción sobre un conjunto
de ediciones. Esquema y conjunto son las dos formas de las que el contrato
está hecho:
| Dueño | Forma | Qué fuerza a resolver |
| ------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **`form`** | esquema | Args tipados vía sium + validación + write-scope por campo. Es el ÚNICO componente cuyo manifiesto el motor ya sabe escribir: agente→componente (args contra campos) y componente→agente (elicitación) son **la misma proyección en los dos sentidos** |
| **`table` / `tree-grid`** | conjunto | Actos sobre selección de N filas, OCC por fila, batch como transacción, `superseded` real. La claim «delegación como transacción» solo aguanta carga aquí; sobre texto es casi trivial |
**Chat y palabras son CONSUMIDORES, no jueces.** Chat entra por lo que solo
él da (provenance por modelo de mensaje · slot de actividad de tool · vista
conversacional de un run); palabras es un actuado más cuando su gate abra.
Ninguno decide el formato del manifiesto ni el gate de la spec. Riesgo que
esto evita, y que era real: chat y palabras son **ambos texto lineal**, así
que un manifiesto probado solo ahí asumiría texto en silencio (rango como
selección, ediciones secuenciales, args string) y el caso peor aparecería
tarde. Dato del inventario al firmar: **170 morfos, 0 declaran capacidad
`delegate`**.
**Corolario firmado — la elicitación NO depende de superficie conversacional.**
Una pregunta tipada es un formulario en contexto: `Form.AutoFields` (ya
previsto en F4) la materializa, descartable y no-modal, que es justo lo que
exige el contrato a11y (WCAG 2.2.4). La nota del protocolo v1
(«materializes with the conversation surface») describía UNA opción, no una
necesidad; corregida en `protocol.ts`.
### La entrada de delegación — patrón, no componente
Materializar el encargo (goal + contexto visible + autoridad) es un **patrón
con pieles**, montado en app-land con piezas del framework — mismo veredicto
que la review-card: el framework da estados, afordancias y piezas; el APP da
el contenido en su dominio. Lo que el servicio aporta —reads priorizadas por
atención— llega **cuando exista** (F4). **Descartado explícitamente** una
entrada global siempre-disponible: roza el modo ambiental, que está FIRMADO
FUERA (⚖️1) y no se recupera por la puerta de atrás.
## §5 · Bifurcaciones que requieren TU elección (⚖️)
| # | Decisión | Estado |
| --- | ------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ⚖️1 | Modo ambiental (D-AG.3) | ✅ FIRMADO: fuera-reservado-con-nombre |
| ⚖️2 | Propagación causal del actor (D-AG.8) | ✅ FIRMADO: híbrido — token opaco de actor como baggage del envelope causal (comparte primitivo con la traza OTel); F1 solo el primitivo, retrofit ~6 costuras diferido a F3+ |
| ⚖️3 | Fallo a mitad de secuencia (D-AG.4) | ✅ FIRMADO: rollback-a-inicio default; parcial por-capacidad |
| §3 | D-AG.3–D-AG.11 (forma recomendada) | ✅ FIRMADO EN BLOQUE (2026-07-21) |
## §6 · Qué NO entra en este track
Los 4 ejes de F-B de palabras, la provenance en el modelo del documento
(`Block.origin`), las puertas mudas del provider, `api.transact` y la
materialización del write-scope → **track palabras**. La doctrina de
`data-actor` como pintura derivada del modelo queda enunciada aquí
(D-AG.8/triage) y materializada allí.

Powered by TurnKey Linux.