mirror of
https://github.com/hanzoai/video.git
synced 2026-11-03 04:21:39 +00:00
Separates creative grammar (renderer_family) from technical engine (render_runtime) so HyperFrames can stand alongside Remotion as a first-class runtime instead of masquerading as a Remotion sub-case. Locks runtime choice at proposal stage and enforces it end-to-end: the schemas require it, video_compose routes by it, the reviewer fails closed on silent swaps, and a parametrized contract test walks every pipeline manifest to ensure each planning-stage skill explains the conversation to the user. Adds hyperframes_compose (scaffold/lint/ validate/render/doctor/add_block), a playbook -> CSS style bridge, and vendored HyperFrames Layer 3 skills from commit d291358, pinned via PROVENANCE.md for future re-sync. Final_review now records render_runtime_used and runtime_swap_detected so compose lies are catchable after the fact.
2.7 KiB
2.7 KiB
Compose Director - Clip Factory Pipeline
When To Use
Render each clip and platform variant independently. The important behaviors here are consistency, batch resilience, and clear reporting of partial failures.
Runtime Routing (HARD CONSTRAINT — Remotion or FFmpeg only)
This pipeline is Phase 1 deferred from the HyperFrames adoption schedule. edit_decisions.render_runtime must be "remotion" (default) or "ffmpeg" (pure-concat clip jobs with no composition). HyperFrames is NOT a valid runtime here — clip-factory depends on Remotion word-level caption burn, and HyperFrames caption parity is deferred work.
- If
edit_decisions.render_runtime == "hyperframes", stop. Re-open the idea stage so the user can be presented the real constraint and lockremotionwith arender_runtime_selectiondecision that recordshyperframesasrejected_because: "caption-burn parity deferred on clip-factory". - Per AGENT_GUIDE.md → "Present Both Composition Runtimes (HARD RULE)": the constraint is NOT an excuse to skip the conversation. The user still gets to see that HyperFrames exists and why it isn't viable here.
- Pass
proposal_packet/brieftovideo_compose.execute()so the in-tool runtime-swap check runs end-to-end.
Prerequisites
| Layer | Resource | Purpose |
|---|---|---|
| Schema | schemas/artifacts/render_report.schema.json |
Artifact validation |
| Prior artifacts | state.artifacts["edit"]["edit_decisions"], state.artifacts["assets"]["asset_manifest"] |
Clip edits and assets |
| Tools | video_trimmer, video_compose, audio_mixer, color_grade |
Render pipeline |
| Media profiles | lib/media_profiles.py |
Platform targets |
Process
1. Treat Each Output As Its Own Job
One clip across three platforms is three render jobs. Name and track them explicitly.
2. Reuse What Can Be Shared
- shared audio mix where possible,
- shared subtitle styling,
- shared overlay assets,
- shared grading if the source needs it.
3. Fail Softly
If one clip or one platform variant fails:
- log it clearly,
- continue the rest of the batch,
- do not block successful exports.
4. Verify Every Output
Per render:
- correct duration,
- correct resolution/aspect ratio,
- no black opening frame,
- hook appears on time,
- subtitles render correctly,
- audio is present and consistent.
5. Use Render Report Metadata
Recommended metadata keys:
job_indexfailed_jobsshared_intermediatesplatform_groupings
Common Pitfalls
- Rendering sequentially without reason when jobs are independent.
- Treating a failed clip as a reason to stop the batch.
- Letting one platform variant quietly use the wrong framing or subtitle zone.