plan now lists every external request the Build will make, one entry per
request, and runs the plan's Producers that need nothing from outside so
each request's exact constraints exist before submission. Parameters are
read off the request itself (scalars by their own names, prose as a word
count, referenced media counted by kind); no model-specific field table
lives in the CLI. A request whose references are still to be generated
reads the author's request draft upstream and says the references are
pending. Requests with the same shape are grouped and counted, word counts
shown as a range.
Core scheduling becomes incremental: a ready Producer no longer waits for
an unrelated external request that shared its scheduling turn, which is
what let plan-time evaluation reach every request and also stops Builds
serializing cheap steps behind long paid ones.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
A project-local package builds its picture in TypeScript: its Producer returns a list of elements, and
the field names on those elements are fixed by the Composition Types it imports. Nothing authored
carries them, so `check` had no Record to validate — the object does not exist until the Producer
runs, which is at Build. A media element's artifact field is `artifact`, and a package writing
`source` instead passed `check` completely green and failed a paid Build.
The compiler decides those names without running anything, and it never ran on a project: the CLI
loads TypeScript through tsx, which strips types without reading them, and the tree's own
`tsconfig.json` covers the packages it ships rather than the ones a project writes.
`hypit check` now typechecks `<project>/packages/*/src`, with the options the Distribution checks
itself by, so a project package is held to the standard the packages it imports are held to. Node
resolution reaches none of those from a project — Hypit finds `@hypit/x` by its own walk to
`<root>/packages/x` and nothing links it into `node_modules` — so the mapping is read out of each
Distribution package's own `exports`.
Measured on a real project: `hypit check` takes 1.8s in total. As authored it reports one error, a
real one nobody had seen — a label passed to an assertion that takes none, so its refusal names
nothing. With the reported typo injected it reports that one plus exactly
`TS2353: 'source' does not exist in type 'VisualMediaElement'`, at the file and line. Every shipped
example reports none.
Separately, the Build-time refusal was describing a state it manufactured. Spreading an absent
artifact produced `{}`, so the field the author actually wrote was dropped without a word and the
identity check one call later reported `.artifact` as invalid — a field they had not typed. A media
element with no artifact now says so.
`hypit-whisperx-prepare` failed for a reason other than the one reported: `download_dir` is explicit,
so `NLTK_DATA` never decided anything. `nltk.download` fetches its index before it looks at what is on
disk, so preparing an installation that needed nothing still needed the network. Already installed is
now already done.
Two facts a package author needs, placed where the author is already reading rather than in a
document: a Type is its owning Module and its name, and two Types with identical value shapes are
distinct; `blobArtifact` is declared by `@hypit/artifact`, which is the Module that identifies it
whatever re-exports it.
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.
The umbrella video-contracts package collapsed eight unrelated
vocabularies into one release unit. Public video communication now
lives in small, independently versioned contract packages: narrative,
media, program-space, speech, speech-evidence, semantic-map, visual-ir
and composition. Speech implementation packages are renamed for what
they do (speech-spine, speech-basis, speech-alignment), realization
folds into run, and hyperframes-render becomes render-hyperframes with
a renderer-neutral Visual IR spec. Every model package gains a direct
activation entry, and shared video test fixtures move to test-support.
Example package locks are regenerated for the decomposed closure; the
graph-check, live, echo-pro-aroll and bootstrap sources all compile
against the new package set.
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.