Repository navigation
fix(core): a render lands where preview does when a set interrupts a tween - #7283
Merged
Merged
Conversation
Contributor
There was a problem hiding this comment.
Verdict: REQUEST CHANGES · 1 blocker · 0 important · 0 nits · head d0559e36
The fix is correct. It falls short on CONTRIBUTING.md: the Comments workflow fails at this head, though the test plan ticks "Comments follow CONTRIBUTING.md". ↓ inline
Scope
- Read
gsap.ts(settleOverlapsEndedBetween,framesSkippedSinceLastSeek,landOn,seekGsapTimeline) and the new tests in full. - Verified the
fails without the fix:line locally. With main'sgsap.ts, all 4 new tests fail ([30, 0]vs[30, 1]). With this head, all 10 tests ingsap.order.test.tspass. - Rule 2 sweep: the render paths in
init.ts(lines 5293, 5528) both go throughseekGsapTimeline. The rawtotalTimecalls inhtmlCompiler.tsare compile-time probes, not frame capture. - Settling on replayed frames reads the cached spans (
overlapSpansOf), so it adds no per-frame structure walk. - CI was still running for regression, Windows render, and CI. The new goldens for this overlap are not reviewed here.
Contributor
Edit accuracy: accurate 267 (base branch 267), smooth 130 of thoseThe gate passes. Quarantined, measured but not gated (8)
Unstable (1)
|
miguel-heygen
enabled auto-merge
November 6, 2026 01:32
Merged
2 of 4 tasks
SanHsien
added a commit
to SanHsien/hyperframes
that referenced
this pull request
Nov 6, 2026
…view Adopts heygen-com#7264 (no-draw seeks no longer upload graded images to the GPU), heygen-com#7267 (normalize-audio says where the target stays when a limit holds), heygen-com#7268 (a render's lint runs at normal priority), heygen-com#7283 (a render lands where preview does when a set interrupts a tween) and heygen-com#7287 (a missing local font no longer stops a cloud render), with prerequisite heygen-com#7061. Not adopted: the stale auto-close workflow (heygen-com#7280; the fork uses Dependabot) and the v0.9.18/v0.9.19 releases. Watermark advances to b4cc674. Co-authored-by: Miguel Ángel <miguel.sierra@heygen.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Nov 6, 2026
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
A render now lands where preview and a seek do when a
setinterrupts a tween that is still running on the same property. The set's value holds once the tween has ended, on every worker.Why
Preview settles this overlap, and renders skip that step. So a worker that renders frame by frame keeps the tween's last value after it ends, while preview and a direct seek keep the set's value.
A panel fading out for 1 s, with a set at 0.3 s that brings it back, shows this. It looks right in preview and renders blank:
Related work
Refs #7061, which settled preview and left renders out. Refs #6707 and #7231, which made workers agree with an in-order render. They stay in place, and the in-order render they match now lands where preview does.
How
seekGsapTimelinemoves the playhead through one helper,landOn, for replayed frames and the final frame, and it always settles. Theif (!renderFps)guard on the settle step is gone, so preview and render share one path.Behaviour change: a film with this overlap now renders the set's value after the tween ends, matching preview, where it used to render the tween's final value on frame-by-frame workers. Frames inside the overlap are unchanged.
Test plan
gsap.order.test.ts, "a render where a set interrupts a running tween": in-order, workers starting partway, every 6th frame, and behind the producer's stand-in.[30, 1]and gets[30, 0]. With the oldgsap.ts, all 4 new tests fail and the 6 existing ones in the file pass. With the fix, all 10 pass, 3 runs in a row.packages/core/src/runtime: 118 files, 2,812 tests pass.planV2andrenderChunkV2, 1,379-frame chunk, 6 workers, beginframe capture, read frame by frame through frame 420. 8 variants of overlapping writes, nested timelines and autoAlpha each hold one value after frame 160, with no change at frame 230, the worker boundary.