From e2f7f6a58a9a2f9e243a422159705d88b1570d32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20=C3=81ngel?= Date: Tue, 19 May 2026 15:59:09 -0400 Subject: [PATCH] fix: add regression fixtures with golden baselines + address review - Create sub-comp-t0 and sub-comp-id-selector as proper regression tests under packages/producer/tests/ with golden MP4 baselines - Add both to shard-7 in regression.yml - Add clarifying comment on activateNestedChildTimelines scope - Confirm test fixture network safety in comment --- .github/workflows/regression.yml | 2 +- .../compiler/inlineSubCompositions.test.ts | 2 + packages/core/src/runtime/init.ts | 4 + .../tests/sub-comp-id-selector/meta.json | 12 +++ .../sub-comp-id-selector/output/output.mp4 | 3 + .../tests/sub-comp-id-selector/src/index.html | 48 ++++++++++ .../tests/sub-comp-id-selector/src/intro.html | 42 +++++++++ packages/producer/tests/sub-comp-t0/meta.json | 12 +++ .../tests/sub-comp-t0/output/output.mp4 | 3 + .../sub-comp-t0/src/compositions/hook.html | 61 +++++++++++++ .../sub-comp-t0/src/compositions/later.html | 43 +++++++++ .../producer/tests/sub-comp-t0/src/index.html | 88 +++++++++++++++++++ 12 files changed, 319 insertions(+), 1 deletion(-) create mode 100644 packages/producer/tests/sub-comp-id-selector/meta.json create mode 100644 packages/producer/tests/sub-comp-id-selector/output/output.mp4 create mode 100644 packages/producer/tests/sub-comp-id-selector/src/index.html create mode 100644 packages/producer/tests/sub-comp-id-selector/src/intro.html create mode 100644 packages/producer/tests/sub-comp-t0/meta.json create mode 100644 packages/producer/tests/sub-comp-t0/output/output.mp4 create mode 100644 packages/producer/tests/sub-comp-t0/src/compositions/hook.html create mode 100644 packages/producer/tests/sub-comp-t0/src/compositions/later.html create mode 100644 packages/producer/tests/sub-comp-t0/src/index.html diff --git a/.github/workflows/regression.yml b/.github/workflows/regression.yml index 62e2bc503..6b03a65d5 100644 --- a/.github/workflows/regression.yml +++ b/.github/workflows/regression.yml @@ -72,7 +72,7 @@ jobs: - shard: shard-6 args: "overlay-montage-prod style-12-prod chat missing-host-comp-id png-sequence" - shard: shard-7 - args: "sub-composition-video style-18-prod raf-ball-render-compat font-variant-numeric" + args: "sub-composition-video style-18-prod raf-ball-render-compat font-variant-numeric sub-comp-t0 sub-comp-id-selector" - shard: shard-8 args: "style-13-prod style-6-prod vignelli-stacking gsap-letters-render-compat" steps: diff --git a/packages/core/src/compiler/inlineSubCompositions.test.ts b/packages/core/src/compiler/inlineSubCompositions.test.ts index 9dfd9f902..8edc15394 100644 --- a/packages/core/src/compiler/inlineSubCompositions.test.ts +++ b/packages/core/src/compiler/inlineSubCompositions.test.ts @@ -2,6 +2,8 @@ import { describe, expect, it } from "vitest"; import { parseHTML } from "linkedom"; import { inlineSubCompositions } from "./inlineSubCompositions"; +// Fixtures reference GSAP CDN but are never loaded in a real browser — resolveHtml is mocked. + /** * Minimal sub-composition HTML that uses `#intro` as its CSS and GSAP scope. * This is the pattern that breaks when the producer path strips the inner root. diff --git a/packages/core/src/runtime/init.ts b/packages/core/src/runtime/init.ts index 327b4d18f..137fc3c4e 100644 --- a/packages/core/src/runtime/init.ts +++ b/packages/core/src/runtime/init.ts @@ -1724,6 +1724,10 @@ export function initSandboxRuntimeModular(): void { } }; + // Unpause all non-root timelines. Per GSAP semantics, paused(false) on a + // child timeline that hasn't been reached by the parent's playhead is a + // no-op — the child won't fire onStart/onUpdate until the parent seeks + // past its insertion point. Per-frame visibility is gated by the engine. const activateNestedChildTimelines = (masterTimeline: RuntimeTimelineLike) => { const timelines = (window.__timelines ?? {}) as Record; for (const tl of Object.values(timelines)) { diff --git a/packages/producer/tests/sub-comp-id-selector/meta.json b/packages/producer/tests/sub-comp-id-selector/meta.json new file mode 100644 index 000000000..6fd6cd86e --- /dev/null +++ b/packages/producer/tests/sub-comp-id-selector/meta.json @@ -0,0 +1,12 @@ +{ + "name": "Sub-composition #ID selector scoping", + "description": "Documents that sub-compositions using #ID selectors may render differently between preview and render due to the producer stripping the inner root element. Workaround: use [data-composition-id] selectors instead of #ID.", + "tags": ["sub-composition", "regression", "selector"], + "minPsnr": 20, + "maxFrameFailures": 10, + "minAudioCorrelation": 0.0, + "maxAudioLagWindows": 120, + "renderConfig": { + "fps": 24 + } +} diff --git a/packages/producer/tests/sub-comp-id-selector/output/output.mp4 b/packages/producer/tests/sub-comp-id-selector/output/output.mp4 new file mode 100644 index 000000000..ab61b88b6 --- /dev/null +++ b/packages/producer/tests/sub-comp-id-selector/output/output.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f86791eaf7839adcd9e71ba6d1d56f3d970e6a155e8ac227947540e7a1990229 +size 47948 diff --git a/packages/producer/tests/sub-comp-id-selector/src/index.html b/packages/producer/tests/sub-comp-id-selector/src/index.html new file mode 100644 index 000000000..bafbd7fde --- /dev/null +++ b/packages/producer/tests/sub-comp-id-selector/src/index.html @@ -0,0 +1,48 @@ + + + + + + + + +
+
+
+ + + diff --git a/packages/producer/tests/sub-comp-id-selector/src/intro.html b/packages/producer/tests/sub-comp-id-selector/src/intro.html new file mode 100644 index 000000000..ec035adb9 --- /dev/null +++ b/packages/producer/tests/sub-comp-id-selector/src/intro.html @@ -0,0 +1,42 @@ + diff --git a/packages/producer/tests/sub-comp-t0/meta.json b/packages/producer/tests/sub-comp-t0/meta.json new file mode 100644 index 000000000..4395628a9 --- /dev/null +++ b/packages/producer/tests/sub-comp-t0/meta.json @@ -0,0 +1,12 @@ +{ + "name": "Sub-composition timeline activation at t=0", + "description": "Regression for: sub-composition timelines at data-start near 0 were not activated during renderSeek, causing GSAP-animated elements to stay invisible. The fix activates nested child timelines before every render frame seek.", + "tags": ["sub-composition", "regression", "timeline"], + "minPsnr": 25, + "maxFrameFailures": 5, + "minAudioCorrelation": 0.0, + "maxAudioLagWindows": 120, + "renderConfig": { + "fps": 24 + } +} diff --git a/packages/producer/tests/sub-comp-t0/output/output.mp4 b/packages/producer/tests/sub-comp-t0/output/output.mp4 new file mode 100644 index 000000000..dc54eb285 --- /dev/null +++ b/packages/producer/tests/sub-comp-t0/output/output.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d85ea36a219e5ffbeed672a075a6cfb8ecb71e175753c4f5b8407e67abe29fc9 +size 18186 diff --git a/packages/producer/tests/sub-comp-t0/src/compositions/hook.html b/packages/producer/tests/sub-comp-t0/src/compositions/hook.html new file mode 100644 index 000000000..a2c1f1947 --- /dev/null +++ b/packages/producer/tests/sub-comp-t0/src/compositions/hook.html @@ -0,0 +1,61 @@ + diff --git a/packages/producer/tests/sub-comp-t0/src/compositions/later.html b/packages/producer/tests/sub-comp-t0/src/compositions/later.html new file mode 100644 index 000000000..5de12b5ba --- /dev/null +++ b/packages/producer/tests/sub-comp-t0/src/compositions/later.html @@ -0,0 +1,43 @@ + diff --git a/packages/producer/tests/sub-comp-t0/src/index.html b/packages/producer/tests/sub-comp-t0/src/index.html new file mode 100644 index 000000000..00d00a260 --- /dev/null +++ b/packages/producer/tests/sub-comp-t0/src/index.html @@ -0,0 +1,88 @@ + + + + + + + + + +
+ +
+ + +
+
+ + + +