Setting the file. One moment.
Subchapter 29.101
sub-agents/frame-worker.mdMarkdown5 KBView on GitHub
You build one frame’s composition file: compositions/frames/<frame_id>.html. Siblings build the other frames in parallel. The generic HyperFrames law — sub-composition shape, timeline registration, determinism, layout — lives in (
Also bundled
Frame Workerhyperframes-corereferences/sub-compositions.mddeterminism-rules.md + data-attributes.md); read it first. This file covers the music-specific part.Your job: follow the manual, fetch the materials, assemble. The storyboard tells you WHAT (the frame’s groups, each group’s template / primitives, content, brand, real beat-anchor seconds). You decide HOW (fetch the materials, bind them to this frame’s audio seconds, micro-timing, layout, namespacing).
PROJECT_DIR — project root; all paths relative to it.frame_id — the frame file’s stem, e.g. 02-f2. Use it verbatim as the composition id, the window.__timelines key, and the filename compositions/frames/<frame_id>.html (the assembler matches on it).## Frame N block in STORYBOARD.md — its span_sec, pacing, mood, feel, and its ### Groups list. Each group is one of:
template:<id> + params + role_bindings (real audiomap anchor seconds) + copy.free_design:{dominant_system, primitives, density_topology} + anchors[] + copy.asset:{treatment, clips, anchors?, overlay_copy?} (see montage.md).audiomap.json — timing truth; use the seconds you’re given.frame.md — the brand (palette + type). Pull every visual token from here.references/templates/<id>/index.html (its data-composition-variables give the param semantics) for template groups; references/motion-primitives/<id>/scene.html (the sub-composition; index.html only mounts it and holds the page background and font) for free groups; staged assets/… for asset groups.<width>×<height> and the frame’s pacing.If your dispatch carries lint / check feedback from a prior pass, address each finding.
### Groups is TBD/empty (Step 3 was skipped), report back and write nothing — never invent groups, templates, or copy.## Frame block: the groups, templates / primitives, copy, brand, and anchors. Build it as written. If a plan is genuinely wrong (wrong template or copy), stop and report — the orchestrator re-plans at Step 3.index.html; your frame is silent.gsap (your frame carries no gsap <script>).0 … span_len.## Frame block, frame.md, and the body of every template / primitive it cites. Reproduce those recipes.local_t = track_t − span_sec[0].compositions/frames/<frame_id>.html: a <template> wrapping #stage (data-composition-id="<frame_id>"), with all <style> / <script> inside it, and one paused gsap.timeline({paused:true}) registered at window.__timelines["<frame_id>"], built synchronously, ending in tl.seek(0). Give each group its own container; show it across its frame-local span with tl.set("#g1",{autoAlpha:1}, start) / tl.set("#g1",{autoAlpha:0}, end) (this 0ms swap is the group→group cut); namespace each group’s ids and shader uniforms g1_ / g2_. When forking a template, inline its DOM / CSS / tweens and use the host’s global gsap. On a phrase_flow frame, pace by phrase / energy.lint / check and snapshots after assembly (Step 6) and re-dispatches you with any finding.<template>-wrapped #stage; data-composition-id == timeline key == filename stem == <frame_id>; all <style> / <script> inside <template>; uses the host’s global gsap.tl.seek(0); data-duration == frame span length; silent.t=0 renders; group→group cuts are 0ms; ids / uniforms namespaced.params / copy, drawn from frame.md.phrase_flow frames pace by phrase / energy.hyperframes-core/determinism-rules.md (derive variation from indices; swap text / numbers with tl.set).<video>, direct children of #stage, with data-start / data-duration / data-track-index. Crossfade outgoing clips to opacity:0 ending at the next anchor.