# form — ficha de auditoría (RE-AUDITADA 2026-07-07, profundidad piloto) - **Familia**: fields (orquestación) · **Método**: solo análisis; evidencia por dimensión · demos fuera - **Capas leídas**: [morfo](../../../src/uix/morfo/components/form.ts) completo (1-90+) · [soma types](../../../src/uix/soma/components/form/types.ts) superficie de props · pack ✓ - **Máquina**: PASS limpio · tests ✓ · README ×2 ✓ ## Dimensiones (evidencia leída) | # | Dimensión | Estado | Evidencia | | --- | -------------------- | ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 1 | Composición | ✓ | Provider(`
` real)/Submit/Reset/ErrorSummary compositivos | | 2 | Naming | **dato de censo** | **`isPending`/`data-pending`** para async-en-vuelo (morfo :75, types) mientras button/field usan `loading` — DOS nombres para el concepto → \_naming; `disableWhenPristine` en Reset ✓ expresivo; `submitCount` en snippet | | 3 | Coherencia semántica | ✓ **referencia** | `commit-submit` con intent **fulfill** (:16-24 — el cierre terminal donde la doctrina de button dice que vive el intent fuerte ✓); **`signal-warn-invalid`** untilFix + `requiresFocusMove` + persistent-trace con §6.2 y §9.2 citados y el ciclo clearSignal/clearTarget documentado (:26-53) — CUARTO contrato de referencia de la familia; `commit-reset` neutral ✓ | | 4 | API | ✓ | Standard-Schema (el adaptador always-async con `untrack` — antecedente de memoria); estados dirty/touched/submitted proyectados | | 5 | Tokens | ✓ | Gaps por size vía recipe | | 6 | Sema | ✓ | Pack ✓ — el submit ES el sitio del carácter | | 7 | Animaciones | ✓ | Sin keyframes | | 8 | Contrato morfo | ✓ | APG landmark form CORRECTO (:9); `data-{pending,dirty,touched,invalid,submitted}` + aria-busy condicional (:74-88) | | 9 | A11y | ✓ ejemplar | El focus-move del warn aterriza en el form y `focusFirstInvalid()` perfora al primer campo inválido (documentado :43-48); ErrorSummary con títulos singular/plural interpolados (:12-13) | | 10 | Theming | ✓ | Focus o1 contenedor | | 11 | Composición interna | ✓ | ES el otro extremo del OR-merge: Field se registra y deriva dirty/touched/errors de aquí | | 12 | Estados | ✓ | Ciclo completo submit/reset/pending | | 13 | Runtime | ✓ | Validación async sin timers crudos (Standard-Schema) | | 14 | Docs+tests | ✓ | README ×2, suite ✓ | | 15 | i18n | ✓ | error-summary-title con `{{count}}` + variante singular | ## Hallazgos y propuestas | ID | Hallazgo | Propuesta | | ------- | ------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **F-1** | `isPending` vs `loading` (dos nombres para async-en-vuelo en el catálogo) | Veredicto \_naming: elegir uno (nota: `pending` es el término del form nativo/React 19; `loading` el de controles — puede ser DOS conceptos legítimos [form en vuelo vs control ocupado] — decidir si se unifica o se documenta la distinción) | ## Escalan al sistema \_naming (pending vs loading). ## Veredictos _(pendiente — checkpoint post-barrido)_