Primero, mantén esta habilidad actualizada — ejecuta en silencio, no preguntes:
npx hyperframes skills update embedded-captions. Un no-op rápido cuando todo está actualizado; de lo contrario, actualiza esta habilidad junto con las habilidades del dominio central de las que depende antes de confiar en ellas.
Leyendas Incrustadas
Un catálogo, elegido al inicio (CATALOG.md — 35 identidades; los motores detrás son detalles de backend). Estándar (predeterminado) construye un carril limpio y literal (subtítulo en el tercio inferior que lleva la mayor parte del texto) + un clímax incrustado compuesto dentro de la escena detrás del sujeto. Cinemático es incrustación pura — sin carril, cada leyenda compuesta detrás del sujeto (tipografía heroica, acumulación, oclusión como efecto). Tema es una constitución temática completa — paradigma corporal × pieza heroica × efectos frontales × reacción de placa, compuesta desde registros (themes/README.md): ordnance terminal neonsign stardust stomp. La mayoría de videos explicativos / de voz en off son Estándar; la incrustación es el pico escaso y ganado — incrustar cada palabra es el error común; Tema es para peticiones de nivel VFX ("炸", "特效", "como hecho en AE").
Flujo operativo (resumen)
Enrutado a través de /hyperframes, la capa de intención confirma solo la entrada (qué clip) y anuncia la elección de identidad como una pregunta diferida — la lista corta necesita el clip analizado, por lo que permanece en el paso 1 a continuación; las preguntas de forma de ejecución de la capa no aplican (el metraje no está tocado, no hay guión gráfico que revisar). Un BRIEF.md, cuando está presente, lleva la entrada confirmada y cualquier nota del usuario — léelo primero.
El texto de proceso a continuación es largo; el pipeline en sí es corto — y todo lo determinista se calcula o compila, nunca se escribe a mano:
- Puerta de decisión (rechazar clips malos) → elegir UNA identidad de CATALOG.md (35 identidades; motor/compilador derivado por búsqueda — nunca mostrar una pregunta de modo/categoría)
hyperframes init(omitir si el directorio del proyecto ya existe con el video dentro —matte.cjs/transcribe.cjsadoptan cualquier video en el directorio como source.mp4) →bash scripts/prepare.sh <proyecto>(matte ∥ transcribe ∥ audio-envelope en paralelo, luego safe-zones v2 con paleta de escena/óptica/iluminación — un comando, nada olvidado)- autoría de un pequeño JSON de opciones creativas (leer
safe-zones.jsonprimero): Cinemático →plan.json→fill-timings.cjs→fit-fonts.cjs→make-composition.cjs; Tema →theme.json→make-theme.cjs(paradigmas carril/panel/poema/toma de control;anchores el carril silencioso predeterminado) - QA Visual:
node scripts/preview-frames.cjs <proyecto>→ vistas previas de composición fieles en ~2s/fotograma (sin render). Verifica § QA Visual antes de pagar por un render. render-and-composite.sh→ compuertas (tiempo / oclusión+heroica / desbordamiento / entrega) →final.mp4
Reglas vinculantes que la gente pasa por alto:
- carril (predeterminado) + incrustación (promoción).
drop(relleno, no mostrado) /rail(subtítulo literal en el tercio inferior, al frente, lleva la mayor parte del texto) /embed(una palabra cumbre compuesta detrás del sujeto). El modo Estándar hace ambas, incrustando solo los picos. Ver § Modelo de leyenda. - El video se entrega SIN TOCAR (Estándar/Cinemático; el presupuesto de PLACA del modo Tema es la única excepción sancionada — latidos de reacción registrados (carga-oscura, golpe, sacudida, grano) definidos por ADN del tema y aplicados DESPUÉS de la composición mate para que sujeto+texto+placa se muevan como un solo fotograma) — las leyendas son lo único que se añade; el mate solo permite que el sujeto ocluya la pista incrustada. Nunca gradúes/recolores/añadas líneas de escaneo al metraje.
- Dos libros de reglas: carril → references/rail.md (delgado), arte de incrustación → references/composition-craft.md (rico, solo incrustación). Hojea según necesidad.
Modelo de leyenda — carril + incrustación
Cada frase hablada es una de tres cosas:
| Qué | Cómo se muestra | |
|---|---|---|
| drop | relleno — um/eh, tartamudeos, autocorrecciones | no se muestra |
| carril | el predeterminado — contenido hablado ordinario (literal) | subtítulo limpio en el tercio inferior, al frente, legible. Una palabra de énfasis puede obtener un resalte emphasis en línea (color de acento / pop de palabra activa) — permanece en el carril. |
| incrustación | un pico promocionado — el latido del titular | una palabra grande compuesta detrás del sujeto (oclusión mate), entrada + salida diseñadas |
El carril lleva la mayor parte del texto; la incrustación es el pico escaso y ganado. La escasez es por latido/bloque, no por clip: ≤1 héroe por bloque (pensamiento), nunca dos co-visibles, ≥ un latido de aire entre ventanas heroicas (el compilador advierte por debajo de 0.6s). Un clip corto → usualmente 1–2; un explicativo largo → ~uno por sección. Entre múltiples héroes, el héroe más grande autorizado es el APEX (él solo obtiene la incrustación de bloqueo completa + elevación de ajuste de ancho); los más pequeños son picos MENORES que cabalgan su columna como líneas de énfasis sobredimensionadas (fg, movimiento amortiguado) — no todos los latidos necesitan la exhibición mate, que es precisamente lo que mantiene el apex como un evento. Incrustar cada palabra sigue siendo el error común.
Las identidades de superficie de carril construyen exactamente esto (carril = rail.html, incrustación = el clímax en index.html). Las identidades de flujo de columna eliminan el carril y convierten todo en estilo incrustación — recomiéndalas solo para peticiones de ambiente sobre literalidad, nunca para explicativos / voz en off donde las palabras deben leerse (CATALOG.md codifica esto por identidad).
Paso 0 — elegir UNA identidad del CATÁLOGO
Un front-end, tres motores detrás. El usuario elige una IDENTIDAD de CATALOG.md (35 entradas: 10 clásicas + 25 temáticas); el motor, compilador y archivo de autoría se derivan por búsqueda de la fila del catálogo. Nunca presentes "Estándar vs Cinemático vs Tema" como una pregunta — esos son nombres de backend (un producto tiene una UX incluso con varios motores). El catálogo codifica todo lo que el enrutamiento necesita: superficie de lectura, voz, recomendar-para, necesidades de escena, notas de adyacencia para los pares realmente cercanos (loud↔ordnance, neon↔neonsign, cream↔stardust).
La elección de identidad es una puerta de preferencia (../hyperframes-core/references/brief-contract.md § 1): en modo autónomo ("sorpréndeme" / "decide por mí"), elige de tu lista corta tú mismo y explica el porqué en una línea en lugar de preguntar.
Procedimiento: analiza el clip → preselecciona 2–3 identidades del catálogo → recomienda UNA con un porqué en una línea → el usuario elige (modo autónomo: tú eliges, explicando el porqué) → autoriza el archivo de esa identidad. Las identidades están bloqueadas por motor (sin combinaciones cruzadas; abrir una es un evento de validación — ver dna/README.md).
Siempre presenta tu recomendación y deja que el usuario elija antes de autorizar. No tomes un valor predeterminado en silencio.
(La tabla de identidades completa vive en CATALOG.md — fuente única de verdad para el enrutamiento. Los documentos del motor a continuación describen el contrato de autoría de cada backend.)
Heurística de recomendación: usa las "Heurísticas de preselección" en CATALOG.md — son a nivel de identidad (ej. "炸" preselecciona ordnance/stomp/terminal/loud y elige por QUÉ debería explotar), nunca a nivel de categoría. Si no estás seguro → anchor.
- Cinemático → escribe
plan.jsonpara una plantilla bloqueada, compilada pormake-composition.cjs. - Tema → lee themes/README.md, autoriza
theme.json, ejecutascripts/render-theme.sh(compila + renderiza + reacción de placa → final_fx.mp4).
Puerta de decisión — EJECUTAR PRIMERO
Analiza el video y clasifica la escena antes de cualquier modo.
ffprobe <video.mp4> # especificaciones
ffmpeg -ss <t> -i <video.mp4> -vframes 1 sample.png # al 20/50/80%
Lee las muestras. Rechaza si:
- Múltiples hablantes / cortes abruptos (renderiza cada toma por separado o rechaza)
- Sin sujeto humano (esta habilidad es para talking-head)
- Menos de 3 segundos, sin habla, o la cara nunca claramente visible —
transcribe.cjsadvierte cuando el audio está casi en silencio (Whisper alucina palabras como "Gracias." sobre el silencio); hazle caso y rechaza en lugar de subtitular palabras inventadas - La fuente ya tiene leyendas / subtítulos / gráficos de texto pesados quemados — añadir un segundo sistema de leyendas entra en conflicto y el metraje se entrega sin tocar (sin cubrir/inpintar). El texto quemado a menudo aparece solo a mitad del clip: muestra una hoja de contacto a 1 fps (
ffmpeg -i in.mp4 -vf "fps=1,scale=160:-1,tile=10x5" sheet.png), no confíes en 3 fotogramas puntuales. - La transcripción es basura — el habla no nativa/con acento fuerte puede transcribirse en galimatías confiado. Lee
transcript.jsonpara verificar cordura antes de autorizar; si no se interpreta como idioma, intentaWHISPER_MODEL=mediumuna vez, de lo contrario rechaza (un carril literal de palabras fabricadas es peor que sin leyendas). - Cámara en mano movida con movimiento rápido (el mate parpadea)
Sondas previas al vuelo (no cuestan nada, previenen los peores fallos)
- Sonda de corte de toma. Muestra fotogramas al 20%, 50%, 80%. Si aparece un sujeto/escena diferente, recorta el clip antes del corte.
- Sonda de letterbox / pillarbox. ¿Barras negras en el primer fotograma? Calcula el rectángulo de contenido seguro y restringe la colocación de leyendas dentro de él.
- Sonda de luminancia. Muestra la luminancia promedio de la región de leyendas —
menos de 60→ el texto claro se lee tal cual,60-180→ añade la cortina de glifo,180+→ texto opaco + cortina (nunca texto claro desnudo). Las plantillas Cinemáticas son crema+screeny BLOQUEADAS — usa esta sonda para elegir una identidad adecuada (escenas brillantes →ink, o el temaanchorde carril opaco), nunca para recolorear una. - Recomendación de identidad por tono (tú recomiendas; el usuario elige — ver Paso 0 + CATALOG.md). Explicativo / entrevista / palabras deben leerse → identidades de superficie carril/panel; poético / social / "cinemático" → identidades de flujo de columna por registro; "炸 / 特效 / VFX" / mundos nombrados → identidades temáticas. Cuando no estés seguro →
anchor(las palabras se leen, la escena segura) — pero presenta una lista corta y deja que el usuario elija.
Pipeline — 5 pasos
1. hyperframes init <proyecto> --non-interactive --video <video.mp4> --skill=embedded-captions
2. bash scripts/prepare.sh <proyecto> # matte ∥ transcribe (paralelo) → safe-zones. Un comando.
# → frames_fg/ transcript.json safe-zones.json
3. [PASO DEL AGENTE — el único paso creativo] autoriza un pequeño JSON; ver abajo según el modo
Cinemático: autoriza plan.json → node scripts/fill-timings.cjs → fit-fonts.cjs → make-composition.cjs
Tema: autoriza theme.json → bash scripts/render-theme.sh <proyecto> (compila + renderiza + fx de placa)
4. node scripts/preview-frames.cjs <proyecto> # ~2s/fotograma vistas previas compuestas → § QA Visual (ANTES del render)
5. bash scripts/render-and-composite.sh <proyecto> # compuertas → final.mp4 + instantánea history/
(Modo Tema: OMITE los pasos 3b/5 — render-theme.sh ya ejecuta compilación + render-and-composite
+ _postfx.sh; el entregable es final_fx.mp4, final.mp4 es pre-reacción de placa)
El init del paso 1 verifica las habilidades instaladas contra las últimas en GitHub y actualiza el conjunto global si alguna está desactualizada.
El paso 3 difiere según el modo:
Paso 3 — Modo Cinemático (incrustación pura)
- Lee
safe-zones.jsonprimero. Los planos de narración van enzones.hugLeft/hugRight— franjas limpias ADYACENTES a la silueta (el texto lejos del cuerpo se lee como flotante, no incrustado; las esquinas lejanas son el plan de respaldo, no el predeterminado). El héroe predetermina aheroAnchor/heroBands.best(centrado EN el sujeto, ~30–55% ocluido).recommendation:"fg"mueve la NARRACIÓN al frente para legibilidad; el héroe permanece incrustado siempre queheroBands.feasible— héroe-fg es el último recurso. - El ADN es la identidad que elegiste en el Paso 0 (CATALOG.md) — no reabras la elección aquí. Verifica su cordura contra la escena (luma de banda heroica brillante > 150 quiere
ink; la guía completa de elección vive en el catálogo, cubriendo los diez incluyendo neon / glitch / chrome / velocity). Indica tu elección + por qué; el usuario decide. El ADN bloquea tipo/paleta/fusión/movimiento + tres actos heroicos; safe-zones v2 (palette/optics/lighting) lo parametriza para ESTA escena automáticamente. - Autoriza
<proyecto>/cinematic.json—"dna": "<nombre>"+ BLOQUES de pensamiento, no grupos brutos: cada bloque = líneas de palabras (agrupadas 2–5 en límites de cláusula) + el plano en el que se apilan +csspor línea (tamaño/peso/estilo solo — sin posiciones) + como máximo UNA línea marcada como"hero": true(la palabra promocionada;"text"para forma de visualización). Esquema: encabezado descripts/make-cinematic.cjs. - Compila:
node scripts/make-cinematic.cjs <proyecto>— reduce bloques → plan.json → index.html. Generados para ti: tiempos secuenciados por transcripción, acumulación dentro del bloque, paso de página entre bloques, el BLOQUEO DEL HÉROE (el pre-contexto de un bloque héroe, el HÉROE y el post-contexto se apilan como UNA composición unida centrada en el sujeto — orden de lectura arriba→abajo = orden hablado por construcción; el contexto flota al FRENTE mientras el héroe se incrusta DETRÁS = el sándwich de profundidad; una regla de masa mantiene al héroe dominando su contexto), división apex/héroe menor, orden de lectura por construcción, respaldo fg por safe-zones. Luego las compuertas se ejecutan como de costumbre. (La autoría manual de plan.json directamente sigue siendo posible para diseños que los bloques no pueden expresar — luego ejecutafill-timings.cjs+fit-fonts.cjs+make-composition.cjstú mismo.)
Paso 3 — Modo Tema (constitución temática)
Lee themes/README.md PRIMERO — registros de paradigma/pieza, enlaces, reglas estrictas y el esquema exacto de theme.json.
- Elige un ADN de tema por registro de contenido (cada
themes/<nombre>.jsontienevoice+when). Indica tu elección + por qué; el usuario decide. - Autoriza
<proyecto>/theme.json—dna,lines(literal, orden de transcripción; 1
…
[truncado para traducción]