product-launch-video: assemble-index.mjs is not idempotent — a second run drops every approved frame video
Los mantenedores suelen responder en 1 día
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 75/100
- Tipo de issue
- Error
- Claridad
- Bien especificado
- Estado de actividad
- Activo
- Stack tecnológico
- html, typescript
- Área
- backend
Línea de trabajo
Empieza por skills/product-launch-video/scripts/assemble-index.mjs, en especial por guardFrame(), hoistApprovedVideos() y la escritura cerca de la línea 417. Sigue cómo se usa el HTML del frame reparado al crear index.html y, después, añade una prueba de regresión que ensamble la misma fixture dos veces y compare el número de vídeos en la raíz. El trabajo estará terminado cuando ambas ejecuciones conserven el metraje aprobado y la segunda no genere silenciosamente un render vacío.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Summary
skills/product-launch-video/scripts/assemble-index.mjs is not idempotent. The first run hoists each approved frame <video> out of its frame file and writes the frame file back with only a placeholder comment (<!-- approved frame video hoisted by assemble-index -->). A second run finds no <video> in the frame files, so it rebuilds index.html with no footage, and it exits cleanly without any error or warning.
Repro (hyperframes 0.8.163)
- A project with a frame
compositions/frames/02-x.htmlthat holds an approved video (data-frame-video="approved", withdata-start/data-duration/data-track-index/ layout attrs). - Run
assemble-index.mjs, andindex.htmlhas the root-level<video>. ✅ - Edit any frame (e.g. a caption fix) and run
assemble-index.mjsagain. index.htmlhas no<video>, the frame file has only the hoist comment, and the render shows empty device frames.
Cause
guardFrame() → hoistApprovedVideos() returns the stripped HTML as repairedHtml, and the caller persists it (writeFileSync(compAbs, guard.repairedHtml), ~line 417). The hoist is meant to happen at assembly time, but it mutates the source of truth, so the operation destroys data on re-run.
Suggested fix
Either of these would work:
- Don't write the hoist back: keep the
<video>in the frame source and strip it only in the in-memory copy used forindex.html(the root-dimension repair can still be persisted on its own). - Or make the placeholder carry the full tag (e.g. a
data-hoisted<template>or an attribute-bearing comment) so a re-run can re-hoist from it.
A regression test: run assembly twice on the same fixture and assert that the <video> count in index.html is equal across runs.
Impact
Any edit-and-reassemble loop, which the review loop encourages, silently loses all footage. The only signal is a blank render, found after a full render cycle.
- Lenguaje dominante
- TypeScript
- Estrellas
- 54.1k
- Forks
- 4.9k
- Merge medio
- 9 h 3 min
- PR fusionados (30 d)
- 670
Preparar el entorno
Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de heygen-com/hyperframes
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 88/100
heygen-com/hyperframes#5863 ·
Los mantenedores suelen responder en 1 día
-
gsap_tween_tail counts GSAP's force3D and autoRound flags as propertiesPosiblemente ocupada @rudycelekli la tomó hace 2 días. Abiertobug triage/needs-triage
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
heygen-com/hyperframes#5683 ·
Los mantenedores suelen responder en 1 día
-
Timeline: show a clip's full name when its label is cut offPosiblemente ocupada @DanielMcSheehy la tomó hace 1 día. Abiertodesktop-candidate difficulty/easy enhancement good first issue help wanted triage/ready
Dificultad 2/5 1-3 horas Aptitud para principiantes 85/100
heygen-com/hyperframes#5582 · 2 comentarios ·
Los mantenedores suelen responder en 1 día
-
Studio: press ? to open the keyboard shortcuts panelPosiblemente ocupada @B-Payal la tomó hace 5 días. Abiertodesktop-candidate difficulty/easy enhancement good first issue help wanted triage/ready
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
heygen-com/hyperframes#5580 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
remotion-to-hyperframes: Easing.cubic is mapped to power3 (quartic); cubic is power2Posiblemente ocupada @user-github-me la tomó hace 5 días. Abiertodifficulty/easy documentation help wanted triage/ready
Dificultad 1/5 Menos de una hora Aptitud para principiantes 88/100
heygen-com/hyperframes#5538 · 1 comentario ·
Los mantenedores suelen responder en 1 día
Todos los issues de heygen-com/hyperframes
Issues similares
-
Admin search throws for permissions added through Admin.generalIndexItems('permissions', ...)Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
Koenkk/zigbee-herdsman-converters#13540 ·
Los mantenedores suelen responder en 1 día
-
Add: Tequila Music TV RO SDAbiertocheck:passed streams:add
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
iptv-org/iptv#55821 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
area/busola/ux
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
kyma-project/busola#5442 ·
Los mantenedores suelen responder en 2 días
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
vercel-labs/wterm#246 ·
Los mantenedores suelen responder en 1 día