diff --git a/packages/cli/src/commands/snapshot.ts b/packages/cli/src/commands/snapshot.ts index a8f654f67..f9158f20a 100644 --- a/packages/cli/src/commands/snapshot.ts +++ b/packages/cli/src/commands/snapshot.ts @@ -276,6 +276,7 @@ async function captureSnapshots( for (let i = 0; i < positions.length; i++) { const time = positions[i]!; + // 30 = runtime's default canonicalFps (not exposed on PlayerAPI) await page.evaluate((t: number) => { const player = (window as any).__player; if (!player) return; diff --git a/packages/core/src/runtime/init.ts b/packages/core/src/runtime/init.ts index af7e8529b..11b84dc22 100644 --- a/packages/core/src/runtime/init.ts +++ b/packages/core/src/runtime/init.ts @@ -1634,6 +1634,8 @@ export function initSandboxRuntimeModular(): void { player._timeline = state.capturedTimeline; } + // __renderReady = timeline is bound, safe for deterministic seeking. + // fileServer.ts sets this immediately (no timeline to bind in its runtime). if (state.capturedTimeline) { (window as Window & { __renderReady?: boolean }).__renderReady = true; } diff --git a/packages/producer/src/services/fileServer.ts b/packages/producer/src/services/fileServer.ts index 262ba4308..17c383a98 100644 --- a/packages/producer/src/services/fileServer.ts +++ b/packages/producer/src/services/fileServer.ts @@ -390,6 +390,8 @@ const RENDER_MODE_SCRIPT = `(function() { }, }; window.__playerReady = true; + // Media-fallback player has no timeline to bind, so render-ready is immediate. + // init.ts defers __renderReady until the timeline is bound — different runtime. window.__renderReady = true; return true; }