fix(studio): the timeline scroll gate catches dropped frames in the virtualized view - #4855
Draft
miguel-heygen wants to merge 3 commits into
Draft
miguel-heygen wants to merge 3 commits into
miguel-heygen wants to merge 3 commits into
Conversation
Edit accuracy: 835 passing here, 835 on the base branchThe gate passes. Quarantined, measured but not gated (9)
|
miguel-heygen
force-pushed
the
fix/studio-viewport-gate-virtualized-limit
branch
from
October 1, 2026 14:56
e945e4f to
e3338bf
Compare
miguel-heygen
force-pushed
the
fix/studio-viewport-gate-virtualized-limit
branch
from
October 1, 2026 15:58
e3338bf to
f8f419d
Compare
miguel-heygen
force-pushed
the
fix/studio-viewport-gate-virtualized-limit
branch
from
October 1, 2026 16:52
f8f419d to
8d8b4b3
Compare
This branch has not been 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.
The timeline viewport gate now catches a scroll that drops frames in the virtualized timeline on CI. A 45 ms stall on every scroll step used to pass it.
What changes
responsivenessLimitsin the verdict module. The gate script reads it from there.timeline-viewport-gate-evidenceartifact keeps every measured step's interaction and frame interval, per arm and per attempt (attempts[].runs[].interactions/frameIntervals), so a red can be recomputed later.Why these numbers
A pooled p95 over 315 steps fails once 16 of them are over the limit.
False fails on normal builds. Every CI run today that carries per-step evidence: 68 normal virtualized attempts from 67 PR runs, judged single-shot.
At 41.7 ms the fails were all on interactions: 17-39 steps at 3 frames, spread across all five runs (a slow runner, not a slow start), and frame intervals stayed under the limit (at most 9 steps over 25 ms). The earlier analysis predicted 0% at 41.7 from too little per-step data, so the fallback rule fired before merge and the interaction limit stepped to 58.3 ms. With the rerun a false fail needs two failed attempts in a row; at 58.3 none of the 68 had a single one.
Catching the 45 ms stall, with the rerun. A throwaway build injected a 45 ms stall into every timeline scroll step and ran the virtualized arm 10 times on CI.
CI time per arm. A normal pass runs one attempt, unchanged: about 40 s for the virtualized arm and 35 s for the unvirtualized one. A failed attempt adds one more, about 17 s on a normal build and 30 s on the stall build (a stall arm takes 67-68 s end to end). The steps per run are unchanged.
False fails are counted per arm, each against that arm's own limit: the unvirtualized arm's against its 75 ms, never toward the virtualized limit. For example, #4836's unvirtualized arm read 82, 82, 39, 49 and 47 ms interaction p95 per run on a busy runner; that counts against 75 ms.
This PR's own CI. The virtualized arm applied 58.3 / 25 and passed on its first attempt: interaction p95 33.2 ms with 0 of 315 steps over 58.3, and frame p95 16.8 ms with 1 of 315 over 25. The unvirtualized arm passed at 75 / 75 (61.8 / 33.4 ms).
Tests
timeline-viewport-verdict.test.mjs:Before
Main's limits on recorded CI samples: the 45 ms stall run passes.
After
This branch's limits and rerun on the same samples: both stall attempts fail, and a normal run still passes.