docs(agent): D-AG.12 y §5b firmadas — la spec, y quién prueba el eje

Dos decisiones que estaban pendientes, firmadas tras investigación a fondo
(precedente externo verificado a fecha, no de memoria).

D-AG.12 — EL CONTRATO COMO REFERENCIA
Spec normativa en `docs/spec/` (RFC-2119 + IDs `AG-n` + escalera
stable|provisional|reserved + versionado por fecha), en estado DRAFT para que
F4b se construya CONTRA ella y no al revés. La doctrina se queda con el PORQUÉ.
Conformance en DOS vehículos, que es lo que evita que la palabra sea retórica:
kit de fixtures del protocolo (PORTABLE — un tercero lo corre contra SU
implementación; semilla ScriptedAgentTransport) + agent-check (lint del repo),
ambos citando IDs de requisito en sus fallos. Las dos claims de frontera se
nombran con marcador claimed|shipped porque hoy ninguna está materializada.
Gate de promoción a 1.0: ≥2 formas de dominio + claims shipped + fixtures
verdes. Respaldo externo: MCP ya no promueve a Final sin escenario en su suite
(SEP-2484) y opera lifecycle formal con ventana de 12 meses; AG-UI se volvió
referencia por ADOPCIÓN (AWS Bedrock AgentCore, Microsoft Agent Framework), no
por publicar suite. La spec se escribe antes para gobernar; el título se gana
después.

§5b — QUIÉN PRUEBA EL EJE: form + table
El gate de F4 pedía «2 manifiestos reales» sin asignar dueños; esto rellena ese
hueco, no enmienda nada. El criterio deja de ser disponibilidad y pasa a ser
dificultad: un formato lo decide su caso peor. Y form+table no son preferencia,
son la ANATOMÍA del contrato — los args de una capacidad SON schemas (sium →
toJsonSchema, ya construido en F1) y un run ES una transacción sobre un
conjunto de ediciones. Form además dobla: agente→componente (args contra
campos) y componente→agente (elicitación) son la misma proyección en los dos
sentidos.

Chat y palabras quedan como CONSUMIDORES, no jueces. El riesgo que esto evita
era real: ambos son texto lineal, así que un manifiesto probado solo ahí
habría asumido texto en silencio (rango como selección, ediciones
secuenciales, args string) y el caso peor habría aparecido tarde. Inventario
al firmar: 170 morfos, 0 con capacidad delegate declarada.

COROLARIO — la elicitación no depende de superficie conversacional
Una pregunta tipada es un formulario en contexto (Form.AutoFields), descartable
y no-modal, que es justo lo que exige el contrato a11y (WCAG 2.2.4). La nota de
protocol.ts («materializes with the conversation surface») describía UNA opción
y se leía como necesidad: corregida ahí y en la doctrina §7.

DESCARTADO
Entrada de delegación global siempre-disponible: roza el modo ambiental, que
está FIRMADO FUERA (⚖️1), y no se recupera por la puerta de atrás. La entrada
es un patrón con pieles montado en app-land — mismo veredicto que la
review-card.

Handoff `continue-agente-2026-07.md` reescrito para mañana: la spec DRAFT es lo
primero, luego el kit de fixtures, luego F4b con los dueños ya firmados.

Verificado: agent 30/30 · agent:check limpio · docs:check sin errores nuevos
(el único es el preexistente ajeno de callout).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
alpha-0.1-sec-dom
dev 3 months ago
parent d574982ab9
commit ee02c5c55f

@ -401,7 +401,11 @@ others will cite:
nothing and no `signal`/`commit` event exists on the presence surface, so
the consolidated return is the outcome's only expressive site.
4. Elicitations are **dismissible / postponable**, not modal by default
(WCAG 2.2.4).
(WCAG 2.2.4). An elicitation is a **typed question**, so its surface is a
form in context — not a conversation. The schema the agent asks with is the
same projection its capability args already travel through (sium →
JSON Schema), read in the opposite direction; binding elicitation to a chat
would make a general contract depend on one product shape.
5. **A global keyboard exit** (an Esc-like doctrine): cancel / return reachable
without a mouse. Aura uses `reduce: 'static-frame'`, never `hide`.

File diff suppressed because one or more lines are too long

