# CONTINUE — eje Theming «theme-reach» (handoff, act. 2026-08-25) ## EMPIEZA AQUÍ **El eje ya no tiene cola.** Los 16 componentes que nunca habían pasado están cerrados o adjudicados, la deuda de artefactos está saldada, y **§12.9 y la firma B′ quedaron FIRMADAS Y EJECUTADAS** — las dos decisiones más caras pendientes. Global **68 %**, **45 componentes al 100 %**. Lo que queda NO es ejecución: son **cinco firmas** y una lista de deuda acotada. No abras nada nuevo sin leer §«Lo que espera TU FIRMA» de aquí abajo. ### FIRMA EJECUTADA (2026-08-25) — el velo del sistema no muere por un ATAJO **Qué se firmó** (changelog §56, reverso de §55 el mismo día): al bajar el sobre de trigger de `popover.css` al suelo, §55 lo dejó a **(0,0,0) — el mismo peldaño que `archetypes.css`**, que es quien pinta el velo de estado del sistema. Y el suelo declaraba su superficie con el ATAJO `background:`, que expande a `background-image: none` — **la propiedad exacta donde vive ese velo**. Resultado: el velo de hover de todo trigger desnudo dependía de qué hoja cayera después. No sólo por la regla de hover: el `:where()` deja también la de REPOSO empatada con la de hover del arquetipo, y ésa sola bastaba. La corrección son DOS PALABRAS — `background-color:` en `popover.css:60` y `:75`. **Los números**: **0 px** en el barrido de las **14 identidades del catálogo** que montan un `[data-popover-trigger]` (68 lecturas en reposo → 0 movidas, 68 en hover → 0 movidas, `rules split=2` en las 14) con control negativo diff 5 / 4; las dos sondas del eje a **0 diffs** (`popover` 448 valores / 8 estados, `chronos` 36 832 / 7); y **el velo sobrevive al orden invertido**, donde con el atajo moría (`linear-gradient(…8 %…)` → `none`). Cae con la firma el pin `chronos.css:417` (cinco declaraciones a (0,3,0) que ya no defendían nada): **0 diffs en 20 combinaciones `variant` × `size`**, control negativo 20/20 — §13 lo había adjudicado mal, al velo del `+N more` lo mata `button.css:69`/`:88`. Guarda §55 apartado **(f)** en `active-eidos-config.test.ts`, **4 mutaciones / 4 mordidas** (las dos primeras muerden la mitad positiva, las dos segundas —el atajo AÑADIDO junto al longhand— la negativa). **Lo que quedó fuera, con su número en `next-features.md` §13**: el residuo `transition` del MISMO empate (suelo `background, border-color` vs arquetipo `opacity, background-color`, las dos a (0,0,0) — hoy el `border-color` del hover de popover salta en vez de animarse), la decisión de producto «popover deja de declarar hover propio» (no es coste cero: 0.9821 → 0.931 **más** el velo hoy, sólo el velo después) y `calendar-select.css:14`, que **no es un pin** — retirarlo rompe el tipo en 3 de 4 tallas (12 / 14 / 20 → 16 px). **Fichas y prosa saneadas**: `chronos.md` (censo 202→198, propuesta 50→47, en bloques `` para que sobrevivan a `--report`), `calendar.md` (su ⚠ HALLAZGO «no determinista» lo cerró §55 y ya no apunta a §13), `emoji-picker.md` y los tres comentarios de código que seguían afirmando **(0,2,0)** del sobre (`emoji-picker.css`, `gradient-picker.css` —sólo su mitad base, la de estados sigue viva— y `lib/recipes/base.ts`). Se ANOTAN, no se reescriben: cada medida fue correcta con la cascada de su día. ### FIRMA EJECUTADA (2026-08-25) — el eje `size` de `form` LLEGA a sus acciones **Qué se firmó**: ceder el cromo de `submit`/`reset` al `Button` compuesto (firma del 2026-08-24) destapó el reverso. `form-submit.svelte:20` y `form-reset.svelte:15` traían su propio `size = 'md'` y **nada les pasaba la talla del formulario**, así que un `
` los renderizaba con `data-size="md"` —36 px de alto y 16 px de letra— **en las cinco tallas**; del eje sólo sobrevivía el `row-gap`. Quitar el default no arreglaba nada (el `Button` tiene el suyo): hacía falta el puente, y el precedente es literal. Nuevo `eidos/components/form/context.ts` calcado **1:1 de `toolbar/context.ts`** (`Symbol('form-eidos-ctx')` + getter de propiedad), `form.svelte` publica el `resolvedSize` que ya calculaba, y las dos acciones leen `size={size ?? form?.size}` — la prop explícita gana, y standalone cae en el `md` del propio `Button` sin re-declararlo. **Sólo eidos: cinco ficheros, cero morfo / soma / sema; el contrato de 64 claves y el ledger, intactos.** **Los números**: alto **−10 / −6 / 0 / +8 / +16** px y letra **−4 / −2 / 0 / +4 / +12** px, sobre `submit` y `reset` por igual; **`md` no mueve un solo valor**; 84 diffs en total y **cero** en los cuatro nodos del array, el widget y el resumen de errores. Sonda estándar antes/después **0 sobre 832 valores en 7 estados**; instrumento propio reproducible (dos pasadas sobre código idéntico ⇒ 0 diffs). `vitest src/uix/eidos` 443/444 (el rojo es el ajeno conocido `skin-media-player`), `check` 0 errores atribuidos a los cinco ficheros, `docs:check` 0/0. **La doctrina que hubo que adjudicar**: **VERBATIM, no la norma tapada en `md`**. La tapa de `reference.md` §«Container→part derivation» gobierna contenedores cuyo eje es ANCHURA (su primer consumidor es `Dialog.Close`); el de `form` es DENSIDAD declarada, y su propia receta ya había escrito los cinco peldaños distintos de la acción. Escrita en `next-features.md` §13 §«Anchura vs densidad», con el corolario de que a `alert-dialog` —mismo agujero, eje de anchura— le toca la TAPADA. **Lo que quedó fuera, con su entrada en §13**: `alert-dialog` (no medido), `Form.ErrorSummary` con un `data-size` que ninguna regla lee, la escalera de fuente `12·12·14·14·16` de la acción de `form` (que corrige E1 en su carril) y la cita colgada de `dialog/context.ts:9`. ### FIRMA B′ EJECUTADA (2026-08-24) — la cascada de paleta es una ESCALERA **Qué se firmó**: los tres escritores de `--{c}-palette-*` pasan a tres peldaños que **no empatan** — suelo `:where([data-{c}])` `(0,0,0)` < forward `[data-{c}]:where([data-color], [data-color-custom])` `(0,1,0)` < tono `[data-{c}][data-color='X']` `(0,2,0)`. Antes el forward genérico se emitía el ÚLTIMO empatado a `(0,2,0)` con los bloques por tono, así que **ganaba por orden de emisión** y 419 claves públicas de tono en 49 recetas no pintaban nunca. **Por qué B′ y no reordenar la emisión** (que es lo que §13 proponía): el orden es **contrato invisible** —no se lee en el artefacto, no lo verifica un guard sin recorrer la hoja entera, se rompe moviendo una línea—. La especificidad es **contrato EN el artefacto**. Y es la misma ley que §12.9 acababa de firmar para el plano de profundidad: **una doctrina aplicada dos veces**, no dos parches. **Los números**: neutra en píxel sobre **~297.000 valores computados** comparados antes/después (70.912 + 34.336 planos en dos lotes, 57.720 en el tercero, 134.464 con los tonos ESTAMPADOS en las 49 unidades) — **0 diffs reales**, y los 17 crudos probados ruido reproduciéndolos sobre código idéntico. **207 de 353 claves** de tono volvieron a mover un valor computado. Guarda por **mutación** en `active-eidos-config.test.ts:1761` (6 mutaciones, 6 mordidas; cierre estructural: toda declaración de paleta vive en uno de los tres peldaños; anti-vacío `> 40`). Contrato del forward **ensanchado de 2 a 49 recetas** — vigilaba sólo las de paleta pública y era ciego a las 47 privadas. Suite 35/36 (el rojo `skin-media-player` es AJENO y conocido). **Dónde vive todo**: doctrina en [`theming/changelog.md`](../theming/changelog.md) §53 · contrato en [`theming/reference.md`](../theming/reference.md) (bloque THM-2) · emisor `src/uix/eidos/lib/render-css.ts` (`isPaletteSlotToken` parte el bucket host — **sólo las ranuras de paleta bajan**, el chasis se queda a `(0,1,0)`) · guarda `active-eidos-config.test.ts` · ledger `scripts/theming-sentinel-exceptions.ts`. **Tres leyes que deja escritas, y las tres costaron una medida**: 1. **El silencio del guard NO es señal cuando la adjudicación es por PATRÓN.** `theming-sentinel.ts` detecta STALE sólo contra el ledger EXACTO (`k in ledger`), nunca contra `SENTINEL_PATTERN_EXCEPTIONS`. Las 207 claves resucitadas no dispararon ni un aviso: el estrechamiento hubo que hacerlo comparando a mano contra las 13 entradas. La única que el guard sí vio fue `editable.risk-border`, que era exacta. 2. **Un tono por defecto ESTAMPADO resuelve por el forward, no por el suelo.** El envoltorio estampa `data-color` en toda instancia, la default incluida, así que `