From 8ba3c339156c9d96dd08407019b550191851e5e5 Mon Sep 17 00:00:00 2001 From: Vance Ingalls Date: Wed, 8 Jul 2026 15:21:05 -0700 Subject: [PATCH] fix(engine,producer,cli): close review gaps in sub-timeline fail-fast MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Address PR #2045 review feedback: - Share a SubTimelineWaitOutcome type (engine) end-to-end instead of widening to string across CapturePerfSummary / RenderPerfSummary / telemetry, so the three layers can't drift. - Dedupe scriptLoadFailures on push — a 4xx response and its trailing requestfailed both recorded the same URL, doubling the failed-URL list in the fail-fast warning. - Thread the sub-timeline-wait outcome into render_error (not just render_complete): a render that fail-fasts and then fails downstream (pollVideosReady, extract, encode) previously dropped this signal on the floor. dedupPerfs is now function-scoped so the catch path can read it, same treatment as the existing captureAttempts array. --- packages/cli/src/telemetry/events.ts | 6 ++-- .../cli/src/telemetry/renderObservability.ts | 9 ++++-- packages/engine/src/index.ts | 1 + packages/engine/src/services/frameCapture.ts | 19 ++++++++--- packages/engine/src/types.ts | 11 +++++-- .../producer/src/services/render/cleanup.ts | 8 ++++- .../src/services/render/perfSummary.ts | 32 ++++++++++++------- .../src/services/renderOrchestrator.ts | 24 +++++++++----- 8 files changed, 79 insertions(+), 31 deletions(-) diff --git a/packages/cli/src/telemetry/events.ts b/packages/cli/src/telemetry/events.ts index db4f30feb..b138778f1 100644 --- a/packages/cli/src/telemetry/events.ts +++ b/packages/cli/src/telemetry/events.ts @@ -1,8 +1,11 @@ import { redactTelemetryString, type OutputResolutionIssueKind } from "@hyperframes/core"; +import type { SubTimelineWaitOutcome } from "@hyperframes/engine"; import { trackEvent } from "./client.js"; import { readConfig } from "./config.js"; export interface RenderObservabilityTelemetryPayload { + /** Worst sub-composition timeline wait outcome across sessions. */ + subTimelineWait?: SubTimelineWaitOutcome; observabilityRenderJobId?: string; observabilityCompositionHash?: string; observabilityEventCount?: number; @@ -47,6 +50,7 @@ export interface RenderObservabilityTelemetryPayload { function renderObservabilityEventProperties(props: RenderObservabilityTelemetryPayload) { return { + sub_timeline_wait: props.subTimelineWait, observability_render_job_id: props.observabilityRenderJobId, observability_composition_hash: props.observabilityCompositionHash, observability_event_count: props.observabilityEventCount, @@ -148,7 +152,6 @@ export function trackRenderComplete( captureAvgMs?: number; /** Warmup-robust per-frame capture median (basis for speedup estimates). */ captureP50Ms?: number; - subTimelineWait?: string; /**