Commit Graph

40 Commits

Author SHA1 Message Date
kashorin db4e545d1e refactor: rebuild the domain-neutral language host 2026-10-07 20:44:28 +08:00
kashorin cdd087711d chore(protocol): keep unpublished formats at version 1 2026-09-09 17:26:39 +08:00
kashorin d161dd77c0 refactor(stand-in): select generic media candidates from runs 2026-09-07 04:25:49 +08:00
kashorin fd2387b738 refactor(build): finalize result-oriented execution model 2026-09-03 13:28:06 +08:00
kashorin e8dc1d07b6 refactor(runtime): replace content-addressed artifacts with resources 2026-09-03 13:25:57 +08:00
kashorin 0664b5bac0 feat(runtime): add project-owned build results 2026-09-03 13:23:52 +08:00
kashorin 75c4f61be9 merge: integrate main reconstruction tooling 2026-08-26 19:06:02 +08:00
rponeawa af670c28ce fix: check the project's own author packages, and stop the artifact error blaming the wrong field (#69)
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.
2026-08-25 18:41:41 +08:00
kashorin 9fa9f088a8 feat: complete structured Studio inspector editing 2026-08-25 00:36:10 +08:00
kashorin d91482f112 feat: introduce per-segment semantic takes 2026-08-20 16:35:21 +08:00
rpone df23c73d97 refactor: rebrand Narratage as Hypit 2026-08-19 15:51:58 +08:00
kashorin 4256db2fca refactor: simplify runtime state and scheduling 2026-08-17 14:03:54 +08:00
kashorin 68ceaeb47b refactor: remove redundant runtime infrastructure 2026-08-17 14:03:54 +08:00
kashorin adc463908d refactor: remove stale runtime scaffolding 2026-08-17 14:03:54 +08:00
kashorin 7683e38c0e refactor: remove defensive execution scaffolding 2026-08-17 14:03:53 +08:00
kashorin 3a7c60f8cb refactor: simplify package loading and runtime execution 2026-08-17 14:03:52 +08:00
kashorin a2531a6c53 refactor: keep module identity in manifests 2026-08-13 21:07:55 +08:00
kashorin dcaf24ecb4 refactor: remove redundant compilation wrappers 2026-08-13 19:53:35 +08:00
kashorin 849ac2a76f refactor: simplify modular compilation and runtime state 2026-08-13 18:53:05 +08:00
rpone c4216c4b4c chore: declare licensing accurately before the public release
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.
2026-08-13 00:21:27 +08:00
kashorin 39ff01aeca refactor: simplify graph realization and local workflow 2026-08-12 15:38:06 +08:00
kashorin 1da9c14a09 refactor: isolate playground from production contracts 2026-08-10 20:24:37 +08:00
kashorin e366167a63 merge: integrate v2 architecture with main tooling 2026-08-10 15:19:34 +08:00
kashorin 21c7b8fd8e feat: freeze the visual ir compatibility waist 2026-08-09 23:01:12 +08:00
rpone 191cfa1967 feat: let modules say what their values mean and look like
ValueSchema gains `format` and TypeDeclaration gains `default`. A schema
could say a value is a string but not whether it is a colour or a font
family, and nothing could say what an unspecified one should be -- so every
consumer decided both for itself, and the answers drifted. A colour and a
digest have an exact shape, so validateStoredValue now checks them: a
format nothing enforces goes stale the same way a copied constant does.

Each module now states its own Recipe once, in a recipe.ts its Surface
reads too, with the required key set taken off the default rather than
restated beside it. Four literals that had to be kept in step by hand are
gone.

The playground lists nothing any more. It asks the manifests which modules
declare a Producer outputting a VisualTrack -- exactly the four that do --
builds a form from the declared input schemas, seeds it from the declared
defaults, and calls the module's own bound handler. Its five adapter files
are deleted. A module that gains a visual Producer now appears there on its
own; one that loses it disappears.

