@ -509,6 +509,56 @@ excepción abre la mano para MEDIR, no para contabilizar.
## 8. Registro
- 2026-08-24 — ** `toolbar` 91 % → 94 % CERRADO** (`26713f288`), contrato **54**
claves intacto (cero acuñadas), centinela **52/54** con 2 adjudicadas. **No
había nada que acuñar, y ése es el resultado**: el censo daba `global 0` —la
receta ya lee su contrato en cada declaración, con el eje `size` resuelto por
el TSC a través de siete privados que sólo reapuntan claves públicas por
talla— así que el trabajo fue CLASIFICAR lo que quedaba fuera. Sus dos
privados son **conmutadores por variante** , medidos uno a uno en el nodo real
(`--_toolbar-bg` = `var(--toolbar-bg)` en `surface` , `transparent` en
`outline` y `ghost` ; `--_toolbar-shadow` igual con `none` ): esa segunda rama
es la **identidad de la variante** , no un knob — una barra `ghost` ES la que
no tiene relleno ni sombra, y un público encima dejaría que un tema la
rellenara. Y su único literal (`inline-size: 100%` del separador horizontal,
el mismo trabajo que `align-self: stretch` en el gemelo vertical, medido 112
px sobre 126) queda FIRMADO y sale del ratio. **Lo que enseñó** : (1) **ceder
el cromo al componente compuesto sale GRATIS** — `Toolbar.Button` compone el
`<Button>` canónico y sus nodos llevan `data-button` Y `data-toolbar-button` ,
con `[data-button]` casando a la misma especificidad (0,1,0) pero emitiéndose
DESPUÉS; la diferencia con `form` , que conserva 24 declaraciones que Button
anula, es que esta receta **no escribe ni una regla `[data-toolbar-button]` **
(A-112), así que la cascada del compuesto no le mata una sola clave —medido
ANTES de tocar nada: 51/54, y ninguna de las tres silenciosas era del botón;
(2) el interruptor que revive `disabled-opacity` hay que elegirlo MIRANDO la
regla de hover: encender «group disabled» no tapa nada porque el hover del
bar es `[data-toolbar-link]:hover, [data-toolbar-group-item]:hover:not([data-disabled])`
y el Link no pertenece al grupo — comprobado corriendo el guard antes y
después (51/54 → 52/54, el conjunto muerto encoge en uno y no gana ninguno).
Diff de computed vacío (2.464 valores × 7 estados × 11 nodos), capturas 2×
antes/después.
- 2026-08-24 — ** `collapsible` 90 % → 100 %** (`1621de93c`), contrato 11 → **12**
claves, centinela **10/12** con 2 adjudicadas. Una sola clave, y es **la
COSTURA** (§2-A): el `gap` del encabezado leía `var(--space-2)` A PELO, así
que el valor era del sistema y el knob no era de nadie. El nombre lo decidió
el **catálogo** , no la propuesta de la ficha: `trigger-gap` ya existía ocho
veces en `base.ts` , cinco con exactamente ese paso. **Lo que enseñó** : (1) **el
componente que ANIMA su apertura no tiene un solo knob de motion** — su firma
es el par de eventos `emerge-expand` / `emerge-collapse` que materializa
`EidosConfig.motion.signatures` , y la receta no declara un `@keyframes`
(recipe-contract §2, R-4.5), de modo que lo único suyo es el par
`transition-*` que ya estaba en el contrato: el aviso «nunca `@keyframes` en
una receta» aquí no tenía nada que prohibir; (2) **una silenciosa se ARREGLA
antes que adjudicarse, pero eligiendo el interruptor** — encender el
`disabled` de la demo para toda la corrida se habría llevado el tinte de hover
por delante (`pointer-events: none` en el provider, «montar más mide menos»),
así que el estado entra como **superficie extra** por la URL
(`?perm.disabled=true`, precedente `radio-group` ) en vez de como línea de
ledger. Las dos que sí se adjudican son `transition-duration` /
`transition-ease` , que SON la transición que el guard congela — medidas sin
congelar sobre el encabezado real (`0.18s × 2 → 4.321s × 2`). Diff de computed
vacío (736 valores × 8 estados × 3 nodos, las tres partes del morfo en cerrado
y en abierto), capturas 2× antes/después.
- 2026-08-23 — ** `card` 78 % → 78 %** (`f3189a05a`), contrato 97 → **98** claves,
centinela **49/98** con 49 adjudicadas. **Cerrado en su número, y ése es el
resultado**: sus ocho privados son TODOS, transitivamente, el puente THM-2 —