From 613215fe7c9e98de878ade2f44271bb55844281a Mon Sep 17 00:00:00 2001 From: dev Date: Wed, 26 Aug 2026 05:24:12 +0200 Subject: [PATCH] docs(theming): el dia queda cerrado - handoff 2026-08-26, causa corregida y suelo en 66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cierre documental tras el adversarial de SS14 (firma sostenida; un claim de ACTA cayo y se corrige aqui): - La causa de la extension transitiva del censo era CONTRAFACTUAL en tres sitios (census.ts, next-features, CONTINUE): el alias de SS14 no lleva prefijo propio y el censo lo descarta antes - clasifica global con la razon CORRECTA (medido construyendolo: 1 new, rojo). La extension se justifica por tooltip (alias propio sobre canal propio), no por el alias. Reescrita con el contrafactico medido. - El suelo sube a minAtHundred 66 - SS14 llevo a tabs al 100% y el adversarial cazo el suelo rezagado de su propia ley ("only moves up"). - SS15 NUEVO en next-features, redactado por el adversarial: el GEMELO un piso arriba - floating.svelte.ts publica cinco medidas de instancia como --floating-* (publico sin dueño, ~8 recetas lectoras); mas grande que SS14 porque el posicionador sirve a muchos hosts. Dimensionar antes de firmar. - Handoff 2026-08-26: las cinco firmas del dia con sus adversariales, lo primero de mañana por orden de valor (SS15 - la especie de forma sin dueño - cableado motion - palabras/timeline), el estado de la rama compartida (peer vicen-63 con su C2c/hook, que push falta) y las leyes nuevas del dia (el nombre dice la verdad en las dos direcciones; grep ciego a llaves; sonda ciega a canales; una causa sin contrafactico acaba corregida). Suelo 5/5 con 66 - docs:check 0/0. Co-Authored-By: Claude Fable 5 --- docs/next-features.md | 37 +++++++++-- docs/process/CONTINUE-theming.md | 77 ++++++++++++++++++++--- scripts/theming-census.ts | 17 ++--- src/uix/eidos/theming-reach-floor.test.ts | 7 ++- 4 files changed, 117 insertions(+), 21 deletions(-) diff --git a/docs/next-features.md b/docs/next-features.md index 16598740e..50793cd6e 100644 --- a/docs/next-features.md +++ b/docs/next-features.md @@ -2655,11 +2655,14 @@ retiró una sola). Catálogo: `atHundred` **65 → 66**, global 763 → **761**, RETIRADAS** —la clave entera desaparece— con acta en la cabecera de `scripts/theming-census-debt.ts`; **1154 → 1152 · 0 NEW · 0 STALE**. -**La trampa de clasificación, prevista y resuelta**: la regla de canal del censo -mira el privado que el knob lee DIRECTAMENTE con cero declaraciones; una -línea-alias es un privado DECLARADO cuya única fuente es el canal, así que la -esquiva y cae a residuo `private` no-derivado. El tercer paso de `scanComponent` -resuelve ahora el canal **TRANSITIVAMENTE** (molde de `derivesFromPublic`: +**La trampa de clasificación, prevista y resuelta** — *con la causa CORREGIDA +por el adversarial el mismo día*: la premisa «la línea-alias esquiva la regla y +cae a residuo» era CONTRAFACTUAL — el alias de §14 (`--_indicator-*`) no lleva +prefijo propio y el censo lo descarta antes de coleccionar privados: un knob que +lo lea clasifica `global`, rojo con la razón CORRECTA. El caso que JUSTIFICA la +extensión es `tooltip` (alias con prefijo propio sobre canal propio: reclasificó +`exception` → `channel`, lo que su comentario firmado siempre afirmó). El tercer +paso de `scanComponent` resuelve el canal **TRANSITIVAMENTE** (molde de `derivesFromPublic`: memoizado, a prueba de ciclos, `every` en todo el camino). La **mutación de rigor** que lo delimita: un alias hacia un privado que SÍ está declarado NO clasifica canal — resuelve al valor de esa declaración, cuyas refs son vacías (un @@ -2710,3 +2713,27 @@ docs, `npm run check` sin errores atribuibles. siguen siendo dos públicos de FORMA sin prefijo de dueño y sin entrada de contrato — la misma fuga de espacio que esta firma cerró para las medidas, una especie más allá. El punto 2 los mandó a la puerta del contrato y ahí siguen. + +## 15. La capa flotante publica cinco medidas con nombre público sin dueño — 2026-08-26 + +**PENDIENTE — redactado por el adversarial de §14, NO ejecutado.** El gemelo del +defecto que §14 acaba de cerrar, un piso arriba y con más superficie: +`src/uix/soma/layers/floating/floating.svelte.ts:300-336` publica por instancia +`--floating-{transform-origin, available-width, available-height, anchor-width, +anchor-height}` — **una capa compartida escribiendo medidas de instancia bajo +forma PÚBLICA sin dueño**, la especie exacta de los `--indicator-*` retirados. +Los leen **~8 recetas** (`popover.css:132,157` · `tooltip.css:22,45` · +`select.css:192,205` · `combobox.css:178,191` · `menubar.css` · `split-button` · +`palabras-chrome.css:161` · `generated/base.css:8872`). Invisibles a la ley del +espacio cerrado por la misma razón: esa ley audita `--{c}-*` y un nombre sin +prefijo de componente es vocabulario ajeno. + +La diferencia que hace este expediente MÁS grande que §14: aquí el host no es +uno por instancia de capa — el posicionador flotante sirve a MUCHOS componentes +a la vez, así que «el namespace del host» exige que la capa reciba el kebab de +CADA superficie que posiciona (la forma ya existe: §14 le enseñó a +`MeasuredIndicator` a recibirlo del morfo). Y `getFloatingContentCSSVars` +(`floating/utils.ts:18`, export muerto ya registrado en §13) construye +`--${name}-anchor-width` por plantilla — el mismo expediente decide si muere o +se alinea. Dimensionar antes de firmar: ~8 recetas × N sitios, la cadena de +verificación dinámica de §14 sirve de molde. diff --git a/docs/process/CONTINUE-theming.md b/docs/process/CONTINUE-theming.md index 3072884ab..857b6cd47 100644 --- a/docs/process/CONTINUE-theming.md +++ b/docs/process/CONTINUE-theming.md @@ -29,7 +29,68 @@ firma B′ quedaron FIRMADAS Y EJECUTADAS** — las dos decisiones más caras pendientes. Global **73 %** (68 % antes de la clase `structural`, 69 % antes de `bridge`/`channel`), **65 componentes al 100 %**. -## HANDOFF 2026-08-25 (noche) — POR AQUÍ MAÑANA +## HANDOFF 2026-08-26 (noche) — POR AQUÍ MAÑANA + +**El día ejecutó CINCO firmas más, todas con su adversarial**: la +clasificación de los 318 privados (`e812d3ffd`+`a74aeec7b`+`90b93a79e`, +adversarial 13/13) · la ley del ESPACIO CERRADO (`6499eb2a4`, 7/7) · el +codemod de los 13 canales (`e100ea520`, atómico verificado) · el indicador de +navigation-menu, (a) completada (`de2e136a0`, 6/6 — la especie `output` se +propuso y se RECHAZÓ por abrir excepciones) · **§14, MeasuredIndicator con +nombre poseído** (`8ac23047f` — «la capa es la pluma, no la dueña»; `tabs` +cierra al 100 %). La familia de indicadores entera habla UNA doctrina. + +### Lo PRIMERO mañana, por orden de valor + +1. **§15 — el GEMELO un piso arriba** (redactado por el adversarial de §14, + abajo en `next-features.md` §15): la capa flotante publica CINCO medidas de + instancia como `--floating-*` — forma pública sin dueño, ~8 recetas + lectoras. La especie exacta que §14 cerró, con más superficie y con el + matiz de que el posicionador sirve a MUCHOS hosts. Dimensionar antes de + firmar; la cadena de verificación de §14 es el molde. +2. **La especie de FORMA sin dueño**: `--indicator-duration`/`-ease` (flagged + en §14) — ¿contrato de qué componente, o vocabulario de capa declarado? +3. **Cableado `EidosConfig.motion`→CSS** — mata la última entrada del registro + `PENDING_PRIVATE_RENAME`. +4. **Re-clasificar `palabras`** (canal de valor del scheme, no tema) y + **reabrir `timeline`** (§5 pre-B′) — los dos con expediente escrito. + +### Estado de la RAMA al cerrar el día (léelo antes de tocar nada) + +- **SIN PUSH desde `e100ea520`**: el codemod de canales, navigation-menu, + §14 (`8ac23047f`) y el cierre documental del día. El resto del día está + pusheado hasta `cec75d04e`. +- **Sesión peer `vicen-63` ACTIVA en la rama** (auditoría P0): su C2c retiró + los `syncAttrs` (los de tabs/radio-group VIAJARON en `8ac23047f` con + atribución declarada y acuerdo por canal), su cirugía del runtime y su + commit venían detrás, y **re-armará el hook pre-push** (`scripts/hooks/ + pre-push` es la fuente; el gate ya pasa en verde sobre HEAD con el lint + fuera hasta el one-shot de formato). Si un push falla, el mensaje del gate + dice qué. La sesión de fichas (`vicen-3c`) commiteó `cc2894b36`. +- **Protocolo de rama compartida que el día confirmó tres veces**: staging + por RUTA explícita (nunca `add -A` — 375 ficheros a punto de colarse una + vez), la RAÍZ del repo también se stagea (STUMBLES.md se quedó fuera una + vez), y antes de medir un fichero, `git diff HEAD -- ` por si el peer lo + movió. + +### Las leyes nuevas del día (además de las firmas) + +- **El nombre dice la verdad en las DOS direcciones** — ni knobs que un tema + no puede mover (el inline gana), ni privados que un README enseña como API. + Cuando ninguna de las dos ortografías dice la verdad, la respuesta NO es + una especie nueva: es preguntar qué está mal en el DISEÑO (así cayó + `output`, y así el README de navigation-menu aprendió a enseñar la PARTE). +- **El grep literal es ciego a la forma con llaves** (`--x-{a,b,c}`) — se + barre por STEM. +- **La sonda estándar es CIEGA a los canales** (PROPS sin + translate/rotate/gridTemplateColumns/animationDuration): su 0-diff prueba + lo circundante; el canal se verifica en DINÁMICA por CDP con control + negativo y positivo. +- **Un alias sin prefijo propio ni siquiera entra al clasificador** — y una + causa escrita sin su contrafáctico medido acaba corregida por el + adversarial (pasó dos veces hoy). + +## HANDOFF 2026-08-25 (noche) — histórico **Las CINCO firmas del eje están EJECUTADAS y pusheadas** (`2daa683fa` file-upload · `df3a4d054` form/compuesto · `2ce43db56` tags-input aria · @@ -220,12 +281,14 @@ claves de contrato INTACTOS — ni una acuñada ni retirada). Catálogo `atHundr (la clave entera desaparece), **1154 → 1152 · 0 NEW · 0 STALE**, con acta en la cabecera de `theming-census-debt.ts`. `radio-group` no mueve una cifra. -**⚠ La trampa de clasificación, prevista y resuelta**: la regla de canal miraba -el privado que el knob lee DIRECTAMENTE con cero declaraciones — una línea-alias -es un privado DECLARADO cuya única fuente es el canal, así que la esquivaba y -caía a residuo `private` no-derivado, `newDebt` ROJO con la razón equivocada. El -tercer paso del censo resuelve ahora el canal **TRANSITIVAMENTE** (molde de -`derivesFromPublic`). **Mutación de rigor**: un alias hacia un privado que SÍ +**⚠ La trampa de clasificación, prevista y resuelta** — *causa CORREGIDA por el +adversarial el mismo día*: la premisa del alias que «esquiva y cae a residuo» +era CONTRAFACTUAL — el alias de §14 no lleva prefijo propio, el censo lo +descarta antes de coleccionar privados, y un knob que lo lea clasifica `global` +con la razón CORRECTA (medido construyéndolo: `1 new`, rojo). La extensión +TRANSITIVA del tercer paso se justifica por `tooltip` (alias con prefijo propio +sobre canal propio, reclasificado `exception` → `channel` como su comentario +firmado afirmaba); molde de `derivesFromPublic`. **Mutación de rigor**: un alias hacia un privado que SÍ está declarado NO clasifica canal — `refs.length > 0` es la línea que lo impone. Y el ORDEN de pasos es carga estructural: el segundo (deriva de un público) corre antes, y por eso `--_tooltip-max-width` sigue siendo público. diff --git a/scripts/theming-census.ts b/scripts/theming-census.ts index 5500239cf..acd8d632a 100644 --- a/scripts/theming-census.ts +++ b/scripts/theming-census.ts @@ -654,13 +654,16 @@ export function scanComponent(dir: string): Scan | null { const own = '--_' + dir + '-'; const isChannel = (r: string) => r.startsWith(own) && !declBySource.has(r) && !GENERATED_PRIVATES.has(r); - // TRANSITIVE, and this is the shape that forced it (firma §14, 2026-08-26): a - // SHARED layer's CSS cannot spell its host's name, so the consuming recipe - // declares a local ALIAS over the channel and the layer reads the alias — the - // palette bridge's wiring, one class over. That alias is a DECLARED private - // whose only source is an UNDECLARED one, so the direct test above misses it - // by construction and the knob falls to residue as a non-derived private: - // `newDebt` red with the wrong reason. Same mould as `derivesFromPublic` + // TRANSITIVE (firma §14, 2026-08-26) — and the honest record of WHY, corrected + // by the adversarial pass of the same day: the case that JUSTIFIES it is + // `tooltip` (an own-prefixed alias declared over an own-prefixed channel: + // `--_tooltip-content-width-override` → measured, it reclassified from + // `exception` to `channel`, which its signed comment had always claimed). + // The §14 alias of `radio-group` was the shape that PROMPTED the thought but + // never needed the rule: its alias (`--_indicator-*`) carries no own prefix, + // so the declaration filter above discards it before privates are even + // collected — a knob reading it classifies `global`, red, with the RIGHT + // reason. Same mould as `derivesFromPublic` // (cycle-safe via `seen`, memoized), and `every` throughout, so a knob mixing // a channel with anything else stays residue. // diff --git a/src/uix/eidos/theming-reach-floor.test.ts b/src/uix/eidos/theming-reach-floor.test.ts index cbd7d9463..b3380d753 100644 --- a/src/uix/eidos/theming-reach-floor.test.ts +++ b/src/uix/eidos/theming-reach-floor.test.ts @@ -77,8 +77,11 @@ const FLOOR = { // the question was asked correctly, and none of the 31 was a real advance. // 45 → 65 on 2026-08-26 for the same reason as the ratio above: a recipe // whose only unreached knobs were among those 252 measures 100 % once they - // leave its denominator. - minAtHundred: 65 + // leave its denominator. 65 → 66 later the same day: firma §14 took `tabs` + // to 100 % (its two `global` knobs were the misnamed indicator channel, now + // owned and out of the ratio) — raised in the commit that earned it, per the + // adversarial pass that caught the floor lagging the measure. + minAtHundred: 66 }; describe('theming reach — the floor only moves up', () => {