From 7400fe2fd73ca7667a974646ce58962622f7875d Mon Sep 17 00:00:00 2001 From: DCCONSTRUCTIONS Date: Mon, 24 Aug 2026 00:41:29 +0300 Subject: [PATCH] fix(lab): preserve explicit replay seeks --- .../laboratory/useRecordedEvidencePlayback.ts | 7 +++++++ .../test/m4ReplayThreat.test.mjs | 18 +++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/apps/control-station/src/components/laboratory/useRecordedEvidencePlayback.ts b/apps/control-station/src/components/laboratory/useRecordedEvidencePlayback.ts index 1ad45a0..859a49f 100644 --- a/apps/control-station/src/components/laboratory/useRecordedEvidencePlayback.ts +++ b/apps/control-station/src/components/laboratory/useRecordedEvidencePlayback.ts @@ -45,6 +45,13 @@ export function synchronizeRecordedEvidencePlayback( observed: RecordedObservationPlayback, range: RecordedEvidencePlaybackRange, ): RecordedObservationPlayback { + if (!current.playing) { + // A paused transport also covers every explicit operator seek. Native + // callbacks from the previously displayed frame remain stale until the + // controlled video effect has applied that target, so they cannot move the + // shared LAB clock at all while the operator state is paused. + return current; + } const currentSeconds = clampRecordedEvidenceSeconds(observed.currentSeconds, range); return { ...current, diff --git a/apps/control-station/test/m4ReplayThreat.test.mjs b/apps/control-station/test/m4ReplayThreat.test.mjs index 7128795..1cfb57c 100644 --- a/apps/control-station/test/m4ReplayThreat.test.mjs +++ b/apps/control-station/test/m4ReplayThreat.test.mjs @@ -403,7 +403,23 @@ test("recorded VIDEO clock cannot reverse an explicit operator pause", () => { { currentSeconds: 15.1, playing: true, rate: 1 }, range, ), - { currentSeconds: 15.1, playing: false, rate: 2 }, + { currentSeconds: 15, playing: false, rate: 2 }, + ); + assert.deepEqual( + synchronizeRecordedEvidencePlayback( + { currentSeconds: 10, playing: false, rate: 2 }, + { currentSeconds: 15.1, playing: true, rate: 1 }, + range, + ), + { currentSeconds: 10, playing: false, rate: 2 }, + ); + assert.deepEqual( + synchronizeRecordedEvidencePlayback( + { currentSeconds: 12, playing: true, rate: 2 }, + { currentSeconds: 15.1, playing: true, rate: 1 }, + range, + ), + { currentSeconds: 15.1, playing: true, rate: 2 }, ); assert.deepEqual( synchronizeRecordedEvidencePlayback(