Skip to content

test(engine): pin the motion blur sweep defects A to O by their symptoms - #7149

Merged
vanceingalls merged 1 commit into
mainfrom
test/motion-blur-sweep-fixtures
Nov 5, 2026
Merged

vanceingalls merged 1 commit into
mainfrom
test/motion-blur-sweep-fixtures

Conversation

@jrusso1020

Copy link
Copy Markdown
Collaborator

What

Tests only, stacked on #7108. Adds 13 fixtures from the 60-composition capture motion blur sweep and one test per defect A to O, each named KNOWN BUG on main: <letter>: ... and pinned by its current symptom, the same way #7108 pins its known bugs. Each one flips when its fix lands.

Why

The sweep found 15 defect classes that the current fixtures do not cover. Pinning them keeps the suite green today and turns each fix into a visible test change.

Related work

Refs #7108. G is skipped: it is the callbacks case #7108 already pins (events="on" leaves the label in the wrong state). N is skipped too: #7108's liveness test already pins the blank frame after play() on the capture tier.

How

  • __fixtures__/motionBlur/sweepFixtures.ts: 640x360, 30 fps, 1 s compositions where #m moves x 0 to 480 between 0.25 s and 0.75 s. No text anywhere, so no pin depends on font raster.
  • captureMotionBlur.sweep.browser.test.ts: each case runs one check on a fresh page and asserts the tier, that bad tiles exist, that every bad tile touches the named region, and that the worst MAE is within [0.5x, 2x] of the measured value. When a fix lands, delete the case's bug field and it stays as a regression check.
  • Checks: test(engine): pixel invariants and fixtures that guard default-on capture blur #7108's invariant 1 (outside the trail) and invariant 2 (inside, mean of 8 shutter samples) where they see the defect. Where they do not, a second check against the engine's 32-sample sub-frame blur over the whole frame (ORACLE in thresholds.ts; threshold 7.55, the geometric mean of clean-frame noise 3.94 and the smallest pinned symptom 14.47). A plain mover passes it on both tiers.
Finding Test (KNOWN BUG on main: ...) Check, tier, frame Worst MAE
A panel in front of the mover painted over outside, capture, 14 47.67
B mix-blend-mode mover blends with nothing inside, capture, 11 148.63
C ancestor drop shadow missing inside, capture, 14 73.02
D ::after outside the box cut off inside, capture and filter, 14 107.66
E own clip-path cuts the smear oracle, filter, 14 27.60
F fixed child smeared / jumps into mover outside, capture 11 / filter 11 40.62 / 126.54
H body > #root > .m stops matching, still frames too outside, capture, 4 135.67
I :last-child moves to the filter svg outside, filter, 11 53.63
J overflow:hidden clip edge travels oracle, capture, 11 25.79
K crossing movers carry each other's ghost oracle, capture, 15 14.47
M band at the bottom edge for content rising in oracle, capture, 14 18.31
O mover hidden mid-shutter drawn at full strength inside, capture and filter, 15 50.38

Not pinned:

Test plan

  • Unit tests added/updated
  • Manual testing performed
  • Documentation updated (if applicable)
  • Comments follow CONTRIBUTING.md "Comments": they say why, not what, and a bug fix says what the code must do and how to reproduce the bug

Linux, headless shell from resolveHeadlessShellPath: bun x vitest run src/services/captureMotionBlur.sweep.browser.test.ts in packages/engine, 17 of 17 passed in 26 s, three runs in a row, and once more in 29 s with every core busy (the flake gate's setup). Values were measured on Linux only; macOS has not been run. oxfmt, oxlint, engine tsc --noEmit, the comment checks, test reachability and fallow audit pass.

🤖 Generated with Claude Code

Base automatically changed from test/motion-blur-default-confidence to main November 4, 2026 18:12
Adds 13 text-free fixtures from the 60-composition capture motion blur
sweep and one test per defect, each pinned by its current symptom so it
fails once the fix lands. Pins use the existing outside and inside
invariants where they see the defect, and a second check against the
engine's 32-sample sub-frame blur where they do not (E, J, K, M).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@vanceingalls
vanceingalls force-pushed the test/motion-blur-sweep-fixtures branch from 88e5031 to 5d7156c Compare November 5, 2026 01:31

@heygengenesis heygengenesis Bot left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verdict: APPROVE · 0 blocker · 0 important · 0 nits · head 5d7156c8

Tests only, and CI is green at this head, including the flake gate on the new file. The pins hold after #7190 and #7191: on main with all three merged, I got 17/17 locally, so neither fix flips or moves an A–O pin.

Scope

Audited all three files: fixtures, the ORACLE / SWEEP_SYMPTOMS thresholds, the 17 cases (15 pins + 2 plain controls) and their regions. I ran the sweep in chrome-headless-shell 157 on Linux, on main+#7149+#7190+#7191 (CI covers this head alone). I also ran the core captureMotionBlur suite on the merged tree: 203 pass. macOS values are unmeasured, as the body says. The body still says "stacked on #7108", which went stale with the rebase.

— Genesis (Claude)

@vanceingalls
vanceingalls added this pull request to the merge queue Nov 5, 2026
Merged via the queue into main with commit f3e5b81 Nov 5, 2026
77 checks passed
@vanceingalls
vanceingalls deleted the test/motion-blur-sweep-fixtures branch November 5, 2026 05:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants