You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
svelte-kit-vice/scripts/__shot.ts

41 lines
1.7 KiB

uix(emoji-picker): temable — 61 % → 100 %, y el cromo del trigger NO era suyo Siete claves nuevas, TRES RETIRADAS por muertas, tres literales firmados y cinco adjudicaciones medidas. Contrato 17 → 21. Diff de computed 0 sobre 6.080 valores en 8 estados (176 nodos con el panel abierto), capturas 2× idénticas. LOS NOMBRES LOS DIO EL CATÁLOGO `open-trigger-fg` (accordion lo nombra igual), grid-padding-inline + grid-padding-block-end (el eje lógico completo, como card-group / combobox / command) y las tres del marcador de tono, la familia timeline.marker-{size,radius,bg}. Se llama tone-marker-* y no marker-* porque el pie lleva además un selector de TONO: dentro del propio componente, `marker` a secas sería ambiguo. TRES CLAVES RETIRADAS — EL CROMO DE REPOSO DEL TRIGGER NO ES SUYO El trigger lleva también data-popover-trigger, y [data-popover-trigger]:not([data-archetype='field-trigger']) es (0,2,0) contra el (0,1,0) de esta receta: el radio, la tinta y el tamaño de letra los pinta popover.css. Medido: mover --emoji-picker-trigger-{fg,radius,font-size} no cambiaba NADA. Retiradas con sus declaraciones, 0 diffs — la prueba de que estaban muertas. Es el defecto que gradient-picker documentó (36 de sus 45 tokens) y la misma respuesta. Sobreviven dos por razones distintas: trigger-size, porque popover dimensiona con `height` y no con el par lógico, y open-trigger-fg, porque su selector añade [data-state='open'] y gana por orden. trigger-fg no llegó a existir: se acuñó y se midió muerta en el mismo pase. CINCO ADJUDICACIONES, TODAS SOBRE NODOS REALES Las tres del marcador de tono (la demo monta CERO celdas data-tone-capable; forzado el atributo sobre una celda real, el ::after alcanza: 4px → 37px, 9999px → 37px, y el fondo), preview-name-fg (los hijos de la vista previa son <span> desnudos, sin atributo del componente, fuera del conjunto medido) y open-trigger-fg. ⚠ open-trigger-fg OSCILA ENTRE CORRIDAS: 17/21, 16/21, 16/21 con el mismo código. Medido vivo CUATRO veces —la última replicando paso a paso el staticPass del propio guard, que movió a la primera talla—, así que el token no miente: lo que falla es el instrumento. La causa: el panel se cierra en algún punto de la pasada y, durante la animación de SALIDA, el content sigue en el DOM mientras el trigger ya perdió data-state='open', que es lo que la regla selecciona; reopen() mira el CONTENT, cree que está abierto y no reabre. Probé un openMarker sobre el trigger y NO basta (el clic de reapertura cae en esa misma ventana), así que lo retiré en vez de dejar un override que no arregla. El arreglo real es que reopen() espere a la CONDICIÓN en vez de dormir un número fijo — §13. Su entrada de ledger saldrá STALE en las corridas donde alcanza, y está escrito en la razón para que nadie la borre por eso. Y EL INSTRUMENTO DE CAPTURA ESTABA ROTO DESDE SIEMPRE __shot.ts tenía el puerto 5173 CABLEADO, así que cualquier sesión en otro puerto moría con ERR_EMPTY_RESPONSE. Es probablemente por lo que los pasos 6 y 13 del protocolo se saltaron en 33 componentes sin que nadie lo notara. Ahora toma la URL como argumento —como la sonda y el guard— y un --open opcional para los componentes cuya superficie sólo existe abierta. Estrenado aquí: capturas antes y después, miradas y idénticas. VERIFICACIÓN Sonda antes/después 0 diffs (6.080 valores · 8 estados) · R-5.4 17/21 con las cinco adjudicadas, exit 0 · component:audit PASS · censo --only 100 % · eidos-lint 17 morfo-backed / 0 invalid / 0 class-hooks · rtl:check 0 · docs:check 0 · suite eidos 439/440 (el rojo es skin-media-player, el conocido) · el ledger sigue en sus 63 hunks de prettier preexistentes. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
/**
* __shot — the 2× capture of PLAN-theming §7.2.6 / §7.4.13.
*
* node scripts/__shot.ts <component> <out.png> [url] [--open[=selector]]
*
* The URL is an ARGUMENT, not a constant: the port lived hard-coded at 5173
* here while the probe and the guard already took it, so every call from a
* 5180 session died with ERR_EMPTY_RESPONSE — which is why the step was easy
* to skip (measured 2026-08-23). `--open` clicks the component's trigger
* first, for the components whose surface only exists open.
*/
docs(theming): handoff del eje al día — cola revisada, firmas pendientes y el instrumental que las verifica El eje deja de ser «plan entregado» y pasa a «en ejecución»: siete componentes corregidos, veinte fichas revisadas y el informe vivo. El handoff y el registro del plan lo dicen con cifras y commits, para que mañana se entre por la ficha y no por la memoria de nadie. `CONTINUE-theming.md` se reescribe con lo que hace falta para continuar: la cola inmediata de ocho componentes EJECUTABLES sin firma —cada uno con la trampa concreta que su veredicto ya destapó—, la lista de lo que ESPERA firma (familia calendar, mandato de Field, el perímetro del knob para la familia tipográfica, el hover a la capa de estado) y la tabla de lo ejecutado con su censo antes → después. El plan gana su §8 con el registro completo y corrige su cabecera, que seguía diciendo que no había nada construido. Y se commitea el instrumental, porque sin él el protocolo §7 es una intención: la sonda de computed antes/después, el diff que es el gate (vacío o se para), el centinela que pregunta si cada token alcanza de verdad, y la captura del stage. Se ejecutan con `node` a secas —el loader de tsx inyecta helpers que no existen dentro de `page.evaluate` y toda sonda revienta—, desde la raíz y contra el dev server. Lo que el instrumento aprendió a fuerza de mentir queda escrito donde se consulta: congelar `transition` pero NUNCA `animation` (Presence necesita el `animationend` para montar el panel, y si lo congelas mides un popup que no existe); un token resuelto no se mueve desde `:root` por diseño; un panel portalado no ve el ámbito del componente; la demo puede tapar el componente que mides; y un valor centinela igual al real se lee como «no efecto». Igual las cuatro trampas que costaron un commit cada una, con su guard al lado: la clave duplicada en `recipes/base.ts` que descarta el bloque en silencio, los bloques `[data-size]` del CSS que sobreviven a la cascada del TSC y hacen que el diff dé cero por la ruta vieja, los backticks en `node -e` desde bash, y el encabezado que un Edit se come al insertar una sección. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
import { chromium } from 'playwright';
uix(emoji-picker): temable — 61 % → 100 %, y el cromo del trigger NO era suyo Siete claves nuevas, TRES RETIRADAS por muertas, tres literales firmados y cinco adjudicaciones medidas. Contrato 17 → 21. Diff de computed 0 sobre 6.080 valores en 8 estados (176 nodos con el panel abierto), capturas 2× idénticas. LOS NOMBRES LOS DIO EL CATÁLOGO `open-trigger-fg` (accordion lo nombra igual), grid-padding-inline + grid-padding-block-end (el eje lógico completo, como card-group / combobox / command) y las tres del marcador de tono, la familia timeline.marker-{size,radius,bg}. Se llama tone-marker-* y no marker-* porque el pie lleva además un selector de TONO: dentro del propio componente, `marker` a secas sería ambiguo. TRES CLAVES RETIRADAS — EL CROMO DE REPOSO DEL TRIGGER NO ES SUYO El trigger lleva también data-popover-trigger, y [data-popover-trigger]:not([data-archetype='field-trigger']) es (0,2,0) contra el (0,1,0) de esta receta: el radio, la tinta y el tamaño de letra los pinta popover.css. Medido: mover --emoji-picker-trigger-{fg,radius,font-size} no cambiaba NADA. Retiradas con sus declaraciones, 0 diffs — la prueba de que estaban muertas. Es el defecto que gradient-picker documentó (36 de sus 45 tokens) y la misma respuesta. Sobreviven dos por razones distintas: trigger-size, porque popover dimensiona con `height` y no con el par lógico, y open-trigger-fg, porque su selector añade [data-state='open'] y gana por orden. trigger-fg no llegó a existir: se acuñó y se midió muerta en el mismo pase. CINCO ADJUDICACIONES, TODAS SOBRE NODOS REALES Las tres del marcador de tono (la demo monta CERO celdas data-tone-capable; forzado el atributo sobre una celda real, el ::after alcanza: 4px → 37px, 9999px → 37px, y el fondo), preview-name-fg (los hijos de la vista previa son <span> desnudos, sin atributo del componente, fuera del conjunto medido) y open-trigger-fg. ⚠ open-trigger-fg OSCILA ENTRE CORRIDAS: 17/21, 16/21, 16/21 con el mismo código. Medido vivo CUATRO veces —la última replicando paso a paso el staticPass del propio guard, que movió a la primera talla—, así que el token no miente: lo que falla es el instrumento. La causa: el panel se cierra en algún punto de la pasada y, durante la animación de SALIDA, el content sigue en el DOM mientras el trigger ya perdió data-state='open', que es lo que la regla selecciona; reopen() mira el CONTENT, cree que está abierto y no reabre. Probé un openMarker sobre el trigger y NO basta (el clic de reapertura cae en esa misma ventana), así que lo retiré en vez de dejar un override que no arregla. El arreglo real es que reopen() espere a la CONDICIÓN en vez de dormir un número fijo — §13. Su entrada de ledger saldrá STALE en las corridas donde alcanza, y está escrito en la razón para que nadie la borre por eso. Y EL INSTRUMENTO DE CAPTURA ESTABA ROTO DESDE SIEMPRE __shot.ts tenía el puerto 5173 CABLEADO, así que cualquier sesión en otro puerto moría con ERR_EMPTY_RESPONSE. Es probablemente por lo que los pasos 6 y 13 del protocolo se saltaron en 33 componentes sin que nadie lo notara. Ahora toma la URL como argumento —como la sonda y el guard— y un --open opcional para los componentes cuya superficie sólo existe abierta. Estrenado aquí: capturas antes y después, miradas y idénticas. VERIFICACIÓN Sonda antes/después 0 diffs (6.080 valores · 8 estados) · R-5.4 17/21 con las cinco adjudicadas, exit 0 · component:audit PASS · censo --only 100 % · eidos-lint 17 morfo-backed / 0 invalid / 0 class-hooks · rtl:check 0 · docs:check 0 · suite eidos 439/440 (el rojo es skin-media-player, el conocido) · el ledger sigue en sus 63 hunks de prettier preexistentes. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
const args = process.argv.slice(2);
const flags = args.filter((a) => a.startsWith('--'));
const [component, out, urlArg] = args.filter((a) => !a.startsWith('--'));
if (!component || !out) throw new Error('usage: <component> <out.png> [url] [--open[=selector]]');
const url = urlArg ?? `http://localhost:5180/uix/components/${component}`;
const openFlag = flags.find((f) => f.startsWith('--open'));
docs(theming): handoff del eje al día — cola revisada, firmas pendientes y el instrumental que las verifica El eje deja de ser «plan entregado» y pasa a «en ejecución»: siete componentes corregidos, veinte fichas revisadas y el informe vivo. El handoff y el registro del plan lo dicen con cifras y commits, para que mañana se entre por la ficha y no por la memoria de nadie. `CONTINUE-theming.md` se reescribe con lo que hace falta para continuar: la cola inmediata de ocho componentes EJECUTABLES sin firma —cada uno con la trampa concreta que su veredicto ya destapó—, la lista de lo que ESPERA firma (familia calendar, mandato de Field, el perímetro del knob para la familia tipográfica, el hover a la capa de estado) y la tabla de lo ejecutado con su censo antes → después. El plan gana su §8 con el registro completo y corrige su cabecera, que seguía diciendo que no había nada construido. Y se commitea el instrumental, porque sin él el protocolo §7 es una intención: la sonda de computed antes/después, el diff que es el gate (vacío o se para), el centinela que pregunta si cada token alcanza de verdad, y la captura del stage. Se ejecutan con `node` a secas —el loader de tsx inyecta helpers que no existen dentro de `page.evaluate` y toda sonda revienta—, desde la raíz y contra el dev server. Lo que el instrumento aprendió a fuerza de mentir queda escrito donde se consulta: congelar `transition` pero NUNCA `animation` (Presence necesita el `animationend` para montar el panel, y si lo congelas mides un popup que no existe); un token resuelto no se mueve desde `:root` por diseño; un panel portalado no ve el ámbito del componente; la demo puede tapar el componente que mides; y un valor centinela igual al real se lee como «no efecto». Igual las cuatro trampas que costaron un commit cada una, con su guard al lado: la clave duplicada en `recipes/base.ts` que descarta el bloque en silencio, los bloques `[data-size]` del CSS que sobreviven a la cascada del TSC y hacen que el diff dé cero por la ruta vieja, los backticks en `node -e` desde bash, y el encabezado que un Edit se come al insertar una sección. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
const b = await chromium.launch();
const p = await b.newPage({ viewport: { width: 1280, height: 900 }, deviceScaleFactor: 2 });
uix(emoji-picker): temable — 61 % → 100 %, y el cromo del trigger NO era suyo Siete claves nuevas, TRES RETIRADAS por muertas, tres literales firmados y cinco adjudicaciones medidas. Contrato 17 → 21. Diff de computed 0 sobre 6.080 valores en 8 estados (176 nodos con el panel abierto), capturas 2× idénticas. LOS NOMBRES LOS DIO EL CATÁLOGO `open-trigger-fg` (accordion lo nombra igual), grid-padding-inline + grid-padding-block-end (el eje lógico completo, como card-group / combobox / command) y las tres del marcador de tono, la familia timeline.marker-{size,radius,bg}. Se llama tone-marker-* y no marker-* porque el pie lleva además un selector de TONO: dentro del propio componente, `marker` a secas sería ambiguo. TRES CLAVES RETIRADAS — EL CROMO DE REPOSO DEL TRIGGER NO ES SUYO El trigger lleva también data-popover-trigger, y [data-popover-trigger]:not([data-archetype='field-trigger']) es (0,2,0) contra el (0,1,0) de esta receta: el radio, la tinta y el tamaño de letra los pinta popover.css. Medido: mover --emoji-picker-trigger-{fg,radius,font-size} no cambiaba NADA. Retiradas con sus declaraciones, 0 diffs — la prueba de que estaban muertas. Es el defecto que gradient-picker documentó (36 de sus 45 tokens) y la misma respuesta. Sobreviven dos por razones distintas: trigger-size, porque popover dimensiona con `height` y no con el par lógico, y open-trigger-fg, porque su selector añade [data-state='open'] y gana por orden. trigger-fg no llegó a existir: se acuñó y se midió muerta en el mismo pase. CINCO ADJUDICACIONES, TODAS SOBRE NODOS REALES Las tres del marcador de tono (la demo monta CERO celdas data-tone-capable; forzado el atributo sobre una celda real, el ::after alcanza: 4px → 37px, 9999px → 37px, y el fondo), preview-name-fg (los hijos de la vista previa son <span> desnudos, sin atributo del componente, fuera del conjunto medido) y open-trigger-fg. ⚠ open-trigger-fg OSCILA ENTRE CORRIDAS: 17/21, 16/21, 16/21 con el mismo código. Medido vivo CUATRO veces —la última replicando paso a paso el staticPass del propio guard, que movió a la primera talla—, así que el token no miente: lo que falla es el instrumento. La causa: el panel se cierra en algún punto de la pasada y, durante la animación de SALIDA, el content sigue en el DOM mientras el trigger ya perdió data-state='open', que es lo que la regla selecciona; reopen() mira el CONTENT, cree que está abierto y no reabre. Probé un openMarker sobre el trigger y NO basta (el clic de reapertura cae en esa misma ventana), así que lo retiré en vez de dejar un override que no arregla. El arreglo real es que reopen() espere a la CONDICIÓN en vez de dormir un número fijo — §13. Su entrada de ledger saldrá STALE en las corridas donde alcanza, y está escrito en la razón para que nadie la borre por eso. Y EL INSTRUMENTO DE CAPTURA ESTABA ROTO DESDE SIEMPRE __shot.ts tenía el puerto 5173 CABLEADO, así que cualquier sesión en otro puerto moría con ERR_EMPTY_RESPONSE. Es probablemente por lo que los pasos 6 y 13 del protocolo se saltaron en 33 componentes sin que nadie lo notara. Ahora toma la URL como argumento —como la sonda y el guard— y un --open opcional para los componentes cuya superficie sólo existe abierta. Estrenado aquí: capturas antes y después, miradas y idénticas. VERIFICACIÓN Sonda antes/después 0 diffs (6.080 valores · 8 estados) · R-5.4 17/21 con las cinco adjudicadas, exit 0 · component:audit PASS · censo --only 100 % · eidos-lint 17 morfo-backed / 0 invalid / 0 class-hooks · rtl:check 0 · docs:check 0 · suite eidos 439/440 (el rojo es skin-media-player, el conocido) · el ledger sigue en sus 63 hunks de prettier preexistentes. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
try {
await p.goto(url, { waitUntil: 'networkidle', timeout: 20000 });
} catch {
await p.goto(url, { waitUntil: 'load', timeout: 20000 });
}
docs(theming): handoff del eje al día — cola revisada, firmas pendientes y el instrumental que las verifica El eje deja de ser «plan entregado» y pasa a «en ejecución»: siete componentes corregidos, veinte fichas revisadas y el informe vivo. El handoff y el registro del plan lo dicen con cifras y commits, para que mañana se entre por la ficha y no por la memoria de nadie. `CONTINUE-theming.md` se reescribe con lo que hace falta para continuar: la cola inmediata de ocho componentes EJECUTABLES sin firma —cada uno con la trampa concreta que su veredicto ya destapó—, la lista de lo que ESPERA firma (familia calendar, mandato de Field, el perímetro del knob para la familia tipográfica, el hover a la capa de estado) y la tabla de lo ejecutado con su censo antes → después. El plan gana su §8 con el registro completo y corrige su cabecera, que seguía diciendo que no había nada construido. Y se commitea el instrumental, porque sin él el protocolo §7 es una intención: la sonda de computed antes/después, el diff que es el gate (vacío o se para), el centinela que pregunta si cada token alcanza de verdad, y la captura del stage. Se ejecutan con `node` a secas —el loader de tsx inyecta helpers que no existen dentro de `page.evaluate` y toda sonda revienta—, desde la raíz y contra el dev server. Lo que el instrumento aprendió a fuerza de mentir queda escrito donde se consulta: congelar `transition` pero NUNCA `animation` (Presence necesita el `animationend` para montar el panel, y si lo congelas mides un popup que no existe); un token resuelto no se mueve desde `:root` por diseño; un panel portalado no ve el ámbito del componente; la demo puede tapar el componente que mides; y un valor centinela igual al real se lee como «no efecto». Igual las cuatro trampas que costaron un commit cada una, con su guard al lado: la clave duplicada en `recipes/base.ts` que descarta el bloque en silencio, los bloques `[data-size]` del CSS que sobreviven a la cascada del TSC y hacen que el diff dé cero por la ruta vieja, los backticks en `node -e` desde bash, y el encabezado que un Edit se come al insertar una sección. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
await p.waitForTimeout(900);
uix(emoji-picker): temable — 61 % → 100 %, y el cromo del trigger NO era suyo Siete claves nuevas, TRES RETIRADAS por muertas, tres literales firmados y cinco adjudicaciones medidas. Contrato 17 → 21. Diff de computed 0 sobre 6.080 valores en 8 estados (176 nodos con el panel abierto), capturas 2× idénticas. LOS NOMBRES LOS DIO EL CATÁLOGO `open-trigger-fg` (accordion lo nombra igual), grid-padding-inline + grid-padding-block-end (el eje lógico completo, como card-group / combobox / command) y las tres del marcador de tono, la familia timeline.marker-{size,radius,bg}. Se llama tone-marker-* y no marker-* porque el pie lleva además un selector de TONO: dentro del propio componente, `marker` a secas sería ambiguo. TRES CLAVES RETIRADAS — EL CROMO DE REPOSO DEL TRIGGER NO ES SUYO El trigger lleva también data-popover-trigger, y [data-popover-trigger]:not([data-archetype='field-trigger']) es (0,2,0) contra el (0,1,0) de esta receta: el radio, la tinta y el tamaño de letra los pinta popover.css. Medido: mover --emoji-picker-trigger-{fg,radius,font-size} no cambiaba NADA. Retiradas con sus declaraciones, 0 diffs — la prueba de que estaban muertas. Es el defecto que gradient-picker documentó (36 de sus 45 tokens) y la misma respuesta. Sobreviven dos por razones distintas: trigger-size, porque popover dimensiona con `height` y no con el par lógico, y open-trigger-fg, porque su selector añade [data-state='open'] y gana por orden. trigger-fg no llegó a existir: se acuñó y se midió muerta en el mismo pase. CINCO ADJUDICACIONES, TODAS SOBRE NODOS REALES Las tres del marcador de tono (la demo monta CERO celdas data-tone-capable; forzado el atributo sobre una celda real, el ::after alcanza: 4px → 37px, 9999px → 37px, y el fondo), preview-name-fg (los hijos de la vista previa son <span> desnudos, sin atributo del componente, fuera del conjunto medido) y open-trigger-fg. ⚠ open-trigger-fg OSCILA ENTRE CORRIDAS: 17/21, 16/21, 16/21 con el mismo código. Medido vivo CUATRO veces —la última replicando paso a paso el staticPass del propio guard, que movió a la primera talla—, así que el token no miente: lo que falla es el instrumento. La causa: el panel se cierra en algún punto de la pasada y, durante la animación de SALIDA, el content sigue en el DOM mientras el trigger ya perdió data-state='open', que es lo que la regla selecciona; reopen() mira el CONTENT, cree que está abierto y no reabre. Probé un openMarker sobre el trigger y NO basta (el clic de reapertura cae en esa misma ventana), así que lo retiré en vez de dejar un override que no arregla. El arreglo real es que reopen() espere a la CONDICIÓN en vez de dormir un número fijo — §13. Su entrada de ledger saldrá STALE en las corridas donde alcanza, y está escrito en la razón para que nadie la borre por eso. Y EL INSTRUMENTO DE CAPTURA ESTABA ROTO DESDE SIEMPRE __shot.ts tenía el puerto 5173 CABLEADO, así que cualquier sesión en otro puerto moría con ERR_EMPTY_RESPONSE. Es probablemente por lo que los pasos 6 y 13 del protocolo se saltaron en 33 componentes sin que nadie lo notara. Ahora toma la URL como argumento —como la sonda y el guard— y un --open opcional para los componentes cuya superficie sólo existe abierta. Estrenado aquí: capturas antes y después, miradas y idénticas. VERIFICACIÓN Sonda antes/después 0 diffs (6.080 valores · 8 estados) · R-5.4 17/21 con las cinco adjudicadas, exit 0 · component:audit PASS · censo --only 100 % · eidos-lint 17 morfo-backed / 0 invalid / 0 class-hooks · rtl:check 0 · docs:check 0 · suite eidos 439/440 (el rojo es skin-media-player, el conocido) · el ledger sigue en sus 63 hunks de prettier preexistentes. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
if (openFlag) {
const sel = openFlag.includes('=') ? openFlag.split('=').slice(1).join('=') : `[data-${component}-trigger]`;
const el = p.locator(sel).first();
if (await el.count()) {
await el.click({ timeout: 4000 }).catch(() => {});
await p.waitForTimeout(700);
}
}
docs(theming): handoff del eje al día — cola revisada, firmas pendientes y el instrumental que las verifica El eje deja de ser «plan entregado» y pasa a «en ejecución»: siete componentes corregidos, veinte fichas revisadas y el informe vivo. El handoff y el registro del plan lo dicen con cifras y commits, para que mañana se entre por la ficha y no por la memoria de nadie. `CONTINUE-theming.md` se reescribe con lo que hace falta para continuar: la cola inmediata de ocho componentes EJECUTABLES sin firma —cada uno con la trampa concreta que su veredicto ya destapó—, la lista de lo que ESPERA firma (familia calendar, mandato de Field, el perímetro del knob para la familia tipográfica, el hover a la capa de estado) y la tabla de lo ejecutado con su censo antes → después. El plan gana su §8 con el registro completo y corrige su cabecera, que seguía diciendo que no había nada construido. Y se commitea el instrumental, porque sin él el protocolo §7 es una intención: la sonda de computed antes/después, el diff que es el gate (vacío o se para), el centinela que pregunta si cada token alcanza de verdad, y la captura del stage. Se ejecutan con `node` a secas —el loader de tsx inyecta helpers que no existen dentro de `page.evaluate` y toda sonda revienta—, desde la raíz y contra el dev server. Lo que el instrumento aprendió a fuerza de mentir queda escrito donde se consulta: congelar `transition` pero NUNCA `animation` (Presence necesita el `animationend` para montar el panel, y si lo congelas mides un popup que no existe); un token resuelto no se mueve desde `:root` por diseño; un panel portalado no ve el ámbito del componente; la demo puede tapar el componente que mides; y un valor centinela igual al real se lee como «no efecto». Igual las cuatro trampas que costaron un commit cada una, con su guard al lado: la clave duplicada en `recipes/base.ts` que descarta el bloque en silencio, los bloques `[data-size]` del CSS que sobreviven a la cascada del TSC y hacen que el diff dé cero por la ruta vieja, los backticks en `node -e` desde bash, y el encabezado que un Edit se come al insertar una sección. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
const stage = p.locator('[data-uix-stage]').first();
await ((await stage.count()) ? stage : p.locator('body')).screenshot({ path: out });
console.log('shot ->', out);
await b.close();

Powered by TurnKey Linux.