@ -1536,6 +1536,15 @@ Lo que `chart` destapó (2026-08-22):
dimensionan por `-height-{k}` , uno por `-min-block-size-{k}` ) y la tabla del
dimensionan por `-height-{k}` , uno por `-min-block-size-{k}` ) y la tabla del
propio censo, que ya mapea `min-block-size → height` . Extender R-5.3 con esa
propio censo, que ya mapea `min-block-size → height` . Extender R-5.3 con esa
tabla —propiedad → ranura— cierra la clase entera.
tabla —propiedad → ranura— cierra la clase entera.
- ** `label` es el ÚNICO primitivo de tinta sin el paso `'on-solid'` ** (verificado
2026-08-24). Lo omiten a la vez SU TIPO (`label/types.ts:9`:
`ComponentColorProp | 'muted' | 'disabled'` ) y su runtime (`label.svelte:38`),
así que es **auto-consistente** —no es un bug—, mientras `text.svelte:54` y
`heading.svelte:54` sí lo llevan y §43 describe el eje de la familia CON él.
Tampoco lo salva el «pues compila»: eso era el brazo de CSS crudo del tipo
abierto, idéntico en los tres. Es una **decisión pendiente** , y sólo caben dos:
o `label` gana el paso y la familia queda pareja, o se documenta la omisión
con su razón.
- ** ⚠⚠ EL GUARD TIENE FALSOS POSITIVOS: escribe el centinela en el `style` INLINE
- ** ⚠⚠ EL GUARD TIENE FALSOS POSITIVOS: escribe el centinela en el `style` INLINE
de cada nodo** (medido 2026-08-23). `staticPass` escribe el token en
de cada nodo** (medido 2026-08-23). `staticPass` escribe el token en
`documentElement` **y en todos los nodos del componente** , y ahí es donde vive
`documentElement` **y en todos los nodos del componente** , y ahí es donde vive
@ -1585,6 +1594,62 @@ Lo que `chart` destapó (2026-08-22):
mask cambia (`at 50% 35%` → `at 11% 50%` ). Añadir `maskImage` a la lista de
mask cambia (`at 50% 35%` → `at 11% 50%` ). Añadir `maskImage` a la lista de
propiedades del guard es una línea, pero toca el instrumento de TODOS: entra
propiedades del guard es una línea, pero toca el instrumento de TODOS: entra
con su re-verificación de los componentes con ledger.
con su re-verificación de los componentes con ledger.
- **El detector STALE del centinela es CIEGO a las adjudicaciones por PATRÓN**
(verificado 2026-08-24 sobre el código, tras B′ ). `theming-sentinel.ts:1140-1141`
filtran `k in ledger` , es decir **sólo las excepciones EXACTAS** . Las cubiertas
por `SENTINEL_PATTERN_EXCEPTIONS` sí entran en `reasonFor` (`:1129`) para
adjudicar un muerto, pero **nunca en `stale`** : una clave de patrón que pasa a
viva no dispara ni un aviso. **El coste ya está pagado** : en B′ revivieron 207
claves y el guard no dijo nada — el estrechamiento del ledger hubo que hacerlo
comparando a mano contra las 13 entradas. Arreglo mínimo: filtrar por
`reasonFor(k) !== null` en vez de `k in ledger` , e imprimir QUÉ patrón la
cubría (si no, el aviso no dice dónde ir). Es de la clase re-verificar-ledger
—tocar el guard obliga a re-pasar el ledger entero—, así que firma pequeña,
como las otras del instrumento.
- **El guard no sabe medir TONO y ESTADO a la vez** (verificado 2026-08-24; es la
raíz de `TONE_UNREACHED` , la razón nueva del ledger). El estampado del tono
vive **sólo** en el paso estático (`theming-sentinel.ts:913`, `TONES.find(...)`
→ `setAttribute('data-color', tone)` ); el paso de hover (`:999`) barre los ejes
de `sweepAttr` pero **no estampa tono** . Y `sweepAttr` puede forzar un estado,
pero de los **48** componentes de `COMPONENT_OVERRIDES` sólo `toggle` declara
un eje de estado (`:635`, `data-state: off|on` ) — `switch` y `button` **no
tienen entrada**. Medido: la ficha de `switch` monta **1 nodo `unchecked`** y
todas sus ranuras de paleta cuelgan de `[data-state='checked']` ; la de `button`
monta **1 nodo sólido** . Consecuencia: **toda clave de tono cuya ranura esté
detrás de un estado o de un hover se mide A MANO**, y por eso son 146 las que
siguen adjudicadas tras B′ y no cero. Arreglo: estampar el tono también en el
paso de hover, y dar eje de estado a los componentes cuyas ranuras lo exigen.
- **Tres huecos de la SONDA** (`scripts/__theming-probe.ts`, verificados
2026-08-24), independientes entre sí:
1. **El pase `open` de `editable` no muere por el localizador: muere por el
CLIC.** El localizador (`:324-326`) SÍ casa `[data-editable-input]` (3
nodos), pero esos inputs están `hidden` / 0× 0, así que
`trigger.click({ timeout: 2000 })` (`:330`) expira **dentro del `catch`
vacío** (`:359`) y el pase se pierde **EN SILENCIO** . La puerta real es
`[data-editable-preview]` + foco, que el CENTINELA ya declara
(`theming-sentinel.ts:214-221`: `openBy: 'focus'` , `openWith` ) y la sonda
no. Dos arreglos, y conviene hacer los dos: copiar la puerta, y que el
`catch` **avise** en vez de tragar (un pase perdido en silencio es un 0/N
que nadie investiga).
2. **La sonda no tiene análogo del barrido de variantes.** `DEMO_VARIANTS`
(`:139-202`, **10 claves** : avatar, audio-player, text-gradient, badge,
image-picker, search-field, chat-composer, chat-message, chat-typing, toast)
**TRUECA de demo, no barre** : mide un estado en lugar de otro. Por eso
`button` , que monta un solo botón sólido, no tiene sondeadas sus otras
variantes. Es el hermano exacto del hueco del guard de arriba.
3. **Dos alias de escala hacen sondas DÉBILES.** `affirm: 'teal'`
(`lib/config-types.ts:95` y `lib/themes/base.ts:40` ): estampar `teal` como
escala «cruda» computa **idéntico** a estampar el rol `affirm` en los 10
slots, así que una sonda que crea estar probando la vía de escala puede
estar midiendo la de rol. Y su hermana, medida: `risk: 'orange'`
(`themes/base.ts:42`), de donde ** `risk ≡ orange` ** y ** `risk ≠ amber` ** —
ojo, que la convención canónica del libro nombra `amber` mientras el tema
base mapea `orange` . **No son dos casos: son NUEVE de las 33 escalas** , las
que el tema base ata a un rol — `purple` (primary), `slate` (secondary),
`indigo` (tertiary), `gray` (neutral), `teal` (affirm), `green` (fulfill),
`orange` (risk), `red` (threat) y `plum` (loss). Para barridos futuros: usar
una escala sonda de las **24 libres** (`fuchsia`, `steel` , `sand` … ) y NO
`plum` , que a primera vista parece neutra y es el rol `loss` .
- **Montar MÁS capas puede medir MENOS** (medido 2026-08-23 en `background` ).
- **Montar MÁS capas puede medir MENOS** (medido 2026-08-23 en `background` ).
Al enseñar al guard a encender las capas opt-in del componente, añadir el foco
Al enseñar al guard a encender las capas opt-in del componente, añadir el foco
puntual, la velocidad de paralaje y la profundidad hizo BAJAR la corrida de 17
puntual, la velocidad de paralaje y la profundidad hizo BAJAR la corrida de 17