Group A keeps the 15 metadata-only shader-transition demos on GSAP with explicit runtime
fields because their sole GSAP timeline is a WebGL or Three.js progress driver with no
author motion to port. The pre-existing gsap_timeline_registered_before_async_build lint
finding on code-shader-dissolve is unrelated to this change; only its registry-item.json
was touched, not its .html file.
Group B ports transitions-3d, transitions-grid, and transitions-distortion fully to
anime.js, sets runtime to animejs, and removes the GSAP dependency from those
compositions.
Group C splits transitions-destruction: title/outro card motion now runs on a separately
registered anime.js timeline, while GSAP remains for the burn-canvas driver and coupled
scene crossfade, so the registry runtime remains gsap.
Round 2: forEach over named const arrays, direct window.__timelines
member registration, no-op .call labels. Fixes four silent-data-loss
bugs: mutated arrays trusted at initial literal, helper declarations
dropped without expansion, bare reassignment and loop counters treated
as constants (which also overcounted round-1 conversions; 9 files
honestly demoted to manual). Final: 28 converted / 2 warnings / 117
manual. Shared finitePositiveNumber extracted in eval scripts.
Gate re-run passes 8/8. Duck-typed anime wrappers lacking a readable
duration now prime via a large clamped seek. The animejs-adapter fixture
had two registered timelines animating scale on the same element, which
is order-dependent under independent seeks; corrected per the new
one-property-owner contract rule recorded in U3-GATE-RESULT.md. Eval
scripts get the scripts-convention fallow suppressions.
Anime.js 4.5.0 timeline children added at position greater than zero do
not render their from-values until the timeline has been sought past
that position once; a cold seek to frame 0 left them untouched. Prime
each instance once at registration (seek to duration, back to 0),
mirroring the GSAP adapter's totalTime nudge. Covers keyed and legacy
array registrations. Found by the U3 determinism gate.
Allow timeline registry lint to accept hyperframesAnime.register() and __hfAnime.
Treat registered finite anime instances as duration sources.
Add anime.js registration, autoplay, and infinite-loop diagnostics.
Make the validate CDN-timeout hint engine-neutral.
Adds focused anime.js 4.5 determinism fixtures plus a Puppeteer gate that compiles and serves each fixture through the producer runtime path, then checks repeat seeks, out-of-order seeks, backward seeks, bounds behavior, and anime engine activity from DOM snapshots.
* feat(skills): add brief contract — interaction modes + shared intake fields across workflows
New hyperframes-core/references/brief-contract.md, the shared intake
contract every creation workflow now runs its brief against:
- §1 interaction mode: collaborative (default) vs autonomous, ongoing
vs one-time signals, mode set once and carried forward, and a gate
taxonomy (preference / checkpoint / quality / routing) — autonomous
skips waiting, never verification
- §2 field registry: destination→aspect derivation (feed → 1:1,
Shorts/TikTok → 9:16, else 16:9), message, angle, length, audience,
language, narration — each workflow binds fields as ask or state
- §3 question rules: one round with one question per asked field
(native question UI mandatory when available, recommended option
first with a receipt), never drop a question as inferable, and a
mode legend advertised in the intro text instead of asked
Wired into the surfaces:
- hyperframes router: detect mode at entry, derive aspect from
destination instead of stating 16:9
- product-launch-video / pr-to-video / faceless-explainer: ask/state
binding tables at Step 0; Step 3/6 checkpoint-gate branches
(autonomous posts a heads-up with a preview hint before render)
- website-to-video: local mode definition now defers to the contract
- music-to-video, general-video, embedded-captions, talking-head-recut,
slideshow, motion-graphics: mode semantics wired per gate type
- storyboard-format: new optional 'mode' frontmatter key
- pr-to-video: length tier is a ceiling, not a floor — a one-headline
PR recommends inside the 30–90s sweet spot regardless of diff size
* feat(skills): story spine + mode-first brief across creation workflows
Story — the reverse-iceberg feedback:
- New hyperframes-creative/references/story-spine.md, three rules for
the narrated workflows: the hook speaks the viewer's outcome
language, the value claim lands by beat 2 (implementation is the
footnote of the story, not the spine), and the storyboard is
presented as a proposal — 'This video tells [audience] that
[message]' plus a per-frame why: drawn from narrativeRole
- pr-to-video: feature-reveal reordered promise-first (impact leads,
diff/mechanism follow as evidence); hooks ban file/function names;
fix-explainer, refactor-walkthrough, changelog unchanged
- product-launch-video / faceless-explainer hook rules aligned to the
spine; website-to-video's beat summary gains the echo line + why:;
general-video points at the spine from its plan step
Brief — hardened after live-test drift:
- Mode is now the first question (Collaborative recommended vs
Autonomous), its own round, skipped when the request carries a
signal; autonomous asks nothing further until one final
preview-or-render question before render
- Step 0 rewritten as a literal two-round question script in each
shot-sequence workflow (website-to-video's editorial register,
channel-agnostic); brief-contract.md §3 reduced to invariants so the
procedure lives in exactly one place
* feat(skills): split type minimums by viewing context
typography.md: full-screen viewing keeps body 20px / headline 60px;
in-feed destinations (X / LinkedIn / Instagram — brief-contract's
destination field) scale to body >=32px, headline >=90px, data labels
>=24px. First-pass values, to be calibrated against real renders.
* feat(skills): storyboard proposal as a table + credits close by default
- story-spine § 3: the proposal presents frames as a markdown table
(frame · beat · on screen · why) instead of dense paragraphs; the
three shot-sequence workflows and website-to-video's beat summary
reference the same shape
- pr-to-video: the credits close is now the default ending — every PR
video ends on a contributors frame (committers by commit count, 1-6
avatars), with no taste judgment; the only skip is when no avatar
was fetched, and the user can cut the frame in the proposal
* fix(skills): address review nits on the brief/story contracts
- embedded-captions: the identity procedure now states both sides of the
preference gate inline (user picks; autonomous picks with a stated why)
- website-to-video step-2-brief: note that its mode section is the
workflow's application of brief-contract.md, not a second definition
- brief-contract: resuming a project reads mode from STORYBOARD.md
frontmatter — a recorded mode counts as set, closing the write-only gap
* docs(skills): add a non-code receipts example to the brief contract
Review nit (jrusso1020, #2058): the receipts example in § 3 was
PR-video-shaped only. A destination-shaped example joins it so the rule
reads as workflow-neutral.
* fix(cli,skills): install workflow skills on demand instead of re-pulling the full set
Users report every init re-pulls all 21 skills into ~/.agents/skills
whenever anything is stale or missing - heavy, noisy, and it re-expands
deliberate partial installs.
Split the set into two tiers:
- core: the /hyperframes router + hyperframes-* domain skills +
media-use, which every workflow references structurally. init and
bare 'skills update' keep these (plus anything already installed)
fresh, and never expand the install.
- on demand: the end-user workflow skills (and figma). They install at
trigger time via 'skills update <name...>' - positional names are
the only way update expands an install: one targeted
'skills add --skill <name>' covering only stale/missing targets, a
fast no-op when current, presence-verified after install, exit 1 on
unknown names, and a presence-only degrade when GitHub is
unreachable.
The /hyperframes router now runs 'skills update <workflow>' after
routing and before reading the workflow skill, so a routed workflow is
guaranteed present even on a machine that only has the core set. Each
on-demand skill also opens with the same self-maintenance step (run
'npx hyperframes skills update <name>' silently), so a workflow
triggered directly - without the router - still refreshes itself and
restores any missing core skill before relying on it.
When the manifest is unreachable (offline / rate-limited) the engine
degrades honestly instead of claiming success: named runs presence-check
the request plus a pinned fallback core list (unit-pinned to skills/)
and blind-install whatever is absent; a bare strict update fails loudly
so the 'check || update' chain can't pass while everything stays stale;
init reports the skipped freshness check. --json emits structured
errors on failure paths.
skills check still lists every skill, but exits non-zero only for
stale installed skills, an incomplete core set, or removed leftovers -
workflow skills not yet installed are reported as available on demand.
Bare 'hyperframes skills' (and 'skills add --all') remain the explicit
full-set installs.
Verified end-to-end with a sandboxed $HOME: fresh init installs the 9
core skills only; 'skills update slideshow' adds exactly that skill
(no-op on re-run, exit 1 on unknown names); bare update refreshes
without expanding; a live Claude Code run routed PR-to-video, executed
the router's update step, and the workflow skill appeared before use;
and a second live run triggered an installed workflow directly, whose
opening maintenance step restored a deliberately removed core skill.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* docs(skills): clarify update-engine contracts + document lazy-install model
- skills.ts: note the UpdateSkillsResult.unknown strict-mode contract,
verifyInstalled's non-strict (warn-not-throw) intent, and that a
partial install stays "refreshed but never expanded" (review nits).
- docs/guides/skills.mdx: add a "Keeping skills current" section covering
the core-eager / workflow-on-demand model and the skills check|update
commands, per the repo's catalog-maintenance rule.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: kiritowoo <295860553+kiritowoo@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Miao Yang <miao.yang@heygen.com>