Skill Tracer
Skills › HyperFrames › remotion-to-hyperframes › expected.json

expected.json

41 lines · skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/expected.json at a595755

1{
2 "tier": 3,
3 "name": "stargazed-data-driven",
4 "composition_id": "Stargazed",
5 "description": "Data-driven 10-second composition with three scenes, custom React subcomponents reused across scenes, a Zod schema with defaultProps, and a count-up number animation. Translates the realistic shape of a production Remotion composition into HF — without using the runtime adapter from PR #214.",
6 "duration_seconds": 10,
7 "fps": 30,
8 "width": 1280,
9 "height": 720,
10 "ssim_threshold": 0.9,
11 "validation": {
12 "measured_mean_ssim": 0.953,
13 "measured_min_ssim": 0.927,
14 "measured_p05_ssim": 0.938,
15 "measured_p95_ssim": 0.978,
16 "measured_at": "2026-09-18",
17 "measured_against": "remotion@4.0 (PNG output, BT.709) vs hyperframes@0.7.71 (sub-composition fixtures)",
18 "notes": "The September 18 SSIM measurements describe the quartic power3.out translation. The count-up fixture uses power2.out to match the cubic 1-(1-t)^3 curve exactly; those historical scores do not measure the corrected curve. Check rounded counts at matching frame times in addition to SSIM."
19 },
20 "remotion_apis_exercised": [
21 "Composition with z.object schema and typed defaultProps",
22 "Sequence (3 nested with computed offsets)",
23 "AbsoluteFill",
24 "useCurrentFrame, useVideoConfig",
25 "interpolate (single-segment, multi-segment, with extrapolation)",
26 "spring (two configs: damping:12 and damping:14)",
27 "Custom React subcomponents reused with different props (StatCard ×3)",
28 "Custom React utility component (AnimatedNumber for count-up)",
29 "Custom React utility component (UnderlinedText)",
30 "Per-instance delay via prop (delayInFrames)"
31 ],
32 "translation_notes": [
33 "Zod schema + defaultProps → data-* attributes on the root #stage div. The skill emits one data attribute per scalar prop; nested arrays (stats[]) get materialized as repeated HTML markup with per-instance data attributes (data-stat-index, data-stat-value, --card-color).",
34 "Custom React subcomponents inline as repeated HTML divs. The component prop interface becomes the repeated markup template. This is lossy for components with internal state — fine here because StatCard, AnimatedNumber, UnderlinedText all derive from props alone.",
35 "AnimatedNumber's frame-driven count-up → a GSAP tween on a { v: 0 } counter object with onUpdate rewriting textContent. GSAP's power2.out is cubic easeOut, matching the Remotion 1-(1-t)^3 manual ease.",
36 "Two different springs in this composition: damping:12 → back.out(1.4) (snappy), damping:14 → back.out(1.2) (calmer). The 1.4 vs 1.2 overshoot ratio approximates the damping difference.",
37 "Per-instance stagger via delayInFrames prop translates to a GSAP timeline offset of (i * 0.4)s.",
38 "Threshold 0.90 allows spring → back.out approximation (two different configs) and font/AA differences on body text. The cubic count-up curve matches exactly; evaluate rounded counts at matching frame times separately from SSIM."
39 ],
40 "rationale": "Threshold 0.90 sits ~0.04 below measured p05 (0.938). The wider gap vs T1/T2 reflects T3's bigger approximation budget (2 spring instances + count-up timing + font fallback on multiple text sizes). Mean SSIM below 0.90 = structural mismatch (wrong durations, wrong stagger, missing prop wiring), not approximation drift."