Keep a clip that starts later playing at its first frame

The e2e 68 check "a clip that starts later" was red in 3 of the last
8 suites (CI tasks 697, 703, 712). Two causes sat on top of each other.

- The check measured too late. It started sampling after play(), and
  under CI load the clock was already at 0.05 to 0.22 s. It now starts
  before the click, like 68d does.
- Measured early, a real bug showed: the video held for one frame at
  its first picture. The first picture triggers a redraw, and the game
  takes its first step in the same frame. readSpeed got both calls with
  the same frame time and divided by 1 ms. The speed came out at 16.7x,
  which counted as a jump, so the player paused.
- readSpeed now measures a step without elapsed wall time against one
  frame at 60 fps. A real jump still counts as a jump.
- e2e 34 "the pause holds the stream" also failed in task 712. Its
  cause is still open. The failure message now names the state before
  the pause, so the next red run shows where the samples got lost.

Tests:
- video-follow.test.ts 18/18, the new test is red without the fix
- e2e 68 on melektaus-atx: ALL PASSED, 21 checks
- Gate on melektaus-atx: CHECK EXIT 0, 314 files, 4853 tests

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
adminandClaude Opus 5.5 committed 2026-10-16 08:40:11 +02:00
1 parent 0d7672a5af
commit 5b9d084dfe
4 files changed
+42 -12

No files matched your search

+10
View File
@@ -44,6 +44,16 @@ describe('the speed of the asked time', () => {
expect(readSpeed(readSpeed(null, 0.8, 0), 0.8 + 2 / 60, 16).speed).toBe(1);
});
it('counts a first step in the same frame as the ask before it as a start', () => {
// The first picture redraws the view at once, then the game steps within the same frame.
let reading = readSpeed(null, 0.8, 0);
reading = readSpeed(reading, 0.8, 16);
reading = readSpeed(reading, 0.8 + 1 / 60, 16);
expect(reading.speed).toBe(1);
// Within one frame a jump is still a jump.
expect(readSpeed(readSpeed(null, 0.8, 0), 0.9, 0).speed).toBe(0);
});
it('does not count a jump faster than a video plays, or a time running back, as a start', () => {
expect(readSpeed(readSpeed(null, 0.8, 0), 0.9, 16).speed).toBe(0);
expect(readSpeed(readSpeed(null, 0.8, 0), 0.8 - 1 / 60, 16).speed).toBe(0);