feat(aura): fases 7–8 · README eidos + component:audit PASS — Aura completa (0–8)

Cierra el primer componente del eje agéntico de punta a punta (las 9 fases de
la ruta). `component:audit` PASS.

- README eidos con comparativa (5 refs adyacentes — thinking-indicators,
  CopilotKit activity, Vercel useChat.status, presencia colaborativa
  Figma/Docs, assistant-ui) reconociendo el paisaje escaso: nadie tiene una
  semántica perceptiva de la delegación con a11y (informe §8.3). Decisiones +
  Gaps con disposición.
- Fixes del audit: opacity literal `0.5` → `var(--opacity-50)` (R-4.2);
  excepción R-1.5 documentada (único focusable = Cancel, que compone Button);
  `apg: 'none — …'` en el morfo (A-1.4).

Gates: component:audit PASS · morfo:vocabulary limpio · eidos-lint aura 0
inválidos · recipe-contract verde.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
alpha-0.1-sec-dom
dev 3 months ago
parent ef85b9223d
commit 2c175c5d95

File diff suppressed because one or more lines are too long

@ -0,0 +1,91 @@
# Aura
The **agent presence surface** — the eidos face of the canonical materializer
of the `delegate` family (book ch. 29: *¿quién actúa ahora?*). Soma owns the
custody-of-control state, the axis's one polite live region and the global
exit; Eidos adds the living orb (a `$scene` aurora modulated by state) and the
size axis. Doctrine:
[`docs/architecture/agent.md`](../../../../../docs/architecture/agent.md) §7.
## Baseline
- **Classification**: interactive (a `Cancel` trigger). Composes the soma
headless provider (`$soma/components/aura`) over a structural agent port;
with no agent the surface is a valid `idle` (§0 degradation).
- **Anatomy**: `Aura` (root, `data-state`) → `.Indicator` (decorative orb,
`aria-hidden` — the `$scene` aurora paints inside; the recipe's radial
gradient is the static truth underneath) + `.Status` (localized state
label) + `.Region` (the axis's ONE `role="status"` polite live region) +
`.Cancel` (the global exit, composes `<Button>` via asChild).
- **Two axes**: `size` (sm | md | lg — orb + label scale, orb derived from
the **Avatar** primitive `--avatar-size-*`) and the semantic `data-state`
tint (soma-owned; the recipe maps it to role slots — reviewing = risk,
escalated = threat, acting/offered/planned = primary, idle = neutral). Aura
has **no `color` prop by design**: the tint is evaluative, not decorative;
a theme re-tints via the `--aura-orb-color-*` role tokens.
- **The orb is the D4 consumer**: `.Indicator` prefers the shared `uix.scene`
engine (global concurrent-scene budget) with a per-dom fallback outside a
uix tree; under reduced motion the engine's mandatory `static-frame` policy
keeps the gradient — presence never disappears.
## Comparativa
Agent-presence-with-a11y is a near-empty landscape — no shipping framework
has a perceptual surface for the *delegation cycle*. The refs are adjacent, not
equivalent; the comparativa maps what each does and what Aura adds.
| Ref | Equivalente | Qué adoptamos | Qué no |
| --- | --- | --- | --- |
| ChatGPT / Claude "thinking" indicator | pulsing dot while the model works | la continuidad *pensando → actuando* como estado perceptible | indicador SOLO visual, sin región viva ni máquina de estados — un usuario de lector de pantalla no sabe que el agente actúa |
| CopilotKit activity / generative-UI | render de actividad de tool en el transcript | la idea de superficie de presencia del agente | acoplado al chat (no hay presencia sin conversación); sin semántica de «quién actúa» ni a11y dedicada |
| Vercel AI SDK `useChat.status` | `submitted / streaming / ready` | mapear el estado del run a una superficie | un **string de estado**, no un canal perceptivo (sin sonido/motion/hold ni anuncio atribuido) |
| Presencia colaborativa (Figma / Google Docs) | «X está editando» (cursores/avatares) | el **precedente a11y de anunciar a otro actor** (live region, «quién») | modela HUMANOS concurrentes, no el ciclo de delegación (offer→review→act→return) ni la autoridad/autonomía |
| assistant-ui | estado `running` por mensaje | — | estado por-mensaje, no una presencia del agente con salida global y ciclo tipado |
**Lo que Aura añade y nadie tiene** (informe §8.3): una semántica perceptiva
de la delegación (`delegate` + `sustain` con sonido/motion/hold), anuncios
**atribuidos y coalescidos por plan** (WCAG 4.1.3), reduced-motion que conserva
la presencia (`static-frame`, nunca `hide`), y una salida global por teclado.
## Decisiones
- **Sin prop `color`**: el tinte es la valoración del estado (evaluativo), no
decoración — cargar `color` invitaría al antipatrón «marco rojo». El tema
re-tinta los slots de rol `--aura-orb-color-*`.
- **`expression: 'family-default'`**: el perfil sonoro bajo de `delegate` es
decisión firmada de capa 1 (los canales fuertes aparecen en composición con
signal/commit); la modulación por intent reservada en scene §F6
(velocidad/amplitud/hue ≈ pitch/gain/contour) es VISUAL → recipe + `$scene`,
no un pack de sonido.
- **Orb = Avatar**: el tamaño deriva de la primitiva canónica del disco de
presencia/identidad (`--avatar-size-{sm,md,lg}` = 32/40/48); un tema que
retoca avatares retoca el orb. (Los 14/20/28 iniciales eran magic numbers
inventados — corregido.)
- **Cancel compone `<Button>`** vía asChild (nunca el `<button>` nativo del
soma); `variant`/`size`/`color` diferidos a los defaults del Button.
- **La Region es sr-only en el recipe** (present para AT, silenciosa a la
vista); el orb es la presencia visible.
R-1.5 exception: the only focusable part is `Cancel`, which composes
`<Button>` — the focus-ring is owned by the Button recipe (THM §32). The orb,
status and region are non-interactive, so the aura recipe declares no focus
treatment of its own.
## Sema events
Four — the `delegate` cycle (first eidos component to react to the family):
`sustain-processing` (stateBound; orb tint + optional scene intensity while
acting), `delegate-offer` / `delegate-escalate` (untilAction) /
`delegate-return`. The visual weight is state tint + the scene; the transient
`data-event-family="delegate"` stamp gets its hint from the shared events
layer. Full table in the soma README
([`$soma/components/aura`](../../../soma/components/aura/README.md)).
## Gaps
| Gap | Disposition |
| --- | --- |
| Presets de escena por estado (carácter de aurora distinto más allá de speed/amplitude/hue) | **diferir** — la modulación actual cubre el ciclo; se especializa cuando el diseño lo pida |
| Superficie de elicitación en `escalated` (pregunta tipada vía `Form.AutoFields`) | **diferir** a PLAN-agent F4 — la categoría del protocolo existe (reservada); se materializa con la superficie de conversación |
| Variante compacta/inline (solo orb, sin status/cancel) para toolbars | **diferir** — hasta que un host real lo pida (la barra de admisión) |
| Prop `color` decorativo | **descartar** — el tinte es evaluativo (estado del run); un `color` invitaría al antipatrón «marco rojo». El tema re-tinta los slots de rol |

@ -82,7 +82,7 @@
/* Idle: the presence recedes without disappearing (never `hide`). */
[data-aura][data-state='idle'] [data-aura-indicator] {
opacity: 0.5;
opacity: var(--opacity-50);
}
/* ── Status label ───────────────────────────────────────────────────────── */

@ -30,6 +30,9 @@ export const auraMorfo = {
name: 'Aura',
kebab: 'aura',
scope: ['soma', 'sema', 'eidos'],
// No APG pattern exists for agent presence; the live region follows the
// status-role guidance (like Announce). The decision travels here.
apg: 'none — agent presence has no APG pattern; the Region follows status-role live-region guidance',
// Sema expression: family defaults, ON PURPOSE. The delegate family keeps
// a LOW sound/haptic profile by signed layer-1 decision (sema-map.ts —
// strong channels appear when delegate composes with signal/commit); the

Loading…
Cancel
Save

Powered by TurnKey Linux.