Siete claves nuevas (37 → 44), un literal firmado, siete adjudicaciones medidas.
Diff de computed 0 sobre 480 valores en 8 estados.
LAS SIETE SON LAS DOS TINTAS SEMÁNTICAS QUE LE FALTABAN
Cuatro para los tonos EVALUATIVOS (risk-border, risk-title-fg, threat-border,
threat-title-fg): dialog no tiene forward de paleta THM-2 y su trato de tono es
deliberadamente estrecho —el borde y la tinta del TÍTULO, nunca la superficie
del cuerpo, para que el texto largo no compita con la señal—, pero iban a
--color-risk-* a pelo.
Tres para el tinte de SALIDA (saved-border, failed-border, dismissed-border): el
morfo escribe data-last-action antes de que data-state pase a closed, así que el
borde superior dice CÓMO se cerró mientras se va. El tercero cubre cancelled /
dismissed / dismissed-outside, que comparten valor: todo cierre sin resultado.
{tono}-border es el nombre del catálogo (48 claves) y failed-border el de
proof-of-human.
EL 11 % QUE QUEDA SON CUATRO ESCOTILLAS, NO DEUDA
Los --_dialog-content-*-override los escribe el wrapper INLINE desde las props
width / minWidth / maxWidth / height / minHeight. Un público encima lo pisaría el
inline y mentiría — la clase de --_background-gradient-image y del triple de
s-text-virtual-list. El nombre del privado ya lo dice: -override.
⚠ NO se acuñó tipografía de superficie, por §12.9: el contenido lleva
data-depth='modal' y un plano declara font-family / line-height a la misma
especificidad y más tarde en la cascada. Las claves de título y descripción que
ya existían son de PARTES internas, no de la superficie del plano.
SIETE ADJUDICACIONES, DOS DE ELLAS CON SEGUNDA PASADA
Estados que la demo no monta: la hoja inferior, el tamaño full, las ocho celdas
no centradas de la rejilla de posición, el data-position del botón de cierre y
los tres tintes de salida (que sólo existen mientras data-state='closed' y
data-last-action COEXISTEN). Y dos costaron una segunda pasada por el VALOR del
atributo: la rejilla usa top-left / top-right (físicos), no top-start; y el botón
de cierre NO lleva data-position en esta demo aunque todas las reglas que leen
close-inset lo exigen.
VERIFICACIÓN
Sonda antes/después 0 diffs (480 valores · 8 estados · 8 nodos con el diálogo
abierto) · R-5.4 37/44 con las siete adjudicadas, exit 0 · component:audit PASS ·
censo --only 89 % · eidos-lint 15 morfo-backed / 0 invalid / 0 class-hooks ·
rtl:check 0 · docs:check 0 · suite eidos 439/440 (el rojo conocido) · capturas 2×
· el ledger sigue en sus 63 hunks previos.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
## 2. Sistema transversal (0) — informativo, fuera del ratio
## 2. Sistema transversal (0) — informativo, fuera del ratio
Un tema los alcanza **a nivel de sistema**, por diseño (recipe-contract §2).
Un tema los alcanza **a nivel de sistema**, por diseño (recipe-contract §2).
@ -67,7 +59,7 @@ Consumidos y **no declarados en el CSS** (vienen de `base.ts` o de un estilo inl
- **Tiene eje `size`**: los tokens dimensionales van por talla (`{part}-{eje}-{k}`) apuntando al bundle `--size-{k}-*`, nunca al primitivo crudo (theming §5; el guard `recipe-css-contract` prohíbe el primitivo).
- **Tiene eje `size`**: los tokens dimensionales van por talla (`{part}-{eje}-{k}`) apuntando al bundle `--size-{k}-*`, nunca al primitivo crudo (theming §5; el guard `recipe-css-contract` prohíbe el primitivo).
### 4.1 Tokens a declarar en `lib/recipes/base.ts` (2)
### 4.1 Tokens a declarar en `lib/recipes/base.ts` (0)
Valor **verbatim** del CSS de hoy: el default no se mueve, sólo cambia quién
Valor **verbatim** del CSS de hoy: el default no se mueve, sólo cambia quién
puede moverlo. Nombres derivados de recipe-contract §1 (ejes lógicos, talla
puede moverlo. Nombres derivados de recipe-contract §1 (ejes lógicos, talla
@ -77,21 +69,13 @@ no distingue lo que debería — se marca `⚠`.
- **⚠ decisión: `min-width` es shorthand o eje físico — hay que partirlo en ejes lógicos antes de nombrarlo (recipe-contract §1, R-4.4)** — 1: `min-width`.
- **⚠ decisión: `min-width` es shorthand o eje físico — hay que partirlo en ejes lógicos antes de nombrarlo (recipe-contract §1, R-4.4)** — 1: `min-width`.
- **⚠ decisión: `height` es shorthand o eje físico — hay que partirlo en ejes lógicos antes de nombrarlo (recipe-contract §1, R-4.4)** — 1: `height`.
- **⚠ decisión: `height` es shorthand o eje físico — hay que partirlo en ejes lógicos antes de nombrarlo (recipe-contract §1, R-4.4)** — 1: `height`.
- **⚠ decisión: `min-height` es shorthand o eje físico — hay que partirlo en ejes lógicos antes de nombrarlo (recipe-contract §1, R-4.4)** — 1: `min-height`.
- **⚠ decisión: `min-height` es shorthand o eje físico — hay que partirlo en ejes lógicos antes de nombrarlo (recipe-contract §1, R-4.4)** — 1: `min-height`.
- **⚠ decisión: `width` es shorthand o eje físico — hay que partirlo en ejes lógicos antes de nombrarlo (recipe-contract §1, R-4.4)** — 2: `width`.
- **⚠ decisión: `width` es shorthand o eje físico — hay que partirlo en ejes lógicos antes de nombrarlo (recipe-contract §1, R-4.4)** — 2: `width`.
- **⚠ decisión: la propiedad no tiene slot canónico en el vocabulario** — 3: `border-top-color`.
### 4.3 Avisos sobre los tokens propuestos (2)
- **declaración por color: `declarations[]` con scope `color:risk` (tsc.md)** — `--dialog-content-border`, `--dialog-content-fg`
- **declaración por color: `declarations[]` con scope `color:threat` (tsc.md)** — `--dialog-content-border`, `--dialog-content-fg`
### 4.4 Lo que hay que comprobar a mano (PLAN-theming §1.3 · §7.4)
### 4.4 Lo que hay que comprobar a mano (PLAN-theming §1.3 · §7.4)
@ -105,6 +89,51 @@ no distingue lo que debería — se marca `⚠`.
<!-- veredicto:start -->
<!-- veredicto:start -->
_(pendiente — lo escribe el autor; se conserva al regenerar)_
**EJECUTADO 2026-08-23 — 67 % → 89 %.** Siete claves nuevas (37 → 44), un
literal firmado, siete adjudicaciones medidas. Diff de computed **0 sobre 480
valores en 8 estados**.
**Las siete son las dos tintas SEMÁNTICAS que le faltaban.** Cuatro para los
'radius-sm':'only the step in force paints; forced data-rounded=sm → reaches (4px → 37px)',
'radius-sm':'only the step in force paints; forced data-rounded=sm → reaches (4px → 37px)',
'radius-lg':'only the step in force paints; forced data-rounded=lg → reaches (10px → 37px)'
'radius-lg':'only the step in force paints; forced data-rounded=lg → reaches (10px → 37px)'
},
},
dialog:{
// 2026-08-23. Seven tokens of states the demo does not mount: it shows a
// middle-centred `md` dialog, open and neutral. All forced on the real
// content node, transitions frozen.
'content-max-height-sheet':
'only under [data-sheet] (the wrapper sets it below the sm breakpoint); forced -> reaches (850px -> 377px)',
'content-full-inset':"only under [data-size='full']; forced -> reaches (12px -> 37px)",
'content-position-inset':
'only on the 8 non-centred cells of the position grid; forced data-position=top-left -> reaches (16px -> 37px)',
'close-inset':
'the close button carries NO data-position in this demo, and every rule that reads it needs one; forced data-position=top-right -> reaches (12px -> 37px)',
// The exit tint: the morfo writes `data-last-action` before `data-state`
// flips to closed, so both attributes only coexist WHILE the dialog leaves.
'saved-border':
'only during the exit, with [data-state=closed][data-last-action=saved]; forced -> reaches (oklch(0.9582 0.0223 155) -> rgb(1,2,3))',