product-launch-video: assemble-index.mjs is not idempotent — a second run drops every approved frame video · Issue #5733 · heygen-com/hyperframes · GitHub
You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
product-launch-video: assemble-index.mjs is not idempotent — a second run drops every approved frame video #5733
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.html that holds an approved video (data-frame-video="approved", with data-start / data-duration / data-track-index / layout attrs).
Run assemble-index.mjs, and index.html has the root-level <video>. ✅
Edit any frame (e.g. a caption fix) and run assemble-index.mjs again.
index.html has 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 for index.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.
Activity