`section` (cuatro claves resucitadas), `sticky` 0 → 100 %, `button-group` 40 →
100 %, `qr-code` 43 → 100 %, `toggle-group` 33 → 50 % (su techo) y `split-button`
adjudicado en 50 % (el suyo). Cero claves nuevas. Global 65 %, 25 componentes al
100 %, y los de alcance <20 % bajan de 14 a 12.
EL HALLAZGO ESTÁ EN `section`: LA RECETA TAPABA SUS PROPIAS CLAVES PÚBLICAS.
Declaraba los cuatro pasos de relleno en el host
(`[data-box][data-section] { --section-padding-block-sm: … }`), y esa declaración
gana a la que el contrato emite en `:root`: un tema que escribiera
`--section-padding-block-lg` perdía contra la receta. Borrado el bloque —mismos
valores, una sola fuente—, computado idéntico (48px antes y después), y las
cuatro claves alcanzan.
Lo demás es IDENTIDAD: once `100 %` entre las seis recetas y el centinela de 2px
del sticky —el hilo invisible que el observador vigila—, todos con su razón
escrita. Más un respaldo muerto retirado en `toggle-group`, sobre un token
PRESTADO de `toggle`: el velo de un grupo deshabilitado ES el del toggle, y se
tema en su ficha (§5.3-3).
Y UNA CLASE DE ADJUDICACIÓN NUEVA, QUE SE REPETIRÁ: UN PASO POR INSTANCIA.
`section` y `qr-code` mapean su prop de talla a `var(--{c}-{eje}-{k})` y la
escriben INLINE, así que sólo el paso ACTIVO alcanza; los otros leen muertos
hasta que la prop cambia. No es deuda ni ceguera del instrumento: es cómo
funciona una escala resuelta por prop.
Gates: los seis guards en verde · censo 65 % · `component:audit` PASS · suite
eidos con el rojo conocido ajeno · `rtl:check` 0 · `docs:check` 0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
## 2. Sistema transversal (0) — informativo, fuera del ratio
Un tema los alcanza **a nivel de sistema**, por diseño (recipe-contract §2).
@ -46,6 +46,8 @@ _La receta no declara privados propios en su CSS._
## 4. Propuesta de corrección
- **Sin knobs de apariencia**: el visual vive en un componente compuesto o en una capa compartida. «Declarado y nunca pintado» no es deuda por sí solo (architecture/eidos.md, columna `unused`).
### 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
@ -73,6 +75,19 @@ no distingue lo que debería — se marca `⚠`.
<!-- veredicto:start -->
_(pendiente — lo escribe el autor; se conserva al regenerar)_
**EJECUTADO 2026-08-23 (cola pequeña) — sin knobs que medir, y CUATRO claves
resucitadas.** La receta declaraba sus propios pasos de relleno EN EL HOST
(`[data-box][data-section]`), y esa declaración **tapaba las cuatro públicas que
el contrato ya emite en `:root`**: un tema que escribiera `--section-padding-block-lg`
perdía contra la receta. Borrado el bloque —mismos valores, una sola fuente— y el
computado no se mueve (48px antes y después).
El `inline-size: 100%` pasa a excepción por identidad: una sección ES el ancho de
su caja.
Los tres pasos que el guard sigue viendo quietos son **un paso por instancia**:
el wrapper mapea la prop `padding` a `var(--section-padding-block-{k})` y lo
escribe INLINE, así que sólo el activo alcanza. Forzando el paso, alcanza
- **⚠ 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.3 Avisos sobre los tokens propuestos (1)
- **el privado `--_sticky-sentinel-size` debe pasar a leer este público (o desaparecer)** — `--sticky-sentinel-height`
### 4.4 Lo que hay que comprobar a mano (PLAN-theming §1.3 · §7.4)
- [ ] **Privado que no deriva de un público** — §3 lo marca; el privado debe leer el público o desaparecer.
@ -84,6 +77,9 @@ no distingue lo que debería — se marca `⚠`.
<!-- veredicto:start -->
_(pendiente — lo escribe el autor; se conserva al regenerar)_
**EJECUTADO 2026-08-23 (cola pequeña) — 0 % → 100 %** sin acuñar nada: sus dos
knobs eran identidad. El centinela del sticky (`--_sticky-sentinel-size: 2px`) es
el hilo invisible que el observador vigila —ni se ve ni se tematiza— y el
`inline-size: 100%` es el ancho de su caja. Los dos con su razón escrita.
'outline-arrow-bg':'the arrow is painted through a SIBLING selector that needs the content carrying data-variant=outline AND the panel open; measured with the demo switch -> reaches (oklch(0.9911 0 0) -> rgb(1,2,3))',
'size-xs':'one step per instance: the wrapper writes var(--qr-code-size-{k}) inline from the size prop and the demo runs lg. Forced -> reaches (96px -> 123px)',
'size-sm':'same, one step per instance',
'size-md':'same, one step per instance',
'size-xl':'same, one step per instance',
'fg':'painted as the SVG fill of the module path, not as color on the root; read on the path -> reaches (rgb(24,24,27) -> rgb(1,2,3))',
'bg':'painted as the fill of the backing rect, not as background on the root; read on the rect -> reaches (white -> rgb(1,2,3))'
},
'toggle-group':{
gap:'the demo group is ATTACHED (segmented), where the gap collapses to 0; removed data-attached -> reaches (4px -> 123px)'
},
'button-group':{
'divider-strength':
'the seam only draws between ATTACHED buttons of a filled variant (solid/soft/ghost/plain) and the demo runs surface; forced -> reaches (0.18 -> 0.9 alpha)'
},
button:{
// Measured one by one 2026-08-23. The icon scale needs a real <svg> child,
// the radius scale is an OPT-IN prop the demo does not set, and the four