Preserve forwarded Result values without eager materialization, advance live Builds from disposable indexes, and bound HyperFrames resource, source-frame, and output work.
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.
Let HyperFrames render explicit frame intervals with independent browser workers, and make Runtime account for request-dependent resource units across Builds. Preserve external Operations while stopped executions settle so capacity is released only after real work ends.
`claim` selects only `queued` and `waiting` Dispatches, and a Dispatch carries no
worker identity or lease, so nothing separates one whose Worker is alive from one
whose Worker is gone. A Worker stopped between claiming a Dispatch and finishing it
therefore left it `running` for good, still holding the lane capacity it reserved —
capacity that is deliberately retained across a `pending` result and released only by
the same Worker observing the operation end.
Every later Build then queued behind a slot nobody held, and `cancel` could not clear
it either, because cancelling runs on a claimed Dispatch. The visible state was a
queue that never moved while `Active Operations` stayed `0`, and restarting the Worker
— the one repair that suggests itself — could not help.
One Worker owns a Runtime, so a `running` Dispatch at startup is abandoned by
construction: release its capacity and return it to `queued`, where it is claimable
and its cancellation can run.
The runtime reference gains the reading that distinguishes this state, and the
project-`package.json` requirement that keeps package discovery inside the project.
Every workspace manifest omitted a license field, so a scanner reading
the published repository would resolve all 90 of them as unknown. Both
Python services went further and declared plain Apache-2.0, which is
looser than the LICENSE they actually ship under.
Package bytes feed the example package locks, so adding the field
invalidated all three; refreshed them. Only closureDigest and artifacts
move — same 31 selected packages, nothing added or removed.
Also record what the READMEs never said: ffmpeg is a real prerequisite
for a Build and had zero mentions, and the media Lambda layer is a GPL
FFmpeg build. That build is deliberate — libx264 is GPL-only and the
encode path requires it — and it stays lawful only because the operator
builds and deploys it into their own account. Publishing a prebuilt
layer would break that, so the boundary is now written down.
Deleting the aliases in 99fccf8 removed the declarations but left their
doc comments, which slid onto whatever followed. Two live functions were
left marked @deprecated — selectedSatisfaction, which the plan compiler
calls, and operationResultRecord, which is unrelated to either word — and
a third comment trailed at the end of plan.ts above nothing. A comment
that lies is worse than the alias it described.
Two more aliases survived that pass because it scanned `export const` and
these are `export type`: NodeComponentPackage and
LocalBuildSchedulerOptions, both marked deprecated, neither with a
consumer outside its own file.
On the words themselves: Candidate and Satisfaction are not two names for
one thing. A Candidate is supply — a way the graph can produce a value. A
Satisfaction is the request's choice of which Candidate answers which
Logical Output, and how faithfully. Both are needed and both are wire
types.
The friction was one function. selectedSatisfaction promised a
Satisfaction and returned the Candidate that a Satisfaction names, which
is presumably why someone once aliased it to selectedCandidate. It is now
satisfiedCandidate, which says what comes back, and a comment states the
distinction so the alias has no reason to reappear.
Narratage (narration + montage) is the project, framework, npm scope
(@narratage/*) and CLI command. SVML remains the name of its markup
language, so file suffixes (.svml/.svs/.svrun), source Headers and
svml.* wire format ids are intentionally unchanged. Example locks are
regenerated because package manifests participate in artifact digests.