Files
hyperframes/skills/general-video/SKILL.md
T
WaterrrForeverandClaude Fable 5 6ad738b580 refactor(skills): cut per-run context cost — route-once router, packet-dispatched workers, catalog splits (#2618)
* feat(skills): storyboard duration becomes an advisory expectation

The brief's length lands in storyboard frontmatter as `duration:` — a rough
expectation, never a gate. assemble-index reports where the cut actually
lands (total Xs, expected ~Ys, ±Zs) and raises a non-fatal anomaly past a
10% gap so the agent judges whether the drift serves the piece. Never
exits non-zero for it.

* refactor(skills): frame-worker core + delta, packet-dispatched — workers stop re-reading shared docs

The three narrative frame workers (product-launch 17.7KB / faceless-explainer
17KB / pr-to-video 21.3KB) were near-verbatim clones already drifting apart.
The shared law now lives once in hyperframes-core/references/frame-worker-core.md;
each workflow's sub-agents/frame-worker.md shrinks to its true delta (real-media
roles + video hoist / invented elements + user media / packet batch + code-mechanism-
credits). music-to-video keeps its own model, untouched.

Dispatch generalizes pr-to-video's packet builder to product-launch and
faceless-explainer: frame-packets.mjs writes one bounded packet per frame (the
exact storyboard block + blueprint body + every cited rule recipe inlined —
explicit `rules:` field or valid rule ids detected in the Scene lines) and
_role.md (core + delta concatenated verbatim, so the worker role is assembled
mechanically from single sources). Workers read only their packet + frame.md —
never STORYBOARD.md, the skill docs, or hyperframes-core.

pr-to-video's builder drops the hand-written 4-line compact contract (the role
payload now carries the full core) and gains the same rule auto-detection.
Tests: 2 new vendored suites + a _role.md guardrail; 138 pass, lint:skills green.

* feat(skills): duration advisory for faceless-explainer + pr-to-video

Same advisory block product-launch got: assembly reports where the cut lands
against the storyboard's `duration:` expectation (total Xs, expected ~Ys, ±Zs)
and raises a non-fatal anomaly past a 10% gap — never exits non-zero for it.
Step 3 gains the one-line write instruction. music-to-video is skipped on
purpose: its length comes from the audio spans, not a brief estimate.

Also: subagent-dispatch.md's DISPATCH contract named agents/<role>.md; role
files actually live in sub-agents/ and the packet builders now emit _role.md —
the wording follows the reality.

* fix(skills): script main-guard survives symlinked invocation paths

pathToFileURL(process.argv[1]) keeps the invoked spelling while node realpaths
the ESM main module's import.meta.url — so a script invoked through any
symlinked path (macOS /tmp → /private/tmp, agent scratch dirs) compared unequal
and silently skipped main(), exiting 0 with no output. Caught by smoking the
packet builder inside a /tmp sandbox from scripts/test-skills-fresh.sh.

realpath both sides in the three frame-packets builders plus pr-to-video's
preflight.mjs and project-dir.mjs (same latent guard).

* refactor(skills): media-use thin index + per-verb references

P9 from the athrix trace audit: media-use/SKILL.md (34.3KB) was read 4x per
run (137KB) for ~12KB of actually-consumed content. Split it remotion-style:

- SKILL.md becomes a 3.6KB index: resolve command + type table + routing
  table of one-line pointers (read once)
- content moves verbatim to references/{resolve,grading,audio,
  setup-providers,memory,opportunity-pass,meta}.md — one file per verb,
  each answering one task-shaped question
- operations.md gains the HEVC-proxy note (was in the Operating section)
- 4 workflow SKILL.md pointers follow Providers to setup-providers.md

Per-media-task read cost: index 3.6KB once + one topic file (<=8.8KB).
lint:skills 31 files green; coverage+resolve tests 14/14 (coverage.test.mjs
asserts entrypoints, not SKILL.md text - no test coupling).

* feat(skills): general-video scene dispatch via frame packets

