33 claves en una entrada NUEVA de `recipes/base.ts`. Censo 29 % → 75 %.
El knob ya tenía siete públicos «de facto» —consumidos como
`var(--knob-x, <default>)`— pero **ninguno declarado**, así que un tema no los
veía en `getRecipeTokens()`. Tokenizar ha sido sobre todo DECLARAR lo que ya se
consumía, y separar dos cosas que compartían nombre.
1. **Cuatro `--knob-*` quedan FUERA a propósito**: `progress`, `angle`,
`start-angle` y `sweep` los escribe el provider INLINE desde el estado del
control (`knob-provider.svelte.ts:358`). Canal de valor, no superficie de
tema \u2014 ningún contrato gana a un estilo inline. Misma clase que
`carousel.item-gap` y que la `z` del preview de drag-drop que retiró la
revisión adversarial.
2. **⚠ `--knob-arc-width` significaba DOS cosas con DOS defaults distintos**: el
inset de la cara del dial (`--space-3`, líneas 80 y 113) y la separación
superior del puntero (`--space-2`, línea 165). Un tema que lo escribiera
movía las tres declaraciones a la vez, pero **sin tema cada una valía algo
distinto** \u2014 «un nombre que no distingue lo que debería», que es la
definición de colisión que usa el propio generador. Separado en `arc-width`
(la cara) y `pointer-inset` (el puntero), cada uno con su valor verbatim:
cambia la superficie de tema, **no el píxel**.
3. **Las coordenadas por talla SUBEN al TSC, y no era opcional.** El default por
talla vivía en un privado y el público era un override que iba DELANTE
(`var(--knob-gap, var(--_knob-gap))`): declarar `--knob-gap` en el contrato
**habría matado la escala**, porque ganaría siempre. Con el patrón del resto
del eje (coordenadas + resuelto por `data-size`) el default sigue vivo y el
tema alcanza. Eje sm|md|lg|xl, sin xs; el diámetro es `control-height × 2` en
cada talla, proporción del bundle conservada verbatim.
`--_knob-value-digits` sigue privado: es el número de dígitos del valor máximo,
dato del consumidor.
Artefactos y gates:
- Sonda antes/después = 0 diffs en 754 valores × 7 estados. Determinismo
verificado.
- R-5.4: 25/33; los ocho mudos adjudicados con su medición (la demo no monta
etiqueta \u2014 0 nodos contados \u2014 ni estado de arrastre; forzados, los ocho
mueven).
- censo --only 75 % · component:audit PASS · eidos-lint invalid 0, class-hooks
0 · suite eidos 439/440 (el rojo conocido) · rtl:check 0 · docs:check 0 ·
check por fichero limpio.
- README con «Talla y tema» y tab `Tokens` en la demo (33 claves).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>