11 claves nuevas (42 → 53). Su contrato ya era grande —40 claves de intención—
pero su CROMO estaba a pelo: la densidad por talla, la interlínea y el trazo del
anillo de `outline`, que era la última fila que impedía al privado del borde
derivar de un público.
Dos ausencias firmadas: los `transparent` de `outline` y `ghost` y los tres
`border-width: 0`. La variante ES la ausencia de cromo — mismo criterio que
button, y por la misma razón: diez claves de `transparent` no son un contrato,
son ruido.
EL INSTRUMENTO NO VEÍA 38 DE SUS 42 CLAVES, Y NINGUNA ESTABA MUERTA. Dos
cegueras a la vez:
1. Su paleta resuelve por `data-intent`, NO por `data-color`. El barrido de tono
del guard —añadido esta mañana para button— estampaba sólo `data-color`. Ahora
estampa los DOS nombres: un componente selecciona por uno y el otro queda
inerte.
2. Y luego por VARIANTE: las ranuras `solid`/`contrast` sólo pintan en `solid`,
la de borde sólo en `outline`, y la demo monta una de cada. Con `sweepAttr`
sobre `data-variant`, el guard las recorre.
Con las dos, 4/42 → 53/53. Es la diferencia entre «38 tokens que mienten» y «38
tokens que nadie había mirado con el atributo puesto»: exactamente lo que R-5.4
existe para distinguir.
Gates: sonda 0 diffs en 192 valores × 7 estados (la demo monta UNA franja) ·
centinela 53/53 sin una sola adjudicación · censo 100 % · `component:audit` PASS
· suite eidos con el rojo conocido ajeno · `rtl:check` 0 · `docs:check` 0 ·
captura de las cuatro variantes con cuatro intenciones.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- **Tiene eje `size`**: los tokens dimensionales van por talla (`{part}-{eje}-{k}`) apuntando al bundle `--size-{k}-*`, nunca al primitivo crudo (theming §5; el guard `recipe-css-contract` prohíbe el primitivo).
### 4.1 Tokens a declarar en `lib/recipes/base.ts` (11)
### 4.1 Tokens a declarar en `lib/recipes/base.ts` (0)
Valor **verbatim** del CSS de hoy: el default no se mueve, sólo cambia quién
puede moverlo. Nombres derivados de recipe-contract §1 (ejes lógicos, talla
@ -79,29 +71,10 @@ no distingue lo que debería — se marca `⚠`.
- **⚠ decisión: `100%` es un valor identidad o geometría de layout, no un knob de tema — el perímetro de «knob» es D-TH.2, sin firmar** — 1: `inline-size`.
- **⚠ decisión: `border` es shorthand o eje físico — hay que partirlo en ejes lógicos antes de nombrarlo (recipe-contract §1, R-4.4)** — 1: `border`.
### 4.3 Avisos sobre los tokens propuestos (4)
### 4.2 Sin nombre mecánico (1)
- **el privado `--_banner-padding-block` debe pasar a leer este público (o desaparecer)** — `--banner-padding-block-sm`, `--banner-padding-block-md`, `--banner-padding-block-lg`
- **el privado `--_banner-padding-inline` debe pasar a leer este público (o desaparecer)** — `--banner-padding-inline-sm`, `--banner-padding-inline-md`, `--banner-padding-inline-lg`
- **el privado `--_banner-font-size` debe pasar a leer este público (o desaparecer)** — `--banner-font-size-sm`, `--banner-font-size-md`, `--banner-font-size-lg`
- **el privado `--_banner-bg` debe pasar a leer este público (o desaparecer)** — `--banner-bg`
- **⚠ decisión: `100%` es un valor identidad o geometría de layout, no un knob de tema — el perímetro de «knob» es D-TH.2, sin firmar** — 1: `inline-size`.
### 4.4 Lo que hay que comprobar a mano (PLAN-theming §1.3 · §7.4)
@ -115,6 +88,37 @@ no distingue lo que debería — se marca `⚠`.
<!-- veredicto:start -->
_(pendiente — lo escribe el autor; se conserva al regenerar)_
**EJECUTADO 2026-08-23 — 30 % → 100 %**, 11 claves nuevas (42 → 53), y el
centinela pasa **53/53 sin una sola adjudicación**. Su contrato ya era grande
—40 claves de intención— pero su CROMO estaba a pelo.
Cosida la densidad por talla (relleno de bloque y de línea, y la escala, que lee
el bundle), la interlínea y **el trazo del anillo de `outline`**, que era la
última fila que impedía al privado del borde derivar de un público.
**Dos ausencias firmadas**: los `transparent` de `outline` y `ghost` y los tres
`border-width: 0`. La variante ES la ausencia de cromo — el mismo criterio que
button, y por la misma razón: diez claves de `transparent` no son un contrato,
son ruido.
**El instrumento no veía 38 de sus 42 claves, y ninguna estaba muerta.** Dos
cegueras a la vez:
1. **Su paleta resuelve por `data-intent`, no por `data-color`.** El barrido de
tono del guard —añadido esta mañana para button— estampaba sólo
`data-color`. Ahora estampa los DOS nombres: un componente selecciona por uno
y el otro queda inerte.
2. **Y luego por VARIANTE**: las ranuras `solid`/`contrast` sólo pintan en
`solid`, la de borde sólo en `outline`, y la demo monta una de cada. Con
`sweepAttr` sobre `data-variant`, el guard las recorre.
Con las dos, **4/42 → 53/53**. Es la diferencia entre «38 tokens que mienten» y
«38 tokens que nadie había mirado con el atributo puesto»: exactamente lo que
R-5.4 existe para distinguir.
Verificación: **diff de computed = 0** sobre 192 valores en 7 estados (la demo
monta UNA franja) · centinela **53/53** · censo 100 % · `component:audit` PASS ·
suite eidos con el rojo conocido ajeno · `rtl:check` 0 · `docs:check` 0 ·
captura de las cuatro variantes con cuatro intenciones.