Kit de motion graphics en EffectCraft
Un flujo de trabajo probado para crear motion graphics corporativos de 60 segundos en EffectCraft que tengan un diseño cuidado, estén sincronizados y libres de los errores clásicos: cuadros vacíos entre escenas, locuciones superpuestas, texto tapado por decoraciones, números que desaparecen y efectos de sonido fuera del ritmo.
El diseño viene de los looks y las composiciones, no de cero. Elige uno de los cinco looks probados, escribe cada escena como una única llamada a scene() con tu contenido y los tiempos de las palabras, y la composición se encarga del tamaño, la cuadrícula, el color y el movimiento. Los agentes que inventan un estilo terminan con degradados oscuros, manchas de brillo y texto centrado pequeño; esta es la razón principal por la que una promo generada se ve barata.
Cualquier agente puede usar esto. Todo se ejecuta desde la terminal (effectcraft-cli a través de scripts/ec.py). MCP es opcional. Ubicación del kit: la carpeta que contiene este archivo (llámala $KIT).
No es este kit: los videos narrativos de figuras / stick-figure (pantalla dividida "forma incorrecta vs forma correcta") usan la skill stick-figure-story.
Reglas de oro (las razones están en references/)
- Los tiempos vienen de los datos, no de suposiciones. El plan de escenas está en
timeline.json. Los scripts de escena usanSC("s3")yW("s3", "palabra")(el tiempo absoluto en que se dice una palabra). Nunca escribas un tiempo como23.6. - Mira cada escena que construyas. Renderiza fotogramas de previsualización (
ec.py frames) y abre los PNG. El código que se ejecuta sin errores puede renderizar mal. - "Terminado" significa que pasó los gates.
timeline.py checktiene 0 FAIL,ec.py qatiene 0 FAIL,ec.py qa-videotiene 0 FAIL, y has mirado la hoja de contactos. Informa los resultados con honestidad, incluyendo las advertencias. - Usa un look y las composiciones (
references/looks.md). Compara dos looks antes de elegir. Al menos un tercio de las escenas deben ser visuales (teléfono / iconos / flujo / barras, o una escena personalizada con un objeto). El código de escena personalizada es para lo que ninguna composición cubre (un mapa, una maqueta de producto), y aún así usa la paleta del lookP(S.fondo)y los tamaños de fuenteLOOK.tipo. - Lee
references/pitfalls.mdantes de escribir cualquier script de EffectCraft. Leereferences/motion-design.md,references/looks.mdyreferences/techniques.md(cuadrícula de beats, SFX alineados con picos, morphs continuos, lista de prohibiciones) antes de diseñar escenas. - La marca no es tuya para editar (
references/brand.md). Muestra el archivo de logotipo real, nunca el nombre escrito como wordmark. Escribe el tagline carácter por carácter. No inventes nombres de productos, etiquetas de botones ni estadísticas. Completa el bloque"brand"entimeline.jsonpara queec.py qalo verifique. - Pasar QA no es lo mismo que tener buen diseño. Planifica el guion de color, los visuales y el momento estrella antes de escribir las escenas, y evalúa la película en una revisión de director creativo antes de renderizar (
references/design-review.md, comparado conreferences/benchmark_sheet.png). 7b. UI de producto real (SaaS, videos de aplicación): siguereferences/ui-footage.md: captura solo datos de muestra, recorta a un panel, muéstralo legible (55%+ de ancho) o reconstruirlo como UI animada, una pantalla por toma, sin paredes de miniaturas con tono, sin números inventados, y construye aquí para que los gates de QA se ejecuten. - Anuncios de alta energía / hipercinéticos (estilo TikTok, un golpe en cada palabra hablada): sigue
references/high-energy.mdytemplates/hyper.jsxen lugar de las composiciones calmadas. - Informa lo que muestra el render, no lo que planeaste. Antes de escribir el informe o la entrega, extrae fotogramas del MP4 final (no de la previsualización) en la mitad y el último medio segundo de cada escena, y verifica cada afirmación: ¿cada línea en pantalla tiene tiempo suficiente para leerse?, ¿cada paso dibujado es realmente visible?, ¿la captura de pantalla es legible?, ¿la duración coincide con el brief y el nombre del archivo? Lee cada transcripción de locución contra el guion, y escucha el nombre de la marca. En pruebas, la entrega de un agente describía cuatro pasos de un diagrama, tres promesas y "BridgeAxis Technologies"; la película mostraba el último paso 0,3 s antes del corte, las promesas durante medio segundo, capturas de pantalla ilegibles y una voz diciendo "Bridge Access".
timeline.py checkyec.py qaahora advierten sobre errores de voz no leídos y texto legible durante menos demin_readsegundos: corrige esas advertencias, no las expliques. Ejecuta con la configuración de razonamiento más alta de tu agente: la ejecución descuidada fue en "Bajo".
Estructura del proyecto
<proyecto>/
timeline.json plan de escenas + señales SFX + música (empieza con $KIT/templates/timeline.example.json)
audio_meta.json archivos de voz + marcas de tiempo de palabras (del paso de audio)
soundtrack.wav generado por timeline.py mix
assets/voice|sfx|bgm|iconos|fuentes
scripts/lib.jsx copia de $KIT/templates/lib.jsx (configura COMP; el look proporciona colores y fuentes)
scripts/look.jsx escrito por `ec.py look NOMBRE --acento HEX`
scripts/timing.jsx generado (timeline.py emit) - nunca editar
scripts/wipes.jsx generado (timeline.py emit) - ejecutar ÚLTIMO
scripts/reset.jsx, s1.jsx ... s8.jsx
qa/ previsualizaciones y hojas de contactos
Ejecuta cada comando desde <proyecto>/. ec.py lee la ruta del proyecto y el nombre de la composición de timeline.json.
Flujo de trabajo A: nuevo video
0. Brief. Pregunta antes de construir: marca/sitio web a emular, estado de ánimo (ruidoso / tranquilo / técnico / lujoso), duración y relación de aspecto, voz (género/tono), y si se quiere música/SFX. Adivinar la dirección creativa es la razón más común por la que un primer corte es rechazado.
1. Configuración
mkdir -p <proyecto>/{scripts,assets/{voz,sfx,musica,iconos},qa} && cd <proyecto>
cp $KIT/templates/lib.jsx $KIT/templates/reset.jsx $KIT/templates/s1.jsx scripts/
cp $KIT/templates/timeline.example.json timeline.json # editar nombres de proyecto/composición/salida
python3 $KIT/scripts/ec.py fonts # instala las fuentes de los looks (una vez por máquina)
Configura COMP en scripts/lib.jsx con el nombre de la composición de la línea de tiempo. Anota el color de acento de la marca (logotipo, CSS del sitio web, producto). Si la marca tiene un sitio web, lee su CSS para el acento y las fuentes. Pon los archivos de logotipo en assets/logo/ y completa el bloque "brand" en timeline.json: nombre, tagline exacto, archivos de logotipo, y cualquier nombre de producto o URL aprobados (references/brand.md).
2. Guion y voz. Escribe 8 líneas (gancho, problema, marca, 2–3 beneficios, prueba, tarjeta final); 60 s contienen aproximadamente 110–130 palabras habladas. Genera un archivo de audio por línea y obtén las marcas de tiempo de palabras en audio_meta.json con esta forma:
{"voces": [{"id": "s1", "ruta": "assets/voz/s1.wav", "duracion_s": 6.45,
"palabras": [{"palabra": "Cada", "inicio": 0.30, "fin": 0.59}, ...]}]}
Primero ejecuta python3 $KIT/scripts/ec.py doctor. Lista lo que esta máquina tiene y cómo instalar lo que falte. Cuando diga ready, no investigues ni instales alternativas (edge-tts, Whisper, piper, Playwright): las herramientas siguientes son las probadas. Sin ninguna voz, temporiza las escenas con offsets "in+0.5" en lugar de palabras; $KIT/demo/ es un ejemplo completo silencioso (ec.py demo lo renderiza).
- Voz (la predeterminada): Kokoro local, voz femenina
af_heart. Gratis, sin cuenta. El modelo se almacena en caché en~/.cache/hyperframes/tts/(se descarga una vez en la primera ejecución):Sinexport HYPERFRAMES_PYTHON=~/.venvs/kokoro/bin/python # REQUERIDO: el venv con kokoro-onnx npx hyperframes tts "Texto de la línea uno." -v af_heart -o assets/voz/s1.wav # un archivo por líneaHYPERFRAMES_PYTHONfalla con "The kokoro-onnx package is not installed". No hagas pip-install de nada: configura la variable. - Marcas de tiempo de palabras:
npx hyperframes transcribe assets/voz/s1.wav --json. Usa el modelo Parakeet, almacenado en caché en~/.cache/hyperframes/parakeetdespués de la primera ejecución (el motorautolo selecciona). Parakeet es adecuado para voces TTS limpias como Kokoro. No pases-e whisperaquí: el motor Whisper de hyperframes (whisper.cpp) no está configurado. Para voces grabadas reales con acentos, la skill de edición de footage usa faster-whisper large-v3-turbo (~/.venvs/asr). Copia las palabras y sus tiempos de inicio y fin enaudio_meta.json. - Música y SFX: el motor de audio de media-use (
node <skills>/media-use/audio/scripts/audio.mjs --request audio_request.json --out audio_meta.json --only bgm,sfx). Recupera del catálogo de HeyGen por descripción, por ejemplo"bgm": {"mode": "retrieve", "query": "piano cálido tranquilo"}.<skills>es~/.claude/skillspara Claude Code,~/.agents/skillspara Codex/OpenCode/DeepSeek. - HeyGen text-to-speech (a través del motor o la CLI
heygen) es la voz alternativa, pero el saldo gratuito se agota. Cuando eso ocurra, usa Kokoro. La recuperación de música y SFX también necesita la CLIheygencon sesión iniciada (heygen auth login --oauth) a menos queHEYGEN_API_BASEesté configurada; sin ella,sfxresponde desde la biblioteca incluida de media-use, y el usuario puede proporcionar su propio archivo de música.
Anota qué proveedor y voz usaste realmente.
3. Línea de tiempo
python3 $KIT/scripts/timeline.py beats # tempo de la música, beats, inicios de compás, drop -> beats.json (necesita "music")
python3 $KIT/scripts/timeline.py suggest # propone entrada/salida de escena + voz_en; con beats.json, las escenas terminan en los beats
# pegar en timeline.json, configurar el "bg" de cada escena (light/dark/accent), añadir señales SFX ancladas a palabras
python3 $KIT/scripts/timeline.py words # cada palabra con su tiempo absoluto
python3 $KIT/scripts/timeline.py check # DEBE ser 0 FAIL
python3 $KIT/scripts/timeline.py emit # escribe scripts/timing.jsx + scripts/wipes.jsx
python3 $KIT/scripts/timeline.py mix # escribe soundtrack.wav (-14 LUFS)
Corta en el beat: timeline.py snap mueve los cortes existentes a los beats donde la voz aún encaja; en las escenas, BEAT(n), DOWNBEAT(n), nearBeat(t) y T.drop sincronizan golpes y pops con la música (references/techniques.md).
El SFX "at" puede ser un número, "beat:12", "downbeat:3", "drop", "s2:tarde" (la palabra "tarde" en la voz de s2; "s2:el#2" = 2º "el"), "wipe:s3" (la transición hacia s3), "in:s3" o "out:s3". Añade "offset", "vol", "max" (longitud de recorte) y "align": "peak" (el momento más fuerte del sonido aterriza en el ancla: úsalo para impactos y pops).
4. Planifica, luego escribe las escenas. Primero escribe el plan en qa/design_review.md (references/design-review.md, partes 1-6): el guion de color con una línea por escena, el visual que muestra lo que dice cada línea, el héroe de cada escena y el momento estrella. Asigna a cada escena un fondo en timeline.json ("bg": "light" | "dark" | "accent") y vuelve a ejecutar timeline.py emit. Alterna los fondos para que cada corte se lea como un nuevo capítulo. Usa "accent" para los 1-2 momentos más intensos, generalmente el pico emocional. Coloca la revelación de la marca y la tarjeta final en el fondo donde el logotipo real se lea mejor (generalmente light), no en el accent. Luego escribe scripts/s1.jsx ... sN.jsx, cada uno con una llamada scene() con una composición (especificaciones: al inicio de templates/layouts.jsx; guía: references/looks.md):
// scripts/s2.jsx
scene("s2", "list", { label: "El problema",
items: [["Llegadas tarde.", "tarde"], ["Sorpresas en aduanas.", "aduanas"], ["Seguimiento que no te dice *nada.*", "seguimiento", "nada"]],
punch: [["Demasiado tarde.", "tarde"]] });
*palabra* marca la parte acentuada de una línea. Los tiempos son palabras de timeline.py words ("palabra", "palabra#2", "palabra+0.3", "in+0.2"), escritas sin puntuación. Las composiciones agrandan o reducen el texto para llenar el cuadro, así que escribe el texto que quieras y deja que la composición le dé tamaño. Mantén las líneas en pantalla cortas: son titulares, no la locución. Solo para algo que ninguna composición cubra (un mapa, una maqueta de producto), copia $KIT/templates/scene_template.jsx.
Haz que al menos un tercio de las escenas sean visuales. Una película que solo tiene palabras sobre fondos se lee como una presentación de diapositivas, por buena que sea la tipografía. Las composiciones visuales ponen un objeto en pantalla del que habla la voz: phone (el producto en la pantalla de un teléfono: una página de pago, un pedido, una actualización de seguimiento), icons (2-4 pictogramas dibujados con etiquetas), flow (paradas unidas por una línea que se llena a medida que se nombra cada una: cliente → teléfono → banco, almacén → puerto → puerta) y bars (2-4 barras que crecen: comisiones, tiempos de espera, antes/después). Elige las escenas donde la voz describe una cosa o un proceso, no una afirmación.
scene("s4", "flow", { label: "Cómo funciona", title: ["Acreditado el *mismo día.*", "dinero", "mismo"],
nodes: [{ icon: "shop", label: "Vendes", at: "vend" }, { icon: "phone", label: "Tapnest", at: "app" },
{ icon: "bank", label: "Tu cuenta", at: "cuenta", note: "Mismo día" }] });
Los iconos los dibuja el kit (sin archivos): phone card bank cash clock check tick shop bolt chart truck box pin lock user people chat globe send star plane doc. Una escena visual personalizada también cuenta cuando sus capas de imagen/objeto tienen "VIS" en sus nombres (por ejemplo "s5 VIS mapa"); ec.py qa advierte cuando menos de un tercio de las escenas son visuales.
No copies layouts.jsx en el proyecto: ec.py lo carga desde el kit, y una copia congela la versión anterior.
5. Elige el look (lee references/looks.md primero). Preselecciona dos looks que encajen con la marca de diferentes maneras, toma el acento de la marca, y compáralos en TUS escenas:
python3 $KIT/scripts/ec.py new
python3 $KIT/scripts/ec.py import soundtrack.wav assets/iconos/*.png
python3 $KIT/scripts/ec.py compare editorial swiss --acento FF5B1F # -> qa/look_compare.png: ÁBRELO
python3 $KIT/scripts/ec.py look editorial --acento FF5B1F # aplica el ganador
6. Construye y previsualiza
python3 $KIT/scripts/ec.py run s1 s2 s3 s4 s5 s6 s7 s8 wipes # s1 crea la composición + banda sonora
python3 $KIT/scripts/ec.py frames 2 4 6.5 # ABRE qa/frames.png y míralo
Previsualiza dos o tres momentos de cada escena. Para arreglar una escena, edítala y ejecuta ec.py rebuild sN (borra solo esa escena, la reconstruye y vuelve a ejecutar las transiciones). Para reconstruir todo (por ejemplo tras cambiar el look): ec.py run reset s1 ... sN wipes. El look proporciona la transición; para reemplazarla, escribe tu propio scripts/wipes.jsx sin la línea de cabecera "GENERATED" (emit entonces la deja intacta en lugar de sobrescribirla).
7. QA
python3 $KIT/scripts/ec.py qa # comprueba las reglas 2-9 -> qa/qa_results.json + qa/qa_report.txt: LÉELO
python3 $KIT/scripts/ec.py qa-video <final>.mp4 # comprueba el MP4 renderizado final (fotogramas medios y finales)
Abre el PDF de la hoja de contactos de qa/. Mira también ec.py qa contra tu rama actual git diff:
- ADVERTENCIA de diseño: menos del 33% de las escenas son visuales. Solución: convierte escenas de texto en
phone,flow,barsoicons. - ADVERTENCIA de legibilidad: el texto se muestra < X segundos (leyendo la línea de voz más rápida). Ajusta el tiempo de la composición o la longitud del texto.
- ADVERTENCIA de nombre: el archivo de logotipo no coincide con el nombre de la marca.
- ERRROR de transición:
wipes.jsxes un archivo generado que editaste. Solución: vuelve a ejecutartimeline.py emitpara regenerarlo o añade// GENERATEDa tu versión personalizada.
Si hay 0 FAIL pero la previsualización se ve mal (texto partido, iconos pequeños, colores incorrectos), corrige la escena. No entregues una película que se ve mal, aunque pase QA.
8. Render
python3 $KIT/scripts/ec.py build h264 # -> comp name.mp4 (H.264 1080p)
python3 $KIT/scripts/ec.py build prores # -> comp name.mov (ProRes 422 para entrega profesional)
python3 $KIT/scripts/ec.py qa-video comp name.mp4 # verificaciones en el MP4 renderizado
9. Entrega. Informa: título del proyecto, look (con acento), proveedor de voz (y nombre), duración, archivos de salida y su resumen QA. Enumera las advertencias no resueltas: "composición visual 29% (<33% requerido)", "s5 'El proceso': texto 'Automatizado', legible 1.2 s, mínimo 1.8 s", "s7 'Prueba social': icono de usuario, legible 0.9 s, mínimo 1.5 s". Y los problemas reales de las escenas que viste: "s3: el teléfono muestra la fecha de ayer".
Y más importante: ¿la película coincide con el brief original? ¿Es la longitud correcta? ¿El archivo de salida es el que se pidió? ¿El nombre de la marca se pronuncia correctamente y coincide con el logotipo? Siempre verifica las afirmaciones de la entrega mirando el render final. En pruebas, una entrega afirmaba que la comprobación QA aprobaba todo, pero la revisión visual mostraba que el logotipo era en realidad el icono de una aplicación de dibujo; el módulo ec.py qa no verifica el contenido del logotipo, solo que el archivo existe, y el agente confundió "confirmar que no hay fallos" con "el render es correcto".
Flujo de trabajo B: arreglar/auditar un proyecto existente
Partimos de un proyecto creado por otro agente. El proyecto se ve mal (texto ilegible, colores feos, fuera de ritmo, sin escenas visuales) o tiene errores de render. O el usuario quiere que verifiques si está bien para entrega. Lee primero references/pitfalls.md y references/looks.md. Luego ejecuta desde la carpeta del proyecto:
python3 $KIT/scripts/timeline.py check # comprueba la línea de tiempo
python3 $KIT/scripts/ec.py qa # comprueba las reglas en EffectCraft
find . -name "*.jsx" -path "./scripts/*" | xargs grep -l "scene(" # busca escenas
Si timeline.py check falla (FAIL en superposición de locuciones, tiempos, mezcla, palabras no encontradas): corrige los tiempos primero. Ejecuta timeline.py words -v 2>&1 | head -40 para ver errores de palabras. La corrección típica es cambiar "en+1.0" por una palabra real, o ampliar la ventana de superposición de una escena.
Si la línea de tiempo está bien pero la salida es fea:
- Sin look:
ls scripts/look.jsx, si no está, ejecutaec.py look editorial --acento FF5B1F(elige un acento de la marca) yec.py run reset s1 ... sN wipes. - Sin escenas visuales: convierte al menos un tercio de las escenas a
phone,flow,barsoicons. - Mala legibilidad: acorta las líneas de texto o ajusta los valores de tiempo de la composición.
- Sincronización musical deficiente: ejecuta
timeline.py suggest --grid beatspara alinear los cortes con los beats del archivo de música. - Transiciones que desaparecen porque
wipes.jsxtiene la cabecera GENERATED: regenera contimeline.py emit.
Si el render falla (errores de After Effects): ejecuta ec.py doctor para comprobar dependencias, luego ec.py run s1 solo 2>&1 | tail -20 para aislar la escena fallida. Las causas típicas: nombres de fuente incorrectos, referencias de archivo de icono rotas, macros de composición no coincidentes. Informa lo que encontraste y cómo lo arreglaste.
Referencias
| Archivo | Contenido |
|---|---|
references/pitfalls.md | Errores comunes y cómo evitarlos |
references/looks.md | Descripciones de estilos + elección + personalización de paletas |
references/motion-design.md | Principios de diseño de movimiento para gráficos corporativos |
references/techniques.md | Sincronización con beats, SFX alineados con picos, morphs, transiciones prohibidas |
references/brand.md | Cómo manejar los activos de marca (logotipos, fuentes, colores) |
references/design-review.md | Lista de verificación de diseño: guion de color, visual, momento estrella, guía de revisión |
references/ui-footage.md | Cómo capturar/reconstruir UI de producto para videos SaaS |
references/high-energy.md | Guía para anuncios rápidos (estilo TikTok) |
references/benchmark_sheet.png | Hoja de referencia de calidad (PDF de 4 páginas para comparación) |
Plantillas
| Archivo | Propósito |
|---|---|
templates/timeline.example.json | Estructura de línea de tiempo completa con bloques de ejemplo |
templates/lib.jsx | Biblioteca: funciones de utilidad (beats, degradados de preajuste) + importación de look |
templates/reset.jsx | Limpia la composición |
templates/s1.jsx | Primer plano de ejemplo |
templates/scene_template.jsx | Esqueleto de escena personalizada |
templates/hyper.jsx | Plantilla de anuncio de alto ritmo (para la regla 8) |
templates/layouts.jsx | Composición de escenas: phone, list, icons, flow, bars, split, endcard (cargado desde el kit) |
demo/ | Proyecto de demostración completo y silencioso (sin voz) |
Notas de implementación
- Todos los scripts de Python (
timeline.py,ec.py) esperan Python 3.10+. Están en$KIT/scripts/. Se ejecutan desde el directorio<proyecto>/. ec.pyenvía comandos a EffectCraft CLI (effectcraft-cli), que debe estar instalado y enPATH(o configurado por--cli).timeline.pyutilizasoxpara la mezcla de audio,ffprobepara la duración yffmpegpara la normalización a -14 LUFS.- Los tiempos de las palabras se indexan contra la pista de voz sin recortar; si recortas el audio, los números de tiempo se desplazan.
- La hoja de contactos de
qa/se genera con timestamps de fotogramas de escena y debe inspeccionarse manualmente; el agente no debe confiar en el texto alternativo. - "Overlap" en
timeline.jsoncontrola cuánto tiempo permanece visible la escena anterior después de que comience la locución de la siguiente (predeterminado 0.3 s, ajustable por escena hasta 0.8 s). - Los archivos de iconos PNG en
assets/iconos/son opcionales; el kit dibuja sus propios iconos vectoriales a menos que proporciones un personalizado (por ejemplo, el logo de la aplicación).
Solución de problemas
| Síntoma | Comprobación | Solución |
|---|---|---|
timeline.py check FAIL en superposición | Ejecuta timeline.py words -v | Ajusta el overlap de escena en timeline.json |
| "La composición nombre no existe" | ec.py doctor | ¿Pasó la ejecución de s1 que la crea? Ejecuta ec.py run s1 |
| "No se encuentra el archivo de fuente" | ec.py fonts se ejecutó correctamente? | Vuelve a ejecutar ec.py fonts. La fuente puede tener un nombre PostScript diferente |
| Iconos borrosos/pequeños | Las reglas de la composición icons escalan para llenar; comprueba la relación de aspecto | Puede que necesites menos iconos o un label más corto |
| La música no se mezcla | ffprobe soundtrack.wav | ¿Falta el archivo de música en assets/bgm/? |
| SFX no se alinea | Separación del beat de la pista SFX | Prueba "align": "peak" o ancla a una palabra en lugar de un beat |
| El wipes personalizado se sobrescribe | wipes.jsx falta la línea // GENERATED | Añade // GENERATED a tu wipes personalizado o ponlo en otro archivo e impórtalo al final |
ec.py qa dice "No composition" | El nombre de la composición en lib.jsx no coincide con el creado | Comprueba COMP en scripts/lib.jsx contra timeline.json comp |
| "error de índice de palabra" | Una referencia de palabra en una escena no existe en los datos de voz | Ejecuta timeline.py words -v para encontrar la palabra faltante; corrige la ortografía o la puntuación en el guion |
Aprendizaje y mejora continua
Después de cada entrega, añade una entrada en qa/retrospective.md con:
- ¿Qué salió bien? (look, sincronización, escena visual)
- ¿Qué salió mal? (advertencia de QA, error de render, desajuste de diseño)
- Una cosa que mejorarías la próxima vez (por ejemplo, "prueba el look editorial con un acento más frío", "escribe antes el guion de color", "para escenas de teléfono, previsualiza con datos reales")
Este bucle de retroalimentación te ayuda a elegir mejores looks y composiciones más rápido en proyectos futuros.