Load compositions without a GSAP timeline

A valid document still loads. A real script failure keeps its own message.

Audited 3 boundaries · Not exercised 4 composition classes · No new authoring format
hyperframes @ 9701f0da61ddbf32d0c9d7bbf4fabc02b3ee3263 · 2026-10-07
In one breath. The document already owns duration and Studio already records early script errors, but the probe accepts only a positive adapter duration.

Where the value travels

flowchart LR D[Document and scripts] --> P[CompositionProbe] P --> H[Player error event] H --> R[React Player] R --> N[NLE shadow] N --> S[Shadow discard] S --> T[Editor toast]

The contract, per boundary

Document duration

Use the existing root declaration or timed clip ends. Do not invent a timeline length.

readStaticCompositionMeta(doc: Document):
 { width: number | null; height: number | null;
   fps: number; durationSeconds: number } | null
Producer: packages/core/src/runtime/compositionLength.ts:141, declaration read at152; package-subpaths.json:323 exposes runtime/composition-length. Current probe consumer composition-probe.ts:118 requires adapter.getDuration() >0. Proposed reuse is not exercised.
existsexport reachableprobe does not read

Early script failures

The preview server captures browser errors before author scripts execute. Read that same buffer before reporting readiness or a timeout.

var seen=window.__hfPreviewErrors=[];
addEventListener("error",function(e){seen.push(e.message||String(e))});
Producer: packages/studio-server/src/routes/preview.ts:326, inserted at338 before scripts. Constant: packages/core/src/studioPreviewMark.ts:4. Existing reader: packages/studio/src/hooks/useConsoleErrorCapture.ts:68. New probe read not exercised. Resource events may yield generic Event text; unhandled rejection is not captured by this producer.
existssame-origin reachableserver writes; console reads

Probe result and failure

A probe error discards the hidden edit preview while the live preview stays visible.

onReady: (result: ProbeResult) => void;
onError: (message: string) => void;
new CustomEvent("error", { detail: { message } })
Producer: composition-probe.ts:123/136; hyperframes-player.ts:208. Accepting lines: studio/player/components/Player.tsx:241, components/nle/NLEPreview.tsx:556, player/hooks/useShadowPreviewReload.ts:116, components/EditorShell.tsx:186. Ready accepts duration and adapter at hyperframes-player.ts:1305.
existswired through every layerprobe writes; toast reads

How it says no

CauseCurrent observableEvidence
No GSAP or no positive adapter durationComposition timeline not found after 8scomposition-probe.ts:118/134
Real early script errorSame timeout if no adapter appearsProbe has no early-error reader; error buffer reader search bounded to all packages excluding generated/dist
Injected runtime never appearsProbe can wait indefinitelyEarly return at115 bypasses timeout at134

Decisions only you can make

1. Slow initialization with no usable document duration

The task already decides valid document duration and real script errors. The remaining wait policy is unknown: a probe failure at8s discards a shadow whose outer budget allows up to45s.

OptionConsequence
Keep finite8s failurePreserves the existing probe budget. Slow unresolved initialization still fails, with an accurate readiness cause.
Let the outer shadow budget own waitingStudio can accept initialization after8s; embeddable player needs its own finite bound. Changes lifecycle scope.

Recommendation: first prove the slow class with real browser fixtures. Preserve the existing finite probe budget unless that evidence calls for a separately owned wait policy.

Coverage, honestly

Audited: producer bodies and accepting lines above at the pinned main ref.

Trusting: no runtime claims credited from mocks.

Not exercised: CSS-only, bare render(t), WAAPI, zero-duration timeline, script failure, and delayed initialization still need red tests and real reload captures. No implementation has been written.

What would prove this page wrong