Reparación, no trabajo nuevo. `edc019515` salió con la mitad del componente:
la receta, el CSS, el README, la demo y la ficha entraron; el ledger R-5.4, el
guard y la entrada del §8 se quedaron fuera, y en su lugar viajaron fragmentos
de OTRA sesión (rating-group). Causa medida: en esta rama el ÍNDICE de git es
un recurso compartido — entre el `git add` verificado y el `git commit` otra
sesión hizo su propio `reset` + `add`, y el commit fotografió su índice, no el
mío. Verificar el árbol indexado no basta si alguien puede reescribirlo
DESPUÉS de mirarlo; la verificación y el commit tienen que ir en la misma
invocación. Sin esto `npm run theming:sentinel -- toggle` falla: el contrato
tiene 126 claves y el ledger no tenía ninguna.
Lo que entra:
- **Ledger** (`theming-sentinel-exceptions.ts`): las 8 adjudicaciones medidas
de toggle (los cinco pasos de `rounded` que la demo no expone,
`disabled-opacity`, y el par de transición que ES lo que el guard congela)
y la excepción POR PATRÓN de sus 48 claves de tono — la cascada de paleta,
medida aquí: con `data-color=primary` `--toggle-primary-solid` no mueve nada
y `--palette-solid` sobre el mismo nodo repinta; quita `data-color` y
`--toggle-neutral-solid` pinta otra vez.
- **Guard** (`theming-sentinel.ts`): el barrido de VARIOS ejes como producto
cartesiano (un solo eje da la misma secuencia de siempre), el valor `null`
que QUITA el atributo, el mismo barrido en el pase de HOVER, y el override
de toggle. 36/126 → 70/126 sin adjudicar nada. Los 12 componentes con
`sweepAttr` re-verificados uno a uno: cero regresiones, cero STALE.
- **`PLAN-theming.md` §8**: la entrada de toggle.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
'the guard freezes transitions and this token IS the transition; measured unfrozen on a real item -> reaches (0.12s -> 11.5s on colour and transform)',
// 2026-08-23. Eight, each forced on the REAL stage toggle. The forty-eight
// tone keys are the palette cascade, adjudicated BY PATTERN below; the
// twelve hover keys and the thirty variant keys stopped being dead when the
// guard learnt to sweep SEVERAL axes (variant x state x invalid) in both
// passes — they are not adjudicated, they are measured.
'radius-sm':
'only the step in force paints (the demo has no `rounded` control at all, so the resting corner is the only one mounted); forced data-rounded=sm -> reaches (4px -> 1234px)',
'the demo boots enabled, and switching `disabled` on for the whole run would drop pointer-events and revert the hover pair, killing six other keys; forced data-disabled on the real toggle -> reaches (opacity 0.4 -> 0.123)',
'transition-duration':
'the guard freezes transitions and this token IS the transition; measured unfrozen -> reaches (0.12s -> 11.5s on all four transitioned properties)',
' — and here NEUTRAL falls with the rest: soma always stamps data-color (it is the resolved colour, neutral by default), so the generic block matches on every instance and the fallback the other recipes keep alive never applies. Measured checked 2026-08-23: --switch-neutral-solid moves nothing, --palette-solid on the node repaints (oklch(0.5556 …) -> rgb(4,5,6))'
' — the six tones toggle forwards x eight slots, 48 of its 126 keys (it excludes fulfill/loss by doctrine: a toggle is neither completion nor irreversible loss). Measured 2026-08-23 on the real pressed toggle with transitions frozen: with data-color=primary, --toggle-primary-solid moves NOTHING (the fill stays oklch(0.5556 0.1829 305.86)) while --palette-solid on the same node repaints it (rgb(1, 2, 3)); strip data-color and --toggle-neutral-solid paints again (oklch(0.6434 0 0) -> rgb(1, 2, 3)). The neutral eight fall with the rest for a second reason worth writing down: the guard STAMPS data-color=neutral to test them, which is exactly what turns the generic block on'