Brings the session hand-off up to date with the work after the first write:
- checkbox 244ms lag fix (sequence pre->post) + the new doctrine (handler-gated
control state needs 'post'; call-site state tolerates 'pre');
- P3-11 surface ladder (light overlay -> neutral-4);
- prefers-contrast: more a11y;
- theming-engine backlog close (P3-5/6/8 fixed, P3-4/7/9 deferred with rationale,
P2 halves deferred).
Marks the prior "pendiente" engine-hygiene list as resolved-or-decided in the
continuation block. Final state: color/theming fully triaged, check 0 errors.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@ -373,10 +373,30 @@ Sprint dando "un giro de vueltas" al sistema de color de Eidos hasta reference-g
- **forced-colors**: el box-shadow muere en HCM → el foco debe ser `outline`. Migrar los componentes que aún usan `var(--focus-ring)` (box-shadow) a `outline` propio es trabajo futuro per-componente (hoy dependen del fallback global).
- **slot `border` = step 7** (no 6).
**Pendiente (solo higiene del engine, NO calidad de color)**: `THEMING_AUDIT` P3-4 (densidad por especificidad `:where(:root)`), P3-5 (guard parseFloat), P3-6 (`dispose()` DOM directo), P3-7 (runes en `active-eidos.svelte.ts`), P3-8 (re-exports crudos de render-fns), P3-9 (forwarders huérfanos), P3-11 (asimetría light/dark muted/overlay), + mitades P2 (poda del contrato, validación de identificador-color pelado).
**Pendiente (solo higiene del engine, NO calidad de color)** — _todo resuelto-o-decidido en la continuación, abajo_: `THEMING_AUDIT` P3-4/5/6/7/8/9/11 + mitades P2.
**Continuación (mismo día) — fix de UX + cierre del backlog**:
- **Checkbox lag — NO era color, era timing del sema** (`e6fd014d` + `cd834384`). El usuario reportó el check "muy lento". Medido frame-a-frame: el `data-state` tardaba **244ms** en cambiar tras el click. Causa: el provider del checkbox fija el estado en el HANDLER del `runtime.trigger`, y el morfo declaraba `sequence: 'pre'` → el runtime hace `await runEmit()` (que **espera el hold del canal visual ~240ms**, `engine.emit()` → `await visualChannel.handle`) ANTES del handler. Fix: `commit-toggle-check`/`commit-toggle-uncheck` → `sequence: 'post'` (handler primero, pulso después). 244ms → 46ms. Secundario: trazo del checkmark `stroke-duration` 220ms hardcoded → `var(--duration-fast)`. **Verificado que radio-group (47ms) y tabs (31ms) NO laggean** aunque son 'pre' — fijan estado en el call-site, no en el handler; no se tocaron. Toggle/Switch ya eran 'post'.
- **DOCTRINA NUEVA**: un control cuyo estado se fija en el HANDLER del trigger DEBE usar `sequence: 'post'`; con `'pre'` el hold perceptual del emit bloquea el cambio funcional. Los que fijan estado en el call-site toleran 'pre' sin lag.
- **P3-11 surface ladder** (`76e18772`). Light `overlay` era `neutral-3` == `muted` (popovers indistinguibles de paneles muted en light); dark ya tenía overlay=4. Light overlay → `neutral-4` → ladder consistente en ambos modos: `default(1) < raised(2) < muted(3) < overlay(4)`. Verificado (popover light: overlay L93% ≠ muted L95.5%).
- **prefers-contrast: more** (`21b2329a`). Completa el a11y de color junto a forced-colors. `renderPrefersContrastBlock` → `@media (prefers-contrast: more) { :root:root { … } }` refuerza bordes (neutral 7/8/9) + texto de-enfatizado (12/11). `:root:root` (0,2,0) gana al `:root` del tema; aditivo, gated, estrictamente más fuerte. THEMING §28.
- **Cierre del backlog del engine** (`afa15aea`). `THEMING_AUDIT` P3 todo fixed-or-decided:
- ✅ **P3-6** confirmado ya resuelto (dispose vía `dom`, sin `document` directo).
- ✅ **P3-8** index ya NO re-exporta los render-fns crudos (API pública = clase `ActiveEidos`; `./lib/render-css` para uso interno). Consumidor de test redirigido al módulo.
- ⏸️ **P3-4** deferido (densidad gana por orden de fuente determinista, estable; restructure `:where(:root)` = coste alto por nit teórico).
- ⏸️ **P3-7** deferido (reactividad callback-driven vía `apply()` POR DISEÑO; runes = refactor riesgoso sin bug que lo justifique).
- ⏸️ **P3-9** deferido (forwarders huérfanos `_accent` — cirugía de recipe con riesgo de cascada, valor bajo).
- Único pendiente real: 2 mitades **P2** (poda de contrato + validación de identificador-color pelado) — edge-case, deferidas por bajo valor.
**Estado final del color/theming**: apariencia + a11y (forced-colors + prefers-contrast) + wide-gamut + theme builder runtime + backlog del engine — todo resuelto-o-decidido, cero ítems colgando. `check` 0 errores. Suite eidos 156/159 (3 fallos de words, pre-existentes, confirmados con baseline). Docs extra: `THEMING.md` §28 (prefers-contrast), `THEMING_AUDIT_2026-06-01.md` scorecard P3 completo.