Two releases have landed since the last post here, and they are opposites. One changed the name and nothing else. The other changed almost everything and kept the name.

Here is the promo for the current release. As always, it was produced end to end by the tool itself — script, storyboard, design, motion, voiceover, music and captions:

v0.1.0 — the rename

The skill used to be called HVE Spielberg. I picked that name because it was funny and it signalled what the tool did in two words.

It was also a mistake, and the reason is not subtle: the name referenced a living public figure. Using a famous person’s name as a product identity carries trademark and right-of-publicity exposure, and it implies an endorsement that never existed. None of that becomes less true because the project is small, open source, or affectionate about it. So it is now hve-video-director — an explicit domain and the role it performs.

npx skills update does not complete a rename

This is the part worth knowing even if you do not use the skill, because it is a genuine sharp edge in the tooling.

The old repository URL redirects to the new one. So npx skills update resolves the new SKILL.md, keys it by the name in its frontmatter, and installs hve-video-director alongside hve-spielberg. It prints ✓ Updated 1 skill(s) and exits successfully.

What you are left with is both: a live install and a stale one that still declares the old name and is still loadable by your agent. It also never converges — every later update reports the same pending update again, forever.

Two commands actually fix it:

1
2
npx skills remove hve-spielberg --global
npx skills add nebrass/hve-video-director --global

Generated video projects were unaffected. The scaffolding never embedded the skill name, so no phase, workflow, script, CLI flag or file format changed. Only the name did.

The release also added TRADEMARKS.md — nominative attribution for every third-party mark the skill references — and a resolver that matches the skill’s declared frontmatter identity rather than its directory name, so a clone left under the old folder name still loads instead of failing halfway through a render.

v0.2.0 — deleting most of what I had written

The interesting release is this one, and its headline is subtraction.

hve-video-director sits on top of HyperFrames — HTML plus GSAP, rendered through headless Chromium. When I first built the pipeline, HyperFrames was one skill and I wrote a great deal of prose explaining how to use it: how to structure a composition, how to wire a sub-composition, how transitions should behave.

Then the upstream project grew into a family of skills with real owners for those topics. My prose did not disappear when that happened. It quietly became a hand-maintained copy of someone else’s manual — one that could drift out of date without anything failing, because nothing checked it.

An architecture review put a number on it: roughly 70–85% of the phase prose had become that shadow copy. So v0.2.0 deletes it and cites upstream instead.

What it keeps is the part with no upstream equivalent — the governance layer:

  • The consent doctrine. Every phase ends at an approval checkpoint the user grants. The agent recommends; it never preselects, and it never infers an answer you did not give.
  • Revision fingerprints. Your creative choices are hashed. Change one, and every phase that depended on it goes stale rather than silently shipping against an old decision.
  • Capture determinism and reviewed captions, which are bound to the fingerprint of the final mixed audio, so captions cannot drift away from the track they describe.

A reasoning layer

The bigger addition is a layer that decides how to communicate an idea before anything renders.

It runs twelve questions per frame — what must the viewer understand, at what abstraction level, with what emotional tone, how dense, does the camera need to move and to answer which question — and writes the answers onto the storyboard as director keys. Those keys are not notes. They are the build input the scene builder receives.

Camera moves, motion principles and visual metaphors come from a written grammar, and each entry declares what capability it needs. A frame’s capability set is then the mechanical union of what it cites — not a taste call — and that set is what selects a runtime. Most frames stay flat GSAP. Occasionally one earns Three.js, and when a frame is denied it, the storyboard records the refusal and the reason.

A seam gate that actually verifies

Transitions used to be governed by prose rules: don’t do this, prefer that. Rules in prose are suggestions with extra steps.

Now the boundaries between scenes are written into a ledger, stamped into the composition, and measured. A velocity-matched cut has to show that both sides move on the same axis in the same direction at a comparable speed, with no frame where both scenes are visible.

The honest part is what it cannot check. A crossfade carries nothing across the cut, so it cannot be a ledger row at all. In the promo above, three of seven boundaries are numerically verified and four are dissolves — the gate reports that count rather than exiting green and implying more than it checked.

Frame packets

Each scene is now built from a packet: that one frame’s storyboard block, the design spec, the inlined bodies of the recipes it cites, and the paths of its bound captures. Nothing else — not the rest of the film, not the reasoning that produced the keys.

That last exclusion is deliberate. The reasoning produced the conclusion; shipping the derivation alongside it is exactly what makes a builder’s context grow without bound.

Things that only show up when you render

Two findings from this release that generalise beyond this project.

A gate passing is not the same as the thing working. While producing the promo, one scene’s terminal footage rendered as a black panel for most of its window — and lint, check and the seam gate all passed green, because none of them look at whether a clip decoded. The renderer itself flagged the cause: the clip had keyframes 8.33 seconds apart, so seeking into it failed. The normalize recipe now pins the keyframe interval to the output frame rate. The class of bug is worth remembering: your gates check what they check.

Verification you wrote carelessly is worse than none. My own local build check for this blog ran Hugo with --quiet and then echoed BUILD OK unconditionally. It reported success on a build that had failed, and I only found out when the deploy pipeline went red. A check that cannot fail is a check that lies.

Try it

1
npx skills add nebrass/hve-video-director --global

Then, in Claude Code or GitHub Copilot CLI:

/hve-video-director my-promo

🔗 Repository: github.com/nebrass/hve-video-director · Changelog: CHANGELOG.md · Release: v0.2.0

The committed reference build lives in example/ — the source artifacts of one real run, with a consent record you can validate rather than take on trust.