Where a module has no honest default it says nothing: a value carrying
content-addressed media cannot have one, because the module has no bytes to
point at, and the form asks for a file instead.
2026-08-09 06:26:27 +08:00
kashorin 4d4273f3d3 test: pin the two things every other package's identity rests on
protocol and runtime-adapter had no tests of their own. Both are load
bearing in the same way: a digest computed here is what a Build, a
package lock and a Runtime Profile are addressed by, so a change in
either is a change to the meaning of records already written down.

The protocol tests are about one property — values that mean the same
thing digest the same, values that mean different things do not — and
then about what has no canonical form at all: non-finite numbers,
undefined members, accessors, non-plain objects, cycles in either shape.

Both files end with pinned constants. They are not testing that sha256
works. They exist so that changing how a value is canonicalized, or how
an adapter is identified, cannot be a quiet change: editing a constant is
an act a reviewer sees, and a silently different digest is not. The
adapter pin has a precedent — renaming `kind` invalidated every recorded
lock, and nothing failed until a lock did.

Writing them found one defect. createRuntimeEndpointAdapterFacet built a
facet without validating it; only isRuntimeAdapterHostFacet checked, and
the loader skips a facet that fails that check. So a package with a
broken adapter registered nothing and surfaced as "adapter X is not
registered", three layers from the mistake. Both constructors now
validate what they are given.
2026-08-09 01:25:28 +08:00
kashorin 1a5b0e4ca7 refactor: decompose video-contracts into owned domain modules
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.
2026-08-08 01:35:22 +08:00
kashorin a6686b0bad feat: rename the project to Narratage
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.
2026-08-07 22:29:26 +08:00
kashorin f5f01cebae docs: retire the v1/v2 rewrite narrative
The exploratory root compiler never shipped, so version-numbered
narration only confused the current single implementation. Doc and spec
filenames drop their -v1 suffix, titles drop v1, prose describes the
present system, the v2-bootstrap example becomes bootstrap, and the CLI
usage/scripts are plain svml. Package locks are regenerated because
package README bytes participate in artifact digests.

Script Surface's own v1 target statements remain: that spec genuinely
defines its first public version.
2026-08-07 22:22:38 +08:00
kashorin d8d7e38c1f chore: reset every wire format version to @1
The @0/@2/@4 numbers were rewrite-internal draft counters, not released
format versions. No external consumer or persisted data depends on them,
so the first public format of every id is @1. Negative-format tests use
@9 as the deliberately unknown version. Example package and runtime
locks are regenerated because format ids participate in digests.
2026-08-07 22:12:53 +08:00
kashorin 2855fd2a80 refactor(v2): complete graph-first runtime foundation
Remove payload lineage coupling, load deployment adapters from locked packages, add explicit artifact lifecycle tooling, and keep image/media execution behind replaceable endpoints. Refresh the executable examples and architecture records to match the implemented boundaries.
2026-08-07 20:40:49 +08:00
kashorin 93458649d9 refactor(v2): separate candidates from satisfactions 2026-08-07 04:54:02 +08:00
kashorin 366b72e5fd fix(v2): keep provided values ordinary substitute candidates 2026-08-07 03:15:33 +08:00
kashorin 3ffb6211d9 feat(v2): run realized talking-film builds 2026-08-07 02:49:24 +08:00
kashorin 0a813794e4 feat: lock deterministic compute facets 2026-08-06 13:34:48 +08:00
kashorin 1320b2c77f feat: assemble modular v2 compiler and runtime 2026-08-05 21:45:52 +08:00
kashorin c763ce44f1 feat: implement graph-native v2 compilation 2026-08-05 03:22:35 +08:00
kashorin f57ac143c4 feat: make external capabilities explicit and verifiable 2026-08-04 05:24:39 +08:00
kashorin 39392a5d10 feat: add modular text and script surfaces 2026-08-03 18:47:51 +08:00
kashorin 38a2ac9457 feat: bootstrap the v2 core and node driver 2026-08-03 14:12:53 +08:00