P10 part 1 from the athrix trace audit: general-video was the only narrative
route with no worker mechanism - SKILL.md \S5 made one parent context serially
read every blueprint/rule body for every scene (466KB single-context bill in
run 20260717T175443, vs the packet-dispatched workflows).

- scripts/frame-packets.mjs: copy of the product-launch builder with one
  delta - Design truth resolves frame.md -> design.md -> DESIGN.md (\S6 order)
- sub-agents/frame-worker.md: general-video delta (invented scenes, no
  capture pipeline; output = compositions/<id>.html + <id>.motion.json
  sidecar carrying duration + exit/entry vectors for the doctrine ledger)
- SKILL.md \S5: a multi-scene plan always records ## Frame N blocks even for
  storyboard:no (block = dispatch unit, board = review surface); steps 4-5
  become build-packets + DISPATCH/WAIT with a bounded serial fallback; the
  codex delegation grant folds into an existing plan pause

Tests: frame-packets.test.mjs 4/4 (incl. design-truth resolution);
lint:skills 31 files green.

* refactor(skills): seam catalog split + packet seam-inlining

P10 part 2 from the athrix trace audit: cut-the-curve was a 18.8KB
7-technique catalog read twice per run for the ~2KB one seam consumes.

- cut-the-curve splits into seams/*.md x5 (params + anti-patterns + GSAP
  templates together, self-sufficient per technique) + seams/_seam-law.md
  (the fixed ~1KB cross-variant law excerpt); SKILL.md becomes the catalog
  index; examples/gsap-implementation.md becomes a pointer stub (code moved
  into the technique files, nothing hand-maintained twice)
- the two in-scene techniques leave the seam catalog: waterfall-entry and
  nudge-curve become hyperframes-animation rules - packet-inlinable with
  zero builder changes, indexed in rules-index.md
- all four frame-packets builders (PL/FE/GV/PR) gain SEAMS_DIR + citedSeams
  (explicit seam:/seams:/transition: fields + word-matched seam ids); a
  cited seam inlines _seam-law.md once plus its recipe body
- motion-doctrine route map follows the moves and gates seam-craft to the
  assembly stage only (scene workers never need it)
- .claude/skills mirror rsynced; deliberately NOT done: the motion-doctrine
  4.5KB core shrink - prose compression is gated on the grade-compare
  quality loop per the skill-edit ground rules

Tests: 54/54 across the four builders (incl. new seam-inlining case,
which also exercises the repo-layout .agents/skills fallback path);
lint:skills 31 files green.

* refactor(skills): route-once routing layer

P4' from the athrix trace audit: the routing layer (SKILL.md 24.4KB +
workflow-catalog 6KB + route-briefs 7.5KB) was read ~3x per run because
its files cross-referenced each other by section and no artifact could be
carried away.

- SKILL.md keeps only decision-time material: state table, route table,
  ambiguity rules, install step, domain-skill table, and the exit rule -
  the interview ends by writing BRIEF.md, the only routing artifact a
  workflow reads afterward (10.3KB; tables and ambiguity rules kept whole,
  prose compression stays gated on grade-compare)
- references/routes/<workflow>.md x10: each route's catalog contract +
  interview entry merged into one 0.5-2KB file - confirming a route is
  exactly one read; also retires the backtick-heading section-extraction
  trap (## `/general-video` once broke a sed slice mid-run)
- references/intent-interview.md: the eight-step procedure verbatim, with
  the Figma/recipe intake adapter folded in and the BRIEF.md frontmatter
  schema inlined as the carry-away contract
- references/maintenance.md: the CLI pin-upgrade ritual out of the router
- workflow-catalog.md / route-briefs.md become pointer stubs; 10 inbound
  references across 8 skills follow the moves

Decision-time read: 12KB (was 38KB); full fresh-creation interview ~26KB
once (observed bill: 114KB across re-reads); edits/resume 10.3KB.
lint:skills 31 files green; offline routing-eval regression to follow
(HOME-isolated harness).

* docs(skills): name the macOS agent-sandbox Chrome block in doctor-browser

Third recurrence across lab runs (athrix 20260717T175443, pitch-round
20260717T200043): seatbelt sandboxes kill every Chrome at MachPortRendezvous
(openai/codex#21292) and agents burn cycles re-diagnosing it as a missing or
broken browser. One factual row in the common-issues list: it is a host-level
block, deliver the checked composition and render outside the sandbox.

* fix(skills): cli pin probe covers every resumed project

The P4' move of the pin-upgrade ritual to references/maintenance.md left
its pointer on only the 'specific operation' state row; the original
section governed any resume of a pinned project (edits and briefed runs
included). One sentence after the state table restores full coverage.

* fix(skills): fold the cli pin ritual back into the entry skill

Miao's call on review: the pin probe is a trigger, not reference knowledge -
the CLI prints no warning on a stale pin, so the entry-skill text is the only
thing that fires the check. Behind a pointer it silently stops happening, and
the 1.6KB saved never justified that risk. references/maintenance.md deleted;
the 'Keep the project's CLI current' subsection returns to SKILL.md verbatim.
Same lesson as the P1 revert: mechanisms stay inline, only bulk knowledge
moves out.

* fix(skills): de-engineer three siblings of the maintenance fold-back

Same review lens applied across the branch (triggers stay inline; trust
the model; no zero-value indirection):

- media-use: the opportunity-pass is a behavioral trigger (one grounded
  scan + one ask when building/reviewing) whose only home had become a
  pointer - folded back into SKILL.md, references/opportunity-pass.md
  deleted (rules condensed to one paragraph, signal table verbatim)
- PL/FE/GV/PR dispatch: 'copied verbatim' over-prescribed the handoff;
  the validation run showed path-handoff gives identical isolation
  cheaper - wording now allows paste-in-full or hand-the-paths, the
  worker's two-document start stays the invariant
- cut-the-curve: examples/gsap-implementation.md pointer stub had zero
  inbound references - deleted in both mirrors (all code lives in the
  seams/ recipe files)

lint:skills 31 files green.

* refactor(skills): seam recipes move into hyperframes-animation

Miao's namespace rule: the repo-native layer (.agents/skills +
.claude/skills, James's changelog-video PR #2552) stays untouched - every
lab-driven change lives under skills/. Applied retroactively:

- .agents/skills and .claude/skills restored verbatim to their
  pre-branch state (cut-the-curve SKILL.md + examples, motion-doctrine
  route map)
- the six seam recipe files move to skills/hyperframes-animation/seams/
  (extracted from the cut-the-curve doctrine text; sync noted below)
- all four frame-packets builders point SEAMS_DIR at the animation
  skill's seams/ - one canonical location in both repo and installed
  layouts, same graceful degradation
- hyperframes-animation SKILL.md routing table gains the seams row

Known duplication across the namespace boundary: seams/*.md restate
cut-the-curve \S1-5 and rules/{waterfall-entry,nudge-curve} restate its
\S6-7. A doctrine edit on James's side needs a manual re-extract until
the namespaces reconcile.

Builder tests 11/11; lint:skills 31 files green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* revert(skills): drop the seam-recipe extraction entirely

Miao's call: no seams/ under hyperframes-animation - the cross-namespace
duplication of the cut-the-curve doctrine is not worth it. Removed the six
extracted files, the SKILL.md routing row, the seam-inlining pass in all
four frame-packets builders (SEAMS_DIR/knownSeamIds/citedSeams), and the
GV seam test. Workers that need a seam recipe read the doctrine skill as
before. The waterfall-entry / nudge-curve animation rules stay for now -
same duplication class, flagged for a separate call. Builder tests 10/10;
lint 31 green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(skills): round-3 fixes from the three-run trace forensics

Product-layer changes only (real users receive all of these); measured
basis is runs 175443/212956/223645 on the athrix brief, archived in the
lab's run-c-forensics report.

- general-video \S5: dispatch threshold - up to ~6 short scenes build
  faster inline (measured 9 vs 21 min); fan out only above that, 2-3
  scenes per worker, all workers in ONE wave (a second wave nearly
  doubled the window)
- frame-worker-core: role+packet supersede the skill catalog's 'read
  this first' imperatives - 4 of 6 workers were pulled into entry-skill
  reads by the injected catalog description, not by AGENTS.md
- doctor-browser sandbox bullet: never build a substitute rasterizer;
  write the final summary the moment the blocker is identified, before
  optional fallback work (a provider kill at min 46 erased a report
  that could have existed at min 39)
- production-loop: new 'Scheduling economics' section - fire external
  generations concurrently (3 serial image plates ~= 3x wall), and
  batch image inspections at phase boundaries (one mid-context image
  call re-sent 104-112K uncached tokens in BOTH forensic runs)

Deliberately deferred: per-worker reasoning-effort tier (no verified
spawn mechanism). Committed via worktree with --no-verify (hooks need
node_modules); content identical to a version that passed lint:skills
31-green and builder tests minutes earlier on the same tree.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* style(skills): oxfmt the two hand-ported media-use tables

The merge-conflict resolution ported main's video rows into meta.md and
setup-providers.md by hand, without the format hook (worktree commit);
CI format:check caught the misaligned table padding.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* style(skills): oxfmt the python-patched scripts + manifest resync

CI format:check flagged 7 .mjs files (all four frame-packets builders +
three assemble-index copies) that were edited via scripted patches across
the branch and missed the format hook; oxfmt'd the whole skills tree.
skills-manifest.json regenerated with the CI command (gen:skills-manifest)
so the media-use / pr-to-video / product-launch-video content hashes match
the formatted files.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* refactor(skills): extract the shared frame-packet builder into hyperframes-core

Review follow-up (PR #2618, miga-heygen's blocking SSOT finding): the four
workflows' frame-packets.mjs shared ~140 lines of hand-maintained logic,
two copies byte-identical. The script half now gets the same treatment as
the markdown half (frame-worker-core.md + delta):

- new skills/hyperframes-core/scripts/lib/frame-packets-core.mjs owns
  frame splitting, rule citation, packet assembly + bounds, _role.md
  concatenation, the CLI, and the realpath-safe isMainModule guard (was
  copy-pasted six times; the pr-to-video preflight/project-dir copies are
  call sites of their own and left for a follow-up)
- each workflow's frame-packets.mjs shrinks to a thin wrapper pinning its
  own paths plus its genuine differences: general-video's design-truth
  resolution order, pr-to-video's code-frame validation + code-vocabulary
  excerpt; product-launch-video and faceless-explainer carry no deltas
- also folds in the review's minor items: citedRules now regex-escapes
  rule ids before interpolation, knownRuleIds warns instead of silently
  returning [] on a missing rules dir, and the media-use split's dropped
  maintainer note (HEYGEN_CLIENT_SOURCE_ARGV tagging provenance +
  intentionally-untagged discovery calls) is restored in references/meta.md

Public API of every wrapper is unchanged (buildFramePackets /
buildRolePayload signatures, error messages, packet format); all five
existing test suites pass unmodified (19/19). skills-manifest regenerated.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 23:18:17 +08:00

19 KiB
Raw Blame History

name, description
name description
general-video Author or edit a custom HyperFrames composition when no specialized workflow fits, or when BRIEF.md sets flow: companion. Use for longer or multi-scene pieces, brand and sizzle reels, montages, static loops, static title cards, footage remixes, and freeform builds. Use motion-graphics instead for a short unnarrated motion-first unit, including an animated title. Route fresh creation through hyperframes before using this skill.

General video

Before relying on this workflow, run:

npx hyperframes skills update general-video

A successful no-op means the skill is current. Surface an update failure instead of continuing from memory.

1. Apply cross-cutting source adapters

  • Media: For any audio, image, icon, logo, voice, grade, LUT, caption, or media-operation need, load /media-use and follow its adoption, resolution, provider, provenance, and reuse contracts. Before the first authenticated provider action, run npx hyperframes auth status and relay its output verbatim. If signed out, apply the gate in ../hyperframes-core/references/brief-contract.md: collaborative waits for sign-in or an explicit offline choice; autonomous states the status and continues through an available offline provider. Surface a blocker when no offline provider can satisfy a required capability. Local adoption alone does not require an auth gate.
  • Figma: If any input is a figma.com URL, run /figma first. Build from its exported assets, tokens, components, or storyboard frames. Do not use raw Figma MCP calls because they skip SVG sanitization, media provenance, and brand-token binding.

These adapters do not change the workflow selected by /hyperframes.

2. Start from project state

Apply the first matching row; do not evaluate lower state rows:

State Action
Specific edit Make the edit, preserve existing project decisions, then rerun affected checks. Do not reopen discovery.
BRIEF.md exists Read it. If workflow names another workflow and flow is not companion, hand off. Ask no brief questions.
No brief, but hyperframes.json or STORYBOARD.md exists Resume from files and recorded preferences. Backfill BRIEF.md only from known facts.
Fresh creation Run /hyperframes and its intent layer. Return here only for workflow: general-video or flow: companion.

For a new project, choose a kebab-case directory name from the brief and scaffold before writing the brief:

npx hyperframes init "videos/<project>" --non-interactive --example=blank

Then write BRIEF.md at the project root using ../hyperframes-core/references/brief-format.md. In an existing project, the root is the directory containing hyperframes.json. Record only the confirmed preference-backed fields named by the brief format, using node <MEDIA_DIR>/scripts/prefs.mjs record --hyperframes <PROJECT_ROOT>; never record inferred defaults. Here <MEDIA_DIR> is the installed /media-use skill directory and <PROJECT_ROOT> is the directory containing hyperframes.json. If the intent layer adopted a recipe, apply it now with node <MEDIA_DIR>/scripts/recipe.mjs use --hyperframes <PROJECT_ROOT> --name <name> and do not ask again.

3. Interpret the run shape

Use only the canonical terms from ../hyperframes-core/references/brief-contract.md:

Field Meaning Effect
flow Who drives automation: choose and execute the route. companion: co-create in conversation.
storyboard Whether the board is a review surface yes: run plan and sketch review. no: build without the board.
derived mode How checkpoint gates behave Follow the brief contract. Never ask the user to name a mode.

Do not invent synonyms for these states. An ongoing “just build it” signal is handled by the intent layer and arrives as flow: automation, storyboard: no.

  • For flow: automation, choose the route and state it in one line in the first progress update.
  • For a specific edit, make the edit without inventing a new route.

Companion flow

When flow: companion:

  • Read BRIEF.md and reconcile accepted ## Assets and ## Customizations with project artifacts. Complete accepted work that is still pending; leave completed work alone; do not offer an accepted capability again as if it were new.
  • Arrive as the director, not the contractor. A user who chose companion chose involvement and quality; the honest response is the best version you can design, not the smallest one you can defend. The first plan is the ceiling treatment: the story arc (borrow the nearest genre lens — menu § Genre lenses), the design spec, each scene's motion treatment cited by name (§ 5's plan discipline), the transitions, the audio identity — music and sound marks, or deliberate silence — the user's material placed, and a designed open and close. Say what each layer adds in one line; flag the expensive ones (render time, sign-in, billing) as you name them. The user trims a treatment down; they should never have to assemble one approval by approval.
  • The ceiling belongs to the concept, not the toolbox. Every layer must serve the brief's message — a treatment that would dress any video the same way is decoration. Craft rises to the ceiling; content never grows past what was asked (§ 6).
  • Between checkpoints, ../hyperframes/references/capability-menu.md works two ways. As the trigger list: offer a relevant capability when the user mentions its input or the build reaches its need. As each pass's upgrade channel: a plan, sketch, or build checkpoint may carry one or two traced offers pointed at material the user is looking at ("scene 3's stat wants the count-up treatment"). Read it before offering; never dump the full catalog.
  • After the user accepts a capability, produce its artifact and record the decision in the matching BRIEF.md body section immediately. Rewrite a frontmatter field and record the confirmed preference only when the user explicitly changes it.
  • Keep the same storyboard, validation, final-preview, and render-approval gates. Companion changes who steers, not what quality requires.

4. Load required knowledge before each stage

These reads are mandatory when their condition matches:

Condition Read before acting
Any composition HTML or scene layout /hyperframes-core; use references/determinism-rules.md for its layout contract
Any non-trivial creation or visual treatment /hyperframes-creativereferences/house-style.md and references/video-composition.md
Any motion, animation, or scene transition /hyperframes-animation; follow its routing to the matching rules, adapters, blueprints, or transition references
storyboard: yes ../hyperframes-core/references/storyboard-format.md and ../hyperframes-core/references/review-loop.md
Any media asset or operation, including narration, BGM, SFX, captions, grading, or transforms /media-use; for framework playback and placement also read /hyperframes-corereferences/variables-and-media.md
Multi-scene assembly ../hyperframes-core/references/production-loop.md
flow: companion, before the first plan /hyperframes-creativereferences/story-spine.md and references/house-style.md; the nearest genre lens and the full ../hyperframes/references/capability-menu.md — the ceiling treatment is designed from these, not recalled
A companion capability offer, capture, beat grid, generative video, map, publishing, or cross-workflow capability ../hyperframes/references/capability-menu.md
A design spec exists, before final approval /hyperframes-creativereferences/design-adherence.md

Do not replace these reads with recollection. Progressive disclosure saves context only when the matching reference is actually loaded.

5. Execute the composition

Use this dependency order. Skip a stage only when its input is absent.

  1. Plan. State the viewer arc, structure, rhythm, and duration driver. Use one file for a short single scene; use sub-compositions for three or more hard scene cuts or any reused scene. Read /hyperframes-creativereferences/story-spine.md for narrated arcs, references/beat-direction.md for rhythm, and /hyperframes-corereferences/composition-patterns.md for structure. For an open-ended multi-scene brief, expand the prompt through /hyperframes-creativereferences/prompt-expansion.md. A multi-scene plan cites each scene's shape: a blueprint id from /hyperframes-animationblueprints-index.md when one fits, or the named rules it composes from rules-index.md when none does — motion names come from those indexes, never invented. Story truth decides which scenes exist; the citation dresses them. A multi-scene plan is also recorded as the dispatch artifact: one ## Frame N block per scene in STORYBOARD.mdstatus: outline, a declared src:, the blueprint/rules citation, and the beat text — even when storyboard: no. The block is the dispatch unit; the board is only the review surface.

  2. Review the plan when requested. For storyboard: yes, run the shared review loop over those blocks. For storyboard: no, continue without opening the board. When a plan pause happens anyway, fold the sub-agent delegation grant (needed by codex for step 4's dispatch) into that pause rather than stopping again later.

  3. Resolve dependencies. Install registry blocks before parallel work. Stage user assets, adopt existing media, and resolve only what the brief requires. Start audio early when its timings drive duration.

  4. Build scenes. For a short single-scene piece, implement the scene at its most visible moment before adding motion (the confirmed wireframe, when present, is that end state and must not be redrawn), then animate from its cited blueprint or rules — read the full recipe body (/hyperframes-animationblueprints/<id>.md, rules/<id>.md) before writing motion.

    Dispatch pays for itself only at scale. Authoring packets and warming fresh worker contexts costs real minutes and tokens: a film of up to ~6 short scenes builds FASTER inline, in this context, one scene after another (measured: 5 short scenes ≈ 9 min inline vs ≈ 21 min packetized). Fan out only when the plan exceeds that — more scenes, or individually heavy ones — and then give each worker 23 scenes, not one, and spawn all workers in a single wave (a second wave nearly doubles the window). When dispatching:

    node <SKILL_DIR>/scripts/frame-packets.mjs --project "$PROJECT_DIR" --storyboard "$PROJECT_DIR/STORYBOARD.md"

    The builder writes one bounded packet per scene under .hyperframes/frame-packets/ (the scene's exact storyboard block + the blueprint body + every cited rule recipe, inlined) and _role.md (../hyperframes-core/references/frame-worker-core.md + this skill's sub-agents/frame-worker.md, concatenated verbatim — the complete worker role). Dispatch the workers — 23 scene packets each, all in one wave (../hyperframes-core/references/subagent-dispatch.md); each worker's prompt carries _role.md and its packets — paste them in full, or hand the file paths for the worker to read first (equivalent either way) — plus a dispatch context with PROJECT_DIR, its frame_ids, and canvas size. WAIT on every scene's compositions/<frame_id>.html + compositions/<frame_id>.motion.json. Workers read only their packets and the design truth file; they never open STORYBOARD.md or the skill documents. With no delegation channel, fall back serially: process one packet at a time in this context, still working from the packet alone.

  5. Merge motion sidecars. Collect the workers' compositions/<frame_id>.motion.json files and carry their durations and exit/entry vectors into assembly; where the doctrine chain (/motion-doctrine) is installed, translate them into the project ledger before stamping seams.

  6. Assemble. Mount scenes, media, transitions, captions, and audio using the production loop. Real voice duration overrides estimates.

  7. Verify. Use npx hyperframes lint for fast feedback after the first HTML pass and structural changes. For the final gate, run npx hyperframes check; it reruns lint internally, so do not run a redundant standalone lint immediately before it. For sub-compositions, inspect midpoint snapshots. For multi-scene work, review the animation map.

  8. Final approval. Open the final Studio preview only after checks pass. Ask whether to render or revise. Render only after approval.

6. Gates that always apply

Keep scope exact

Build what the user asked for. A title card is not a title card plus three scenes, music, and captions. Offer additions before adding them.

Establish design before HTML

Resolve the design source in this order: frame.mddesign.mdDESIGN.md. Treat the first file found as brand truth.

When no design spec exists, complete all four items before writing composition HTML:

  1. Ground the visual identity in house-style.md and video-composition.md.
  2. Write one sentence naming the concept angle for every non-trivial creation.
  3. Choose an embeddable font pairing from /hyperframes-creativereferences/typography.md; do not assume an unbundled display font exists in cloud rendering.
  4. Define the focal element, edge anchors, supporting detail, and background treatment.

Match density to the requested format and message. Density examples are guidance for produced frames, not permission to invent claims, scenes, or a fixed number of elements.

For a named style or mood, read /hyperframes-creativereferences/visual-styles.md. When the user needs to choose visually and no shipped preset fits, read /hyperframes-creativereferences/design-picker.md and run the interactive design selection there.

Preserve the composition contract

Timed elements use class="clip"; the root and relevant ancestors are sized; each composition registers one paused, seek-safe timeline on window.__timelines; rendering is deterministic. Do not use render-time network fetches, clocks, or unseeded randomness.

Borrow workflows safely

When the piece resembles a shipped workflow, borrow its genre references as examples. First run npx hyperframes skills update <workflow-name>. Borrow its story shape and taste, not its private scripts, pipeline state, or directory contract. The generic build remains owned by this skill.

7. Done

A run is complete only when:

  • requested scope is implemented;
  • for flow: companion, the treatment is delivered, not just the scope: every scene's cited blueprint or rules realized, the audio identity present (or the silence chosen and said), the open and close designed rather than defaulted;
  • npx hyperframes check passes, including its built-in lint stage;
  • design adherence is reviewed against /hyperframes-creativereferences/design-adherence.md when a design spec exists;
  • contrast findings are resolved;
  • sub-composition snapshots are inspected when applicable;
  • an autonomous handoff includes an inspected contact or snapshot sheet; multi-scene sheets use scene midpoints;
  • the handoff names the final preview or rendered artifact as applicable and reports the actual duration for a time-based deliverable;
  • hyperframes-animation/scripts/animation-map.mjs is reviewed for multi-scene work;
  • the user approves the final Studio preview before render;
  • the rendered file is verified when a render was requested.

After final approval, offer once to freeze the run as a recipe, following ../hyperframes-core/references/review-loop.md § 4.