Building the in-a-hurry showcase video surfaced a real workflow gap:
bespoke-composition.md was Remotion-flavored throughout. A fresh agent
reading it for a music-driven hero piece would be routed straight to
Remotion atelier — missing that HyperFrames has no cut-schema and is
already atelier by its nature (every HF composition is a hand-authored
index.html with data-* timing and a GSAP timeline you write).
This commit reframes the doctrine to be runtime-aware:
- New "Atelier and the two runtimes" subsection explicitly separates
Remotion (atelier as escape hatch from cut-schema registry) from
HyperFrames (always atelier; composition_mode "atelier" is implicit).
Same principles apply in both cases; the rendering path differs.
- Step 3 (vocabulary) now routes to /hyperframes-animation for HF
projects — 36+ atomic rules (kinetic-beat-slam, 3d-text-depth-layers,
motion-blur-streak, ...), 15+ scene blueprints, 16 transition families,
7 runtime adapters (GSAP / Lottie / Three.js / Anime.js / CSS / WAAPI /
TypeGPU), and the html-in-canvas-patterns headline capability for 1–3
cinematic hero beats per video. Also points at /hyperframes-creative,
/hyperframes-media, /media-use, /hyperframes-cli.
- Step 4 (engine mechanics) adds HF-side gotchas alongside Remotion:
the data-* contract, mandatory class="clip", paused-timeline + seek
rule, lint/validate/snapshot verification primitives, stable-id
selectors over nth-of-type.
- Step 5 (render) split into per-runtime paths:
* Remotion atelier — auto-stage copy + bespoke contract (unchanged).
* HyperFrames — npx hyperframes init scaffold, beats workflow,
lint+validate+snapshot verification, npx hyperframes render.
Flags the known gap (F13): hyperframes_compose.render still requires
cuts[] from the templated path; call npx directly until the tool
grows a bespoke branch parallel to _render_via_atelier.
- Worked precedents section now lists both runtimes — Phantom Reach /
Compound Snowball / Library of Alexandria for Remotion atelier, plus
in-a-hurry for HyperFrames (kinetic-beat-slam + 3d-text-depth-layers
+ motion-blur-streak + css-distortion + html-in-canvas + Three.js
bloom).
F12 — Hero-component spine is a templating anti-pattern. The first
atelier proof (alexandria-fire) leaned on a single candle as scaffolding
under every scene with different text below — same hero, different
caption — which is exactly the "branded slides" pattern atelier was
supposed to break. The signature device is meant to appear in ONE or
at most two beats (typically the climactic moment), not as the visual
scaffolding of every scene. Each scene must earn its own composition:
a different primary visual subject, a different scale, a different motion
register. Doctrine added as step 1.5 in skills/meta/bespoke-composition.md
("Plan each scene as its own composition") plus a reviewer
scene_distinctness gate enforced at compose stage — the reviewer samples
one representative frame per scene and refuses to pass if two or more
scenes share their primary visual subject.
F9 — Captions/on-screen-text dedup. When a SerifLine reads the script
verbatim AND auto-captions emit the same text, the piece looks amateurish
even when the rest is beautiful. Rule added under engine mechanics: decide
once per piece whether captions add meaning (numbers, names, translations,
attributions) or are accessibility subtitles echoing narration — never
both for the same content. Reviewer gate at compose stage compares active
caption text against on-screen text in the same time window.
Both gates are CRITICAL; the publish-stage check was updated to expect
six (was four) resolved atelier findings.
Self-audit of alexandria-fire under the new rules: 4 of 5 scenes share
the candle as their primary visual subject — would now flag CRITICAL
scene_distinctness and require re-planning. (Re-author the piece in a
follow-up; the doctrine is the deliverable here.)
Introduce a hand-authored, project-local Remotion render path that bypasses
the cut-schema and the stock scene-type registry, for hero/bespoke videos
that must look distinct from one another.
- video_compose: composition_mode="atelier" (or renderer_family="bespoke")
routes to _render_via_atelier, which renders a project-local entry under
remotion-composer/projects/<slug>/ with an optional per-project public_dir
(skips copying the bloated shared public/). No cut-schema, no stock registry.
- skills/meta/bespoke-composition.md: routing skill — art direction
(visual-style) -> motion principles (Disney 12) -> engine mechanics
(remotion-best-practices + stock components read only as a mechanics codex)
-> atelier render. Doctrine: reuse engine knowledge, never creative components.
- AGENT_GUIDE: "Composition Authoring Mode" (templated vs atelier); default
atelier for hero work; scene-type catalog reframed as a mechanics codex.
- animation-runtime-selector + INDEX: authoring-mode-first pointers.
- base_tool.run_command: decode subprocess output as UTF-8/replace (Windows
cp1252 crashed the reader thread on Remotion's Unicode progress output).
- .gitignore: remotion-composer/projects/ (throwaway bespoke compositions).