product-launch-video: assemble-index.mjs is not idempotent — a second run drops every approved frame video · Issue #5733 · heygen-com/hyperframes · GitHub
Skip to content

product-launch-video: assemble-index.mjs is not idempotent — a second run drops every approved frame video #5733

Open

Description

@jrejaud

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)

  1. 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).
  2. Run assemble-index.mjs, and index.html has the root-level <video>. ✅
  3. Edit any frame (e.g. a caption fix) and run assemble-index.mjs again.
  4. 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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions