Skip to content

docs(hyperframes): lecciones medidas contra un corpus de referencias, y cuatro herramientas de verificación - #9

Open
occazzio wants to merge 3 commits into
nateherkai:mainfrom
occazzio:docs/lecciones-medidas-hyperframes
Open

docs(hyperframes): lecciones medidas contra un corpus de referencias, y cuatro herramientas de verificación#9
occazzio wants to merge 3 commits into
nateherkai:mainfrom
occazzio:docs/lecciones-medidas-hyperframes

Conversation

@occazzio

Copy link
Copy Markdown

Qué es

Usé el kit para producir ocho piezas, midiendo cada una contra un corpus de 22 referencias reales de motion graphics. El proceso dejó un conjunto de hallazgos que contradicen o completan lo que el skill de hyperframes ya decía, más cuatro herramientas que sostienen esas afirmaciones.

Todo lo que se afirma en el documento está medido, no estimado.

Qué cambia

Nuevo · references/lecciones-medidas.md

Enlazado como primera referencia del SKILL.md, con la nota de que donde contradiga al resto del skill gana, porque está medido.

  • Trampas del motor de captura por seek. immediateRender muerde en las dos direcciones: con el default el elemento se congela en su estado inicial desde el cuadro 0, y con false muestra su estado final desde el cuadro 0. Este último apareció tres veces en piezas distintas. También: los fundidos que terminan en un límite de clip necesitan un tl.set duro, no hay obturador —todo el motion blur es autoreado—, y dos tweens sobre la misma propiedad se pisan en silencio.
  • La escala real de un travelling. Medido cuadro a cuadro sobre una referencia: el objeto pasa del 13 % al 88 % del ancho del cuadro en 3.8 s. Un empuje de 1.0 a 1.15 no es una cámara. Y el error de fondo suele ser anterior: construir el objeto a escala web, con lo cual por más que se empuje nunca llena el cuadro.
  • Por qué una cámara necesita textura para verse. Un degradado radial desplazado se ve idéntico a sí mismo. Incluye el umbral de percepción (1 px de desplazamiento aparente por cuadro) y una trampa cara: mix-blend-mode: overlay sobre negro devuelve negro, así que el grano queda puesto y es invisible.
  • Cómo se ilumina un objeto en la oscuridad: lo define su borde, no su relleno.
  • Medición de texto. Ninguna es válida antes de document.fonts.ready: offsetWidth devuelve el ancho de la tipografía de respaldo, medido 23 % menor, y una caja calculada con ese número recorta la frase para siempre. Incluye las alternativas por porcentaje y transformada que no dependen de ninguna métrica.
  • Siete layouts de composición leídos de las referencias, con el único caso en que corresponde centrar.
  • Ritmo (variación máx÷mediana ≈ 3×), tiempo de lectura (17 caracteres por segundo contados después de que el texto está completo), y las equivalencias de curva entre la literatura y GSAP: cubic out es power2.out, no power3 — la numeración de GSAP induce a este error.
  • Audio: el sonido va en el pico de la animación y no en el corte; loudnorm controla el pico de muestra mientras el encoder AAC reconstruye picos entre muestras (~1.6 dB).
  • Método: medir la fluidez en vez de opinarla, mirar a resolución completa y no en miniaturas, y el A/B pareado por timestamp contra la referencia.

Nuevo · scripts/lab/

fluidez.sh mide cuántos cuadros no cambian respecto del anterior y dibuja el perfil
sfx.sh sintetiza aire/click/sub/cama/riser con el pico en una posición conocida
master.sh deja el audio en −16 LUFS verificando el pico real y corrigiéndose solo
getfont.mjs baja cualquier Google Font en woff2 y arma el @font-face

Las cuatro usan sólo ffmpeg y Node, que el kit ya requiere.

Correcciones a contenido existente

  • references/typography.md prohibía tipografías sin advertir que el motor sólo embebe 18 familias. Siguiendo la lista tal como estaba se podía elegir una que no está embebida y el render caía a la de respaldo en silencio. Ahora dice cuáles sobreviven a ambos filtros y cómo traer las demás.
  • references/motion-principles.md proponía animar letterSpacing como variación de entrada, y el propio lint del motor lo rechaza: reflowea el texto y se clava a píxeles enteros, así que tiembla bajo la captura por seek. Corregido con la alternativa (partir en spans y animar la x de cada glifo).

