Preserve forwarded Result values without eager materialization, advance live Builds from disposable indexes, and bound HyperFrames resource, source-frame, and output work.
Studio opens in the browser's color scheme and a top-bar button switches
between light and dark. A choice that differs from the browser is kept in
localStorage; choosing the browser's own scheme returns to following it.
Each theme-dependent color is written as light-dark(light, dark), with the
dark value unchanged, and data-theme on <html> sets color-scheme. The light
palette uses hypit.ai's warm neutrals. Timeline items tint their track hue
over white, with text and audio waveforms in a deep shade of the same hue.
path.relative of a workspace file named ..keep.svml is the string
..keep.svml. Treating any relative result that starts with .. as an
escape rejected that file as SOURCE_OUTSIDE_ROOT, and the same
predicate was copied into source discovery, Build Result project
paths, Studio writes and CLI short paths.
Use the repository's existing check: only `..` and `..${sep}` are
parent traversal. A Source still cannot import ../outside.svs.
Place prepared Takes on an independent Timeline with gaps and overlaps. Present picture, sound and captions through explicit Use rules while preserving source timing and project-authored styles.
Unify Companion bands, parameter ownership and source writeback in Studio. Migrate components, examples and authoring guidance, remove retired Speech/Semantic Track interfaces, and retain protocol identifiers at @1.
Validation: repository suite (786 tests; six sandbox-blocked tests passed on permitted rerun), 43 Studio tests after audit fixes, TypeScript, public declarations, four example-package builds, chat Source check and npm file inventory.
Keep reused media as explicit references, publish Result changes only when needed, and replace Windows files without timed retries. Clarify environment selection and CLI output.
Refine Studio task and media browsing, editable display names, inline media previews, single-row track overlap, semantic ruler pinning, and Companion-owned Ranking selection.
Speech publishes semantic timing and original audio. Media Performance and project components consume the prepared material, preserving source offsets across Takes while controlling their own framing and motion.
Add explicit renderer programs for coordinated HTML/CSS/JavaScript scenes, with typed media children, backdrop filtering and blending. Remove stand-in and estimated-take preview paths, migrate Sources and documentation, and demonstrate a Moment-driven video-to-diagram handoff.
A stand-in is an ordinary Run Candidate for a generated output that has not
been bought yet. It is derived, never restated: every exact-model package built
with model-kit now exports one <key>-stand-in Run Fragment that reads the
model's published draft (resolution, aspect ratio, duration, generateAudio),
the same prompt Text edge and the piece's clock, and asks the draw-card
capability of @hypit/stand-in for a card of exactly that frame and length. What
cannot be derived — an automatic duration, a video model without an aspect
ratio, an audio model — is refused with the reason.
media.local serves draw-card. The card is drawn in Node with a built-in 5x7
bitmap face (this machine's ffmpeg has no drawtext): a ground coloured by kind,
a thick border, a diagonal STAND-IN watermark, the kind in large type, the
model, frame and duration, a prompt excerpt, and for video a running timecode,
frame counter and progress bar composited frame by frame by ffmpeg; a model
that would have spoken leaves a silent track so A-roll recipes find their
audio stream. The card is a Blob of the output's type and goes through
inspect and normalize like the real thing; plan lists it at local price and
Studio executes it as a local Need.
Verified in a Studio session: the media-track preview with three stand-in
fragments and an estimated take displays in about two seconds. The empty
mock-media, preview-mock and semantic-take-preview directories are gone.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Studio can only show media that has been normalized, and normalization is a
Need served by the Profile's local FFmpeg Endpoint. A Studio that installs no
Endpoint therefore rejects every file Candidate: satisfying the generated
output leaves inspect-media and normalize-media unresolved, and a file cannot
satisfy the normalized output's type. The deleted path-based preview bypass
answered this question with the wrong mechanism; this is the right one.
The Runtime Host gains localEndpoints(): every Endpoint the Profile selects
whose Provider declares local pricing, immediate capabilities only, with the
Profile's bindings applied. A capability bound to a priced Endpoint stays
unresolved rather than falling to a local one. Studio preflight and execution
resolve Needs through that registry, exactly as plan and a Build do minus every
priced Endpoint, and name the capability when a Need reaches nothing free.
Verified on the media-track preview with three file Candidates and an
estimated semantic take: normalized through media.local and displayed in
306 ms. Duplicate studio.svrun files that were byte-identical to a sibling Run
are removed; a Run's path carries no semantics.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Studio installs the local FFmpeg endpoint for a preview Run and whitelists the
deterministic media capabilities it serves, but only in the startup preflight.
The session every browser request runs called inspectStudioRun without them, and
the endpoints threaded into studioPlugin never reached readStudioSession at all,
leaving its own endpoints field dead.
A preview Run therefore started and then refused each request with "the Studio
projection closure requires unresolved capabilities:
@hypit/media-pipeline@1#inspect-media, @hypit/media-pipeline@1#normalize-media".
Pass the endpoints through to the session and resolve the same capability set
there, named once beside inspectStudioRun rather than duplicated.