Every SKILL.md already declared the new name — name: frames, frames-cli, frames-core, and so on — but the directories were never moved, so the tree carried frames-* in content and hyperframes-* on disk. Everything that resolves a skill by path missed: the core-skill list, the plugin marketplace pin, and the docs the CLI reads at runtime. Eight tests failed on main because the files they open do not exist. The directories now match what the files say they are, and the guide the claude-design contract reads takes the name that contract already used.
7.1 KiB
Production loop — from an approved plan to a delivered video
The stages between a plan the user has agreed to and a video in their hands, written as dependencies, not numbered steps: order between independent stages is free — audio renders in the background while frames build; that is the standard trick — order inside a dependency chain is not. Nothing in this file addresses the user: every user-facing pause lives in review-loop.md, and this file only marks where those passes attach. Some routes bring their own spine (a beat grid, existing footage) — the stages compose around it. A stage whose need is absent simply doesn't run: no narration, no audio stage; a single scene, no transitions. An edit request enters at the artifact it touches and re-runs verify.
The shipped narrative workflows implement these stages with their own scripts; a freeform build follows this file directly, borrowing tools where the capability menu says they live (frames/references/capability-menu.md).
| Stage | Needs | Produces | Where the capability lives |
|---|---|---|---|
| Blocks & assets | the approved plan | registry blocks installed once, before any parallel work (parallel workers race the registry); user assets staged; logos / images / grades resolved | npx @hanzo/frames add <block> per block the plan names; staging, adoption, and resolve via the menu's media rows |
| Audio | narration text (when narrated); the storyboard's music: mood |
voice files + word timings + BGM + SFX → audio_meta.json |
the one engine — media-use/audio/scripts/audio.mjs, run in the background; wait-bgm.mjs before render when BGM generates |
| Frames | design spec + the plan (+ a confirmed sketch when one exists — dress that layout, never redraw it: review-loop.md § 3) |
each scene at compositions/frames/NN-*.html, marked animated in the storyboard as it lands |
frame.md + frames-animation blueprints / rules (+ the genre lens, menu § Genre lenses); parallel dispatch per subagent-dispatch.md |
| Duration sync | word timings + frames | scene durations trued to real voice length — real duration wins, silent scenes keep estimates, synced values are never hand-edited | a mechanical rule; the narrative workflows' audio scripts apply it, a freeform build applies it by hand |
| Assembly | frames | the index composition — scenes as sub-compositions on tracks | sub-compositions.md + tracks-and-clips.md; borrowable assemble-index.mjs (menu) |
| Transitions | the assembled index | scene handoffs injected | frames-animation/transitions/overview.md → catalog.md; borrowable transitions.mjs (menu) |
| Captions | word timings + the index | the caption track | borrowable captions.mjs (menu); no script to time against → media-use scripts/transcribe.mjs first |
| Verify | the index (+ captions / transitions when present) | npx @hanzo/frames lint and npx @hanzo/frames check passing; a contact-sheet glance (snapshot --at <frame-midpoints>) |
frames-cli |
| Deliver | verify passing | the final-look pause → on approval render → optionally publish (a stable public link) → the recipe offer |
final approval and recipe offer: review-loop.md § 4; render / publish: frames-cli |
The Frames stage follows the plan's citations: a scene planned on a blueprint or on named rules is built by reading that recipe's body (frames-animation/blueprints/<id>.md, rules/<id>.md) before its motion is written — names come from the indexes, never invented, and a scene the plan left uncited gets its citation at build time, not improvised motion.
Scheduling economics (facts you can't see from inside the session)
- External generations are independent work. Image plates, TTS, BGM, video gen: fire every generation whose prompt is already known concurrently or in the background, and overlap the wait with reading or building. Three image plates generated one-after-another cost ~3× the wall time of firing them together.
- Attaching an image re-prices your whole context. A mid-session image inspection (especially at original detail) invalidates the prompt cache — the next request re-sends your entire history at full price. Batch visual checks (one contact sheet beats N single-frame views) and schedule them at phase boundaries, not mid-build.
Two attach points carry the user's voice into this loop: the plan that starts it was approved at review-loop.md § 1 (collaborative) or posted as a heads-up (autonomous), and nothing renders before the § 4 final look. Everything between those two is yours to schedule.