# date-range-field — ficha de auditoría (RE-AUDITADA 2026-07-07, profundidad piloto) - **Familia**: fields (rango de fechas; dos endpoints DateField) · **Método**: solo análisis; evidencia por dimensión · demos fuera - **Capas leídas**: [morfo](../../../src/uix/morfo/components/date-range-field.ts) (68 líneas; censo `semantic:`=0, `apg:`=1 spinbutton) · [soma types](../../../src/uix/soma/components/date-range-field/types.ts) superficie · [provider](../../../src/uix/soma/components/date-range-field/date-range-field-provider.svelte.ts) dirigido (:51,:72) · [exports](../../../src/uix/soma/components/date-range-field/exports.ts) (:5-7) · README soma (:44) - **Máquina**: PASS limpio · tests ✓ · README ×2 ✓ - **Nota de método**: el borrador inicial de esta re-ficha iba a declarar "0 eventos = rango mudo"; la lectura de la composición lo DESMIENTE — cada Input crea su propio contexto DateField (exports :5-7 re-exporta `Segment` del single; README :44) y los `commit-set` del single disparan POR ENDPOINT. La delegación es by-design. ## Dimensiones (evidencia leída) | # | Dimensión | Estado | Evidencia | |---|---|---|---| | 1 | Composición | ✓ ejemplar | Cada endpoint es un DateField COMPLETO ligado a `provider.startValue/endValue` (README :44); `Segment` re-export directo del single (exports :5-7) — cero re-implementación de la maquinaria de segmentos; validación/placeholder/granularity/locale compartidos simétricamente | | 2 | Naming | ✓ + dato de censo | `value: DateRange` + `onValueChange` ✓; **`onStartValueChange`/`onEndValueChange`** — PRIMER patrón de callbacks por sub-valor del catálogo (censar en otros dobles); `placeholder` compartido único (la incidencia 2026-05-20 #1 — el END auto-paginaba al START — documentada en el provider del single con la regla `false` en endpoints) | | 3 | Coherencia semántica | ✓ delegada + **cuestión de diseño** | El morfo propio declara 0 eventos: la semántica vive en los singles embebidos (cada endpoint comete su `commit-set` al fijarse). **F-1**: NO existe evento de *rango completo* — fijar el segundo extremo (el momento terminal del gesto, cuando `{start,end}` queda sellado) suena igual que fijar el primero. ¿Debe el sellado del par tener su propio commit (fulfill) o bastan los dos del single? → veredicto | | 4 | API | ✓ | `validate: DateRangeValidator` + `onInvalid: DateOnInvalid` + min/max; hereda la razón de invalidez SIN tipar del single (censo validación) | | 6 | Sema | condicionada | Sin pack propio (correcto: delega); el carácter depende del pack del single embebido → date ✓ tuneado. La decisión SYS-3 del trío debe cubrir los ranges explícitamente | | 8 | Contrato morfo | ✓ | APG spinbutton citado; ARIA heredada de los segments del single (README :58) | | 5, 7, 9-15 | | heredan del single | Wrapper de composición: tokens/recipe/i18n/a11y = los de date-field; focus delegado a los embebidos ✓ | ## Hallazgos y propuestas | ID | Hallazgo | Propuesta | |---|---|---| | **F-1** | Sin evento de rango-completo (el sellado del par no se distingue del commit de un extremo) | Decidir en checkpoint: (a) declarar `commit-set` a nivel range cuando ambos extremos fijan (fulfill — el "cierre" perceptible), o (b) documentar que los dos commits del single bastan. Si (a), resolver los DOS ranges en el mismo fix | | **F-2** | Razón de invalidez sin tipar (heredada) | Veredicto de validación de la familia (nivelar a las razones tipadas de color-field) | | **F-3** | Compuesto SIN `expression` declarada — el canon existe (`'delegated'`, morfo/types.ts, decisión 2026-05-26) y sus primos date-picker/drp lo usan | Añadir `expression: 'delegated'` (una línea) — SYS-11 | ## Escalan al sistema SYS-3 (la decisión del trío debe nombrar a los ranges) · _naming (callbacks por sub-valor) · patrón "delegación semántica por composición" — segundo caso documentado tras field-langs (el morfo compuesto NO re-declara los eventos del embebido) → regla candidata para el canon. ## Veredictos *(pendiente — checkpoint post-barrido)*