docs(theming): el handoff, reescrito para que otra sesión arranque sin arqueología

La sesión llega llena. El handoff había crecido por acumulación —cada bloque
añadía su sección— y para saber qué hacer había que leerlo entero y deducirlo.
Ahora la AGENDA va arriba y el registro histórico abajo, separado por su propio
encabezado.

Arriba: qué comprobar en los primeros cinco minutos (las dos cifras que deben
cuadrar, el dev server antes de medir, leer el veredicto §5); tres opciones con
recomendación —revisión adversarial de F2-A, el diseño de `calendar-surface`, o
seguir la cola por alcance, con la cola ya recalculada—; el protocolo en diez
pasos; y **lo que este bloque enseñó**, que es lo que evita repetir el día:

  el veredicto orienta pero la medición decide (tres de ocho tenían un error de
  lectura) · un token que no mueve nada miente, y lo que procede es retirar la
  declaración muerta · un alias puro se borra, no se renombra · lo que la capa
  posee el consumidor no lo acuña · y la sonda miente de tres maneras
  distintas, así que ante un diff inesperado se corre DOS VECES sobre el mismo
  código antes de sospechar del cambio.

El plan §8 gana la entrada de la sesión con las cifras y los commits, y su
cabecera de estado pasa a 43 %.

Estado que hereda la sesión siguiente: alcance global 43 % (era 33 % al abrir el
eje), 15 componentes con contrato, 49 sin él, 7 al 100 %, gramática con 0
desviadas y guard en `error`. 29 commits, sin pushear.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
alpha-0.1-background
dev 2 months ago
parent 34a95a550c
commit f5f2b5d225

@ -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

@ -1,7 +1,9 @@
# PLAN — Theming: que TODO componente sea personalizable por un tema (eje `theme-reach`)
> **Estado (act. 2026-08-20): EN EJECUCIÓN — 7 componentes corregidos, 20
> fichas revisadas; las D-TH.1…8 de §4 FIRMADAS TODAS el 2026-08-20** (más las
> **Estado (act. 2026-08-21): EN EJECUCIÓN — alcance global 43 %, 15
> componentes con contrato, 49 sin él. Vocabulario CERRADO (codemod + R-5.3 +
> muro de tipos) y bloque F2-A CERRADO. Las D-TH.1…8 de §4 FIRMADAS TODAS el
> 2026-08-20** (más las
> tres decisiones hermanas del mismo día: familia calendar = capa compartida,
> mandato Field ejecutable, hover→capa de estado — ver «Firmas del 2026-08-20»
> del CONTINUE). El registro con cifras y commits está en §8, y el punto
@ -450,6 +452,43 @@ de commit. Sin artefacto, el paso no se ha hecho.
## 8. Registro
- 2026-08-20/21 — **Las 14 firmas, el vocabulario y el bloque F2-A.** El día se
abrió presentando D-TH.6 y acabó con las catorce decisiones pendientes
firmadas en bloque, el vocabulario normalizado con guard, y ocho componentes
tokenizados. Detalle en [`CONTINUE-theming.md`](./CONTINUE-theming.md)
§«Registro de la sesión».
**El vocabulario** (`f09e04fab` acta · `bd916ef3f` codemod · `93017975c`
segunda pasada · `7781d6e4c` guard + doctrina · `476da2dd2` muro de tipos):
307 claves al idioma firmado —tinta `fg`, modificador interactivo delante—
con censo de alcance IDÉNTICO y 0 diffs de computed. R-5.3 entra en `error`
directo; el tipo de `defineRecipes` impide la regresión sin ejecutar nada.
La medición corrigió el inventario heredado: 370 «desviadas» eran 301, porque
47 claves `{rol}-{slot-de-rol}` son canónicas por construcción y un codemod
sobre ellas habría roto `button` entero.
**El bloque F2-A** (pieza 0 `bd032534b` + ocho componentes): global
**37 % → 43 %**, sin contrato **56 → 49**, al 100 % **6 → 7**. `command` 98 %
· `table` 86 % · `media-player` 88 % · `tree-grid` 95 % · `gradient-picker`
88 % · `listbox` 68 % (techo deliberado: su ritmo es de `list-surface`) ·
`carousel` 77 % · `feed` 94 %. Protocolo §7 entero en los ocho; diff de
computed vacío en todos.
**Lo que el bloque destapó y NO se arregló aquí** está en
[`next-features.md`](../next-features.md) §12 y §13: el contrato de cascada
del velo de estado (131 declaraciones-atajo en 45 componentes, la prop
`hoverable` que no suprime nada, un empate de especificidad resuelto por orden
de carga) y los huecos de instrumento y demo. La regla que el eje adoptó: si
una incidencia mueve píxel o toca morfo, se mide, se anota y se sigue.
**Tres veredictos de ocho tenían un error de lectura** que sólo apareció
midiendo, y esa es la lección de método del bloque: el veredicto orienta, la
medición decide.
Además: la demo enseña ahora el contrato de tokens (`90aa6dc5f`,
`TokensPanel` leyendo `getRecipeTokens()` en vivo) — hasta ese día ninguna
demo mostraba la superficie que este eje construye.
- 2026-08-19 — Censo medido (§1) con `scripts/theming-census.ts` (añadido en
este commit como instrumento, sin guard). Plan entregado. **Nada firmado,
nada construido.** Precedente ejecutado hoy que fija la forma:

Loading…
Cancel
Save

Powered by TurnKey Linux.