8 claves en una entrada NUEVA de `recipes/base.ts`. Censo 63 % → **100 %**.
Mismo patrón que text-circular: cinco públicos «de facto» consumidos con
fallback y ninguno declarado, más tres que faltaban — los tres en la ESQUINA
del marco de foco.
**La esquina es una escuadra dibujada con bordes**: 1rem × 1rem con dos de sus
cuatro lados a `0` según la posición. El tamaño es un knob, el grosor del trazo
otro, el radio el tercero. Los desplazamientos `-0.625rem` NO son knobs: colocan
la escuadra fuera del marco y se derivan del tamaño y el trazo. `border-color`
y `glow-color` son el mismo acento en dos capas y se declaran aparte a
propósito: un tema puede querer el halo de otro tono que el borde.
EL HALLAZGO — **`--radius-xs` NO EXISTE** (→ next-features §13):
La escala de radios del sistema es `sm | md | lg | xl | xxl` (+ none, full,
default), sin `xs`. Esta receta escribía `border-radius: var(--radius-xs, 3px)`
y **pintaba el fallback**, así que nadie lo notó nunca. Al tokenizarlo tal cual,
la variable quedó vacía, la declaración inválida y las cuatro esquinas
CUADRADAS: **48 diffs** — exactamente para lo que existe el gate. El contrato
guarda `3px` verbatim, el valor que de verdad pintaba, y el diff vuelve a 0.
Lo que abre: **un `var(--fantasma, fallback)` es una referencia muerta que
funciona por accidente**, y el guard G2 que el plan menciona
(«referencias-fantasma contra el contrato derivado») o no existe o no cubre los
fallbacks. Barrer el catálogo buscando `var(--…, …)` cuyo primer nombre no esté
en el contrato derivado es un pase mecánico que se paga solo.
Y un arreglo de instrumento: **`filter` y `backdrop-filter` faltaban en la lista
de propiedades del guard**. `glow-color` vive dentro de un `drop-shadow()` y
leía «no effect» estando vivo — `KNOB_PROPS` del censo sí las tenía, así que el
censo contaba el knob y el guard no podía verlo. Con ellas, text-focus pasa a
**8/8 sin una sola excepción**. Verificados los 30 componentes con ledger: cero
regresiones, cero STALE. (De paso se retiró una adjudicación que había escrito
con una razón equivocada antes de medir: el token sí movía el filter.)
Gates: sonda antes/después = 0 diffs en 1.769 valores × 7 estados · censo
--only 100 % · suite eidos sin rojos nuevos · rtl:check 0 · docs:check 0 ·
check por fichero limpio.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>