13 KiB
| title | type | date | branch | spec | doctrina | plan |
|---|---|---|---|---|---|---|
| CONTINUE — Eje agéntico ($agent) · punto de reanudación | process / handoff | 2026-07-28 | alpha-0.1-sec-dom (COMPARTIDA entre sesiones — disciplina abajo) | docs/spec/delegation-contract.md (NORMATIVA — se construye CONTRA ella) | docs/architecture/agent.md (el PORQUÉ) | PLAN-agent.md (el acta, fila a fila) |
CONTINUE — Eje agéntico ($agent)
Track del agente como tal; la integración por componente pertenece al track
de cada componente. Este documento es el punto de reanudación: qué hacer
primero, qué está bloqueado y qué trampas ya nos costaron tiempo. La historia
está comprimida al final — si buscas el acta completa, está en
PLAN-agent.md.
1. Lo primero al abrir sesión
git fetch gita && git log --oneline -3 # la rama es COMPARTIDA: mira quién tocó
npm run agent:check # guard del eje (D-AG.11)
npx vitest run src/arts/agent # 33/33 (10/10 son conformance)
Si algo de eso no está verde, eso es el trabajo, no lo de abajo.
2. Bloqueado: dos firmas del usuario
Están escritas en §D de la spec, que es donde viven las decisiones abiertas de un DRAFT (al promocionar, §D debe quedar vacía). No las firmes tú.
| Decisión | ¿Bloquea? | |
|---|---|---|
| §D.1 · AG-35 | Presencia: SHOULD o MUST. Recomendación razonada ya escrita en la spec: SHOULD + política que lo eleve a MUST — rehusar por defecto rompería los 30 tests del motor y le quitaría al app el derecho a expresar el ciclo a su manera (el playground de agnt ya lo hace SIN Aura) |
No |
| §D.2 · AG-41 | La forma del canal de elicitación | SÍ — bloquea F4b |
Por qué §D.2 bloquea: la elicitación está especificada y no cumplida, y
la razón es estructural, no cosmética — la escalada lleva una razón tipada
pero no la pregunta, y resolveEscalation(runId, 'continue' | 'cancel')
no tiene por dónde llevar una respuesta. Hacen falta los dos sentidos:
AgentRunSnapshot.elicitation?: { requestId, prompt, schema? } // la pregunta sale
resolveEscalation(runId, resolution, answer?) // la respuesta entra
Ambos aditivos (nada existente rompe), y el protocolo ya tiene la forma
reservada en elicitation-request (AG-48). Pero la forma es decisión de
spec, no de implementación: por eso está en §D y no en un TODO.
3. Desbloqueado: empezar por aquí
F4b — los dos manifiestos, con dueños ya firmados en PLAN-agent.md §5b.
No dependen de §D.
- Manifiesto de
form(forma ESQUEMA) — args tipados sium + validación + write-scope por campo. Es el único componente cuyo manifiesto el motor ya sabe escribir: los args de una capacidad SON schemas (toJsonSchema, F1 construido), así que agente→componente y componente→agente (la elicitación) son la misma proyección en los dos sentidos. - Manifiesto de
table/tree-grid(forma CONJUNTO) — actos sobre N filas, OCC por fila, batch como transacción. Es donde la claim «delegación como transacción» deja de ser palabra: sobre texto es casi trivial. - Al aparecer el primer manifiesto en
src/uix/agent/components/, se encienden solas las cinco auditorías dormidas deagent-check(drift manifiesto↔API · tier de madurez · veracidad de reversibilidad · calidad model-facing · no-bypass). Ya están declaradas en el script. - Lo demás de F4b: árbol de manifiestos · promoción
uix.agent(cierra D-AG.1b) ·toJsonSchema→$sium· wiringidentity.locale ← prefs· chat como consumidor (provenance por mensaje · slot de actividad · vista conversacional del run).
Chat y palabras son CONSUMIDORES, no jueces (§5b). El criterio no es disponibilidad sino dificultad: «un formato lo decide su caso peor». Ambos son texto lineal — probar solo ahí habría sesgado el manifiesto hacia texto en silencio. Inventario al firmar: 170 morfos, 0 con capacidad
delegate.
F2 — piloto palabras: sigue GATED hasta que su track firme sus 4 ejes F-B. Cuando abra es el TERCER contexto y hereda patrón, no lo define.
4. Estado
Cerrado: F0 doctrina · F1 motor · F3 Aura completa (0–8, audit PASS) +
promoción uix.scene · F4a marco de integración APP · la spec · los dos
vehículos de conformance.
Los dos vehículos que la spec exige existen y ambos citan requisitos — condición para que «conformance» no sea retórica:
| Vehículo | Qué verifica | Estado |
|---|---|---|
$agent/conformance |
El contrato, por la puerta pública. Portable: no importa createEngineAgent; habla con un ConformanceSubject estructural |
10/10 · cubre AG-2/4/5/6/9/10/21/25/26/50 |
agent-check |
La participación (manifiestos) | 1 de 6 auditorías viva (anti-falsificación de actor); 5 esperando el árbol |
AG-35 y AG-41 están fuera del kit a propósito mientras §D siga abierta,
con un test que fija esa ausencia: afirmar un requisito sin decidir sería
inventar la decisión.
Aura: component:audit PASS (0 errores; 3 warnings heurísticos del harness
compartido). Anillo de custodia + orbe-contorno + Status en dos líneas + tres
desenlaces expresados. Variantes de Aura.Indicator: orb (defecto, afinado
para 32-48px) · portal (esfera a contraluz, luce en superficie grande) ·
aurora. Las elige el desarrollador.
Flecos (ninguno bloqueante)
- El pulso de
commit-selectdel onion se corta si el consumidor cierra el anillo al elegir: el sello dura su hold, pero el nodo ya se desmontó. Arreglo: retención tipoPresenceen el cierre. reviewingvsescalateda 22° de hue;loss(plum) a 16° deprimary. La FORMA los distingue (AG-44, fijado porshapes.test.ts) y los declines van a neutral, así que no comparten superficie. Retintar de verdad exigiría una escala nueva: no hay hueco entre las 9 actuales.- Diferidos con disposición (acta en PLAN §F4a): resumen semántico de contexto
(F5) ·
supersededpor OCC (F2) · journal por defecto en factory.
Sin firmar, sin bloquear
- Canal de corrección a mitad de run (
amend/nudge): no existe — un prompt nuevo es un run nuevo. Cambio de motor + protocolo; su sitio natural es la sección de reservas de la spec. - Pre-run elicitation (que pregunte ANTES de proponer): hoy solo puede
preguntar escalando a mitad. Con
Form.AutoFieldscomo vehículo ya no necesita chat, pero sí decidir si el motor abre un hueco de «run de clarificación» o se compone con un runsuggest.
5. Verificación
npx vitest run src/arts/agent # 33/33
npx vitest run src/uix/eidos # 361/361
npx vitest run src/uix/soma/components/aura # 11/11
npm run agent:check # limpio
npm run morfo:vocabulary # sin errores (warnings ajenos)
npm run docs:check # 1 error AJENO (callout)
npm run check # 73 errores = AJENOS preexistentes
/uix/components/aura— demo canónica: anillo on/off, tamaños, variantes, switch studio (220px) y los seis estados por compuertas deterministas, SIN modelo. El sitio para juzgar el componente aislado./active/docs/agnt— página del arte: playground gated + §Real model (modelo real: Aura + anillo radial) + transporte + el bus como eje de iniciativa.- Entorno del usuario: Ollama en
:11434conqwen3-coder:30b(CPU mayormente → 2-3 min/turno). El:8080es Open WebUI (API keys OFF — NO sirve como endpoint directo).
6. Disciplina y gotchas (leer ANTES de tocar)
Rama y git
- Rama COMPARTIDA entre sesiones concurrentes: índice y working compartidos,
el staging puede evaporarse. Commits SIEMPRE en bloque atómico
git reset -q && git add <paths explícitos> && verify && commit. Jamás amend. Ficheros mixtos con trabajo ajeno: stagear solo lo mío (backup →git checkout HEAD --→ mi cambio →add→ restaurar suyo+mío). contracts.testtiene 2 fallos AJENOS conocidos (menubar/radio-group), ydocs:check1 (callout). No son tuyos.- El HEAD puede retroceder bajo tus pies: si tus commits no salen en
git log -3, comprueba congit merge-base --is-ancestor <sha> HEADantes de alarmarte — normalmente la otra sesión commiteó encima.
Verificación visual
- Chrome en SEGUNDO PLANO congela
rAFyResizeObserver(visibilityState === 'hidden'): el canvas se queda en 300×150 y las medidas mienten. Verificar pintado o tamaño exige la ventana DELANTE. (Media hora perdida diagnosticando un «bug» que era esto.) - Pane oculto: no dispara clicks reales y tampoco compone frames.
- Vite escucha en
::1, no en127.0.0.1, y la extensión de Chrome rechazalocalhost→ hace falta--host 127.0.0.1(ya está en.claude/launch.json, configverify). - MIRA el render antes de enseñar. Regla dura re-aprendida dos veces: un
efecto construido desde un resumen de texto sale mal (el
portalnació como anillos planos porque leí «concentric layers» en vez de mirar la referencia).
Trampas de código que ya nos mordieron
createEngineTimers()comotimersdel motor TIPA pero revienta:EngineTimersexponeschedule, noonce; el primer timeout llama aundefinedy el run cierra comotransport-error. La factory deactive-appadapta el puerto justamente por eso.fallbackTargetgana sobre eltargetdel morfo (contrato deTriggerOptions): un provider que lo pase SIEMPRE ignora en silencio el target declarado. Aura pasa el Ring en los terminales por eso.asserts conditionexige llamarse por un nombre anotado: desestructurarlo de un objeto de contexto son 17 errores de tipo.- Bus payloads = SOLO metadata: jamás goal ni contenido de usuario; el
suscriptor resuelve del módulo por
runId. - openai-chat / Ollama reutiliza
index:0para todas las tool calls del stream: una call nueva se detecta poriddistinto, jamás por index. - Chrome MCP: coords de screenshot ≠ viewport con zoom/scroll — para
sectores SVG usar DOM dispatch (
pointerdown+pointerup+click). - Sesión paralela regenerando rutas → full reload del dev server que MATA runs en vuelo. No es bug propio.
7. Historia comprimida
Hasta 2026-07-22 — F1 motor · adaptador openai-chat (Ollama/llama.cpp/LM
Studio) · conformidad bus/orca (el goal FUERA del payload) · Aura fases 0–8 ·
promoción uix.scene · el patrón «Aura al centro de un OnionMenu». Verificado
E2E contra qwen3-coder:30b real: ciclo completo y escalada por doc.clear
→ Deny → returned(aborted, user-cancel) + documento intacto.
2026-07-23/28 — la superficie visible (rediseño dirigido por el usuario sobre un banco de mockups con el orbe REAL dentro):
- Anillo de custodia (
Aura.Ring): el estado se lee como FORMA — raíl · arco que respira · segmentos = pasos · dos arcos QUIETOS esperando revisión · arco que gira · anillo cerrado + pulso. Movimiento = loops REGISTRADOS, nunca@keyframesde receta. - El orbe es un contorno:
thickness; el hueco es real sobre cualquier fondo. Fuera la rama claro/oscuro ybackgroundColor, que pintaba un disco opaco en el centro. - Color = tokens de rol: antes rotaba el hue — delta medido en OKLCH
aplicado en YIQ, así que
risksalía verde junto a su propio anillo naranja. - Desenlaces expresados: tres terminales con intent intrínseco. Antes un fallo de transporte era indistinguible de un éxito.
- Mapa semántico de color: un hue = un significado en TODA la superficie.
- Status en dos líneas (cierra D1) · variante
portal· modo studio en la demo.
2026-07-23/28 — el contrato: D-AG.12 y §5b firmadas · la spec
DRAFT (50 requisitos) · agent-check · el kit de conformance.