Para el revisor

  • El documento está en español. Si preferís que el kit mantenga todo en inglés, lo traduzco sin problema — decímelo y lo hago en este mismo PR.
  • .claude/ y .agents/ están sincronizados con npm run sync:skills, como pide el CLAUDE.md del repo.
  • Verificado: npm run check da 695 archivos y 0 errores; npm run sync:skills no reporta discrepancias.
  • Las herramientas van en scripts/lab/ y no en video-projects/, que está en .gitignore — las referencias del documento apuntan ahí.
  • El corpus de 22 referencias de motion graphics no se incluye: es material de terceros. El documento lo describe sin depender de esos archivos.

🤖 Generated with Claude Code

thiagovisuales and others added 3 commits September 11, 2026 00:46
… verificación

Producir ocho piezas contra un corpus de 22 referencias de motion graphics dejó
un conjunto de hallazgos que contradicen o completan lo que el skill ya decía.
Todo lo que se afirma acá está medido, no estimado.

Nuevo: references/lecciones-medidas.md
  · Las trampas del motor de captura por seek: immediateRender muerde en las dos
    direcciones (con false el elemento muestra su estado FINAL desde el cuadro 0),
    los fundidos que terminan en un límite de clip necesitan un tl.set duro, no
    hay obturador así que todo el motion blur es autoreado, y dos tweens sobre la
    misma propiedad se pisan en silencio.
  · La escala real de un travelling: medido sobre una referencia, el objeto pasa
    del 13 % al 88 % del ancho del cuadro. Un empuje de 1.0 a 1.15 no es una
    cámara. Umbral de percepción: 1 px de desplazamiento aparente por cuadro.
  · Por qué una cámara necesita textura (grano) para verse, y por qué el modo de
    fusión importa: overlay sobre negro devuelve negro.
  · Cómo se ilumina un objeto en la oscuridad: lo define su borde, no su relleno.
  · Ninguna medición de texto es válida antes de document.fonts.ready — offsetWidth
    devuelve el ancho de la tipografía de respaldo, medido 23 % menor. Alternativas
    por porcentaje y transformada que no dependen de ninguna métrica.
  · Siete layouts de composición leídos de las referencias, con el único caso en
    que corresponde centrar.
  · Ritmo (variación 3×), tiempo de lectura (17 caracteres por segundo), y las
    equivalencias de curva entre la literatura y GSAP: cubic out es power2.out,
    no power3 — la numeración de GSAP induce a este error.
  · Audio: el sonido va en el pico de la animación, y loudnorm controla el pico de
    muestra mientras el encoder AAC reconstruye picos entre muestras.

Nuevo: scripts/lab/ — cuatro herramientas que sostienen esas afirmaciones
  · fluidez.sh  mide cuántos cuadros no cambian respecto del anterior
  · sfx.sh      sintetiza aire/click/sub/cama/riser con el pico en posición conocida
  · master.sh   deja el audio en -16 LUFS verificando el pico real y corrigiéndose
  · getfont.mjs baja cualquier Google Font en woff2 y arma el @font-face

Correcciones a contenido existente
  · references/typography.md prohibía tipografías sin advertir que el motor sólo
    embebe 18 familias. Siguiendo la lista tal como estaba se podía elegir una que
    no está embebida, y el render caía a la de respaldo en silencio.
  · references/motion-principles.md proponía animar letterSpacing como variación
    de entrada, y el propio lint del motor lo rechaza: reflowea el texto y se clava
    a píxeles enteros, así que tiembla bajo la captura por seek.

Verificado: npm run check (695 archivos, 0 errores) y npm run sync:skills sin
discrepancias entre .claude/ y .agents/.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
scripts/lab/logos.mjs baja logos del CDN de Simple Icons con el color oficial de
cada marca, sin API key. Se bajan al proyecto en vez de enlazarlos porque el motor
renderiza sin red garantizada y una composición tiene que ser reproducible offline.

No todas las marcas están: Adobe, Canva, Slack y OpenAI devuelven 404 porque
pidieron que no se use su logo. La herramienta lo reporta en vez de tragárselo —
la diferencia entre notarlo y descubrir un hueco recién en el render.

Y un detalle que no es decoración: el logo va sobre una pastilla blanca. Notion,
Vercel, GitHub y OBS son casi negros y sobre fondo oscuro desaparecen.

Además, en lecciones-medidas.md: el color vive en los objetos, no en las letras.
Texto blanco sobre oscuro o negro sobre claro. Si el texto compite en color con
el objeto, hay dos cosas peleando por el mismo trabajo.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Un valor relativo (+=, -=) captura su base al inicializar el tween. El render
reparte la pieza en tramos entre varios workers: uno inicializa a mitad de vuelo
del tween anterior y otro arranca en frío con el estado final, así que el mismo
cuadro sale en dos posiciones distintas y se ve como un salto en el límite del
tramo. Va siempre fromTo con extremos explícitos.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants