Files
calesthio 50891a75b7 hyperframes: add HTML/CSS/GSAP as a parallel composition runtime
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.
2026-04-18 18:37:00 -07:00

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 lock remotion with a render_runtime_selection decision that records hyperframes as rejected_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/brief to video_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_index
  • failed_jobs
  • shared_intermediates
  • platform_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.