@ -1,7 +1,7 @@
---
title: CONTINUE — Eje agéntico ($agent) · sesión siguiente
type: process / handoff
date: 2026-07-23
date: 2026-07-24
branch: alpha-0.1-sec-dom (COMPARTIDA entre sesiones — disciplina abajo)
plan: PLAN-agent.md (el acta completa, fila a fila)
doctrina: docs/architecture/agent.md
@ -58,6 +58,39 @@ transporte real** (transporte apuntado a un puerto muerto) →
· región «Agente: falló — control devuelto». Antes ese caso era
indistinguible de un éxito.
### Sesión 2026-07-23 (tarde) — dos decisiones firmadas
Investigación a fondo pedida por el usuario («estamos marcando el camino, las
decisiones tienen que ser arquitectónicamente impecables»), con precedente
externo verificado a fecha. Actadas en `PLAN-agent.md` §5 y §5b:
- **D-AG.12 ✅ FIRMADA** — spec normativa en `docs/spec/` (RFC-2119 + IDs
`AG-n` + escalera `stable|provisional|reserved` + versionado por fecha),
**DRAFT** para que F4b se construya CONTRA ella. Conformance en DOS
vehículos: kit de fixtures del protocolo (PORTABLE, semilla
`ScriptedAgentTransport`) + `agent-check` (lint del repo), **ambos citando
IDs**. Las dos claims de frontera se nombran con estado `claimed|shipped`.
Gate de promoción a 1.0: **≥2 formas de dominio** + claims `shipped` +
fixtures verdes.
- **§5b ✅ FIRMADO — quién prueba el eje**: `form` (esquema) + `table`/
`tree-grid` (conjunto). Rellena el hueco «2 manifiestos reales» que el gate
de F4 dejó sin dueños; NO enmienda nada. Chat y palabras quedan como
CONSUMIDORES, no jueces.
- **Corolario**: la elicitación **no depende de superficie conversacional** —
una pregunta tipada es un formulario en contexto (`Form.AutoFields`).
Corregido en `protocol.ts` y en la doctrina §7.
- **Descartado**: entrada de delegación global siempre-disponible (roza el
modo ambiental, FIRMADO FUERA en ⚖️1). La entrada es patrón con pieles,
montado en app-land.
**El razonamiento que lo sostiene, por si mañana se cuestiona**: el criterio
NO es disponibilidad sino dificultad — «un formato lo decide su caso peor».
Y form+table no son preferencia: son la **anatomía del propio contrato** (los
args SON schemas vía sium→toJsonSchema; un run ES una transacción sobre un
conjunto). Chat y palabras son ambos texto lineal: probar solo ahí habría
sesgado el manifiesto hacia texto en silencio. Inventario al firmar: 170
morfos, 0 con capacidad `delegate`.
## Cómo verificar rápido al retomar
```bash
@ -80,56 +113,56 @@ npm run check # 73 errores = AJENOS preexistentes; 0 propios
mayormente → 2-3 min/turno; paciencia). El `:8080` es **Open WebUI**
(API keys OFF — NO sirve como endpoint directo).
## Siguiente trabajo (en orden)
0. **FIRMAR D-AG.12** (PLAN §5, pendiente 2026-07-22): elevar la doctrina a
spec publicable («el contrato de delegación») con `agent-check` como
conformance + nombrar las dos reclamaciones de frontera (contexto por
atención · delegación como transacción). El usuario dijo «sí» a dejarla
planteada; falta la firma formal de forma y alcance al retomar.
1. **F4b — chat como 2º consumidor** (desbloqueado, siguiente):
participante con provenance por modelo de mensaje + composer como entrada
de delegación + árbol de manifiestos `src/uix/agent/components/` +
**completar `agent-check`** (existe ya con la auditoría 5 —
anti-falsificación de actor— viva y probada en negativo; las otras cinco
están DECLARADAS en el script y se encienden al aparecer el primer
manifiesto, que es lo que exige «nace CON el árbol, no después») +
elicitación materializada
(Form.AutoFields) + **promoción `uix.agent`** (cierra D-AG.1b). Con el 2º
consumidor: promover `toJsonSchema` a `$sium` (nota en json-schema.ts) y
wiring `identity.locale ← prefs`.
2. **F2 — piloto palabras**: GATED hasta que el track palabras firme sus 4
ejes F-B. Al abrirse: capacidad tipada contra su API + OCC (\_version) +
write-scope + `allowedFamilies` del primer actuado (reubicada aquí).
3. **Flecos de la superficie** (ninguno bloqueante):
## Siguiente trabajo (en orden) — para MAÑANA
0. **Escribir la spec DRAFT** (D-AG.12a, firmada): `docs/spec/` con el
contrato de delegación — RFC-2119, IDs `AG-n`, escalera de estabilidad,
versionado por fecha, las dos claims marcadas `claimed`. Es lo PRIMERO
porque F4b debe construirse contra ella (spec-first). Sale de
`docs/architecture/agent.md`: la doctrina se queda con el PORQUÉ.
1. **Kit de fixtures del protocolo** (el vehículo portable de conformance):
turnos scripted → transiciones de custodia esperadas, sobre
`ScriptedAgentTransport`. Cada fixture cita su ID `AG-n`.
2. **F4b — generalización, con los dueños ya firmados**:
- manifiesto de **`form`** (esquema): args tipados sium + validación +
write-scope por campo. Enciende las 5 auditorías dormidas de
`agent-check`.
- manifiesto de **`table`/`tree-grid`** (conjunto): OCC por fila, batch
como transacción — es donde la claim «delegación como transacción» deja
de ser palabra.
- **elicitación** = `Form.AutoFields` (sin depender de chat).
- árbol `src/uix/agent/components/` + promoción `uix.agent` (cierra
D-AG.1b) + `toJsonSchema`→`$sium` + `identity.locale ← prefs`.
- **chat** entra por lo suyo: provenance por modelo de mensaje, slot de
actividad, vista conversacional del run.
3. **F2 — piloto palabras**: GATED hasta que su track firme los 4 ejes F-B.
4. **Flecos de la superficie** (ninguno bloqueante):
- **El pulso de `commit-select` del 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 tipo `Presence` en el cierre.
- **`reviewing` vs `escalated` a 22° de hue** (naranja vs rojo): el
canon los separa por rol y la FORMA los distingue, pero perceptualmente
están cerca. Si molesta: `escalated` a `solid-hover`, o retintar el tema.
- **`loss` (plum) a 16° de `primary`** en el tema por defecto — por
eso el «Deny» leía violeta (NO era bug del `OnionColor`: plum ES el rol
`loss`). Con los declines en neutral ya no comparten superficie; regla
escrita: «loss nunca convive con primary». Retintarlo de verdad exige
una escala nueva (no hay hueco entre las 9 actuales).
- **`reviewing` vs `escalated` a 22° de hue** (naranja vs rojo): el canon
los separa por rol y la FORMA los distingue, pero perceptualmente están
cerca. Si molesta: `escalated` a `solid-hover`, o retintar el tema.
- **`loss` (plum) a 16° de `primary`** — con los declines en neutral ya no
comparten superficie; regla escrita: «loss nunca convive con primary».
Retintarlo de verdad exige una escala nueva (no hay hueco entre las 9).
- Diferidos con disposición (acta en PLAN §F4a): resumen semántico de
contexto (F5) · `superseded` por OCC (F2, lado componente) · journal
por defecto en factory (el app decide vehículo).
## Preguntas abiertas (decisión del usuario)
- **Superficie de composición del encargo** (banco de mockups, D5: orbe →
encargo → contexto → anillo de autoridad). El encargo NO es estado de la
máquina: antes de delegar no hay custodia que sostener, y meterlo en el run
pondría al motor a gobernar algo sobre lo que no tiene autoridad. Va como
superficie de APP. ¿Se materializa en F4b (composer del chat) o espera a
palabras (que es literalmente el escenario del editor de blog)?
Las dos grandes se firmaron el 2026-07-23 (spec + quién prueba el eje). Queda:
- **Canal de corrección a mitad de run** (`amend`/`nudge`): no existe — un
prompt nuevo es un run nuevo. Cambio de motor + protocolo, sin firmar.
prompt nuevo es un run nuevo. Es cambio de motor + protocolo, sin firmar.
Con la spec DRAFT escrita, el sitio natural de decidirlo es su sección de
reservas.
- **Pre-run elicitation** (que pregunte ANTES de proponer): hoy solo puede
preguntar escalando a mitad, y la escalada lleva razón tipada, no una
pregunta abierta con respuesta.
pregunta abierta con respuesta. Con `Form.AutoFields` firmado como vehículo,
esto ya no necesita chat — pero sí decidir si el motor abre un hueco de
«run de clarificación» o se compone con un run `suggest`.
## Disciplina y gotchas operativos (¡leer antes de tocar!)

@ -39,7 +39,10 @@ export type AgentProtocolEvent =
readonly direction: AgentStateDirection;
readonly patch: unknown;
}
// ── elicitation (RESERVED — N4; materializes with the conversation surface)
// ── elicitation (RESERVED — N4). A typed question is a FORM in context
// (`Form.AutoFields`), dismissible and non-modal per the a11y contract
// (WCAG 2.2.4) — a conversation surface is one option, never a
// requirement (D-AG.12/§5b, signed 2026-07-23).
| {
readonly type: 'elicitation-request';
readonly requestId: string;

Loading…
Cancel
Save

Powered by TurnKey Linux.