El contrato ya estaba entero (79 claves) y NO se acuña ninguna: las tres
declaraciones que quedaban fuera lo están por doctrina, y así se firma.
Lo que entra:
- `width: 100%` de `fitted` firmado con su anotación `/* literal: */`
(recipe-contract §3): es IDENTIDAD — `fitted` ES «la lista llena el eje
inline», y un token ahí sólo podría tomar un valor sin desdecir la prop.
Sale del ratio: 96 % → 97 %.
- La propuesta §4.1 de la ficha (acuñar `indicator-width` / `-height` sobre
`var(--indicator-w, 0px)`) se RECHAZA por escrito. Esas vars son el canal
de VALOR de soma: la capa `MeasuredIndicator` escribe el rect del trigger
activo en cada movimiento, así que un público encima sería un knob que un
tema puede FIJAR — y fijarlo rompe el deslizamiento. Misma adjudicación
que `navigation-menu` lleva escrita para su propio `indicator-w` (y la
razón por la que su `-x` se retiró, muerto). El comentario de la receta lo
dice ahora en el sitio donde se lee.
- Guard R-5.4: entrada nueva en `COMPONENT_OVERRIDES` (barrido de
`data-variant` line/surface/pills/segmented + las dos superficies de URL
del propio demo, `perm.orientation=vertical` y `perm.disabled=true`):
40/79 → **70/79** sin adjudicar una clave de más.
- Ledger: 9 adjudicaciones, todas MEDIDAS a mano sobre los nodos reales —
los cuatro tokens de transición (el guard congela `transition`), los tres
del anillo de foco (el guard hace `blur` a propósito), `trigger-bg` (la
demo monta el Indicator y la regla que sube la etiqueta por encima de la
píldora gana 0,2,0; sin indicador alcanza) y `scrollable-fade`, que además
pinta por `mask-image`, fuera del juego de propiedades del guard.
- README con su sección «Talla y tema» (tabla derivada del contrato) y
pestaña `Tokens` en la demo (79 claves, verificada en el navegador).
- Ficha `docs/audit/theming/tabs.md` con su veredicto §5.
Comprobado y refutado: el trigger NO compone el `Button` canónico
(`tabs-trigger.svelte` → `Tabs.Trigger` de soma, un `<button>` desnudo), así
que la clase «el compuesto gana a la receta que lo compone» de toolbar / form
no le aplica y no hay declaración muerta que ceder.
Censo: 96 % → 97 % (77 knobs · 74 públicos · 2 globales · 0 literales ·
1 excepción firmada · 1 sistema). Sin cambios en `recipes/base.ts` ni en
`generated/base.css` — no hacía falta regenerar.
Diff de computed: **0 diffs sobre 2.016 valores en 8 estados** (8 nodos en
reposo, 7 en hover). Capturas 2× antes/después, idénticas.
Guards: centinela 70/79 verde · `component-audit --only tabs` PASS ·
`eidos-lint tabs` 0 invalid (13 morfo-backed, 44 eidos-only) ·
`vitest run src/uix/eidos` 35/36 (el rojo conocido es `skin-media-player`) ·
`rtl:check` 0 · `docs:check` 0 · `check` COMPLETED sin un solo error en
ficheros de tabs · prettier limpio sobre el contenido normalizado a LF.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>