mirror of
https://github.com/heygen-com/hyperframes.git
synced 2026-09-03 12:54:29 +00:00
#2606 taught the video-coverage gate that a non-looping short video holds its final decoded frame across the tail, so the delivered source frames are enough to cover the authored slot. But that fix gated the credit on '!video.loop' — a looping short video was still measured as unique-source-frames / slot-frames and aborted at ratio << threshold. Reproduced on 0.7.64 with the reporter's exact composition (3s clip in a 10s slot, loop attribute): render aborts with 'captured 90 of expected 300 frames (coverage 30.0%)'. Same source without loop renders clean via #2606's freeze credit. This is the mainline 'loop a short clip to fill a longer scene' case, the reason loop exists. Fix: extend #2606's source-credit to loops symmetrically — the delivered set (all N source frames) covers every repeat within the slot, so expectedFrames = min(slotFrames, sourceFrames) for both hold and loop. Fail-loud preserved for a genuinely-broken loop (extractor truncated below its own source): a 60/90 delivery still aborts at 66.7% < 95% because the delivered set no longer covers the full source period the loop reuses. Missing extractions still require the full slot. Test updates: - 'still requires the full authored slot for looping clips' locked in the buggy behavior; replaced with 'credits a looping short clip against the source portion' which asserts the correct 90/90/1.0. - Added 'still fails when a looping clip's source extraction is truncated' as the new fail-loud floor. Fixes #2665. Regression window: 0.7.60 (#2606's original ship) through 0.7.67 (current). Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>