Repository navigation
fix(core): the filter tier's svg no longer changes which child is last in the root - #7293
Merged
Merged
Conversation
…t in the root Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Contributor
Contributor
There was a problem hiding this comment.
Verdict: APPROVE · 0 blocker · 0 important · 0 nits · head fe037536
Scope
- Read
filterTier.tsend to end.teardownremoves the svg from any parent, and the tier was already building it with the globaldocument(same ascreateElementNSandlandThenUndoDom(…, document)), so moving it underdocumentElementadds no new document assumption. Nothing else incaptureMotionBlur/appends toroot. The canvas tier wraps the root and doesn't add children to it. - Checked locally: core
index.test.tspasses 125/125. With only the one line reverted, the new test fails. - CI: the first
Studio: edit accuracy (14/15)failure was a puppeteer WS-endpoint launch timeout, unrelated to this change. After a rerun the whole CI run is green.captureMotionBlur.sweep.browser.test.tsran in Test (17 passed). Windows render verification and Safari perf were still running when this was posted. - The
html > :last-child/body:last-childexposure is documented in the PR body. I accept it as is.
— Genesis
SanHsien
added a commit
to SanHsien/hyperframes
that referenced
this pull request
Nov 6, 2026
…view Adopts heygen-com#7294 (line_unread findings carry the measured frames), heygen-com#7271 (blur mutes discrete callbacks instead of undoing them), heygen-com#7293 (the filter tier's svg keeps the last child), heygen-com#7292 (a mover holding a fixed child stays sharp), heygen-com#7288 (auto motion blur draws with the filter tier) and heygen-com#7298 (Shift no longer re-renders the timeline). The fork's seek recovery in captureMotionBlur stays. Defers heygen-com#7134 (no packages/share) and heygen-com#7295 (needs the heygen-com#7080 crop pipeline). Watermark advances to 66cbabc. Co-authored-by: Miguel Ángel <miguel.sierra@heygen.com> Co-authored-by: Vance Ingalls <vance@heygen.com> Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
SanHsien
added a commit
to SanHsien/hyperframes
that referenced
this pull request
Nov 6, 2026
…-com#7288) 537b88d adopted heygen-com#7288, which makes auto motion blur draw with the filter tier, but left out the engine side. Pixel tests that expect the capture tier then failed on Windows CI. Take upstream e2bb7da's change to captureMotionBlur.pixels.browser.test.ts, which asks those tests for the capture tier explicitly. The other engine files that heygen-com#7271/heygen-com#7288/heygen-com#7292/heygen-com#7293 touch (fixtures, thresholds, sweep and differential tests) do not exist in this fork. Co-authored-by: Vance Ingalls <vance@heygen.com> Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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
The filter tier appended its hidden
<svg><defs>(the per-mover SVG filters) to the composition root and left it there until teardown, so#root > :last-childor:last-childselectors on the root's children matched the injected svg and a stray square could draw at (0,0) (sweep defect I: 1980 px differ from the oracle). The svg now goes underdocument.documentElementinstead (notdocument.head: adisplay:nonesubtree can stop a filter reference resolving in Chrome). One line infilterTier.tslayerOf.Removal still works from the new parent (
teardowncallsdefs.remove()), and at most one filter tier exists at a time, so filter ids (hf-mb-<n>) cannot collide across two svgs.Tests
index.test.ts:keeps the filter tier's svg out of the root and removes it on teardown: none inside the root, exactly one in the document after a paint, still one after re-init, zero after teardown.last-child-selectorsweep case loses itsbugfield andS.Iand passes as an ordinary outside-the-trail check. Theplainfilter case in the same file is what proves the filter reference still resolves fromdocumentElement.captureMotionBlur213 pass; engine sweep + differential 90 pass on Chrome 153.Limits
<html>, outside<body>, while the filter tier is active. Nothing in core, engine, cli or studio clones or serialises the livedocumentElement.html > :last-childandbody:last-childauthor selectors now see the svg as a sibling ofbody; far less likely than the#rootcase.🤖 Generated with Claude Code