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.
This commit is contained in:
calesthio
2026-04-18 18:37:00 -07:00
parent 9e17263aa5
commit b4f7ec4eee
118 changed files with 10128 additions and 126 deletions
+4 -1
View File
@@ -29,6 +29,7 @@ class BenchScenario:
scenes: list[dict[str, Any]]
edit_decisions: dict[str, Any] | None = None
renderer_family: str | None = None
render_runtime: str | None = None # remotion | hyperframes | ffmpeg (optional)
delivery_promise: dict[str, Any] | None = None
cuts: list[dict[str, Any]] = field(default_factory=list)
@@ -365,7 +366,9 @@ def run_bench(scenarios: list[BenchScenario], verbose: bool = False) -> list[Ben
if sc.expected_slideshow_verdict is not None:
try:
from lib.slideshow_risk import score_slideshow_risk
risk = score_slideshow_risk(sc.scenes, sc.edit_decisions, sc.renderer_family)
risk = score_slideshow_risk(
sc.scenes, sc.edit_decisions, sc.renderer_family, sc.render_runtime
)
actual = risk["verdict"]
ok = _verdict_matches(sc.expected_slideshow_verdict, actual)
result.checks["slideshow_risk"] = {