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.
Every page carried a frontmatter `title` and repeated it as a body `# `, which
the site renders as two headings with two permalinks. The heading text matched
the frontmatter on 41 of the 43 pages; on the two quickstarts it did not, so
"Make a video with your Agent" and "和 Agent 一起制作视频" give way to the
titles already in their frontmatter.
Each step's video now sits directly under that step's heading rather than after
its prose, and the avatars link keeps a blank line beneath it.
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.
estimate:Speech leaves the Author Surface and the Build graph. A duration
is the author's decision, written as a literal on the element that needs
it; the graph computes none, so a Build plan is complete before it starts.
- @hypit/estimate keeps only the measurement library and the
SpeechEstimatePolicy type; its Surface, Producer and fragment are gone.
Policies can be read from an SVS Recipe or from attributes.
- hypit measure joins the creation tools: it counts a Segment's
pronunciation units from the compiled author source (or --text) at the
chosen delivery policy and prints the seconds to write as the literal.
- seedance: duration is a literal only; the DurationProgram deferral, its
type, producers, fragment and schema are removed.
- media:StillVideo: duration is a literal in seconds, published as an
ordinary SpeechDuration Record for its plan step.
- estimated:SemanticTake owns its policy, inline or as policy={recipe},
and publishes it as <id>.policy.
- preview-mock reads program duration from SpeechDuration Records and the
duration port of generation requests; compiler-node's plan-time
pre-evaluation of estimate is removed.
- The 13 example sources and the media-track preview carry the seconds
hypit measure produced for each Segment; the quickstart, styles and
packages guides and the Skill's twelve passages describe the literal.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* fix: a token window is two numbers before it decides which words render
The type said two numbers and nothing checked it. A batch entry is JSON a
caller writes by hand, so `"79:86"` arrived as a string, and destructuring one
yields its first two characters: `from` became `"7"` and `to` became `"9"`.
The guard below compared strings — `"9" > "7"` holds, and `"9" <= 135` holds
once it coerces — so the window passed as valid and words 7 to 9 rendered
under the name of words 79 to 86, with the call reporting success.
Checked where the window enters: the render path, and the two tools that log a
stretch without rendering one. The CLI flag already parsed `from:to` into a
pair, so only the hand-written batch reached this.
* fix: an authoring check resolves the standard vocabulary from the Distribution
A project installs its own packages against itself, and `@hypit/*` comes from
the Distribution the command was launched from. The check loaded against the
project root alone, so every standard import resolved nowhere and the report
opened with `17 imported packages could not be resolved from <project>, so
nothing is known about what the Source draws` — on any project whose Source
imports the ordinary vocabulary, which is all of them.
`previewCheck` a few lines above already reads `videoCliDistribution` and every
other loader call site in the repository passes `fallbackRoots`. This one did
not.
* fix: a Media unit's source forms are the three the surface accepts
`video=` and `audio=` were removed from Item, Member and Layer in fbfcce3a,
which put purpose-written refusals in their place. The manifest kept
advertising both, so `inspect_svml_vocabulary` handed authors an attribute the
loader answers with `media-track:Item does not accept video.` The quickstarts
taught it too, in both languages, alongside a paragraph explaining how `video=`
expanded into the graph.
A generated or imported Blob reaches a Track through `<pipeline:Normalize>`,
whose `.media` output connects to `media=`; `audio="default"` on the Normalize
carries the source's own sound where `audio="include"` used to.
A full reconstruction reported fourteen places the route cost it time. Twelve held. What is here is
the subset that changes the next run rather than the last one, and most of it is code: a fact stated
in a document is a fact every future reader has to carry, so where the tool could stop being wrong
instead, it does.
**The cut re-anchors instead of dropping.** An element given the span it occupies and a Moment to
close it — `during="program" until={story.moment.done}` — is on screen for the whole of any stretch
that ends before that word. `render_element` dropped it, so the one element a reference is about was
unrenderable over every Segment but the last, while the loop asks for it to be compared over each of
them. A close that has not arrived is now removed from the tag and the element stays. Marked before
the cut it really is gone, and marked inside it survived already. Measured on the run that found it:
one Segment renderable before, four after, and the two that still refuse now name a Producer failure
the drop was hiding.
**The package root comes from the Run.** It was the working directory, so naming a Run by path
resolved its imports somewhere else and the project's own elements read as packages that do not
exist. It is now the nearest `package.json` at or above the Run — the same walk `hypit check` makes.
`--package-root` still overrides it and is no longer needed to check a project from anywhere.
**The mock's frame is a hairline.** At a twentieth of the shorter side it was fifty pixels thick on a
full-frame mock, and an observer measuring what an element covers read that as the element stopping
short of the edge — reported every round, about the mock rather than about the Source.
**The comparison names its own pair.** The prompt asks for each difference to say which of the two it
is in, and `observers.md` says which is which: one is the reference, two is the render. The observer
is not told, and the caller was not either.
**`--reference-id` is in the command block** it was missing from, with what it decides. Six of the
run's first comparisons were refused for a mismatch this flag exists to prevent, and it was found by
grepping the tool's source.
Corrections that cost no length: `vocabulary.md` had the inspect output's shape wrong — Recipe
properties are inside the `recipe` attribute, not beside `attributes` — which is why the run read the
file's central claim as false. `styles.md` and `composition.md` documented two Cue keys the Style
refuses and a `display=` that is `document=`.
Two facts moved to where the reader already is rather than into the skill: `media-track`'s `extent`
summary says the ratio is what it decides, and `VisualElement` says position is measured from the
parent. The other runtime-only errors already name their own fix.
`b32e8253` replaced both Playgrounds with `packages/studio`, but the rename
stopped at `examples/`. The skill and the docs still named the tool, the
command and the recipe sheet that no longer exist.
`studio.svs` becomes `recipes.svs` with its import alias, in the 39 files the
examples rename had left behind — docs, the `docs/zh` mirrors, the skill
references and the package manifests whose authoring snippets show the alias.
The old name was already loose, since an `.svs` file is a parameter-recipe
sheet rather than anything Studio reads; once `studio` names the application
it reads as Studio's own config file, which it is not. Two test fixtures keyed
the alias as a plain string rather than inside `{}`, so they moved with it —
`packages/text` had a real reference to `recipes.shot` resolving against a
`studio.shot` fixture.
`pnpm svml:playground -- --source main.svml` becomes `pnpm studio -- --run
build.svrun` throughout. The Run Source is not an optional extra any more:
Studio's unit of work is the Run, and it reads the Author SVML back out of it.
`preview-check.mjs` imported `svml-playground/src/pipeline/preview.js`, which
this branch deleted, so the skill's own build gate had been dead since
`b32e8253`. It is rebuilt on Studio's real entry path — `loadStudioDomain`,
`loadStudioRun`, `inspectStudioRun`, `readStudioSession` — and reports
`provenance.errors` and unresolved Candidates instead of the `waiting` and
`stand-in` fields Studio no longer has. It stays in URL space for Windows, as
`e0ecccb9` established, and closes the archive before exiting rather than
leaving it open behind a `process.exit` in a `try`.
The preview pages are rewritten rather than renamed, because what they
describe is gone. Studio has no stand-ins, no black frames and no estimated
timing; it refuses to open and names what is missing. So the pages document
the five refusals verbatim, and say plainly that a Source still declaring
ungenerated shots will not open — including the warning that no example in
this repository currently does. Running the ported check over all nine
committed Run Sources: six refuse on unresolved capabilities or a target that
is not a Film, and three on footage under the gitignored `examples/**/assets/`.
Claiming otherwise would have shipped a quickstart whose first command fails.
`pnpm check` clean; `pnpm test` 510 pass, 0 fail; `pnpm test:release` 8 pass.
Replace the generic playground with a file-backed Caption Playground, separate source workspaces from installed package roots, and derive exact transitive Module providers in Node package locks.
Remove all "Echo Pro" third-party product references from docs and
examples. Rename examples/echo-pro-aroll to examples/talking-head-aroll.
Add custom TextMate grammar for SVS (hybrid XML+CSS) syntax highlighting
in VitePress. Remove quickstart index "Next" sections.
Break the single quickstart.md into 7 sub-pages covering Script,
SVS Stylesheets, Media & Generation, Timing & Assembly, Tracks,
Film & Rendering, and Run Source & Builds. Each component has
standalone usage examples and combination examples. Chinese
translations for all 7 sub-pages.