@ -1,20 +1,152 @@
# CONTINUE — eje Theming «theme-reach» (handoff, act. 2026-08-20)
**Estado: EN EJECUCIÓN — bloque del vocabulario CERRADO.** 7 componentes corregidos (auditados
contra la gramática nueva: 6 limpios, 1 corrección), 20 fichas revisadas, el
informe de auditoría vivo y regenerable. **El 2026-08-20 el autor firmó las 14
decisiones pendientes**: las D-TH.1…8 enteras (§4 del plan, con dos enmiendas)
más familia calendar, mandato Field y hover→capa de estado — el acta está en
§«Firmas del 2026-08-20». Y el bloque del vocabulario se ejecutó el mismo día
(tres commits, §«Lo ejecutado»): 269 claves renombradas, R-5.3 en `error` ,
doctrina al día. Lo siguiente es la migración a la capa de estado (firma 3).
- Fuente viva del método: [`PLAN-theming.md` ](./PLAN-theming.md ) (§7 el
protocolo, sin excepciones).
- **Informe por componente** : [`docs/audit/theming/` ](../audit/theming/ ) — un
README de conjunto + 170 fichas (162 recetas + 8 sin receta). Cada ficha lleva
su análisis, su propuesta y, en §5, el **veredicto** escrito a mano, que
sobrevive a la regeneración.
# CONTINUE — eje Theming «theme-reach» (handoff, act. 2026-08-21)
**Estado: EN EJECUCIÓN — vocabulario CERRADO, bloque F2-A CERRADO.**
Alcance global **43 %** (era 33 % al abrir el eje, 37 % al empezar el día 20).
15 componentes con contrato, 49 sin él, 7 al 100 %.
## LO PRIMERO AL ENTRAR (cinco minutos, en este orden)
1. **Comprueba que el suelo no se ha movido** :
```bash
node --import tsx/esm scripts/theming-census.ts # 162 · 5.191 · 2.103 (43 %) · 49 sin contrato
node --import tsx/esm scripts/theming-census.ts --names # DESVIADAS 0 — la gramática se mantiene
```
Si el primero no cuadra, alguien tocó recetas: regenera el informe
(`--report`) antes de nada. Si el segundo no da **0 desviadas** , alguien
escribió un nombre fuera de la gramática y R-5.3 debería haberlo cazado —
mira por qué no.
2. **Arranca el dev server ANTES de medir nada** — sin él las sondas no valen:
`preview_start` con la config `dev` de `.claude/launch.json` (puerto 5180).
Las sondas se ejecutan **con `node`, no con `tsx`** , desde la raíz.
3. **Lee el veredicto §5 de la ficha del componente que toques**
(`docs/audit/theming/{c}.md`). La §4 generada NO se sigue a ciegas: en este
bloque, **tres veredictos de ocho tenían un error de lectura** que sólo
apareció al medir (ver «Lo que este bloque enseñó»).
## QUÉ HACER AHORA — tres opciones, y la recomendación
**A · Revisión adversarial del bloque F2-A** (§7.7 del plan, molde Sidebar).
Un pase escéptico que intente REFUTAR, con medición propia y no leyendo los
commits: «el default es idéntico» (rehacer sonda), «cada token alcanza»
(rehacer centinela), «el velo cae donde debe» (píxel arriba). Ocho componentes.
Es lo que el plan manda al cerrar un bloque, y **es mi recomendación** : son
ocho commits nuevos sin revisar por nadie más.
**B · Diseño de la capa `calendar-surface` ** (firma 1 del acta). Lo más
rentable en cifras: desbloquea `range-calendar` (98 knobs) + `month-grid` (61)
- `year-grid` (61) + media `date-range-picker` — unos 220 knobs, el salto de
43 % a ~48 %. **El diseño se PRESENTA al autor antes de escribir una línea**
(nombre, ejes, qué posee la capa; molde `lib/list-surface.css` y sus cuatro
reglas). No es un backfill más: es una capa nueva.
**C · Seguir con la cola por alcance**, que tras F2-A queda así:
| componente | knobs | nota |
| -------------- | ----: | --------------------------------------------------------------- |
| `field-langs` | 41 | espera el mandato Field (firma 2) para la mitad |
| `grid-list` | 32 | mismo patrón que `tree-grid` /`table` (fila + capa de estado) |
| `textarea` | 28 | familia campo |
| `tree-view` | 28 | hermano de `tree-grid` ; su ficha ya avisa del forward de paleta |
| `code-block` | 26 | 24 globales, cero privados — el más mecánico de los que quedan |
| `card-group` | 24 | |
| `spinner` | 23 | 15 privados |
| `picker-shell` | 21 | es CAPA de los pickers: mirar antes qué posee y qué presta |
## EL PROTOCOLO, EN CORTO (el largo está en PLAN-theming.md §7)
Un componente = un commit. Por componente:
1. Leer entero: receta, su bloque en `recipes/base.ts` , README de eidos, morfo,
y el veredicto §5 de su ficha.
2. **Sonda ANTES** (`__theming-probe.ts {c} antes.json < url > `).
3. Escribir el contrato en `recipes/base.ts` — **fusionando en el bloque
existente si ya lo hay** (los forwards de paleta THM-2 ya ocupan bloque en
muchos componentes; un segundo bloque con el mismo nombre se descarta EN
SILENCIO).
4. La receta consume los nombres resueltos; **retirar los bloques `[data-size]`
del CSS** — los emite el TSC, y dejarlos vivos hace que el diff dé 0 por la
ruta vieja.
5. `npm run generate:eidos-css` , sonda DESPUÉS, **diff = 0** .
6. Centinela (`__theming-sentinel.ts {c} < url > `) y **adjudicar cada
«no effect» uno a uno** — no darlos por buenos ni por malos en bloque.
7. Guards: censo `--only {c}` · `component-audit --only {c}` · `eidos-lint {c}`
· `vitest run src/uix/eidos` (comparar POR FICHERO: el rojo conocido es
`skin-media-player` ) · `rtl:check` · `docs:check` · `npm run check`
atribuido POR FICHERO (73 errores globales son de otras sesiones).
8. README del componente con su sección «Talla y tema».
9. **Tab `Tokens` en la demo** — una línea:
`<TokensPanel component="x" stage={stageRef ?? undefined} />` + su botón.
10. Commit con las cifras y los artefactos en el mensaje.
## LO QUE ESTE BLOQUE ENSEÑÓ (léelo antes de tocar nada)
**Sobre los veredictos.** Tres de ocho tenían un error de lectura que sólo
apareció midiendo: el título de `feed` escala por `aria-level` , **no por
talla**; `--gp-current-gradient` lo estampa **soma** , no el wrapper de eidos; y
el trigger de `gradient-picker` no había que tokenizarlo sino **borrarlo** . El
veredicto orienta; la medición decide.
**Un token que no mueve nada es un token que miente.** Ocurrió tres veces:
`table.selected-row-fg` y la tinta de `listbox` (el arquetipo las gana por
especificidad) y **el cromo ENTERO del trigger de `gradient-picker`** (36 de 45
tokens sin efecto — lo pinta `popover.css` , que gana 0,2,0 contra 0,1,0). En
los tres casos la acción correcta fue **retirar la declaración muerta** , y en
los tres retirarla dio 0 diffs, que es la prueba de que estaba muerta.
**Un alias puro no se renombra: se borra.** Los dieciséis `--_mp-*` de
media-player eran alias de su propia fuente; el veredicto pedía renombrarlos y
lo que procedía era eliminar la capa entera.
**Lo que la capa posee, el consumidor no lo acuña.** `listbox` se queda en 68 %
a propósito: su ritmo de fila es de `list-surface` . La métrica penaliza hacer lo
correcto — registrado en `next-features.md` §13.
**Antes de acuñar un `hover-*` , mide contra la capa de estado.** En `listbox` el
`highlighted` pinta DOS veces (plano + velo); se dejó sin token para no
bendecir un duplicado condenado.
**La sonda miente de tres maneras distintas**, y todas costaron tiempo aquí:
congela `transition` pero **nunca `animation`** (el `box-shadow` de
`feed[data-busy]` da 5 diffs entre dos corridas del mismo código); el estado
`hover` se mide **después** de forzar tallas, así que arrastra la última; y un
empate de especificidad **resuelto por orden de carga** hace que `tree-grid` dé
0 ó 3 diffs según la recarga. **Ante un diff inesperado, lo primero es correr
la sonda dos veces sobre el MISMO código.**
## LAS INCIDENCIAS NO SE ARREGLAN AQUÍ
Todo lo que este eje destapa y no le toca arreglar está en
[`docs/next-features.md` ](../next-features.md ) ** §12** (el contrato de cascada
del velo de estado: 131 declaraciones-atajo en 45 componentes, la prop
`hoverable` que no suprime nada, el empate por orden de carga, la banda que
mata el hover, el token de tinta que no puede ganar al arquetipo, el thumb de
`scroll-area` sin velo) y ** §13** (huecos de instrumento y de demo, más los
cuatro que salieron de `gradient-picker` y `listbox` ).
**Regla**: si una incidencia mueve píxel o toca morfo, se MIDE, se anota ahí y
se sigue. No se arregla dentro del commit del componente.
## PENDIENTE DE FIRMA (nada bloquea la cola)
- **Diseño de `calendar-surface`** — la firma 1 aprobó el PATRÓN, no un diseño
concreto; ese se presenta.
- ** `scroll-area.thumb-bg-hover` ** — único knob de la firma 3 sin resolver: su
thumb lleva `archetype: 'thumb'` , que no recibe velo. Cambiarlo es morfo.
- **Extender la clase `system` del censo a las capas compartidas** , como se
hizo con `--style-*` para los primitivos tipográficos (§13 del registro).
---
# REGISTRO DE LA SESIÓN DEL 2026-08-20/21 (histórico — no es la agenda)
Lo que sigue es el detalle de cómo se llegó aquí: las firmas, el codemod, el
guard, y el bloque componente a componente. Se conserva porque cada decisión
lleva su porqué medido, pero **la agenda es lo de arriba** .
## EJECUTADO 2026-08-20 — vocabulario de tokens: D-TH.6 (codemod) + R-5.3 (guard)
@ -189,7 +321,27 @@ como commit aparte — es una clave, y sacarla del codemod duplicaría la
verificación. Si el codemod se retrasa por las firmas pendientes, se ejecuta
sola con el protocolo §7.
## BLOQUE F2-A — el próximo grupo: analizar y corregir (preparado 2026-08-20)
## BLOQUE F2-A — CERRADO 2026-08-21 (preparado el 20, ejecutado el 21)
**Los ocho, con su commit y su alcance final:**
| componente | antes → después | commit |
| ----------------- | --------------: | ----------- |
| pieza 0 (censo) | 37 % → 38 % | `bd032534b` |
| `command` | 0 % → 98 % | `4ddea7fe2` |
| `table` | 0 % → 86 % | `564133b48` |
| `media-player` | 0 % → 88 % | `b7a4cef08` |
| `tree-grid` | 0 % → 95 % | `9748733ad` |
| `gradient-picker` | 0 % → 88 % | `d177ee331` |
| `listbox` | 0 % → 68 % | `3b325c439` |
| `carousel` | 0 % → 77 % | `4cab77667` |
| `feed` | 0 % → 94 % | `34a95a550` |
Global **37 % → 43 %** ; sin contrato **56 → 49** ; al 100 % **6 → 7** . Más
`90aa6dc5f` (el `TokensPanel` que las demos enseñan) y `8324e2ced` (el registro
de incidencias).
El plan del bloque, tal como se preparó:
El primer bloque del backfill bajo TODAS las firmas. Ocho componentes con
veredicto §5 verificado + una pieza de instrumento que va primero. Suma **330