Skip to content

Commit 2af3a11

Browse files
committed
Merge remote-tracking branch 'upstream/main' into fix/ffprobe-robustness
# Conflicts: # packages/engine/src/utils/ffprobe.ts
2 parents 8b80461 + a069730 commit 2af3a11

184 files changed

Lines changed: 14596 additions & 1274 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.claude-plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "hyperframes",
33
"description": "HyperFrames by HeyGen. Write HTML, render video. Compositions, GSAP and runtime adapter animations, captions, voiceovers, audio-reactive visuals, and website capture for HyperFrames.",
4-
"version": "0.7.71",
4+
"version": "0.7.72",
55
"author": {
66
"name": "HeyGen",
77
"email": "hyperframes@heygen.com",

.codex-plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "hyperframes",
33
"description": "Write HTML, render video. Compositions, Tailwind v4 styles, GSAP and runtime adapter animations, captions, voiceovers, audio-reactive visuals, and website capture for HyperFrames.",
4-
"version": "0.7.71",
4+
"version": "0.7.72",
55
"author": {
66
"name": "HeyGen",
77
"email": "hyperframes@heygen.com",

.cursor-plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"name": "hyperframes",
44
"displayName": "HyperFrames by HeyGen",
55
"description": "Write HTML, render video. Compositions, Tailwind v4 styles, GSAP and runtime adapter animations, captions, voiceovers, audio-reactive visuals, and website capture for HyperFrames.",
6-
"version": "0.7.71",
6+
"version": "0.7.72",
77
"author": {
88
"name": "HeyGen",
99
"email": "hyperframes@heygen.com"

.fallowrc.jsonc

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"packages/producer/src/**/*.test.ts",
55
"packages/aws-lambda/src/**/*.test.ts",
66
"packages/gcp-cloud-run/src/**/*.test.ts",
7+
"packages/gcp-cloud-run/terraform/*.test.ts",
78
"packages/producer/src/regression-harness.ts",
89
"packages/producer/src/regression-harness-distributed.test.ts",
910
"packages/producer/src/regression-harness-lambda-local.ts",
@@ -397,6 +398,18 @@
397398
// require intrusive middleware changes beyond this PR's scope.
398399
"minLines": 6,
399400
"ignore": [
401+
// AWS Lambda and GCP Cloud Run deliberately mirror the same distributed
402+
// rendering lifecycle while retaining provider-specific SDK, storage, and
403+
// retry semantics. The Plan v2 AWS adapter extends that existing symmetry;
404+
// extracting a shared cloud abstraction would couple independent packages.
405+
"packages/aws-lambda/src/handler.ts",
406+
"packages/aws-lambda/src/s3Transport.ts",
407+
// The GCP handler deliberately mirrors the AWS protocol lifecycle while
408+
// retaining provider-specific GCS, HTTP, and Cloud Workflows semantics.
409+
// Its tests also mirror the same wire-contract cases; a cross-provider
410+
// test abstraction would hide the adapter boundary being asserted.
411+
"packages/gcp-cloud-run/src/server.ts",
412+
"packages/gcp-cloud-run/src/server.test.ts",
400413
// sourcePatcher.ts: pre-existing internal clones between the inline-style
401414
// and attribute tag-patchers; only the PatchOperation type gained two
402415
// optional fields here, but the line shift makes fallow re-flag them.

bun.lock

Lines changed: 15 additions & 13 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/changelog.mdx

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,63 @@ Recent HyperFrames releases, including user-facing features, fixes, and migratio
88

99
{/* New release entries are prepended by `bun run changelog:draft <version> --write`. */}
1010

11+
<Update
12+
label="HyperFrames v0.7.72"
13+
description="Released - 2026-07-26"
14+
tags={["Release", "Producer", "Gcp Cloud Run", "AWS Lambda"]}
15+
>
16+
Distributed rendering now has a versioned Plan v2 contract with integrity-checked,
17+
content-addressed artifacts and a remote publisher seam for object-storage-backed
18+
workers, while retaining Plan v1 compatibility. This release also improves audio
19+
duration accuracy, diagnostics, deterministic media treatments, and animation tooling.
20+
21+
## Features
22+
23+
- **AWS Lambda:** Support plan protocol v2 ([5bf61d6df](https://github.com/heygen-com/hyperframes/commit/5bf61d6df0694c3077ecc7e84cd9d72f2029a5e6), [#2789](https://github.com/heygen-com/hyperframes/pull/2789))
24+
- **Producer:** Version distributed plan protocol ([f9f00b0ef](https://github.com/heygen-com/hyperframes/commit/f9f00b0efc2d1006967d5b2e0009ea3c3f6ed2e6), [#2777](https://github.com/heygen-com/hyperframes/pull/2777))
25+
- **Lint:** Dense motion re-sampling for content_overlap ([72e2f08f1](https://github.com/heygen-com/hyperframes/commit/72e2f08f15ceec105eb2bca6e9e35b8020e040be), [#2746](https://github.com/heygen-com/hyperframes/pull/2746))
26+
- **Studio:** Add keyframe ease editor ([c253dec23](https://github.com/heygen-com/hyperframes/commit/c253dec23b0a6f1ccfe49c17371fdc9823f73b4c))
27+
- **Core:** Add deterministic keyframe ease runtime ([5acbf240c](https://github.com/heygen-com/hyperframes/commit/5acbf240cbab38594d06b59b9ef7f2a4b37d31b7))
28+
- **Studio:** Add media treatment inspector ([39c2341c4](https://github.com/heygen-com/hyperframes/commit/39c2341c4d1edf52a00fb8db4a49553c739860cc))
29+
- **CLI:** Add agent-first media treatment tools ([4582881d0](https://github.com/heygen-com/hyperframes/commit/4582881d002c361afff59cc1c74ae072a50e17f7))
30+
- **Lint:** Add off_pivot_rotation hub-referenced layout check ([e710a1686](https://github.com/heygen-com/hyperframes/commit/e710a1686f2442b460ea4973dca0be97c81ef184), [#2744](https://github.com/heygen-com/hyperframes/pull/2744))
31+
- **Runtime:** Render media treatments deterministically ([944640c32](https://github.com/heygen-com/hyperframes/commit/944640c3283d604383fd437fcca8c63941d8e3d7))
32+
33+
## Fixes
34+
35+
- **Gcp Cloud Run:** Normalize v2 integrity codes ([0499a5cbc](https://github.com/heygen-com/hyperframes/commit/0499a5cbcb298c7dc4352a2d672b9e18c9db1d81), [#2790](https://github.com/heygen-com/hyperframes/pull/2790))
36+
- **Producer:** Document read-only plan hashing ([c6fdd9c01](https://github.com/heygen-com/hyperframes/commit/c6fdd9c0154aacef9e16ab9c89d3249d0ef5d356), [#2788](https://github.com/heygen-com/hyperframes/pull/2788))
37+
- **Producer:** Use portable audio padding filter ([3b9552ef9](https://github.com/heygen-com/hyperframes/commit/3b9552ef9db36b133485e4ce805892346e0b9006))
38+
- **Producer:** Normalize padded audio on sample timeline ([4b116b988](https://github.com/heygen-com/hyperframes/commit/4b116b98802c05f0eeb541878806692eea975541))
39+
- **Engine:** Stop mux at shortest normalized stream ([63bc525ca](https://github.com/heygen-com/hyperframes/commit/63bc525ca90b08356d50ebb41d4e15581c9d3470))
40+
- **Producer:** Preserve normalized audio mux duration ([532461599](https://github.com/heygen-com/hyperframes/commit/532461599b7518f4609002cdb314ff2ce9f3a70f))
41+
- **Render:** Cap final mux to video duration ([19258ea5b](https://github.com/heygen-com/hyperframes/commit/19258ea5ba47067e9d5756b122051c467ece0b04))
42+
- **Render:** Cap trimmed audio container duration ([afc4e96bb](https://github.com/heygen-com/hyperframes/commit/afc4e96bbed21dbcd29544a6be95d35db7dd4eed))
43+
- **Render:** Scope M4A priming preservation to trims ([9289551e9](https://github.com/heygen-com/hyperframes/commit/9289551e98958f006ec14af8ae9058096a4932fe))
44+
- **Render:** Preserve normalized M4A edit timing ([59c56d325](https://github.com/heygen-com/hyperframes/commit/59c56d325723bbcb7c54315023aedeb72b376cd8))
45+
- **Render:** Trim AAC packet padding exactly ([113a4985b](https://github.com/heygen-com/hyperframes/commit/113a4985b51bc1d77babe7113d6c96bbe46d41bf))
46+
- **Engine:** Preserve bounded ffprobe diagnostics ([8c5077068](https://github.com/heygen-com/hyperframes/commit/8c50770684bc87ca67592c45d4101e3c029193d2), [#2772](https://github.com/heygen-com/hyperframes/pull/2772))
47+
- **Audio:** Preserve causes and use portable padding ([37b88688e](https://github.com/heygen-com/hyperframes/commit/37b88688e7ae854e377c47fe3d9560ab0c930161), [#2769](https://github.com/heygen-com/hyperframes/pull/2769))
48+
- **Parsers:** Preserve duration-authored keyframe timing ([4bfbd89d6](https://github.com/heygen-com/hyperframes/commit/4bfbd89d633d5fd227023643db62d2a566984edb))
49+
- **Parsers:** Preserve authored keyframe intent ([d84e999f7](https://github.com/heygen-com/hyperframes/commit/d84e999f728e25cee15a71995805a52d0a7907c4))
50+
- **Studio:** Preserve composed media treatments ([d5c7d3ee1](https://github.com/heygen-com/hyperframes/commit/d5c7d3ee16c2db53b91c66353d4f6387fe23e920))
51+
- **Lint:** Drop false media_in_subcomposition rule ([e7f9918d2](https://github.com/heygen-com/hyperframes/commit/e7f9918d21f9fa57f1799c7b3ba38963cfcb52f1), [#2765](https://github.com/heygen-com/hyperframes/pull/2765))
52+
53+
## Catalog
54+
55+
- **Registry:** Add media treatment overlays ([b0d3164dd](https://github.com/heygen-com/hyperframes/commit/b0d3164ddb6177c6b31634f02a908fdae607850f))
56+
57+
## Internal
58+
59+
- **Producer:** Add remote-ready plan v2 publisher ([07f9a3de9](https://github.com/heygen-com/hyperframes/commit/07f9a3de954d663e61d0e7da233fe8d33a06a5f9), [#2792](https://github.com/heygen-com/hyperframes/pull/2792))
60+
- **Producer:** Remove stale audio concat remnants ([3ef194234](https://github.com/heygen-com/hyperframes/commit/3ef194234e6104664b8b1902ae916dd7480c3617))
61+
- **Render:** Cover duration-capped audio mux ([20188d637](https://github.com/heygen-com/hyperframes/commit/20188d637b51bed607593592469863ba189ea4ec))
62+
- **CLI:** Move render module collection outside hooks ([3b3d4f559](https://github.com/heygen-com/hyperframes/commit/3b3d4f559ca0b97a4d48d5dbaef10c296407c9cb), [#2780](https://github.com/heygen-com/hyperframes/pull/2780))
63+
- **Studio:** Simplify preview workspace layout ([bf47416e1](https://github.com/heygen-com/hyperframes/commit/bf47416e144bbd45c41375f357b229215aa11ccb))
64+
65+
[View the full commit range](https://github.com/heygen-com/hyperframes/compare/v0.7.71...v0.7.72).
66+
</Update>
67+
1168
<Update
1269
label="HyperFrames v0.7.71"
1370
description="Released - 2026-07-24"

examples/aws-lambda/README.md

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ aws stepfunctions start-execution \
7575
"ProjectS3Uri": "s3://${RENDER_BUCKET}/projects/my-project.tar.gz",
7676
"PlanOutputS3Prefix": "s3://${RENDER_BUCKET}/renders/$(date +%s)/",
7777
"OutputS3Uri": "s3://${RENDER_BUCKET}/output.mp4",
78+
"PlanProtocol": "v1",
7879
"Config": {
7980
"fps": 30,
8081
"width": 1920,
@@ -91,6 +92,9 @@ EOF
9192

9293
The Step Functions execution kicks off Plan, fans out RenderChunk via
9394
the Map state, and finally Assemble. Final mp4 lands at `OutputS3Uri`.
95+
`PlanProtocol` may be `"v1"` or `"v2"`; absent defaults to v1. V2 uses
96+
separate manifest and content-addressed artifact locators throughout the
97+
workflow and never places a v2 object in `PlanS3Uri`.
9498

9599
## Local invocation
96100

@@ -119,13 +123,14 @@ the architecture works on a deployed Lambda — use the local smoke
119123
script:
120124

121125
```bash
122-
# All defaults (mp4-h264-sdr fixture, chunk counts 2/4/8, PSNR >= 40 dB).
126+
# Defaults use the fixture's meta.json minPsnr (30 dB for mp4-h264-sdr).
123127
./scripts/smoke.sh
124128

125129
# Customised:
126130
./scripts/smoke.sh \
127131
--fixture mp4-h264-sdr \
128132
--chunk-counts 2,4,8,16 \
133+
--plan-protocol both \
129134
--psnr-threshold 40 \
130135
--reserved-concurrency 8
131136

@@ -141,7 +146,21 @@ per-run stack name, renders the fixture at each chunk count via the
141146
Step Functions state machine, PSNR-compares against the in-process
142147
baseline (which is git-LFS tracked under
143148
`packages/producer/tests/distributed/<fixture>/output/`), captures
144-
per-execution Step Functions history, and tears the stack down.
149+
per-execution Step Functions history, and tears the stack down. Use
150+
`--plan-protocol both` to run v1 and v2 through the same deployed Lambda
151+
package and baseline. Each v1/v2 pair is also gated directly on per-chunk
152+
hashes from Step Functions history, normalized decoded RGBA frame hashes,
153+
decoded 48 kHz stereo s16le PCM hashes and byte counts, normalized stream
154+
metadata, and duration. Encoded MP4 SHA equality is reported but is
155+
informational unless `--require-encoded-sha-equal` is set. The script
156+
assigns unique function/state-machine names, uses a
157+
dedicated temporary SAM artifact bucket, and removes render objects,
158+
retained buckets, the implicit Lambda log group, and deployment artifacts
159+
on teardown. Suspended-version buckets are purged in 1,000-entry batches,
160+
including concrete versions, null versions, and delete markers. It then
161+
verifies that the stack, both buckets, Lambda, state-machine, and both log
162+
groups are absent; an otherwise-successful run fails if cleanup cannot be
163+
proven.
145164

146165
**Wall-clock methodology caveat (`eval.sh` only).** `eval.sh` reports a
147166
local-vs-Lambda "speedup" column. The local timing includes `bun` +
@@ -162,9 +181,11 @@ spend is roughly $0.10-$0.20 per pass before S3 transfer. Lower
162181

163182
Outputs land under `<repo-root>/lambda-smoke-artifacts/`:
164183

165-
- `results.json``chunkCount × wallClockMs × psnrAvgDb`
166-
- `renders/N<N>-output.mp4` — each rendered chunk count
167-
- `renders/N<N>-history.json` — full Step Functions execution history
184+
- `results.json``planProtocol × chunkCount × wallClockMs × psnrAvgDb`
185+
- `semantic-comparisons.json` — direct v1/v2 semantic gate results
186+
- `renders/<protocol>-N<N>-output.mp4` — each rendered variant
187+
- `renders/<protocol>-N<N>-history.json` — full Step Functions execution history
188+
- `renders/v1-v2-N<N>.*` — normalized frame hashes, ffprobe metadata, and comparison JSON
168189

169190
Prerequisites: `aws` (v2), `sam` (≥ 1.100), `bun` (≥ 1.3), `ffmpeg`,
170191
`jq`, `zip`. AWS credentials come from the standard resolution chain
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"Action": "assemble",
3+
"PlanProtocol": "v2",
4+
"PlanV2ManifestS3Uri": "s3://example-bucket/renders/sample/v2/manifest.json",
5+
"PlanV2ArtifactS3Prefix": "s3://example-bucket/renders/sample/v2/artifacts/sha256",
6+
"PlanHash": "0000000000000000000000000000000000000000000000000000000000000000",
7+
"ChunkS3Uris": ["s3://example-bucket/renders/sample/chunks/0000.mp4"],
8+
"AudioS3Uri": null,
9+
"OutputS3Uri": "s3://example-bucket/renders/sample/output.mp4",
10+
"Format": "mp4"
11+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"Action": "plan",
3+
"PlanProtocol": "v2",
4+
"ProjectS3Uri": "s3://example-bucket/projects/sample.tar.gz",
5+
"PlanOutputS3Prefix": "s3://example-bucket/renders/sample/",
6+
"Config": {
7+
"fps": 30,
8+
"width": 1920,
9+
"height": 1080,
10+
"format": "mp4",
11+
"chunkSize": 240,
12+
"maxParallelChunks": 8,
13+
"runtimeCap": "lambda"
14+
}
15+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"Action": "renderChunk",
3+
"PlanProtocol": "v2",
4+
"PlanV2ManifestS3Uri": "s3://example-bucket/renders/sample/v2/manifest.json",
5+
"PlanV2ArtifactS3Prefix": "s3://example-bucket/renders/sample/v2/artifacts/sha256",
6+
"PlanHash": "0000000000000000000000000000000000000000000000000000000000000000",
7+
"ChunkIndex": 0,
8+
"ChunkOutputS3Prefix": "s3://example-bucket/renders/sample/",
9+
"Format": "mp4"
10+
}

0 commit comments

Comments
 (0)