Hacktoberfest 2026: những issue maintainer đã đánh dấu cho tháng Mười, đang mở và phù hợp người mới. Xem issue Hacktoberfest

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

Đang mở Phù hợp với người mới
#5,733 0 bình luận 0 reaction 0 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 1 ngày

@Dante-dan đang làm issue này rồi.

Từ ngày 17/10/2026.

  • #5738 của @Dante-dan — đang mở

Đánh giá

Độ khó
2/5
Thời gian dự kiến
1-3 giờ
Mức phù hợp với người mới
75/100
Loại issue
Lỗi
Độ rõ ràng
Đặc tả rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
html, typescript
Lĩnh vực
backend

Hướng nghiên cứu

Bắt đầu với skills/product-launch-video/scripts/assemble-index.mjs, đặc biệt là guardFrame(), hoistApprovedVideos() và thao tác ghi gần dòng 417. Theo dõi cách HTML của frame đã sửa được dùng khi tạo index.html, rồi thêm một kiểm thử hồi quy lắp ráp cùng một fixture hai lần và so sánh số lượng video ở phần tử gốc. Hoàn tất khi cả hai lần chạy đều giữ lại footage đã được duyệt và lần chạy thứ hai không âm thầm tạo ra một bản kết xuất trống.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

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.

Ngôn ngữ chính
TypeScript
Star
54.1k
Fork
4.9k
Merge trung bình
8 giờ 49 phút
Pull request đã merge (30 ngày)
667

Chuẩn bị môi trường

Dự án này không cung cấp dev container, Dockerfile hay hướng dẫn đóng góp, nên bạn cần tự thiết lập môi trường: hãy bắt đầu từ README và xem hướng dẫn đóng góp lần đầu của chúng tôi để biết các bước chung.

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của heygen-com/hyperframes

Tất cả issue của heygen-com/hyperframes

Issue tương tự

Thêm issue về TypeScript

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.