@ -1,6 +1,11 @@
# Continue — Auditoría de componentes + fase de fixes (P0– P7)
**Handoff. Fecha: 2026-07-08.** Rama `alpha-0.1-sec-dom` .
**Handoff. Fecha: 2026-07-08 · actualizado 2026-07-09.** Rama `alpha-0.1-sec-dom` .
> **Arranca mañana aquí →** [§ P5 — lo que queda ](#p5--lo-que-queda-arrancar-aquí-mañana ).
> **S6 Field-family está COMPLETO y pusheado** (`53b6f629..d1670caa`). Lo siguiente
> es **S8 calendar-surface** , luego **P6** y **P7** . Dos follow-ups no bloqueantes
> registrados abajo.
Documento de continuación para retomar la fase de fixes de la re-auditoría de
componentes. La **fuente de verdad de los veredictos** es
@ -19,7 +24,7 @@ componentes. La **fuente de verdad de los veredictos** es
| **P2** contratos morfo (role=application× 4, aria-selected fuera del Day, drp translationRef, field data-state, pin-input commit-set, media-player renames) | ✅ |
| **P3** packs sema (13 packs nuevos + 12 morfos `family-default` →`'pack'`) | ✅ |
| **P4** naming/API N1– N10 | ✅ **COMPLETO** |
| **P5** sistema/eidos | 🟡 **EN CURSO** — S1 ✅ · S5 ✅ · depth ✅ · touch-rows ✅ · **S6 , S8 pendientes ** |
| **P5** sistema/eidos | 🟡 **EN CURSO** — S1 ✅ · S5 ✅ · depth ✅ · touch-rows ✅ · **S6 ✅** (composición + poda + de-alias , pusheado) · ** S8 pendiente** |
| **P6** C7 textarea-measure + D13 · C6 weekInfo · B.11 splitter | ⬜ pendiente |
| **P7** S9 iniciativas · S4 28 READMEs · S7 papeleo · errores de tipo baseline | ⬜ pendiente |
@ -87,13 +92,62 @@ fila-label/Field. El código y los docs (§37 reference + changelog) están pues
Material desacoplan área/visual; **nadie** hace split AA/AAA por talla (el análogo
MUI se considera bug). → suelo único 44 AAA sobre el ÁREA.
## P5 — S6 Field composition (HECHO 2026-07-08→09, pusheado)
Doctrina del usuario: **todos los fields deben SER fields** (componen `field.css` ),
**y ningún field concreto declara tokens que aliasen los de Field**. Commits
`5eb92132..d1670caa` (12). Detalle en memoria: `compose-base-field-not-replicate` ,
`no-token-aliases` , `recipe-orphan-test-prune` .
- **16 fields componen `field.css`** — cuatro cardinalidades descubiertas y
documentadas:
1. **multi-field** (date/time-range-field): montan un `<DateField>` /`< TimeField > `
real por endpoint (soma), tamaño/variant/color via visual context.
2. **single-field picker** (date/time-picker): el root ES el field
(`data-field` + `data-{c}-field` ), chrome de `field.css` .
3. **single-control text** (search/mask/number/css): colapsan `fieldRole('provider')`
+ `fieldRole('control')` en la única caja; `field.css [data-field-control]` fija
`flex-direction: row` (evita que la columna del provider apile los afijos).
4. **field con contenido debajo** (password: strength meter): estructura Field
canónica completa con una parte `<Control>` real + el meter como hermano del stack.
- **Poda de recipe-tokens** (`a820e5f3` + `d1670caa` , **199 tokens** ): mover el chrome
a `field.css` dejó los `--{c}-field-height/padding/border/bg/font/...` **huérfanos**
(emitidos sin consumidor). El guard ** `recipe-css-contract.test.ts` "orphaned"** los
caza (167 en la 1ª pasada + 32 tras de-aliasar los pickers). mask-field quedó sin
tokens propios → entrada de recipe eliminada.
- **De-alias de pickers** (`d1670caa`): date-range/time/time-range-picker aliasaban
`--date-field-*` /`--time-field-*` para su parte "field-shaped" → retargeteados a los
**tokens públicos de Field** (`--field-control-*`/`--field-*`/`--field-segment-height`)
o al primitivo donde Field no tiene equivalente (wrap column-gap = segment gap).
Value-preserving (mismo primitivo tras un hop), verificado con revisión adversarial
(workflow, 4 agentes) + navegador en los 4 pickers.
### Lecciones de método (S6) — no repetir
- **El baseline `svelte-check` NO corre vitest.** Tras cualquier refactor de
recipe/CSS, corre además `npx vitest run src/uix/eidos/recipe-css-contract.test.ts`
(25 tests: huérfanos, phantom, "todo var resuelve", scope-contract). La regresión
de 167 huérfanos fue invisible al baseline durante toda la composición S6.
- ** `--field-segment-height` solo existe bajo `[data-field][data-size]` .** Un elemento
compuesto SIN `[data-size]` cae al default `[data-field]` = **md, fijado** . Antes de
cambiar un `calc(--control-height - space-2)` por `--field-segment-height` , verifica
en el DOM (xs/sm/lg) que el elemento consumidor lleva `[data-size]` . La revisión
adversarial cazó exactamente esto en time-range-picker.
## P5 — lo que queda (arrancar aquí mañana)
- **S6 Field composition** (el grande, veredicto CONFIRMADO): R-1.3/R-1.4
(readonly/invalid × 9+2) como tratamiento único DENTRO de Field; 6 fields matan
alturas duplicadas; aterriza `--field-segment-height` .
- **S8 calendar-surface** CONFIRMADO + tokens de rango como **API pública** de la
capa (drp deja de tunear `--_calendar-range-*` ajenos).
capa (drp deja de tunear `--_calendar-range-*` ajenos). ** ← EMPEZAR AQUÍ.**
### Follow-ups no bloqueantes (registrados)
- ** `task_d66356de` ** — **TimeRangePicker no propaga `data-size` a sus endpoints**
(caja fijada a md en todo tamaño; verificado en DOM 2026-07-08). DateRangePicker SÍ
lo hace (via el visual context de date-range-field). Espejar ese patrón; luego el
embedded-trigger de time-range-picker podrá volver a `--field-segment-height` (hoy usa
el privado `--_time-field-height` a propósito, por este hueco).
- **Task #31 (memoria)** — migrar los date/time pickers al `PickerProvider<TValue>`
genérico (deferValue). **POST audit-fix** , no ahora.
## Protocolo de verificación (invariante en toda la fase)