Repository navigation
feat(core): auto motion blur draws with the filter tier - #7288
Merged
Merged
Conversation
|
Preview deployment for your docs. Learn more about Mintlify Previews.
💡 Tip: Enable Automations to automatically generate PRs for you. |
Contributor
vanceingalls
force-pushed
the
feat/blur-auto-filter-tier
branch
from
November 6, 2026 04:14
c420e0d to
0e9314e
Compare
vanceingalls
marked this pull request as ready for review
November 6, 2026 04:14
Capture stays available as data-motion-blur-tier="capture". auto now draws with the filter tier (reasonCode tier-auto), so the capture-only defects leave the default path. Removes the translation-only hand-off and its Discovery field, adds a filter arm to the differential, and updates the check, guide, skill and Blur panel label. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…w auto default spacex-launch (77 movers) takes 2.9x the CPU of no blur on the filter tier and 1.7x on capture; say so, and list the filter tier's measured limits (sweep D, E, F, I, O, B). Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…s mechanism Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
… gate's 120 s run The filter arm moves to its own file and skips fixtures that already draw with the filter tier; inside cases get their own file; a fixture's blur-off page is opened once per file. Shared helpers live in __fixtures__/motionBlur/differentialPage.ts. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
vanceingalls
force-pushed
the
feat/blur-auto-filter-tier
branch
from
November 6, 2026 04:33
0e9314e to
603ffd4
Compare
Contributor
There was a problem hiding this comment.
Verdict: APPROVE · 0 blocker · 0 important · 1 nit · 603ffd46
This approval assumes the stated merge order. #7292 has to land first, because it removes the fixed-child regression (F) that this PR otherwise ships. #7292, #7293 and this PR merge cleanly together, and the core blur suites pass on the combined tree (215/215).
- nit (PR body): "the follow-up PR that fixes it (to be linked)" should now read #7292. The "Filter-arm inside noise…" sentence appears twice. After the rebase onto #7271,
once-guard-labelis in every differential arm, so the counts are now 54/24/22, not 51/22/20. The Flake gate still passed each file 6/6.
Scope
- I read the whole diff.
- I checked that reverting the
chooseTierline fails 3 tests (tier + 2 index). translation-onlyhas no readers left.- The defect reason codes that the fixture edits stopped asserting (
iframe-in-root,accelerated-canvas,backface-visibility) are still covered inhtmlInCanvasDefects.test.tsand in thepixelscases that now pin"capture". - The sweep pins its tiers explicitly, so the new default does not change it.
- CI is all green on
603ffd46. The merge state is only waiting on review. - For the
htmlCompiler.ts:359follow-up: everydata-motion-blur="on"render still takes the screenshot route, and the no-blur arm did not. So some of the 2.9× may come from the route rather than the filter tier. That is worth separating when the follow-up is measured.
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>
SanHsien
added a commit
to SanHsien/hyperframes
that referenced
this pull request
Nov 6, 2026
Re-verified the nine merged PRs in heygen-com#7266-heygen-com#7288 against fork file:line and reverse-apply checks; none needs a new port. The six open PRs (heygen-com#7266, heygen-com#7269, heygen-com#7281, heygen-com#7282, heygen-com#7285, heygen-com#7286) are pinned as monitored with revisit conditions; monitored 99 -> 105. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Merged
2 of 4 tasks
This branch was successfully deployed
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
data-motion-blur-tier="auto"now draws with the filter tier. Capture is opt-in withdata-motion-blur-tier="capture"and still runs wherever html-in-canvas exists.Why: Rames Jusso's sweep of 60 one-pattern compositions found 15 defects, and the worst ones are in the capture tier by design: anything in front of a mover is painted over (A), blend modes are ignored (B), a selector through the root's parent stops matching (H), and the first preview frame after
play()is black (N).autoused to pick capture for any rotation, scale orleft/topmotion, which is what Desktop preview runs. The filter tier has none of those four.Before
k3-promo frame 274 on
main,autodrawing with capture: the swinging pendulum rods and the text carry streaks.After
The same frame on this branch,
autodrawing with the filter tier: the rods soften, the text blurs gently, and nothing in front of a mover is painted over (a scanline overlay in front of the bars at frame 178 survives here and is lost onmain).What it costs: please read before approving
k3-promoframe 274, main (capture) streaks the swinging pendulum rods and the "Every modality" text; this branch softens the rods and blurs the text gently. On the same film at frame 178 a scanline overlay in front of the bars survives on this branch and is lost on main, and onspacex-launchframe 71 a cursor missing on main is present here.spacex-launch, one onk3-promo; wall times were taken at a load average of 30 to 250 and are not quoted):spacex-launch(77 movers) no blur 184-193,auto(filter) 547-552, forced capture 302-320, so filter is 2.9x no blur and 1.75x capture.k3-promo(106 movers) 117 no blur, 236 filter, 205 capture. "About what a render without blur costs" holds only for the four-whip bench the guide used to cite. The cause is not isolated (likely the 32 or morefeOffsetcopies per mover per frame on the software GPU). The guide now says all of this.position: fixedchild of a mover that moves vialeftjumps into the mover, because the SVG filter makes the mover its containing block; in the sweep 3495 px differ from the 32-sample oracle for the filter tier against 721 for capture, and before this changeautokept such movers on capture. The guide lists this and the filter tier's other measured limits (::before/::afteroutside the box cut off, a mover's own clip-path or mask gets hard edges,:last-childon the root's children also matches the injected svg, a visibility toggle inside the shutter drawn at full strength,backdrop-filterdiffering from the oracle).Vance saw these numbers and the held-merge note and asked on 2026-11-06 for everything in this plan to be merged. Merge order: #7271 (callbacks mute), #7292 (the fixed-child fix, which removes the regression above), then this PR.
Changes
tier.tschooseTier:autoandfilterdraw with the filter tier when the fallback is on;capturedraws with capture where it can run;renderer-offstays off. The report reason code forautoistier-auto.translationOnlyfrom discovery, with its tests.hyperframes check:tier-autois a chosen tier, so no fallback info;motion_blur_unverifiednow only for forced capture in a browser without html-in-canvas.Motion blur (Beta)).tier.test.ts,checkMotionBlur.test.ts,index.test.ts, a fixtures case provingautodraws a rotating mover with the filter tier and a page that asks for capture keeps it, and a filter-tier arm (20 cases) in its own file,captureMotionBlur.differential.filter.browser.test.ts. The differential is now three files (default 51 cases, inside 22, filter 20) because the 98-case single file timed out the Flake gate's 120 s per-run limit; each file now runs in at most 37 s locally under one CPU burner per core. The filter arm skips the four fixtures that already draw with the filter tier. Filter-arm inside noise is at most 4.9 against a third ofinsideMaxMae(12.3), so no thresholds changed. Filter-arm inside noise is at most 4.9 against a third ofinsideMaxMae(12.3), so no thresholds changed. Fourpixelscases that tested capture's defect detection throughautonow pass"capture".chooseTierline reverted, the newtier.test.tscase, two coreindex.test.tscases and the new fixtures case fail.Not in this PR
htmlCompiler.tsdetectRenderModeHintsstill routes every blur render through screenshot capture and its message says "draws each frame with html-in-canvas". No longer accurate for the default; follow-up.🤖 Generated with Claude Code