# CONTINUE — eje Theming «theme-reach» — **CERRADO 2026-08-25** ## EMPIEZA AQUÍ **EL EJE ESTÁ CERRADO** (gate de F3 rediseñado y en verde el 2026-08-25; sección §«EL CIERRE, EJECUTADO» abajo). Lo que vigila el estado desde hoy no es este documento sino los guards: `theming-reach-floor.test.ts` (newDebt=0 · STALE=0 · reach ≥ 69 % · ≥45 al 100 %), `component-audit` R-5.1/5.2/5.3 en `error`, y el centinela R-5.4. La deuda restante vive NOMBRADA clave a clave en `scripts/theming-census-debt.ts` (1088 entradas que sólo pueden menguar). Trabajo nuevo de theming se abre como entrada nueva de §13/next-features, no heredando de aquí. Quedan DOS firmas pendientes del autor, registradas en §13: los 318 privados no-derivados sin ratchet por clave, y el idioma `var(--{c}-x, fallback)` sin contrato (`mockup`/`text-scramble`). **El eje ya no tiene cola.** Los 16 componentes que nunca habían pasado están cerrados o adjudicados, la deuda de artefactos está saldada, y **§12.9 y la firma B′ quedaron FIRMADAS Y EJECUTADAS** — las dos decisiones más caras pendientes. Global **69 %** (68 % antes de la clase `structural`), **45 componentes al 100 %**. ## HANDOFF 2026-08-25 (noche) — POR AQUÍ MAÑANA **Las CINCO firmas del eje están EJECUTADAS y pusheadas** (`2daa683fa` file-upload · `df3a4d054` form/compuesto · `2ce43db56` tags-input aria · `1f8ce293b` avatar · `466b24f34` chip/suelo §55). Después cayeron los expedientes de §13: `d5a27b87e` (árbol ARIA de tags-input, cierra F-1) · `3bf7930ba` (el velo no muere por un atajo + pin de chronos, §56) · `318aac207` (la talla de form LLEGA, doctrina anchura-vs-densidad). ### Lo PRIMERO mañana: dos firmas de INSTRUMENTO, en este orden 1. ~~**«La mitad gratis»**~~ — **✅ FIRMADA Y EJECUTADA 2026-08-25** (`047464389`; ver §«FIRMA EJECUTADA — la mitad gratis» justo abajo). Expediente original: scratchpad de la sesión `6314e22b…/scratchpad/bprime/exped/va/informe.md` (1.019 líneas). 2. ~~**La GRANDE: cuatro cegueras + TRES BARRIDOS escalonados.**~~ — **✅ FIRMADA Y EJECUTADA 2026-08-25** (`6392d6003` S1 · `b4dd5a906` S2 · `b9cef9a43` S3; ver §«FIRMA EJECUTADA — la GRANDE» abajo). Se ejecutó exactamente con el plan de VA: tres barridos escalonados, sin fusionar S2 y S3, y la atribución quedó limpia. ### FIRMA EJECUTADA (2026-08-25) — «la mitad gratis»: cegueras 4 y 5, coste de ledger CERO **Qué se firmó** (`047464389`): las dos piezas del expediente VA que NO compartían el coste caro — el codemod ciego a la IIFE con sus dos hermanos, y los cinco huecos de la sonda más el sexto propio (el pase de FOCO prometido e inexistente). Tres ficheros, **ni una entrada del ledger**. Ejecutada por cuatro agentes (tres constructores + uno ADVERSARIAL con mandato de refutar), con bases capturadas ANTES de editar. **Los números**: centinela `label` 1/2 y `switch` 27/52 **byte a byte idénticos** a las bases pre-firma; sonda de `card` **0 diffs en sus 7 bloques viejos**; `editable` estrena bloque `open` (25 filas, 6 con `data-editing`) y dos corridas sobre código idéntico dan **0 diffs en TODOS los bloques**; `menubar` abre por la entrada del centinela (6 nodos → 7, con el panel) y `chat-message` 24 filas × 2 corridas = 0 diffs; codemod 145/145 bloques, avatar `depth 3` con **97** claves (86 públicas + 11 privadas), laboratorio sobre copias (duplicado inyectado DETECTADO, renombrado = 1 línea); importar el centinela: 0,85 s sin navegador. **Las decisiones que deja escritas**: - `COMPONENT_OVERRIDES` es **UNA tabla**: la sonda la importa y `OPEN_TRIGGER` se poda de sus copias literales. La guarda de entrypoint lleva `realpathSync` — hallazgo del adversarial: sin el realpath muere a través de un junction (exit 0 sin inspeccionar nada), y este repo usa worktrees con junctions. - La vía de carga del codemod **SE QUEDA en tsx**: «el censo corre con node pelado» era FALSO (todo `src/uix/morfo` importa sin extensión). - `prepareWith` en la sonda sólo corre sin fila en `DEMO_VARIANTS` (re-clicar APAGA los checkboxes que `prepare()` ya encendió) — y eso deja a la vista la deuda de `search-field` (§13). - El no-determinismo de `chat-message` quedó ACOTADO al bloque `rest` de la sonda (13 vs 16 nodos, chips sin cuajar al medir) — dato para la GRANDE. **Lo que quedó fuera, con su registro en §13**: el barrido de variantes de la sonda (ensanche diferido por el propio expediente) · el clear-trigger de `search-field` en el pase `open` · la asimetría de escenario de los seis con `prepareWith` sin fila · el cortocircuito `alreadyOpen` que la sonda no tiene · y **TRES lectores independientes** de la estructura de `base.ts` (codemod, censo, centinela — la próxima forma nueva se enseña tres veces). El `catch` del `prepareWith` del CENTINELA sigue MUDO **a propósito**: es la ceguera 6, S1 de la GRANDE. ### FIRMA EJECUTADA (2026-08-25) — «la GRANDE»: el guard deja de estar ciego, en tres barridos **Qué se firmó** (`6392d6003` · `b4dd5a906` · `b9cef9a43`): las cegueras 6+1+3+2 del expediente VA, UNA firma, TRES barridos del ledger ENTERO (91 componentes cada uno), ejecutada con el mismo esquema de agentes que «la mitad gratis» (tres constructores en serie + adversarial con mandato de refutar: **12/12 claims confirmados**). - **S1** — el `prepareWith` GRITA (lo que cae en su catch es un control que estaba y falló — la fuente de las muertes fantasma) y el STALE ve los PATRONES (`reasonFor`, mensaje que distingue «retira la exacta» de «ESTRECHA el patrón»). Barrido: 91/91 verdes, 40,8 min, 0 avisos. Cosecha: los dos patrones `PLANE_SUPERSEDED` de `toast` (18 claves), rancios desde la noche de §12.9, RETIRADOS con 3/3 de reproducción. - **S2** — el chooser tipa la sonda por el VALOR por defecto leído de `base.ts`, no por el nombre (357 claves cambian de sonda; 320 de la clase A «vivo por accidente» IACVT). MONÓTONO medido: 91/91, sólo `avatar` +1 y `stepper` +1, sus dos exactas retiradas. Ni `%` ni enteros se clasifican (tipar el `0` habría matado en falso 7 claves vivas). - **S3** — tono+estado: tono en el pase de hover · tono MEDIAL `(^|-)` (las 16 de `tag-group`) · hover para claves de tono muertas (las 21 de `file-upload`) · seis ejes de estado como DATO, valores del morfo/receta/DOM real. Barrido: 91/91, 43,8 min, exactamente los 9 previstos, **+140 claves (catálogo 2776 → 2918, 78 % → 82 % de claves vivas)**. **130/132 `TONE_UNREACHED` reviven; las 2 que no eran `PALETTE_FLOOR`** (el tono HOST por defecto — test de dos caras en checkbox y radio-group, firma idéntica en los ocho componentes). **El ledger después**: 10 patrones retirados + 2 estrechados + 7 exactas retiradas + la constante `TONE_UNREACHED` RETIRADA (la muerte que su docstring pedía). Tier de patrones **28 → 16, 15 de los 16 son el único hecho `PALETTE_FLOOR`**, y el adversarial verificó que los 16 cubren SOLO claves muertas — cero zombis — y que ninguna clave muerta quedó sin razón (659 muertas, 0 sin adjudicar). **Dos correcciones al expediente, reproducidas dos veces antes de tocar**: las `-text` de `tags-input` SÍ reviven (la causa del arquetipo sólo tapa el ítem RESALTADO; la escena no tiene ninguno, y el token pinta además dos nodos hermanos fuera de esa regla) · `tag-group.hover-item-fg` la callaba su `data-state='selected'` nativo — el nodo es un `` que ninguna regla de arquetipo toca. **Deuda nueva registrada en §13** (adversarial, ninguna bloquea): la asimetría del estampado (`data-color` en TODOS los nodos vs sólo el proveedor en producción — medido que NO es la causa de ninguna revivida) · el ternario falsy de la restauración de atributos (un `attr=""` se borra en vez de restaurarse; hoy inocuo) · `checkbox.stroke-ease` con sonda de color (única de las 51 de easing) · el residuo del recorte del hover (`button.palette-element`, escrito en su propia razón). ### EL CIERRE, EJECUTADO (2026-08-25) — deuda B + clase `structural` + R-5 a `error` con LEDGER **✅ EJECUTADO** con el mismo esquema de agentes (tres constructores + un adversarial que confirmó 11 claims y refutó dos números de prosa). Cinco commits: `2c61946fb` (clase `structural`) · `ef47f3447` (deuda B) · `69d69d43c` (el ledger de deuda) · `1ba518fcc` (correcciones del adversarial). - **Deuda B saldada**: `proof-of-human` (20 claves derivadas) · `audio-player` (README nuevo; es un skin sobre media-player que consume sus 61 claves y añade 8; sin demo propia a propósito) · `palabras` (sección honesta SIN tabla: sin contrato en `base.ts`, y sus 117 nombres `--palabras-*` son la proyección del `scheme-style` del documento — canal de VALOR, otro eje; la clasificación del censo sobre él queda EN CUESTIÓN, §13). - **Clase `structural`**: los cinco 0 %-por-naturaleza (`aspect-ratio` · `text-blur` · `cascade` · `motion` · `date-picker`) salen del denominador con su razón EN el artefacto (forma `LAYER_VOCABULARY`). Reach 68 → 69 %, no-contract 23 → 18, el gate deja de ser inalcanzable por construcción. - **R-5 a `error` con LEDGER DE DEUDA — la firma que rediseñó F3**: la deuda real (1088 claves: 763 global + 325 literal, carriles WIP DENTRO) se registra UNA vez por clave en `scripts/theming-census-debt.ts` — deuda registrada, NO excepciones; la válvula sigue intacta y nunca ciega el ratchet. R-5.1/5.2 a `error` contra el ledger (R-5.3 ya lo estaba): deuda nueva = rojo NOMBRADO, entrada rancia = STALE hasta borrarla. Los techos burdos del suelo RETIRADOS (el ratchet es por clave); `atHundred` corrige su criterio (`public > 0`, 14 → 45). El gate de F3 queda redefinido honesto: **«censo 100 % ADJUDICADO»** — y está EN VERDE. - **Pendiente de TU firma, nombrado en §13 y en la cabecera del ledger**: los **318 privados no-derivados** (deuda por la letra de R-5.1, sin ratchet por clave — sólo los cubre el `reachPct` grueso) · el idioma **`var(--{c}-x, fallback)` sin contrato** (`mockup` ×11, `text-scramble` ×2 — otro guard sanciona el idioma, pero no alcanza a `applyTheme` ni al centinela). · Deuda menor registrada: las fichas de `docs/audit/theming/` esperan un `--report` supervisado post-`structural` (tarea aparte). ### FUERA del carril de theming (registrados HOY, no se ejecutan desde aquí) - **E1 — los botones del array de form COMPONEN el Button** (clase A-112): expediente completo de VC en `exped/vc/` + la corrección de E-talla: E2 ahorró el CONTEXTO pero no la LECTURA — E1 debe pasar `size` al Button que inyecte o es la regresión medida (26→36 px en xs). Y las partes son MUDAS (morfo sin evento; verbos canon: `commit-set-add`/`commit-remove`). - Lo abierto por el ARIA: `tag-group` filas SIN celdas (el «precedente» refutado midiendo) · `search-field` F-1 · la regla del censo de citas APG. - El párrafo anchura-vs-densidad querría vivir TAMBIÉN en `reference.md` junto a la norma tapada (dicho por E-talla, fuera de su alcance). ### Las leyes que dejó el día (sesión 2) - **Una interrupción del autor MATA a los agentes en vuelo** — informe.md a disco INCREMENTAL siempre; el disco sobrevive (V1 se recuperó íntegro). - **El supervisor MIRA las capturas antes de cada commit** (regla del autor). - **Las demos del sistema NO entran** ni como prueba central de una firma (reafirmada sobre la captura del velo; la prueba citable es el barrido de las 14 identidades del catálogo). - **F5 compartidas se RETIENEN y liberan EN SERIE** cuando varios ejecutores comparten `next-features`/`CONTINUE` — tres ejecutores hoy, cero pisadas. - La sonda estándar ganó DOS mentiras registradas (se pisa el `data-size` forzado sobre nodos compuestos · los `clamp()` fluidos no comparan sin declarar viewport) — están en §«Lo que el instrumento aprendió». Lo que queda de firma vieja NO cambia: la lista «Lo que espera TU FIRMA» de más abajo quedó VACÍA el 2026-08-25 y las entradas EJECUTADAS de hoy están intercaladas tras esta sección. ### FIRMA EJECUTADA (2026-08-25) — el velo del sistema no muere por un ATAJO **Qué se firmó** (changelog §56, reverso de §55 el mismo día): al bajar el sobre de trigger de `popover.css` al suelo, §55 lo dejó a **(0,0,0) — el mismo peldaño que `archetypes.css`**, que es quien pinta el velo de estado del sistema. Y el suelo declaraba su superficie con el ATAJO `background:`, que expande a `background-image: none` — **la propiedad exacta donde vive ese velo**. Resultado: el velo de hover de todo trigger desnudo dependía de qué hoja cayera después. No sólo por la regla de hover: el `:where()` deja también la de REPOSO empatada con la de hover del arquetipo, y ésa sola bastaba. La corrección son DOS PALABRAS — `background-color:` en `popover.css:60` y `:75`. **Los números**: **0 px** en el barrido de las **14 identidades del catálogo** que montan un `[data-popover-trigger]` (68 lecturas en reposo → 0 movidas, 68 en hover → 0 movidas, `rules split=2` en las 14) con control negativo diff 5 / 4; las dos sondas del eje a **0 diffs** (`popover` 448 valores / 8 estados, `chronos` 36 832 / 7); y **el velo sobrevive al orden invertido**, donde con el atajo moría (`linear-gradient(…8 %…)` → `none`). Cae con la firma el pin `chronos.css:417` (cinco declaraciones a (0,3,0) que ya no defendían nada): **0 diffs en 20 combinaciones `variant` × `size`**, control negativo 20/20 — §13 lo había adjudicado mal, al velo del `+N more` lo mata `button.css:69`/`:88`. Guarda §55 apartado **(f)** en `active-eidos-config.test.ts`, **4 mutaciones / 4 mordidas** (las dos primeras muerden la mitad positiva, las dos segundas —el atajo AÑADIDO junto al longhand— la negativa). **Lo que quedó fuera, con su número en `next-features.md` §13**: el residuo `transition` del MISMO empate (suelo `background, border-color` vs arquetipo `opacity, background-color`, las dos a (0,0,0) — hoy el `border-color` del hover de popover salta en vez de animarse), la decisión de producto «popover deja de declarar hover propio» (no es coste cero: 0.9821 → 0.931 **más** el velo hoy, sólo el velo después) y `calendar-select.css:14`, que **no es un pin** — retirarlo rompe el tipo en 3 de 4 tallas (12 / 14 / 20 → 16 px). **Fichas y prosa saneadas**: `chronos.md` (censo 202→198, propuesta 50→47, en bloques `` para que sobrevivan a `--report`), `calendar.md` (su ⚠ HALLAZGO «no determinista» lo cerró §55 y ya no apunta a §13), `emoji-picker.md` y los tres comentarios de código que seguían afirmando **(0,2,0)** del sobre (`emoji-picker.css`, `gradient-picker.css` —sólo su mitad base, la de estados sigue viva— y `lib/recipes/base.ts`). Se ANOTAN, no se reescriben: cada medida fue correcta con la cascada de su día. ### FIRMA EJECUTADA (2026-08-25) — el eje `size` de `form` LLEGA a sus acciones **Qué se firmó**: ceder el cromo de `submit`/`reset` al `Button` compuesto (firma del 2026-08-24) destapó el reverso. `form-submit.svelte:20` y `form-reset.svelte:15` traían su propio `size = 'md'` y **nada les pasaba la talla del formulario**, así que un `
` los renderizaba con `data-size="md"` —36 px de alto y 16 px de letra— **en las cinco tallas**; del eje sólo sobrevivía el `row-gap`. Quitar el default no arreglaba nada (el `Button` tiene el suyo): hacía falta el puente, y el precedente es literal. Nuevo `eidos/components/form/context.ts` calcado **1:1 de `toolbar/context.ts`** (`Symbol('form-eidos-ctx')` + getter de propiedad), `form.svelte` publica el `resolvedSize` que ya calculaba, y las dos acciones leen `size={size ?? form?.size}` — la prop explícita gana, y standalone cae en el `md` del propio `Button` sin re-declararlo. **Sólo eidos: cinco ficheros, cero morfo / soma / sema; el contrato de 64 claves y el ledger, intactos.** **Los números**: alto **−10 / −6 / 0 / +8 / +16** px y letra **−4 / −2 / 0 / +4 / +12** px, sobre `submit` y `reset` por igual; **`md` no mueve un solo valor**; 84 diffs en total y **cero** en los cuatro nodos del array, el widget y el resumen de errores. Sonda estándar antes/después **0 sobre 832 valores en 7 estados**; instrumento propio reproducible (dos pasadas sobre código idéntico ⇒ 0 diffs). `vitest src/uix/eidos` 443/444 (el rojo es el ajeno conocido `skin-media-player`), `check` 0 errores atribuidos a los cinco ficheros, `docs:check` 0/0. **La doctrina que hubo que adjudicar**: **VERBATIM, no la norma tapada en `md`**. La tapa de `reference.md` §«Container→part derivation» gobierna contenedores cuyo eje es ANCHURA (su primer consumidor es `Dialog.Close`); el de `form` es DENSIDAD declarada, y su propia receta ya había escrito los cinco peldaños distintos de la acción. Escrita en `next-features.md` §13 §«Anchura vs densidad», con el corolario de que a `alert-dialog` —mismo agujero, eje de anchura— le toca la TAPADA. **Lo que quedó fuera, con su entrada en §13**: `alert-dialog` (no medido), `Form.ErrorSummary` con un `data-size` que ninguna regla lee, la escalera de fuente `12·12·14·14·16` de la acción de `form` (que corrige E1 en su carril) y la cita colgada de `dialog/context.ts:9`. ### FIRMA B′ EJECUTADA (2026-08-24) — la cascada de paleta es una ESCALERA **Qué se firmó**: los tres escritores de `--{c}-palette-*` pasan a tres peldaños que **no empatan** — suelo `:where([data-{c}])` `(0,0,0)` < forward `[data-{c}]:where([data-color], [data-color-custom])` `(0,1,0)` < tono `[data-{c}][data-color='X']` `(0,2,0)`. Antes el forward genérico se emitía el ÚLTIMO empatado a `(0,2,0)` con los bloques por tono, así que **ganaba por orden de emisión** y 419 claves públicas de tono en 49 recetas no pintaban nunca. **Por qué B′ y no reordenar la emisión** (que es lo que §13 proponía): el orden es **contrato invisible** —no se lee en el artefacto, no lo verifica un guard sin recorrer la hoja entera, se rompe moviendo una línea—. La especificidad es **contrato EN el artefacto**. Y es la misma ley que §12.9 acababa de firmar para el plano de profundidad: **una doctrina aplicada dos veces**, no dos parches. **Los números**: neutra en píxel sobre **~297.000 valores computados** comparados antes/después (70.912 + 34.336 planos en dos lotes, 57.720 en el tercero, 134.464 con los tonos ESTAMPADOS en las 49 unidades) — **0 diffs reales**, y los 17 crudos probados ruido reproduciéndolos sobre código idéntico. **207 de 353 claves** de tono volvieron a mover un valor computado. Guarda por **mutación** en `active-eidos-config.test.ts:1761` (6 mutaciones, 6 mordidas; cierre estructural: toda declaración de paleta vive en uno de los tres peldaños; anti-vacío `> 40`). Contrato del forward **ensanchado de 2 a 49 recetas** — vigilaba sólo las de paleta pública y era ciego a las 47 privadas. Suite 35/36 (el rojo `skin-media-player` es AJENO y conocido). **Dónde vive todo**: doctrina en [`theming/changelog.md`](../theming/changelog.md) §53 · contrato en [`theming/reference.md`](../theming/reference.md) (bloque THM-2) · emisor `src/uix/eidos/lib/render-css.ts` (`isPaletteSlotToken` parte el bucket host — **sólo las ranuras de paleta bajan**, el chasis se queda a `(0,1,0)`) · guarda `active-eidos-config.test.ts` · ledger `scripts/theming-sentinel-exceptions.ts`. **Tres leyes que deja escritas, y las tres costaron una medida**: 1. **El silencio del guard NO es señal cuando la adjudicación es por PATRÓN.** `theming-sentinel.ts` detecta STALE sólo contra el ledger EXACTO (`k in ledger`), nunca contra `SENTINEL_PATTERN_EXCEPTIONS`. Las 207 claves resucitadas no dispararon ni un aviso: el estrechamiento hubo que hacerlo comparando a mano contra las 13 entradas. La única que el guard sí vio fue `editable.risk-border`, que era exacta. 2. **Un tono por defecto ESTAMPADO resuelve por el forward, no por el suelo.** El envoltorio estampa `data-color` en toda instancia, la default incluida, así que `