refactor(eidos): el catálogo habla un idioma — 269 claves al vocabulario firmado
D-TH.6, ejecutada. El slot de tinta pasa a `fg` y el modificador interactivo
se pone delante, que es lo que theming §6.7 r7 documentaba sin guard desde
que se escribió. Value-preserving: renombra la clave en `recipes/base.ts` y
sus 793 referencias en 101 ficheros; no toca un solo valor.
claves renombradas 269 en 66 componentes
referencias 793 en 101 ficheros
censo antes/después 162 recetas · 5.203 knobs · 1.841 públicos (37 %) · 56
sin contrato — IDÉNTICO, como debe ser un rename
--names antes/después 269 desviadas → 0
Qué NO entra, y por qué:
47 `{rol}-{slot-de-rol}` canónicas: COLOR_ROLE_SLOTS pone el modificador
detrás POR CONSTRUCCIÓN (`primary-solid-hover`)
13 exentas firmadas `--focus-ring-*` es familia del sistema; el color
de `aura` es un sustantivo; `stop-color` ES una
parte de gradient-builder
47 hovers neutros por VALOR: migran a la capa de estado
(§38 + R-4.3), no se renombran — firma 3
6 ocurrencias en historia changelog, errores-toxico, PLAN-affix/background:
reescribir un registro fechado lo vuelve mentira
El clasificador vive en el censo (`--names`), no en un script suelto, para que
el guard R-5.3 consuma la MISMA gramática que el codemod. Su muta-prueba
(`__names-mutatest.ts`, 27 casos) es lo que hizo el trabajo: cazó que yo
promovía al frente CUALQUIER valor declarado por el morfo, y así
`--sidebar-width-icon` (la anchura del raíl colapsado) se convertía en
`--sidebar-icon-width` (la anchura de un icono), que es otra cosa. La firma
dice «delante lo interactivo, detrás lo dimensional y contextual»: ahora sólo
promociona el vocabulario interactivo cerrado, y lo contextual —`below`,
`loaded`, `vertical`, `icon`— se queda donde estaba. Los cinco casos de
regresión están en la muta-prueba.
También cazó que `dropdown-menu.item-bg-hover` lee `var(--color-primary-element)`:
es un hover CON VALENCIA (el palette swap de recipe-contract §2), no el hover
bespoke que §38 deprecó. Clasificar por el nombre lo habría metido en una
migración que no le toca; se clasifica por el VALOR.
Verificación (§7.4, artefacto por paso):
diff de generated/ 269 renombres 1:1 · 0 cambios de valor · 22 privados
reapuntados a los nombres nuevos (`__names-verify-diff`)
computed tag-group · field · tabs: 6.467 valores en 23 estados,
0 diffs — y comprobado en el navegador que sirve el CSS
nuevo, para que ese 0 no sea el de una copia cacheada
huérfanos 0 en código
suite eidos 434 pasan · 1 rojo, el conocido (`skin-media-player`).
`recipe-css-contract` verde: es el guard que caza el
`var()` sin fallback a un nombre que ya no se emite,
o sea el fallo exacto de un rename a medias
component:audit 163 PASS · 3 NEEDS-WORK, los tres SIN TOCAR por esto
check 0 errores en ficheros tocados (los 73 globales son de
otras sesiones de la rama; se atribuye por fichero)
rtl:check 0 · docs:check 0
formato el renombrado no alarga ninguna línea: ningún fichero
tiene más líneas de 100 chars que antes, así que no se
pasa prettier — hacerlo reformateaba 300 ficheros de
deriva ajena
Entra aquí la corrección del repaso de los 7 ya hechos:
`gradient-builder.checker-color` → `checker-fg` (el damero de transparencia;
ahí `color` era slot). Sus `stop-color-*` no se tocan.
Queda para el paso siguiente: R-5.3 no puede graduar a `error` directo
mientras los 47 hovers neutros sigan hablando el idioma viejo — o migran
antes (firma 3, ya firmada), o el guard necesita una exención greppable.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
|
|
|
/**
|
|
|
|
|
* Codemod value-preserving del vocabulario de tokens (D-TH.6, acta 2026-08-20).
|
|
|
|
|
*
|
|
|
|
|
* node --import tsx/esm scripts/__names-codemod.ts --dry # sólo mide
|
|
|
|
|
* node --import tsx/esm scripts/__names-codemod.ts --write # escribe
|
|
|
|
|
*
|
|
|
|
|
* Renombra la CLAVE en `recipes/base.ts` y TODAS sus referencias
|
|
|
|
|
* `var(--{c}-{clave})` en el árbol indexado por git. No toca valores: un
|
|
|
|
|
* rename no cambia lo que se ve ni cuánto alcanza el tema.
|
|
|
|
|
*
|
|
|
|
|
* Molde: la normalización px/py del 2026-07-06 (recipe-contract §1) y su
|
|
|
|
|
* triple muro. Aquí los muros son: colisión de destino · clave duplicada en
|
|
|
|
|
* `base.ts` (añadir un bloque que ya existe lo descarta EN SILENCIO) · el
|
|
|
|
|
* diff de `generated/` como renombres 1:1.
|
|
|
|
|
*
|
fix(theming): la mitad gratis del instrumento - el codemod lee la IIFE y la sonda habla la puerta del centinela
Firma de instrumento (expediente VA, cegueras 4 y 5): coste de ledger CERO,
tres scripts, ni una entrada de theming-sentinel-exceptions.ts tocada.
- __names-codemod.ts: blocks() devuelve {name, at, end, depth} con offsets
reales del fichero; la IIFE de avatar acota su region al return{...} con
depth 3 (y LANZA si no lo encuentra) y los muros 2-3 leen por fin sus 97
claves (86 publicas + 11 privadas); el pase A renombra a \t{depth}.
Laboratorio sobre copias: duplicado inyectado a 3 tabs DETECTADO,
renombrado de una clave de avatar = 1 linea. La via de carga SE QUEDA en
tsx: theming-census importa src/uix/morfo/compile sin extension y todo
src/uix/morfo esta escrito asi.
- theming-sentinel.ts: COMPONENT_OVERRIDES se exporta (UNA tabla de puertas,
no dos) con guarda de entrypoint via realpathSync - sin el realpath la
guarda muere a traves de un junction (exit 0 sin inspeccionar nada) y este
repo usa worktrees con junctions; UIX_DEV_URL reemplaza el :5173 clavado.
Importarlo: 0,85 s sin navegador. label 1/2 y switch 27/52 byte a byte
identicos a las bases pre-firma. Incluye +10 lineas de comentario
PREEXISTENTES de otra sesion (la justificacion de image-adjustments en
COMPONENT_OVERRIDES, solo prosa, verificada contra su acta del 24).
- __theming-probe.ts: el pase open habla el vocabulario del centinela
(prepareWith/openBy/openWith/openMarker, con OPEN_TRIGGER podada de sus
copias literales) y su catch AVISA en stderr distinguiendo "no hay trigger"
de "el gesto fallo"; editable registra por fin su bloque open (25 filas, 6
con data-editing; dos corridas sobre codigo identico = 0 diffs en TODOS los
bloques); pases nuevos de FOCO (la cabecera lo prometia y nada llamaba a
.focus()) y disabled (bloque aparte y ULTIMO de la corrida);
PROBE_ROLE_BOUND_SCALES + PROBE_SAFE_SCALES + assertProbeSafeScale con la
discrepancia risk amber/orange documentada; UIX_DEV_URL. card y editable a
0 diffs contra sus bases en los bloques pre-firma; menubar (6 nodos -> 7
con el panel) y chat-message (24 filas x 2 corridas, 0 diffs) abren via las
entradas del centinela.
Fuera de la firma, registrado en next-features SS13: el barrido de variantes
de la sonda (ensanche diferido), el clear-trigger de search-field en el pase
open, la asimetria de escenario de los seis con prepareWith sin fila en
DEMO_VARIANTS, y la GRANDE (cegueras 6+1+3+2, barridos S1-S3), que sigue
esperando firma. El catch del prepareWith del centinela sigue MUDO a
proposito: es la ceguera 6, S1 de la GRANDE.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 month ago
|
|
|
* Corre con `tsx`, no con el `node` pelado del centinela, porque importa
|
|
|
|
|
* `theming-census`, que a su vez importa `../src/uix/morfo/compile` SIN extensión
|
|
|
|
|
* — y todo `src/uix/morfo` está escrito así. El type stripping de Node no resuelve
|
|
|
|
|
* un import extensionless; alinear la vía de carga es un barrido de `src/`, no de
|
|
|
|
|
* este fichero.
|
|
|
|
|
*
|
refactor(eidos): el catálogo habla un idioma — 269 claves al vocabulario firmado
D-TH.6, ejecutada. El slot de tinta pasa a `fg` y el modificador interactivo
se pone delante, que es lo que theming §6.7 r7 documentaba sin guard desde
que se escribió. Value-preserving: renombra la clave en `recipes/base.ts` y
sus 793 referencias en 101 ficheros; no toca un solo valor.
claves renombradas 269 en 66 componentes
referencias 793 en 101 ficheros
censo antes/después 162 recetas · 5.203 knobs · 1.841 públicos (37 %) · 56
sin contrato — IDÉNTICO, como debe ser un rename
--names antes/después 269 desviadas → 0
Qué NO entra, y por qué:
47 `{rol}-{slot-de-rol}` canónicas: COLOR_ROLE_SLOTS pone el modificador
detrás POR CONSTRUCCIÓN (`primary-solid-hover`)
13 exentas firmadas `--focus-ring-*` es familia del sistema; el color
de `aura` es un sustantivo; `stop-color` ES una
parte de gradient-builder
47 hovers neutros por VALOR: migran a la capa de estado
(§38 + R-4.3), no se renombran — firma 3
6 ocurrencias en historia changelog, errores-toxico, PLAN-affix/background:
reescribir un registro fechado lo vuelve mentira
El clasificador vive en el censo (`--names`), no en un script suelto, para que
el guard R-5.3 consuma la MISMA gramática que el codemod. Su muta-prueba
(`__names-mutatest.ts`, 27 casos) es lo que hizo el trabajo: cazó que yo
promovía al frente CUALQUIER valor declarado por el morfo, y así
`--sidebar-width-icon` (la anchura del raíl colapsado) se convertía en
`--sidebar-icon-width` (la anchura de un icono), que es otra cosa. La firma
dice «delante lo interactivo, detrás lo dimensional y contextual»: ahora sólo
promociona el vocabulario interactivo cerrado, y lo contextual —`below`,
`loaded`, `vertical`, `icon`— se queda donde estaba. Los cinco casos de
regresión están en la muta-prueba.
También cazó que `dropdown-menu.item-bg-hover` lee `var(--color-primary-element)`:
es un hover CON VALENCIA (el palette swap de recipe-contract §2), no el hover
bespoke que §38 deprecó. Clasificar por el nombre lo habría metido en una
migración que no le toca; se clasifica por el VALOR.
Verificación (§7.4, artefacto por paso):
diff de generated/ 269 renombres 1:1 · 0 cambios de valor · 22 privados
reapuntados a los nombres nuevos (`__names-verify-diff`)
computed tag-group · field · tabs: 6.467 valores en 23 estados,
0 diffs — y comprobado en el navegador que sirve el CSS
nuevo, para que ese 0 no sea el de una copia cacheada
huérfanos 0 en código
suite eidos 434 pasan · 1 rojo, el conocido (`skin-media-player`).
`recipe-css-contract` verde: es el guard que caza el
`var()` sin fallback a un nombre que ya no se emite,
o sea el fallo exacto de un rename a medias
component:audit 163 PASS · 3 NEEDS-WORK, los tres SIN TOCAR por esto
check 0 errores en ficheros tocados (los 73 globales son de
otras sesiones de la rama; se atribuye por fichero)
rtl:check 0 · docs:check 0
formato el renombrado no alarga ninguna línea: ningún fichero
tiene más líneas de 100 chars que antes, así que no se
pasa prettier — hacerlo reformateaba 300 ficheros de
deriva ajena
Entra aquí la corrección del repaso de los 7 ya hechos:
`gradient-builder.checker-color` → `checker-fg` (el damero de transparencia;
ahí `color` era slot). Sus `stop-color-*` no se tocan.
Queda para el paso siguiente: R-5.3 no puede graduar a `error` directo
mientras los 47 hovers neutros sigan hablando el idioma viejo — o migran
antes (firma 3, ya firmada), o el guard necesita una exención greppable.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
|
|
|
* Lo que NO reescribe, y por qué:
|
|
|
|
|
* docs/process/** — actas, planes y handoffs: son HISTORIA
|
|
|
|
|
* docs/theming/changelog.md — crónica fechada
|
|
|
|
|
* Reescribir un registro histórico lo convierte en una mentira retroactiva.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
import { readFileSync, writeFileSync } from 'node:fs';
|
|
|
|
|
import { execSync } from 'node:child_process';
|
|
|
|
|
import { resolve } from 'node:path';
|
|
|
|
|
|
|
|
|
|
import { names, type NameFinding } from './theming-census';
|
|
|
|
|
|
|
|
|
|
const BASE = resolve('src/uix/eidos/lib/recipes/base.ts');
|
|
|
|
|
const HISTORY = /^(docs\/process\/|docs\/theming\/changelog\.md$)/;
|
|
|
|
|
|
|
|
|
|
const read = (p: string) => readFileSync(p, 'utf8').replace(/\r\n/g, '\n');
|
|
|
|
|
|
fix(theming): la mitad gratis del instrumento - el codemod lee la IIFE y la sonda habla la puerta del centinela
Firma de instrumento (expediente VA, cegueras 4 y 5): coste de ledger CERO,
tres scripts, ni una entrada de theming-sentinel-exceptions.ts tocada.
- __names-codemod.ts: blocks() devuelve {name, at, end, depth} con offsets
reales del fichero; la IIFE de avatar acota su region al return{...} con
depth 3 (y LANZA si no lo encuentra) y los muros 2-3 leen por fin sus 97
claves (86 publicas + 11 privadas); el pase A renombra a \t{depth}.
Laboratorio sobre copias: duplicado inyectado a 3 tabs DETECTADO,
renombrado de una clave de avatar = 1 linea. La via de carga SE QUEDA en
tsx: theming-census importa src/uix/morfo/compile sin extension y todo
src/uix/morfo esta escrito asi.
- theming-sentinel.ts: COMPONENT_OVERRIDES se exporta (UNA tabla de puertas,
no dos) con guarda de entrypoint via realpathSync - sin el realpath la
guarda muere a traves de un junction (exit 0 sin inspeccionar nada) y este
repo usa worktrees con junctions; UIX_DEV_URL reemplaza el :5173 clavado.
Importarlo: 0,85 s sin navegador. label 1/2 y switch 27/52 byte a byte
identicos a las bases pre-firma. Incluye +10 lineas de comentario
PREEXISTENTES de otra sesion (la justificacion de image-adjustments en
COMPONENT_OVERRIDES, solo prosa, verificada contra su acta del 24).
- __theming-probe.ts: el pase open habla el vocabulario del centinela
(prepareWith/openBy/openWith/openMarker, con OPEN_TRIGGER podada de sus
copias literales) y su catch AVISA en stderr distinguiendo "no hay trigger"
de "el gesto fallo"; editable registra por fin su bloque open (25 filas, 6
con data-editing; dos corridas sobre codigo identico = 0 diffs en TODOS los
bloques); pases nuevos de FOCO (la cabecera lo prometia y nada llamaba a
.focus()) y disabled (bloque aparte y ULTIMO de la corrida);
PROBE_ROLE_BOUND_SCALES + PROBE_SAFE_SCALES + assertProbeSafeScale con la
discrepancia risk amber/orange documentada; UIX_DEV_URL. card y editable a
0 diffs contra sus bases en los bloques pre-firma; menubar (6 nodos -> 7
con el panel) y chat-message (24 filas x 2 corridas, 0 diffs) abren via las
entradas del centinela.
Fuera de la firma, registrado en next-features SS13: el barrido de variantes
de la sonda (ensanche diferido), el clear-trigger de search-field en el pase
open, la asimetria de escenario de los seis con prepareWith sin fila en
DEMO_VARIANTS, y la GRANDE (cegueras 6+1+3+2, barridos S1-S3), que sigue
esperando firma. El catch del prepareWith del centinela sigue MUDO a
proposito: es la ceguera 6, S1 de la GRANDE.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 month ago
|
|
|
/**
|
|
|
|
|
* Los bloques de primer nivel. Casi todos abren `nombre: {`, pero `avatar` envuelve
|
|
|
|
|
* su mapa en una IIFE (`nombre: ((): RecipeTokenMap => {`) y sus claves viven un
|
|
|
|
|
* tabulador más adentro, dentro del `return {` del cierre — la misma lectura que
|
|
|
|
|
* `theming-sentinel.ts`. Exigir `: {` dejaba a `avatar` fuera de la lista: sin
|
|
|
|
|
* bloque para el muro de colisiones, engullido por el rango de su vecino anterior
|
|
|
|
|
* para el de duplicadas, e intocable para el pase A.
|
|
|
|
|
*
|
|
|
|
|
* `at`/`end` acotan la REGIÓN DE CLAVES y `depth` dice a cuántos tabuladores están.
|
|
|
|
|
* Son offsets REALES del fichero — dedentar el bloque para reusar el regex de dos
|
|
|
|
|
* tabuladores rompería el mapeo con el que el pase A edita por rango.
|
|
|
|
|
*/
|
|
|
|
|
type Block = { name: string; at: number; end: number; depth: number };
|
|
|
|
|
|
|
|
|
|
function blocks(src: string): Block[] {
|
|
|
|
|
const opens = [...src.matchAll(/^\t'?([a-z0-9-]+)'?: (\{|\(\()/gm)];
|
|
|
|
|
return opens.map((m, i) => {
|
|
|
|
|
const at = m.index!;
|
|
|
|
|
const end = i + 1 < opens.length ? opens[i + 1].index! : src.length;
|
|
|
|
|
if (m[2] === '{') return { name: m[1], at, end, depth: 2 };
|
|
|
|
|
const body = src.indexOf('\n\t\treturn {', at);
|
|
|
|
|
const close = src.indexOf('\n\t\t};', body);
|
|
|
|
|
if (body < 0 || body > end || close < 0 || close > end)
|
|
|
|
|
throw new Error(`${m[1]}: IIFE sin un \`return {\` legible`);
|
|
|
|
|
return { name: m[1], at: body, end: close, depth: 3 };
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** Las claves de un bloque, al nivel de indentación que ese bloque use. */
|
|
|
|
|
const keyRe = (depth: number) => new RegExp(`^\\t{${depth}}'?(_?[a-z0-9-]+)'?\\s*:`, 'gm');
|
|
|
|
|
|
refactor(eidos): el catálogo habla un idioma — 269 claves al vocabulario firmado
D-TH.6, ejecutada. El slot de tinta pasa a `fg` y el modificador interactivo
se pone delante, que es lo que theming §6.7 r7 documentaba sin guard desde
que se escribió. Value-preserving: renombra la clave en `recipes/base.ts` y
sus 793 referencias en 101 ficheros; no toca un solo valor.
claves renombradas 269 en 66 componentes
referencias 793 en 101 ficheros
censo antes/después 162 recetas · 5.203 knobs · 1.841 públicos (37 %) · 56
sin contrato — IDÉNTICO, como debe ser un rename
--names antes/después 269 desviadas → 0
Qué NO entra, y por qué:
47 `{rol}-{slot-de-rol}` canónicas: COLOR_ROLE_SLOTS pone el modificador
detrás POR CONSTRUCCIÓN (`primary-solid-hover`)
13 exentas firmadas `--focus-ring-*` es familia del sistema; el color
de `aura` es un sustantivo; `stop-color` ES una
parte de gradient-builder
47 hovers neutros por VALOR: migran a la capa de estado
(§38 + R-4.3), no se renombran — firma 3
6 ocurrencias en historia changelog, errores-toxico, PLAN-affix/background:
reescribir un registro fechado lo vuelve mentira
El clasificador vive en el censo (`--names`), no en un script suelto, para que
el guard R-5.3 consuma la MISMA gramática que el codemod. Su muta-prueba
(`__names-mutatest.ts`, 27 casos) es lo que hizo el trabajo: cazó que yo
promovía al frente CUALQUIER valor declarado por el morfo, y así
`--sidebar-width-icon` (la anchura del raíl colapsado) se convertía en
`--sidebar-icon-width` (la anchura de un icono), que es otra cosa. La firma
dice «delante lo interactivo, detrás lo dimensional y contextual»: ahora sólo
promociona el vocabulario interactivo cerrado, y lo contextual —`below`,
`loaded`, `vertical`, `icon`— se queda donde estaba. Los cinco casos de
regresión están en la muta-prueba.
También cazó que `dropdown-menu.item-bg-hover` lee `var(--color-primary-element)`:
es un hover CON VALENCIA (el palette swap de recipe-contract §2), no el hover
bespoke que §38 deprecó. Clasificar por el nombre lo habría metido en una
migración que no le toca; se clasifica por el VALOR.
Verificación (§7.4, artefacto por paso):
diff de generated/ 269 renombres 1:1 · 0 cambios de valor · 22 privados
reapuntados a los nombres nuevos (`__names-verify-diff`)
computed tag-group · field · tabs: 6.467 valores en 23 estados,
0 diffs — y comprobado en el navegador que sirve el CSS
nuevo, para que ese 0 no sea el de una copia cacheada
huérfanos 0 en código
suite eidos 434 pasan · 1 rojo, el conocido (`skin-media-player`).
`recipe-css-contract` verde: es el guard que caza el
`var()` sin fallback a un nombre que ya no se emite,
o sea el fallo exacto de un rename a medias
component:audit 163 PASS · 3 NEEDS-WORK, los tres SIN TOCAR por esto
check 0 errores en ficheros tocados (los 73 globales son de
otras sesiones de la rama; se atribuye por fichero)
rtl:check 0 · docs:check 0
formato el renombrado no alarga ninguna línea: ningún fichero
tiene más líneas de 100 chars que antes, así que no se
pasa prettier — hacerlo reformateaba 300 ficheros de
deriva ajena
Entra aquí la corrección del repaso de los 7 ya hechos:
`gradient-builder.checker-color` → `checker-fg` (el damero de transparencia;
ahí `color` era slot). Sus `stop-color-*` no se tocan.
Queda para el paso siguiente: R-5.3 no puede graduar a `error` directo
mientras los 47 hovers neutros sigan hablando el idioma viejo — o migran
antes (firma 3, ya firmada), o el guard necesita una exención greppable.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
|
|
|
/** Claves de primer nivel duplicadas dentro de un mismo bloque de receta. */
|
|
|
|
|
function duplicateKeys(src: string): string[] {
|
|
|
|
|
const dupes: string[] = [];
|
fix(theming): la mitad gratis del instrumento - el codemod lee la IIFE y la sonda habla la puerta del centinela
Firma de instrumento (expediente VA, cegueras 4 y 5): coste de ledger CERO,
tres scripts, ni una entrada de theming-sentinel-exceptions.ts tocada.
- __names-codemod.ts: blocks() devuelve {name, at, end, depth} con offsets
reales del fichero; la IIFE de avatar acota su region al return{...} con
depth 3 (y LANZA si no lo encuentra) y los muros 2-3 leen por fin sus 97
claves (86 publicas + 11 privadas); el pase A renombra a \t{depth}.
Laboratorio sobre copias: duplicado inyectado a 3 tabs DETECTADO,
renombrado de una clave de avatar = 1 linea. La via de carga SE QUEDA en
tsx: theming-census importa src/uix/morfo/compile sin extension y todo
src/uix/morfo esta escrito asi.
- theming-sentinel.ts: COMPONENT_OVERRIDES se exporta (UNA tabla de puertas,
no dos) con guarda de entrypoint via realpathSync - sin el realpath la
guarda muere a traves de un junction (exit 0 sin inspeccionar nada) y este
repo usa worktrees con junctions; UIX_DEV_URL reemplaza el :5173 clavado.
Importarlo: 0,85 s sin navegador. label 1/2 y switch 27/52 byte a byte
identicos a las bases pre-firma. Incluye +10 lineas de comentario
PREEXISTENTES de otra sesion (la justificacion de image-adjustments en
COMPONENT_OVERRIDES, solo prosa, verificada contra su acta del 24).
- __theming-probe.ts: el pase open habla el vocabulario del centinela
(prepareWith/openBy/openWith/openMarker, con OPEN_TRIGGER podada de sus
copias literales) y su catch AVISA en stderr distinguiendo "no hay trigger"
de "el gesto fallo"; editable registra por fin su bloque open (25 filas, 6
con data-editing; dos corridas sobre codigo identico = 0 diffs en TODOS los
bloques); pases nuevos de FOCO (la cabecera lo prometia y nada llamaba a
.focus()) y disabled (bloque aparte y ULTIMO de la corrida);
PROBE_ROLE_BOUND_SCALES + PROBE_SAFE_SCALES + assertProbeSafeScale con la
discrepancia risk amber/orange documentada; UIX_DEV_URL. card y editable a
0 diffs contra sus bases en los bloques pre-firma; menubar (6 nodos -> 7
con el panel) y chat-message (24 filas x 2 corridas, 0 diffs) abren via las
entradas del centinela.
Fuera de la firma, registrado en next-features SS13: el barrido de variantes
de la sonda (ensanche diferido), el clear-trigger de search-field en el pase
open, la asimetria de escenario de los seis con prepareWith sin fila en
DEMO_VARIANTS, y la GRANDE (cegueras 6+1+3+2, barridos S1-S3), que sigue
esperando firma. El catch del prepareWith del centinela sigue MUDO a
proposito: es la ceguera 6, S1 de la GRANDE.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 month ago
|
|
|
for (const b of blocks(src)) {
|
refactor(eidos): el catálogo habla un idioma — 269 claves al vocabulario firmado
D-TH.6, ejecutada. El slot de tinta pasa a `fg` y el modificador interactivo
se pone delante, que es lo que theming §6.7 r7 documentaba sin guard desde
que se escribió. Value-preserving: renombra la clave en `recipes/base.ts` y
sus 793 referencias en 101 ficheros; no toca un solo valor.
claves renombradas 269 en 66 componentes
referencias 793 en 101 ficheros
censo antes/después 162 recetas · 5.203 knobs · 1.841 públicos (37 %) · 56
sin contrato — IDÉNTICO, como debe ser un rename
--names antes/después 269 desviadas → 0
Qué NO entra, y por qué:
47 `{rol}-{slot-de-rol}` canónicas: COLOR_ROLE_SLOTS pone el modificador
detrás POR CONSTRUCCIÓN (`primary-solid-hover`)
13 exentas firmadas `--focus-ring-*` es familia del sistema; el color
de `aura` es un sustantivo; `stop-color` ES una
parte de gradient-builder
47 hovers neutros por VALOR: migran a la capa de estado
(§38 + R-4.3), no se renombran — firma 3
6 ocurrencias en historia changelog, errores-toxico, PLAN-affix/background:
reescribir un registro fechado lo vuelve mentira
El clasificador vive en el censo (`--names`), no en un script suelto, para que
el guard R-5.3 consuma la MISMA gramática que el codemod. Su muta-prueba
(`__names-mutatest.ts`, 27 casos) es lo que hizo el trabajo: cazó que yo
promovía al frente CUALQUIER valor declarado por el morfo, y así
`--sidebar-width-icon` (la anchura del raíl colapsado) se convertía en
`--sidebar-icon-width` (la anchura de un icono), que es otra cosa. La firma
dice «delante lo interactivo, detrás lo dimensional y contextual»: ahora sólo
promociona el vocabulario interactivo cerrado, y lo contextual —`below`,
`loaded`, `vertical`, `icon`— se queda donde estaba. Los cinco casos de
regresión están en la muta-prueba.
También cazó que `dropdown-menu.item-bg-hover` lee `var(--color-primary-element)`:
es un hover CON VALENCIA (el palette swap de recipe-contract §2), no el hover
bespoke que §38 deprecó. Clasificar por el nombre lo habría metido en una
migración que no le toca; se clasifica por el VALOR.
Verificación (§7.4, artefacto por paso):
diff de generated/ 269 renombres 1:1 · 0 cambios de valor · 22 privados
reapuntados a los nombres nuevos (`__names-verify-diff`)
computed tag-group · field · tabs: 6.467 valores en 23 estados,
0 diffs — y comprobado en el navegador que sirve el CSS
nuevo, para que ese 0 no sea el de una copia cacheada
huérfanos 0 en código
suite eidos 434 pasan · 1 rojo, el conocido (`skin-media-player`).
`recipe-css-contract` verde: es el guard que caza el
`var()` sin fallback a un nombre que ya no se emite,
o sea el fallo exacto de un rename a medias
component:audit 163 PASS · 3 NEEDS-WORK, los tres SIN TOCAR por esto
check 0 errores en ficheros tocados (los 73 globales son de
otras sesiones de la rama; se atribuye por fichero)
rtl:check 0 · docs:check 0
formato el renombrado no alarga ninguna línea: ningún fichero
tiene más líneas de 100 chars que antes, así que no se
pasa prettier — hacerlo reformateaba 300 ficheros de
deriva ajena
Entra aquí la corrección del repaso de los 7 ya hechos:
`gradient-builder.checker-color` → `checker-fg` (el damero de transparencia;
ahí `color` era slot). Sus `stop-color-*` no se tocan.
Queda para el paso siguiente: R-5.3 no puede graduar a `error` directo
mientras los 47 hovers neutros sigan hablando el idioma viejo — o migran
antes (firma 3, ya firmada), o el guard necesita una exención greppable.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
|
|
|
const seen = new Set<string>();
|
fix(theming): la mitad gratis del instrumento - el codemod lee la IIFE y la sonda habla la puerta del centinela
Firma de instrumento (expediente VA, cegueras 4 y 5): coste de ledger CERO,
tres scripts, ni una entrada de theming-sentinel-exceptions.ts tocada.
- __names-codemod.ts: blocks() devuelve {name, at, end, depth} con offsets
reales del fichero; la IIFE de avatar acota su region al return{...} con
depth 3 (y LANZA si no lo encuentra) y los muros 2-3 leen por fin sus 97
claves (86 publicas + 11 privadas); el pase A renombra a \t{depth}.
Laboratorio sobre copias: duplicado inyectado a 3 tabs DETECTADO,
renombrado de una clave de avatar = 1 linea. La via de carga SE QUEDA en
tsx: theming-census importa src/uix/morfo/compile sin extension y todo
src/uix/morfo esta escrito asi.
- theming-sentinel.ts: COMPONENT_OVERRIDES se exporta (UNA tabla de puertas,
no dos) con guarda de entrypoint via realpathSync - sin el realpath la
guarda muere a traves de un junction (exit 0 sin inspeccionar nada) y este
repo usa worktrees con junctions; UIX_DEV_URL reemplaza el :5173 clavado.
Importarlo: 0,85 s sin navegador. label 1/2 y switch 27/52 byte a byte
identicos a las bases pre-firma. Incluye +10 lineas de comentario
PREEXISTENTES de otra sesion (la justificacion de image-adjustments en
COMPONENT_OVERRIDES, solo prosa, verificada contra su acta del 24).
- __theming-probe.ts: el pase open habla el vocabulario del centinela
(prepareWith/openBy/openWith/openMarker, con OPEN_TRIGGER podada de sus
copias literales) y su catch AVISA en stderr distinguiendo "no hay trigger"
de "el gesto fallo"; editable registra por fin su bloque open (25 filas, 6
con data-editing; dos corridas sobre codigo identico = 0 diffs en TODOS los
bloques); pases nuevos de FOCO (la cabecera lo prometia y nada llamaba a
.focus()) y disabled (bloque aparte y ULTIMO de la corrida);
PROBE_ROLE_BOUND_SCALES + PROBE_SAFE_SCALES + assertProbeSafeScale con la
discrepancia risk amber/orange documentada; UIX_DEV_URL. card y editable a
0 diffs contra sus bases en los bloques pre-firma; menubar (6 nodos -> 7
con el panel) y chat-message (24 filas x 2 corridas, 0 diffs) abren via las
entradas del centinela.
Fuera de la firma, registrado en next-features SS13: el barrido de variantes
de la sonda (ensanche diferido), el clear-trigger de search-field en el pase
open, la asimetria de escenario de los seis con prepareWith sin fila en
DEMO_VARIANTS, y la GRANDE (cegueras 6+1+3+2, barridos S1-S3), que sigue
esperando firma. El catch del prepareWith del centinela sigue MUDO a
proposito: es la ceguera 6, S1 de la GRANDE.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 month ago
|
|
|
for (const k of src.slice(b.at, b.end).matchAll(keyRe(b.depth))) {
|
|
|
|
|
if (seen.has(k[1])) dupes.push(b.name + '.' + k[1]);
|
refactor(eidos): el catálogo habla un idioma — 269 claves al vocabulario firmado
D-TH.6, ejecutada. El slot de tinta pasa a `fg` y el modificador interactivo
se pone delante, que es lo que theming §6.7 r7 documentaba sin guard desde
que se escribió. Value-preserving: renombra la clave en `recipes/base.ts` y
sus 793 referencias en 101 ficheros; no toca un solo valor.
claves renombradas 269 en 66 componentes
referencias 793 en 101 ficheros
censo antes/después 162 recetas · 5.203 knobs · 1.841 públicos (37 %) · 56
sin contrato — IDÉNTICO, como debe ser un rename
--names antes/después 269 desviadas → 0
Qué NO entra, y por qué:
47 `{rol}-{slot-de-rol}` canónicas: COLOR_ROLE_SLOTS pone el modificador
detrás POR CONSTRUCCIÓN (`primary-solid-hover`)
13 exentas firmadas `--focus-ring-*` es familia del sistema; el color
de `aura` es un sustantivo; `stop-color` ES una
parte de gradient-builder
47 hovers neutros por VALOR: migran a la capa de estado
(§38 + R-4.3), no se renombran — firma 3
6 ocurrencias en historia changelog, errores-toxico, PLAN-affix/background:
reescribir un registro fechado lo vuelve mentira
El clasificador vive en el censo (`--names`), no en un script suelto, para que
el guard R-5.3 consuma la MISMA gramática que el codemod. Su muta-prueba
(`__names-mutatest.ts`, 27 casos) es lo que hizo el trabajo: cazó que yo
promovía al frente CUALQUIER valor declarado por el morfo, y así
`--sidebar-width-icon` (la anchura del raíl colapsado) se convertía en
`--sidebar-icon-width` (la anchura de un icono), que es otra cosa. La firma
dice «delante lo interactivo, detrás lo dimensional y contextual»: ahora sólo
promociona el vocabulario interactivo cerrado, y lo contextual —`below`,
`loaded`, `vertical`, `icon`— se queda donde estaba. Los cinco casos de
regresión están en la muta-prueba.
También cazó que `dropdown-menu.item-bg-hover` lee `var(--color-primary-element)`:
es un hover CON VALENCIA (el palette swap de recipe-contract §2), no el hover
bespoke que §38 deprecó. Clasificar por el nombre lo habría metido en una
migración que no le toca; se clasifica por el VALOR.
Verificación (§7.4, artefacto por paso):
diff de generated/ 269 renombres 1:1 · 0 cambios de valor · 22 privados
reapuntados a los nombres nuevos (`__names-verify-diff`)
computed tag-group · field · tabs: 6.467 valores en 23 estados,
0 diffs — y comprobado en el navegador que sirve el CSS
nuevo, para que ese 0 no sea el de una copia cacheada
huérfanos 0 en código
suite eidos 434 pasan · 1 rojo, el conocido (`skin-media-player`).
`recipe-css-contract` verde: es el guard que caza el
`var()` sin fallback a un nombre que ya no se emite,
o sea el fallo exacto de un rename a medias
component:audit 163 PASS · 3 NEEDS-WORK, los tres SIN TOCAR por esto
check 0 errores en ficheros tocados (los 73 globales son de
otras sesiones de la rama; se atribuye por fichero)
rtl:check 0 · docs:check 0
formato el renombrado no alarga ninguna línea: ningún fichero
tiene más líneas de 100 chars que antes, así que no se
pasa prettier — hacerlo reformateaba 300 ficheros de
deriva ajena
Entra aquí la corrección del repaso de los 7 ya hechos:
`gradient-builder.checker-color` → `checker-fg` (el damero de transparencia;
ahí `color` era slot). Sus `stop-color-*` no se tocan.
Queda para el paso siguiente: R-5.3 no puede graduar a `error` directo
mientras los 47 hovers neutros sigan hablando el idioma viejo — o migran
antes (firma 3, ya firmada), o el guard necesita una exención greppable.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
|
|
|
seen.add(k[1]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return dupes;
|
|
|
|
|
}
|
|
|
|
|
|
fix(theming): la mitad gratis del instrumento - el codemod lee la IIFE y la sonda habla la puerta del centinela
Firma de instrumento (expediente VA, cegueras 4 y 5): coste de ledger CERO,
tres scripts, ni una entrada de theming-sentinel-exceptions.ts tocada.
- __names-codemod.ts: blocks() devuelve {name, at, end, depth} con offsets
reales del fichero; la IIFE de avatar acota su region al return{...} con
depth 3 (y LANZA si no lo encuentra) y los muros 2-3 leen por fin sus 97
claves (86 publicas + 11 privadas); el pase A renombra a \t{depth}.
Laboratorio sobre copias: duplicado inyectado a 3 tabs DETECTADO,
renombrado de una clave de avatar = 1 linea. La via de carga SE QUEDA en
tsx: theming-census importa src/uix/morfo/compile sin extension y todo
src/uix/morfo esta escrito asi.
- theming-sentinel.ts: COMPONENT_OVERRIDES se exporta (UNA tabla de puertas,
no dos) con guarda de entrypoint via realpathSync - sin el realpath la
guarda muere a traves de un junction (exit 0 sin inspeccionar nada) y este
repo usa worktrees con junctions; UIX_DEV_URL reemplaza el :5173 clavado.
Importarlo: 0,85 s sin navegador. label 1/2 y switch 27/52 byte a byte
identicos a las bases pre-firma. Incluye +10 lineas de comentario
PREEXISTENTES de otra sesion (la justificacion de image-adjustments en
COMPONENT_OVERRIDES, solo prosa, verificada contra su acta del 24).
- __theming-probe.ts: el pase open habla el vocabulario del centinela
(prepareWith/openBy/openWith/openMarker, con OPEN_TRIGGER podada de sus
copias literales) y su catch AVISA en stderr distinguiendo "no hay trigger"
de "el gesto fallo"; editable registra por fin su bloque open (25 filas, 6
con data-editing; dos corridas sobre codigo identico = 0 diffs en TODOS los
bloques); pases nuevos de FOCO (la cabecera lo prometia y nada llamaba a
.focus()) y disabled (bloque aparte y ULTIMO de la corrida);
PROBE_ROLE_BOUND_SCALES + PROBE_SAFE_SCALES + assertProbeSafeScale con la
discrepancia risk amber/orange documentada; UIX_DEV_URL. card y editable a
0 diffs contra sus bases en los bloques pre-firma; menubar (6 nodos -> 7
con el panel) y chat-message (24 filas x 2 corridas, 0 diffs) abren via las
entradas del centinela.
Fuera de la firma, registrado en next-features SS13: el barrido de variantes
de la sonda (ensanche diferido), el clear-trigger de search-field en el pase
open, la asimetria de escenario de los seis con prepareWith sin fila en
DEMO_VARIANTS, y la GRANDE (cegueras 6+1+3+2, barridos S1-S3), que sigue
esperando firma. El catch del prepareWith del centinela sigue MUDO a
proposito: es la ceguera 6, S1 de la GRANDE.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 month ago
|
|
|
function blockRange(src: string, component: string): Block | null {
|
|
|
|
|
return blocks(src).find((b) => b.name === component) ?? null;
|
refactor(eidos): el catálogo habla un idioma — 269 claves al vocabulario firmado
D-TH.6, ejecutada. El slot de tinta pasa a `fg` y el modificador interactivo
se pone delante, que es lo que theming §6.7 r7 documentaba sin guard desde
que se escribió. Value-preserving: renombra la clave en `recipes/base.ts` y
sus 793 referencias en 101 ficheros; no toca un solo valor.
claves renombradas 269 en 66 componentes
referencias 793 en 101 ficheros
censo antes/después 162 recetas · 5.203 knobs · 1.841 públicos (37 %) · 56
sin contrato — IDÉNTICO, como debe ser un rename
--names antes/después 269 desviadas → 0
Qué NO entra, y por qué:
47 `{rol}-{slot-de-rol}` canónicas: COLOR_ROLE_SLOTS pone el modificador
detrás POR CONSTRUCCIÓN (`primary-solid-hover`)
13 exentas firmadas `--focus-ring-*` es familia del sistema; el color
de `aura` es un sustantivo; `stop-color` ES una
parte de gradient-builder
47 hovers neutros por VALOR: migran a la capa de estado
(§38 + R-4.3), no se renombran — firma 3
6 ocurrencias en historia changelog, errores-toxico, PLAN-affix/background:
reescribir un registro fechado lo vuelve mentira
El clasificador vive en el censo (`--names`), no en un script suelto, para que
el guard R-5.3 consuma la MISMA gramática que el codemod. Su muta-prueba
(`__names-mutatest.ts`, 27 casos) es lo que hizo el trabajo: cazó que yo
promovía al frente CUALQUIER valor declarado por el morfo, y así
`--sidebar-width-icon` (la anchura del raíl colapsado) se convertía en
`--sidebar-icon-width` (la anchura de un icono), que es otra cosa. La firma
dice «delante lo interactivo, detrás lo dimensional y contextual»: ahora sólo
promociona el vocabulario interactivo cerrado, y lo contextual —`below`,
`loaded`, `vertical`, `icon`— se queda donde estaba. Los cinco casos de
regresión están en la muta-prueba.
También cazó que `dropdown-menu.item-bg-hover` lee `var(--color-primary-element)`:
es un hover CON VALENCIA (el palette swap de recipe-contract §2), no el hover
bespoke que §38 deprecó. Clasificar por el nombre lo habría metido en una
migración que no le toca; se clasifica por el VALOR.
Verificación (§7.4, artefacto por paso):
diff de generated/ 269 renombres 1:1 · 0 cambios de valor · 22 privados
reapuntados a los nombres nuevos (`__names-verify-diff`)
computed tag-group · field · tabs: 6.467 valores en 23 estados,
0 diffs — y comprobado en el navegador que sirve el CSS
nuevo, para que ese 0 no sea el de una copia cacheada
huérfanos 0 en código
suite eidos 434 pasan · 1 rojo, el conocido (`skin-media-player`).
`recipe-css-contract` verde: es el guard que caza el
`var()` sin fallback a un nombre que ya no se emite,
o sea el fallo exacto de un rename a medias
component:audit 163 PASS · 3 NEEDS-WORK, los tres SIN TOCAR por esto
check 0 errores en ficheros tocados (los 73 globales son de
otras sesiones de la rama; se atribuye por fichero)
rtl:check 0 · docs:check 0
formato el renombrado no alarga ninguna línea: ningún fichero
tiene más líneas de 100 chars que antes, así que no se
pasa prettier — hacerlo reformateaba 300 ficheros de
deriva ajena
Entra aquí la corrección del repaso de los 7 ya hechos:
`gradient-builder.checker-color` → `checker-fg` (el damero de transparencia;
ahí `color` era slot). Sus `stop-color-*` no se tocan.
Queda para el paso siguiente: R-5.3 no puede graduar a `error` directo
mientras los 47 hovers neutros sigan hablando el idioma viejo — o migran
antes (firma 3, ya firmada), o el guard necesita una exención greppable.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async function run() {
|
|
|
|
|
const write = process.argv.includes('--write');
|
|
|
|
|
const findings = await names();
|
|
|
|
|
const renames = findings.filter(
|
|
|
|
|
(f) => (f.klass === 'ink' || f.klass === 'modifier' || f.klass === 'both') && f.to
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// ── Muro 1: colisiones ────────────────────────────────────────────────────
|
|
|
|
|
const base0 = read(BASE);
|
|
|
|
|
const collisions: string[] = [];
|
|
|
|
|
const byComponent = new Map<string, NameFinding[]>();
|
|
|
|
|
for (const f of renames) byComponent.set(f.component, [...(byComponent.get(f.component) ?? []), f]);
|
|
|
|
|
for (const [component, fs] of byComponent) {
|
|
|
|
|
const range = blockRange(base0, component);
|
|
|
|
|
if (!range) {
|
|
|
|
|
collisions.push(`${component}: SIN BLOQUE`);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
const existing = new Set(
|
fix(theming): la mitad gratis del instrumento - el codemod lee la IIFE y la sonda habla la puerta del centinela
Firma de instrumento (expediente VA, cegueras 4 y 5): coste de ledger CERO,
tres scripts, ni una entrada de theming-sentinel-exceptions.ts tocada.
- __names-codemod.ts: blocks() devuelve {name, at, end, depth} con offsets
reales del fichero; la IIFE de avatar acota su region al return{...} con
depth 3 (y LANZA si no lo encuentra) y los muros 2-3 leen por fin sus 97
claves (86 publicas + 11 privadas); el pase A renombra a \t{depth}.
Laboratorio sobre copias: duplicado inyectado a 3 tabs DETECTADO,
renombrado de una clave de avatar = 1 linea. La via de carga SE QUEDA en
tsx: theming-census importa src/uix/morfo/compile sin extension y todo
src/uix/morfo esta escrito asi.
- theming-sentinel.ts: COMPONENT_OVERRIDES se exporta (UNA tabla de puertas,
no dos) con guarda de entrypoint via realpathSync - sin el realpath la
guarda muere a traves de un junction (exit 0 sin inspeccionar nada) y este
repo usa worktrees con junctions; UIX_DEV_URL reemplaza el :5173 clavado.
Importarlo: 0,85 s sin navegador. label 1/2 y switch 27/52 byte a byte
identicos a las bases pre-firma. Incluye +10 lineas de comentario
PREEXISTENTES de otra sesion (la justificacion de image-adjustments en
COMPONENT_OVERRIDES, solo prosa, verificada contra su acta del 24).
- __theming-probe.ts: el pase open habla el vocabulario del centinela
(prepareWith/openBy/openWith/openMarker, con OPEN_TRIGGER podada de sus
copias literales) y su catch AVISA en stderr distinguiendo "no hay trigger"
de "el gesto fallo"; editable registra por fin su bloque open (25 filas, 6
con data-editing; dos corridas sobre codigo identico = 0 diffs en TODOS los
bloques); pases nuevos de FOCO (la cabecera lo prometia y nada llamaba a
.focus()) y disabled (bloque aparte y ULTIMO de la corrida);
PROBE_ROLE_BOUND_SCALES + PROBE_SAFE_SCALES + assertProbeSafeScale con la
discrepancia risk amber/orange documentada; UIX_DEV_URL. card y editable a
0 diffs contra sus bases en los bloques pre-firma; menubar (6 nodos -> 7
con el panel) y chat-message (24 filas x 2 corridas, 0 diffs) abren via las
entradas del centinela.
Fuera de la firma, registrado en next-features SS13: el barrido de variantes
de la sonda (ensanche diferido), el clear-trigger de search-field en el pase
open, la asimetria de escenario de los seis con prepareWith sin fila en
DEMO_VARIANTS, y la GRANDE (cegueras 6+1+3+2, barridos S1-S3), que sigue
esperando firma. El catch del prepareWith del centinela sigue MUDO a
proposito: es la ceguera 6, S1 de la GRANDE.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 month ago
|
|
|
[...base0.slice(range.at, range.end).matchAll(keyRe(range.depth))].map((m) => m[1])
|
refactor(eidos): el catálogo habla un idioma — 269 claves al vocabulario firmado
D-TH.6, ejecutada. El slot de tinta pasa a `fg` y el modificador interactivo
se pone delante, que es lo que theming §6.7 r7 documentaba sin guard desde
que se escribió. Value-preserving: renombra la clave en `recipes/base.ts` y
sus 793 referencias en 101 ficheros; no toca un solo valor.
claves renombradas 269 en 66 componentes
referencias 793 en 101 ficheros
censo antes/después 162 recetas · 5.203 knobs · 1.841 públicos (37 %) · 56
sin contrato — IDÉNTICO, como debe ser un rename
--names antes/después 269 desviadas → 0
Qué NO entra, y por qué:
47 `{rol}-{slot-de-rol}` canónicas: COLOR_ROLE_SLOTS pone el modificador
detrás POR CONSTRUCCIÓN (`primary-solid-hover`)
13 exentas firmadas `--focus-ring-*` es familia del sistema; el color
de `aura` es un sustantivo; `stop-color` ES una
parte de gradient-builder
47 hovers neutros por VALOR: migran a la capa de estado
(§38 + R-4.3), no se renombran — firma 3
6 ocurrencias en historia changelog, errores-toxico, PLAN-affix/background:
reescribir un registro fechado lo vuelve mentira
El clasificador vive en el censo (`--names`), no en un script suelto, para que
el guard R-5.3 consuma la MISMA gramática que el codemod. Su muta-prueba
(`__names-mutatest.ts`, 27 casos) es lo que hizo el trabajo: cazó que yo
promovía al frente CUALQUIER valor declarado por el morfo, y así
`--sidebar-width-icon` (la anchura del raíl colapsado) se convertía en
`--sidebar-icon-width` (la anchura de un icono), que es otra cosa. La firma
dice «delante lo interactivo, detrás lo dimensional y contextual»: ahora sólo
promociona el vocabulario interactivo cerrado, y lo contextual —`below`,
`loaded`, `vertical`, `icon`— se queda donde estaba. Los cinco casos de
regresión están en la muta-prueba.
También cazó que `dropdown-menu.item-bg-hover` lee `var(--color-primary-element)`:
es un hover CON VALENCIA (el palette swap de recipe-contract §2), no el hover
bespoke que §38 deprecó. Clasificar por el nombre lo habría metido en una
migración que no le toca; se clasifica por el VALOR.
Verificación (§7.4, artefacto por paso):
diff de generated/ 269 renombres 1:1 · 0 cambios de valor · 22 privados
reapuntados a los nombres nuevos (`__names-verify-diff`)
computed tag-group · field · tabs: 6.467 valores en 23 estados,
0 diffs — y comprobado en el navegador que sirve el CSS
nuevo, para que ese 0 no sea el de una copia cacheada
huérfanos 0 en código
suite eidos 434 pasan · 1 rojo, el conocido (`skin-media-player`).
`recipe-css-contract` verde: es el guard que caza el
`var()` sin fallback a un nombre que ya no se emite,
o sea el fallo exacto de un rename a medias
component:audit 163 PASS · 3 NEEDS-WORK, los tres SIN TOCAR por esto
check 0 errores en ficheros tocados (los 73 globales son de
otras sesiones de la rama; se atribuye por fichero)
rtl:check 0 · docs:check 0
formato el renombrado no alarga ninguna línea: ningún fichero
tiene más líneas de 100 chars que antes, así que no se
pasa prettier — hacerlo reformateaba 300 ficheros de
deriva ajena
Entra aquí la corrección del repaso de los 7 ya hechos:
`gradient-builder.checker-color` → `checker-fg` (el damero de transparencia;
ahí `color` era slot). Sus `stop-color-*` no se tocan.
Queda para el paso siguiente: R-5.3 no puede graduar a `error` directo
mientras los 47 hovers neutros sigan hablando el idioma viejo — o migran
antes (firma 3, ya firmada), o el guard necesita una exención greppable.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
|
|
|
);
|
|
|
|
|
const targets = new Set<string>();
|
|
|
|
|
for (const f of fs) {
|
|
|
|
|
if (existing.has(f.to!) && f.to !== f.key) collisions.push(`${component}.${f.to} YA EXISTE`);
|
|
|
|
|
if (targets.has(f.to!)) collisions.push(`${component}.${f.to} destino DUPLICADO`);
|
|
|
|
|
targets.add(f.to!);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ── Muro 2: claves duplicadas ANTES ───────────────────────────────────────
|
|
|
|
|
const dupesBefore = duplicateKeys(base0);
|
|
|
|
|
|
|
|
|
|
// El PLAN se escribe antes de tocar nada: es lo único que sobrevive al
|
|
|
|
|
// renombrado, y sin él el verificador del diff no tiene contra qué medir
|
|
|
|
|
// (el clasificador, releído después, ya no ve desviación alguna).
|
|
|
|
|
const planPath = resolve('scripts/__names-plan.json');
|
|
|
|
|
if (write)
|
|
|
|
|
writeFileSync(
|
|
|
|
|
planPath,
|
|
|
|
|
JSON.stringify(
|
|
|
|
|
renames.map((f) => ({ component: f.component, from: f.key, to: f.to })),
|
|
|
|
|
null,
|
|
|
|
|
'\t'
|
|
|
|
|
) + '\n',
|
|
|
|
|
'utf8'
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
console.log(`renombres: ${renames.length} en ${byComponent.size} componentes`);
|
|
|
|
|
console.log(`muro 1 · colisiones: ${collisions.length ? collisions.join(' | ') : 'ninguna'}`);
|
|
|
|
|
console.log(`muro 2 · duplicadas ANTES: ${dupesBefore.length ? dupesBefore.join(' | ') : 'ninguna'}`);
|
|
|
|
|
if (collisions.length || dupesBefore.length) {
|
|
|
|
|
console.error('\nABORTA: un muro está en rojo.');
|
|
|
|
|
process.exit(1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ── Pase A: la CLAVE en base.ts, acotado a su bloque ──────────────────────
|
|
|
|
|
let base = base0;
|
|
|
|
|
let keyHits = 0;
|
|
|
|
|
for (const [component, fs] of byComponent) {
|
|
|
|
|
const range = blockRange(base, component);
|
|
|
|
|
if (!range) continue;
|
fix(theming): la mitad gratis del instrumento - el codemod lee la IIFE y la sonda habla la puerta del centinela
Firma de instrumento (expediente VA, cegueras 4 y 5): coste de ledger CERO,
tres scripts, ni una entrada de theming-sentinel-exceptions.ts tocada.
- __names-codemod.ts: blocks() devuelve {name, at, end, depth} con offsets
reales del fichero; la IIFE de avatar acota su region al return{...} con
depth 3 (y LANZA si no lo encuentra) y los muros 2-3 leen por fin sus 97
claves (86 publicas + 11 privadas); el pase A renombra a \t{depth}.
Laboratorio sobre copias: duplicado inyectado a 3 tabs DETECTADO,
renombrado de una clave de avatar = 1 linea. La via de carga SE QUEDA en
tsx: theming-census importa src/uix/morfo/compile sin extension y todo
src/uix/morfo esta escrito asi.
- theming-sentinel.ts: COMPONENT_OVERRIDES se exporta (UNA tabla de puertas,
no dos) con guarda de entrypoint via realpathSync - sin el realpath la
guarda muere a traves de un junction (exit 0 sin inspeccionar nada) y este
repo usa worktrees con junctions; UIX_DEV_URL reemplaza el :5173 clavado.
Importarlo: 0,85 s sin navegador. label 1/2 y switch 27/52 byte a byte
identicos a las bases pre-firma. Incluye +10 lineas de comentario
PREEXISTENTES de otra sesion (la justificacion de image-adjustments en
COMPONENT_OVERRIDES, solo prosa, verificada contra su acta del 24).
- __theming-probe.ts: el pase open habla el vocabulario del centinela
(prepareWith/openBy/openWith/openMarker, con OPEN_TRIGGER podada de sus
copias literales) y su catch AVISA en stderr distinguiendo "no hay trigger"
de "el gesto fallo"; editable registra por fin su bloque open (25 filas, 6
con data-editing; dos corridas sobre codigo identico = 0 diffs en TODOS los
bloques); pases nuevos de FOCO (la cabecera lo prometia y nada llamaba a
.focus()) y disabled (bloque aparte y ULTIMO de la corrida);
PROBE_ROLE_BOUND_SCALES + PROBE_SAFE_SCALES + assertProbeSafeScale con la
discrepancia risk amber/orange documentada; UIX_DEV_URL. card y editable a
0 diffs contra sus bases en los bloques pre-firma; menubar (6 nodos -> 7
con el panel) y chat-message (24 filas x 2 corridas, 0 diffs) abren via las
entradas del centinela.
Fuera de la firma, registrado en next-features SS13: el barrido de variantes
de la sonda (ensanche diferido), el clear-trigger de search-field en el pase
open, la asimetria de escenario de los seis con prepareWith sin fila en
DEMO_VARIANTS, y la GRANDE (cegueras 6+1+3+2, barridos S1-S3), que sigue
esperando firma. El catch del prepareWith del centinela sigue MUDO a
proposito: es la ceguera 6, S1 de la GRANDE.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 month ago
|
|
|
let block = base.slice(range.at, range.end);
|
refactor(eidos): el catálogo habla un idioma — 269 claves al vocabulario firmado
D-TH.6, ejecutada. El slot de tinta pasa a `fg` y el modificador interactivo
se pone delante, que es lo que theming §6.7 r7 documentaba sin guard desde
que se escribió. Value-preserving: renombra la clave en `recipes/base.ts` y
sus 793 referencias en 101 ficheros; no toca un solo valor.
claves renombradas 269 en 66 componentes
referencias 793 en 101 ficheros
censo antes/después 162 recetas · 5.203 knobs · 1.841 públicos (37 %) · 56
sin contrato — IDÉNTICO, como debe ser un rename
--names antes/después 269 desviadas → 0
Qué NO entra, y por qué:
47 `{rol}-{slot-de-rol}` canónicas: COLOR_ROLE_SLOTS pone el modificador
detrás POR CONSTRUCCIÓN (`primary-solid-hover`)
13 exentas firmadas `--focus-ring-*` es familia del sistema; el color
de `aura` es un sustantivo; `stop-color` ES una
parte de gradient-builder
47 hovers neutros por VALOR: migran a la capa de estado
(§38 + R-4.3), no se renombran — firma 3
6 ocurrencias en historia changelog, errores-toxico, PLAN-affix/background:
reescribir un registro fechado lo vuelve mentira
El clasificador vive en el censo (`--names`), no en un script suelto, para que
el guard R-5.3 consuma la MISMA gramática que el codemod. Su muta-prueba
(`__names-mutatest.ts`, 27 casos) es lo que hizo el trabajo: cazó que yo
promovía al frente CUALQUIER valor declarado por el morfo, y así
`--sidebar-width-icon` (la anchura del raíl colapsado) se convertía en
`--sidebar-icon-width` (la anchura de un icono), que es otra cosa. La firma
dice «delante lo interactivo, detrás lo dimensional y contextual»: ahora sólo
promociona el vocabulario interactivo cerrado, y lo contextual —`below`,
`loaded`, `vertical`, `icon`— se queda donde estaba. Los cinco casos de
regresión están en la muta-prueba.
También cazó que `dropdown-menu.item-bg-hover` lee `var(--color-primary-element)`:
es un hover CON VALENCIA (el palette swap de recipe-contract §2), no el hover
bespoke que §38 deprecó. Clasificar por el nombre lo habría metido en una
migración que no le toca; se clasifica por el VALOR.
Verificación (§7.4, artefacto por paso):
diff de generated/ 269 renombres 1:1 · 0 cambios de valor · 22 privados
reapuntados a los nombres nuevos (`__names-verify-diff`)
computed tag-group · field · tabs: 6.467 valores en 23 estados,
0 diffs — y comprobado en el navegador que sirve el CSS
nuevo, para que ese 0 no sea el de una copia cacheada
huérfanos 0 en código
suite eidos 434 pasan · 1 rojo, el conocido (`skin-media-player`).
`recipe-css-contract` verde: es el guard que caza el
`var()` sin fallback a un nombre que ya no se emite,
o sea el fallo exacto de un rename a medias
component:audit 163 PASS · 3 NEEDS-WORK, los tres SIN TOCAR por esto
check 0 errores en ficheros tocados (los 73 globales son de
otras sesiones de la rama; se atribuye por fichero)
rtl:check 0 · docs:check 0
formato el renombrado no alarga ninguna línea: ningún fichero
tiene más líneas de 100 chars que antes, así que no se
pasa prettier — hacerlo reformateaba 300 ficheros de
deriva ajena
Entra aquí la corrección del repaso de los 7 ya hechos:
`gradient-builder.checker-color` → `checker-fg` (el damero de transparencia;
ahí `color` era slot). Sus `stop-color-*` no se tocan.
Queda para el paso siguiente: R-5.3 no puede graduar a `error` directo
mientras los 47 hovers neutros sigan hablando el idioma viejo — o migran
antes (firma 3, ya firmada), o el guard necesita una exención greppable.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
|
|
|
// más largas primero: una clave puede ser prefijo de otra
|
|
|
|
|
for (const f of [...fs].sort((a, b) => b.key.length - a.key.length)) {
|
fix(theming): la mitad gratis del instrumento - el codemod lee la IIFE y la sonda habla la puerta del centinela
Firma de instrumento (expediente VA, cegueras 4 y 5): coste de ledger CERO,
tres scripts, ni una entrada de theming-sentinel-exceptions.ts tocada.
- __names-codemod.ts: blocks() devuelve {name, at, end, depth} con offsets
reales del fichero; la IIFE de avatar acota su region al return{...} con
depth 3 (y LANZA si no lo encuentra) y los muros 2-3 leen por fin sus 97
claves (86 publicas + 11 privadas); el pase A renombra a \t{depth}.
Laboratorio sobre copias: duplicado inyectado a 3 tabs DETECTADO,
renombrado de una clave de avatar = 1 linea. La via de carga SE QUEDA en
tsx: theming-census importa src/uix/morfo/compile sin extension y todo
src/uix/morfo esta escrito asi.
- theming-sentinel.ts: COMPONENT_OVERRIDES se exporta (UNA tabla de puertas,
no dos) con guarda de entrypoint via realpathSync - sin el realpath la
guarda muere a traves de un junction (exit 0 sin inspeccionar nada) y este
repo usa worktrees con junctions; UIX_DEV_URL reemplaza el :5173 clavado.
Importarlo: 0,85 s sin navegador. label 1/2 y switch 27/52 byte a byte
identicos a las bases pre-firma. Incluye +10 lineas de comentario
PREEXISTENTES de otra sesion (la justificacion de image-adjustments en
COMPONENT_OVERRIDES, solo prosa, verificada contra su acta del 24).
- __theming-probe.ts: el pase open habla el vocabulario del centinela
(prepareWith/openBy/openWith/openMarker, con OPEN_TRIGGER podada de sus
copias literales) y su catch AVISA en stderr distinguiendo "no hay trigger"
de "el gesto fallo"; editable registra por fin su bloque open (25 filas, 6
con data-editing; dos corridas sobre codigo identico = 0 diffs en TODOS los
bloques); pases nuevos de FOCO (la cabecera lo prometia y nada llamaba a
.focus()) y disabled (bloque aparte y ULTIMO de la corrida);
PROBE_ROLE_BOUND_SCALES + PROBE_SAFE_SCALES + assertProbeSafeScale con la
discrepancia risk amber/orange documentada; UIX_DEV_URL. card y editable a
0 diffs contra sus bases en los bloques pre-firma; menubar (6 nodos -> 7
con el panel) y chat-message (24 filas x 2 corridas, 0 diffs) abren via las
entradas del centinela.
Fuera de la firma, registrado en next-features SS13: el barrido de variantes
de la sonda (ensanche diferido), el clear-trigger de search-field en el pase
open, la asimetria de escenario de los seis con prepareWith sin fila en
DEMO_VARIANTS, y la GRANDE (cegueras 6+1+3+2, barridos S1-S3), que sigue
esperando firma. El catch del prepareWith del centinela sigue MUDO a
proposito: es la ceguera 6, S1 de la GRANDE.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 month ago
|
|
|
const re = new RegExp(`^(\\t{${range.depth}})'?` + f.key + "'?(\\s*:)", 'm');
|
refactor(eidos): el catálogo habla un idioma — 269 claves al vocabulario firmado
D-TH.6, ejecutada. El slot de tinta pasa a `fg` y el modificador interactivo
se pone delante, que es lo que theming §6.7 r7 documentaba sin guard desde
que se escribió. Value-preserving: renombra la clave en `recipes/base.ts` y
sus 793 referencias en 101 ficheros; no toca un solo valor.
claves renombradas 269 en 66 componentes
referencias 793 en 101 ficheros
censo antes/después 162 recetas · 5.203 knobs · 1.841 públicos (37 %) · 56
sin contrato — IDÉNTICO, como debe ser un rename
--names antes/después 269 desviadas → 0
Qué NO entra, y por qué:
47 `{rol}-{slot-de-rol}` canónicas: COLOR_ROLE_SLOTS pone el modificador
detrás POR CONSTRUCCIÓN (`primary-solid-hover`)
13 exentas firmadas `--focus-ring-*` es familia del sistema; el color
de `aura` es un sustantivo; `stop-color` ES una
parte de gradient-builder
47 hovers neutros por VALOR: migran a la capa de estado
(§38 + R-4.3), no se renombran — firma 3
6 ocurrencias en historia changelog, errores-toxico, PLAN-affix/background:
reescribir un registro fechado lo vuelve mentira
El clasificador vive en el censo (`--names`), no en un script suelto, para que
el guard R-5.3 consuma la MISMA gramática que el codemod. Su muta-prueba
(`__names-mutatest.ts`, 27 casos) es lo que hizo el trabajo: cazó que yo
promovía al frente CUALQUIER valor declarado por el morfo, y así
`--sidebar-width-icon` (la anchura del raíl colapsado) se convertía en
`--sidebar-icon-width` (la anchura de un icono), que es otra cosa. La firma
dice «delante lo interactivo, detrás lo dimensional y contextual»: ahora sólo
promociona el vocabulario interactivo cerrado, y lo contextual —`below`,
`loaded`, `vertical`, `icon`— se queda donde estaba. Los cinco casos de
regresión están en la muta-prueba.
También cazó que `dropdown-menu.item-bg-hover` lee `var(--color-primary-element)`:
es un hover CON VALENCIA (el palette swap de recipe-contract §2), no el hover
bespoke que §38 deprecó. Clasificar por el nombre lo habría metido en una
migración que no le toca; se clasifica por el VALOR.
Verificación (§7.4, artefacto por paso):
diff de generated/ 269 renombres 1:1 · 0 cambios de valor · 22 privados
reapuntados a los nombres nuevos (`__names-verify-diff`)
computed tag-group · field · tabs: 6.467 valores en 23 estados,
0 diffs — y comprobado en el navegador que sirve el CSS
nuevo, para que ese 0 no sea el de una copia cacheada
huérfanos 0 en código
suite eidos 434 pasan · 1 rojo, el conocido (`skin-media-player`).
`recipe-css-contract` verde: es el guard que caza el
`var()` sin fallback a un nombre que ya no se emite,
o sea el fallo exacto de un rename a medias
component:audit 163 PASS · 3 NEEDS-WORK, los tres SIN TOCAR por esto
check 0 errores en ficheros tocados (los 73 globales son de
otras sesiones de la rama; se atribuye por fichero)
rtl:check 0 · docs:check 0
formato el renombrado no alarga ninguna línea: ningún fichero
tiene más líneas de 100 chars que antes, así que no se
pasa prettier — hacerlo reformateaba 300 ficheros de
deriva ajena
Entra aquí la corrección del repaso de los 7 ya hechos:
`gradient-builder.checker-color` → `checker-fg` (el damero de transparencia;
ahí `color` era slot). Sus `stop-color-*` no se tocan.
Queda para el paso siguiente: R-5.3 no puede graduar a `error` directo
mientras los 47 hovers neutros sigan hablando el idioma viejo — o migran
antes (firma 3, ya firmada), o el guard necesita una exención greppable.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
|
|
|
if (!re.test(block)) continue;
|
|
|
|
|
const quoted = /-/.test(f.to!) ? `'${f.to}'` : f.to!;
|
|
|
|
|
block = block.replace(re, `$1${quoted}$2`);
|
|
|
|
|
keyHits++;
|
|
|
|
|
}
|
fix(theming): la mitad gratis del instrumento - el codemod lee la IIFE y la sonda habla la puerta del centinela
Firma de instrumento (expediente VA, cegueras 4 y 5): coste de ledger CERO,
tres scripts, ni una entrada de theming-sentinel-exceptions.ts tocada.
- __names-codemod.ts: blocks() devuelve {name, at, end, depth} con offsets
reales del fichero; la IIFE de avatar acota su region al return{...} con
depth 3 (y LANZA si no lo encuentra) y los muros 2-3 leen por fin sus 97
claves (86 publicas + 11 privadas); el pase A renombra a \t{depth}.
Laboratorio sobre copias: duplicado inyectado a 3 tabs DETECTADO,
renombrado de una clave de avatar = 1 linea. La via de carga SE QUEDA en
tsx: theming-census importa src/uix/morfo/compile sin extension y todo
src/uix/morfo esta escrito asi.
- theming-sentinel.ts: COMPONENT_OVERRIDES se exporta (UNA tabla de puertas,
no dos) con guarda de entrypoint via realpathSync - sin el realpath la
guarda muere a traves de un junction (exit 0 sin inspeccionar nada) y este
repo usa worktrees con junctions; UIX_DEV_URL reemplaza el :5173 clavado.
Importarlo: 0,85 s sin navegador. label 1/2 y switch 27/52 byte a byte
identicos a las bases pre-firma. Incluye +10 lineas de comentario
PREEXISTENTES de otra sesion (la justificacion de image-adjustments en
COMPONENT_OVERRIDES, solo prosa, verificada contra su acta del 24).
- __theming-probe.ts: el pase open habla el vocabulario del centinela
(prepareWith/openBy/openWith/openMarker, con OPEN_TRIGGER podada de sus
copias literales) y su catch AVISA en stderr distinguiendo "no hay trigger"
de "el gesto fallo"; editable registra por fin su bloque open (25 filas, 6
con data-editing; dos corridas sobre codigo identico = 0 diffs en TODOS los
bloques); pases nuevos de FOCO (la cabecera lo prometia y nada llamaba a
.focus()) y disabled (bloque aparte y ULTIMO de la corrida);
PROBE_ROLE_BOUND_SCALES + PROBE_SAFE_SCALES + assertProbeSafeScale con la
discrepancia risk amber/orange documentada; UIX_DEV_URL. card y editable a
0 diffs contra sus bases en los bloques pre-firma; menubar (6 nodos -> 7
con el panel) y chat-message (24 filas x 2 corridas, 0 diffs) abren via las
entradas del centinela.
Fuera de la firma, registrado en next-features SS13: el barrido de variantes
de la sonda (ensanche diferido), el clear-trigger de search-field en el pase
open, la asimetria de escenario de los seis con prepareWith sin fila en
DEMO_VARIANTS, y la GRANDE (cegueras 6+1+3+2, barridos S1-S3), que sigue
esperando firma. El catch del prepareWith del centinela sigue MUDO a
proposito: es la ceguera 6, S1 de la GRANDE.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 month ago
|
|
|
base = base.slice(0, range.at) + block + base.slice(range.end);
|
refactor(eidos): el catálogo habla un idioma — 269 claves al vocabulario firmado
D-TH.6, ejecutada. El slot de tinta pasa a `fg` y el modificador interactivo
se pone delante, que es lo que theming §6.7 r7 documentaba sin guard desde
que se escribió. Value-preserving: renombra la clave en `recipes/base.ts` y
sus 793 referencias en 101 ficheros; no toca un solo valor.
claves renombradas 269 en 66 componentes
referencias 793 en 101 ficheros
censo antes/después 162 recetas · 5.203 knobs · 1.841 públicos (37 %) · 56
sin contrato — IDÉNTICO, como debe ser un rename
--names antes/después 269 desviadas → 0
Qué NO entra, y por qué:
47 `{rol}-{slot-de-rol}` canónicas: COLOR_ROLE_SLOTS pone el modificador
detrás POR CONSTRUCCIÓN (`primary-solid-hover`)
13 exentas firmadas `--focus-ring-*` es familia del sistema; el color
de `aura` es un sustantivo; `stop-color` ES una
parte de gradient-builder
47 hovers neutros por VALOR: migran a la capa de estado
(§38 + R-4.3), no se renombran — firma 3
6 ocurrencias en historia changelog, errores-toxico, PLAN-affix/background:
reescribir un registro fechado lo vuelve mentira
El clasificador vive en el censo (`--names`), no en un script suelto, para que
el guard R-5.3 consuma la MISMA gramática que el codemod. Su muta-prueba
(`__names-mutatest.ts`, 27 casos) es lo que hizo el trabajo: cazó que yo
promovía al frente CUALQUIER valor declarado por el morfo, y así
`--sidebar-width-icon` (la anchura del raíl colapsado) se convertía en
`--sidebar-icon-width` (la anchura de un icono), que es otra cosa. La firma
dice «delante lo interactivo, detrás lo dimensional y contextual»: ahora sólo
promociona el vocabulario interactivo cerrado, y lo contextual —`below`,
`loaded`, `vertical`, `icon`— se queda donde estaba. Los cinco casos de
regresión están en la muta-prueba.
También cazó que `dropdown-menu.item-bg-hover` lee `var(--color-primary-element)`:
es un hover CON VALENCIA (el palette swap de recipe-contract §2), no el hover
bespoke que §38 deprecó. Clasificar por el nombre lo habría metido en una
migración que no le toca; se clasifica por el VALOR.
Verificación (§7.4, artefacto por paso):
diff de generated/ 269 renombres 1:1 · 0 cambios de valor · 22 privados
reapuntados a los nombres nuevos (`__names-verify-diff`)
computed tag-group · field · tabs: 6.467 valores en 23 estados,
0 diffs — y comprobado en el navegador que sirve el CSS
nuevo, para que ese 0 no sea el de una copia cacheada
huérfanos 0 en código
suite eidos 434 pasan · 1 rojo, el conocido (`skin-media-player`).
`recipe-css-contract` verde: es el guard que caza el
`var()` sin fallback a un nombre que ya no se emite,
o sea el fallo exacto de un rename a medias
component:audit 163 PASS · 3 NEEDS-WORK, los tres SIN TOCAR por esto
check 0 errores en ficheros tocados (los 73 globales son de
otras sesiones de la rama; se atribuye por fichero)
rtl:check 0 · docs:check 0
formato el renombrado no alarga ninguna línea: ningún fichero
tiene más líneas de 100 chars que antes, así que no se
pasa prettier — hacerlo reformateaba 300 ficheros de
deriva ajena
Entra aquí la corrección del repaso de los 7 ya hechos:
`gradient-builder.checker-color` → `checker-fg` (el damero de transparencia;
ahí `color` era slot). Sus `stop-color-*` no se tocan.
Queda para el paso siguiente: R-5.3 no puede graduar a `error` directo
mientras los 47 hovers neutros sigan hablando el idioma viejo — o migran
antes (firma 3, ya firmada), o el guard necesita una exención greppable.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
|
|
|
}
|
|
|
|
|
console.log(`pase A · claves reescritas en base.ts: ${keyHits} / ${renames.length}`);
|
|
|
|
|
|
|
|
|
|
// ── Pase B: las REFERENCIAS `--{c}-{clave}` en el árbol indexado ──────────
|
|
|
|
|
const files = execSync('git ls-files "*.ts" "*.css" "*.svelte" "*.md"', {
|
|
|
|
|
encoding: 'utf8',
|
|
|
|
|
maxBuffer: 1 << 28
|
|
|
|
|
})
|
|
|
|
|
.split('\n')
|
|
|
|
|
.filter(Boolean)
|
|
|
|
|
.filter((f) => !HISTORY.test(f));
|
|
|
|
|
|
|
|
|
|
// Más largas primero y con frontera: `--waveform-color` no puede comerse
|
|
|
|
|
// `--waveform-color-played`.
|
|
|
|
|
const refs = [...renames].sort((a, b) => b.key.length - a.key.length);
|
|
|
|
|
let refHits = 0;
|
|
|
|
|
const touched: string[] = [];
|
|
|
|
|
for (const file of files) {
|
|
|
|
|
const before = file === 'src/uix/eidos/lib/recipes/base.ts' ? base : read(file);
|
|
|
|
|
let after = before;
|
|
|
|
|
for (const f of refs) {
|
|
|
|
|
const from = `--${f.component}-${f.key}`;
|
|
|
|
|
const re = new RegExp(from.replace(/-/g, '\\-') + '(?![a-zA-Z0-9-])', 'g');
|
|
|
|
|
const n = (after.match(re) ?? []).length;
|
|
|
|
|
if (!n) continue;
|
|
|
|
|
after = after.replace(re, `--${f.component}-${f.to}`);
|
|
|
|
|
refHits += n;
|
|
|
|
|
}
|
|
|
|
|
if (after === before) continue;
|
|
|
|
|
touched.push(file);
|
|
|
|
|
if (write) writeFileSync(file, after, 'utf8');
|
|
|
|
|
}
|
|
|
|
|
if (write && !touched.includes('src/uix/eidos/lib/recipes/base.ts'))
|
|
|
|
|
writeFileSync(BASE, base, 'utf8');
|
|
|
|
|
console.log(`pase B · referencias reescritas: ${refHits} en ${touched.length} ficheros`);
|
|
|
|
|
|
|
|
|
|
// ── Muro 3: claves duplicadas DESPUÉS ─────────────────────────────────────
|
|
|
|
|
const dupesAfter = duplicateKeys(base);
|
|
|
|
|
console.log(`muro 3 · duplicadas DESPUÉS: ${dupesAfter.length ? dupesAfter.join(' | ') : 'ninguna'}`);
|
|
|
|
|
if (dupesAfter.length) {
|
|
|
|
|
console.error('\nABORTA: el renombrado creó una clave duplicada.');
|
|
|
|
|
process.exit(1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!write) console.log('\n(--dry: no se ha escrito nada)');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void run();
|