Repository navigation
chore(tests): move gen-os-static asset links to static.heygen.ai - #7536
Merged
Merged
Conversation
The gen-os-static S3 bucket stops serving public reads on Nov 20. The producer regression fixtures and the kinetic-type example load test videos and voice files from it. The same objects, with the same keys and the same bytes, are now served from https://static.heygen.ai/<key>. This swaps the host for 39 of the 40 keys, in the fixture inputs and in the compiled.html goldens, so they stay in step. The dogs-captions clip (uploaded_assets/12ca139c_...mp4) stays on the old host for now. It is held until we decide to copy it or replace it. 17 compiled.html goldens were stored as plain git blobs although .gitattributes routes them to LFS. Editing them moves them into LFS. The two font URLs in urlDownloader.test.ts and htmlCompiler.test.ts are unchanged. They are example strings and are never fetched. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The dogs-captions clip (uploaded_assets/12ca139c_...mp4) is now copied to static.heygen.ai with the same bytes. This swaps its host in the fixture input and in the compiled.html golden, which moves into LFS. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
sudo-rm-rf-root
marked this pull request as ready for review
November 12, 2026 23:14
miguel-heygen
approved these changes
Nov 12, 2026
miguel-heygen
left a comment
Collaborator
There was a problem hiding this comment.
Review at a606c6e31. There were no other reviews when I posted.
Verified
- No fetched old-host URL is left.
git grep gen-os-staticat the head finds only the two font strings.- I fetched and smudged all 50 LFS-tracked
.htmlfiles at the head. None of them mention the old host. - The two font strings are never fetched.
htmlCompiler.test.ts:2272goes throughstubDownloadFetch.fetch, which the test stubs.urlDownloader.test.ts:170only goes throughassertPublicHttpsUrl.
- All 40 keys are byte-identical on both hosts.
- Every key returns 200 from
static.heygen.ai(CloudFront in front of S3). ItsContent-LengthandETagmatch the old bucket, including the multipart ETags on the large videos. - I also downloaded one key from both hosts (
f140a7f9…mp4), and the md5 sums match.
- Every key returns 200 from
- Inputs and goldens change in step.
- I smudged base and head for all 53 changed files and swapped
gen-os-static.s3.us-east-2.amazonaws.com/forstatic.heygen.ai/in the base copy. - All 53 are then byte-identical to the head, so no golden changes beyond the host. That covers the 18 goldens that move from blob to LFS and the 3 that were already in LFS.
- I smudged base and head for all 53 changed files and swapped
- LFS routing works, and CI used real golden content.
.gitattributes:18routespackages/producer/tests/**/output/compiled.htmlto LFS.regression.yml:122checks out withlfs: true.- In the shard logs, every touched fixture reports
compilation_completewitherrors:0, warnings:0. A golden left as a bare pointer would have no timed elements, so the comparison would have logged "Extra element" warnings for it. That confirms the comparison ran against real LFS content.
- CI. All regression shards and every other check are green on this head.
dogs-captions. It is taggedslow, so only the daily full run renders it. Its change is covered by the content check and the byte check above.
Nit (non-blocking): four goldens keep hashes of the old URLs
style-2-prod,style-4-prod,style-7-prodandstyle-11-prodchanged their sources but not theiroutput/compiled.htmlgoldens.- Those goldens don't contain the URL. They contain
_remote_media/download_<md5(url)[0:12]>, fromgetFilenameFromUrlaturlDownloader.ts:228-233, and six of those names are hashes of the old URLs. For example,style-4-prodhasdownload_1994e3d3b268, while the new URL givesdownload_47352078640b. - So a fresh compile now produces different filenames from those goldens.
- CI doesn't notice because
validateCompilation(compilationTester.ts:231) compares onlydata-composition-src, not mediasrc. - Nothing breaks. But the body's "inputs and goldens stay in step" isn't quite true for these four, and the next
--updatewill churn them. - Regenerating those four with
--update, or replacing the six hashes by hand, would close it.
Verdict: APPROVE
Reasoning: Every fetched link now points at a host that serves the same bytes, the goldens differ only by the host swap, and the LFS-backed regression run is green on this exact head. The stale download hashes in four goldens are cosmetic.
3 of 5 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
The
gen-os-staticS3 bucket stops serving public reads on Fri Nov 20. After that, every link tohttps://gen-os-static.s3.us-east-2.amazonaws.com/...returns 403. The producer regression fixtures and thekinetic-typeregistry example load test videos and AI voice files from that bucket, so those tests would break.What changed
https://static.heygen.ai/<key>.astral_assets/uploaded_assets/) and 17 voice files (astral_assets/generated_assets/). In total, 126 links change across 53 files.src/index.html,src/compositions/*.html) and in theoutput/compiled.htmlgoldens, so inputs and goldens stay in step.registry/examples/kinetic-type.packages/engine/src/utils/urlDownloader.test.tsandpackages/producer/src/services/htmlCompiler.test.ts. They are example strings for URL checks and are never fetched.Evidence
1. Same files on both hosts
For each of the 40 keys, I downloaded the file in full (read-only
GET) from the old URL and from the new URL. Then I compared the HTTP status, the byte count and the SHA-256.Result: 40 of 40 match. Both hosts return 200, with the same byte count and the same SHA-256 (263 MB in total). There are no mismatches.
Table: 40 keys
generated_assets/02937d93_65b31a3a3d1f4568b0516b66343245d6.mp395e015872dff3c68generated_assets/051b5d38_af2426f283a749de94ab615d459a565d.mp3a5b8d95a914e4359generated_assets/3a7e8a33_f7ebce6d456345779477498996aa0f74.mp3225aaf66a945e1d2generated_assets/3af40f3b_386326216dcf4956984e4c1c25663cdd.mp38f0e6f172ddb693dgenerated_assets/4ea1246d_d3e9e87e46be4104817dcd75d0adcef0.mp361723769fe95cb18generated_assets/52be8a19_b6ad2cf680444264933b185ff8295074.mp356614cbaf8504286generated_assets/52dc4e22_72f17e2dfc9f40c08f4a5cc82f53db61.mp31e94795bb3c7fc2dgenerated_assets/5a6b802e_a03d12a382bd40a3a6e70de32fbbcfc3.mp34391daf9141264e6generated_assets/61ada7ed_142d9432f783410185afebd0d00f1b7a.mp3daec04a14e4d33begenerated_assets/70b67ff2_d2b6d384b6124d01ba8d826bb8c1b43f.mp319ec08b754336ebagenerated_assets/731894a4_d2374e83720e4b339b6b71ceec1337d7.mp3e4eeba8fe041bdb5generated_assets/7ae8806d_d8eacbb4b2ab4a77af89be7208c0c918.mp36e78741b65467b05generated_assets/853dda23_70261e8b676444bfbfe147e34803851e.mp376adefaf733dd9cegenerated_assets/9e9b7f8a_b36aec8bcce6491f8da430e7e189f1a5.mp303b67017fd5b72c5generated_assets/a5bd8b8b_86b432b7de4c4fa6937b6a9cd37c67db.mp37dd1001b75703dbegenerated_assets/bd3cb328_5d3f0ddf41c14bb8bfad8ae242024334.mp35272a8cc04891b0fgenerated_assets/f87f97d4_0c49f6fa95224cc3bd4f5ea3a0d937c5.wav266ff7d5a49da0e1uploaded_assets/008477bc_391124feb22641f19fd463e5aeb1aeef.mp48ad2f37a89b4b143uploaded_assets/12ca139c_8bf35a3b61b84ab69251ad5091e4c69b.mp4560fb65860d7f439uploaded_assets/1dd17e4d_2c60a8b3482744e29584975d2b84164a.mp44dbb01f3757780fbuploaded_assets/2111e840_0579531a2ffe4c3ea8295b42051fb394.mp48ad2f37a89b4b143uploaded_assets/3053bdbd_3b610ff665ee4d11858cba59dbf47b8c.mp48ad2f37a89b4b143uploaded_assets/45a6a87b_ccb8e5b8362f48129491b55141ca3cb3.mp48ad2f37a89b4b143uploaded_assets/57704cd3_8424a748578a497084fd1278949184fc.mp48ad2f37a89b4b143uploaded_assets/61ae9527_715ce519da784c0daae4f3aade82ee56.mp44dbb01f3757780fbuploaded_assets/64b11740_ce531703293e4dbfa1de029a692e93e4.mp44dbb01f3757780fbuploaded_assets/67cf5a05_e134ec83a57042b38776c952da595870.mp47a1943dcffd08baauploaded_assets/70648f53_abe84fb9991841ae8ba82ee21ba6d37e.mp48ad2f37a89b4b143uploaded_assets/743011f1_e3c6afe3b7aa42369ce01e4961c60e22.mp48ad2f37a89b4b143uploaded_assets/852b4a6c_22c6186c3b844db1955bc9aaee70d348.mp48ad2f37a89b4b143uploaded_assets/8eb26801_b5ca4d50bb91437dac375c58b86d005c.mp48ad2f37a89b4b143uploaded_assets/a8bed725_8ae955c61e3141e09d9eadb97e0eef93.mp44dbb01f3757780fbuploaded_assets/c10d5d5c_5e0cbe68f361481f8d2c77b028e84504.mp44dbb01f3757780fbuploaded_assets/c311bdbf_97f959ca3be34382be873d54a405711b.mp48ad2f37a89b4b143uploaded_assets/cd544f35_70b817304d84455490962587aa52c167.mp41cb16830bbf25eb1uploaded_assets/e5d69fa9_6c6509753f4643cd9bef0b1dc9e1e001.mp48ad2f37a89b4b143uploaded_assets/f140a7f9_c8ae0ae2698f4a6895110bb9cbaadd74.mp42adf0f711e1acb8cuploaded_assets/f82d6e98_9076b56b449e44ac95a2099375863f91.mp44dbb01f3757780fbuploaded_assets/fb7e48ac_f6bf2ab079394d7ebd0491e7008a9242.mp45f1979d9de5c98fcuploaded_assets/fba9969d_c8c30a7e22ac40029c24c5135d27df04.mp44dbb01f3757780fb2. Only the host changed
For each of the 53 files, I compared the PR version with
main(merge baseeb90921). For LFS files, I compared the real content, not the pointer. Then I replacedhttps://gen-os-static.s3.us-east-2.amazonaws.com/withhttps://static.heygen.ai/in themainversion and diffed again.Result: 0 other changed lines in all 53 files. The table shows how many links changed in each file.
Table: 53 files
tests/chat/output/compiled.htmltests/chat/src/index.htmltests/dogs-captions/output/compiled.htmltests/dogs-captions/src/index.htmltests/font-variant-numeric/output/compiled.htmltests/font-variant-numeric/src/index.htmltests/many-cuts/output/compiled.htmltests/many-cuts/src/index.htmltests/overlay-montage-prod/output/compiled.htmltests/overlay-montage-prod/src/index.htmltests/pip-video-late-host/output/compiled.htmltests/pip-video-late-host/src/compositions/pip.htmltests/style-1-prod/output/compiled.htmltests/style-1-prod/src/index.htmltests/style-10-prod/output/compiled.htmltests/style-10-prod/src/compositions/graphics.htmltests/style-10-prod/src/compositions/main-orchestration.htmltests/style-11-prod/src/index.htmltests/style-12-prod/output/compiled.htmltests/style-12-prod/src/index.htmltests/style-13-prod/output/compiled.htmltests/style-13-prod/src/index.htmltests/style-15-prod/output/compiled.htmltests/style-15-prod/src/compositions/aroll.htmltests/style-16-prod/output/compiled.htmltests/style-16-prod/src/index.htmltests/style-17-prod/output/compiled.htmltests/style-17-prod/src/index.htmltests/style-18-prod/output/compiled.htmltests/style-18-prod/src/index.htmltests/style-2-prod/src/compositions/intro.htmltests/style-2-prod/src/compositions/stats.htmltests/style-2-prod/src/index.htmltests/style-3-prod/output/compiled.htmltests/style-3-prod/src/index.htmltests/style-4-prod/src/index.htmltests/style-5-prod/output/compiled.htmltests/style-5-prod/src/compositions/main.htmltests/style-5-prod/src/index.htmltests/style-6-prod/output/compiled.htmltests/style-6-prod/src/index.htmltests/style-7-prod/src/compositions/main.htmltests/style-7-prod/src/index.htmltests/style-8-prod/output/compiled.htmltests/style-8-prod/src/compositions/main-video.htmltests/style-9-prod/output/compiled.htmltests/style-9-prod/src/index.htmltests/sub-composition-video/output/compiled.htmltests/sub-composition-video/src/compositions/polaroid.htmltests/sub-composition-video/src/index.htmltests/vignelli-stacking/output/compiled.htmltests/vignelli-stacking/src/index.htmlregistry/examples/kinetic-type/index.html3. The tests render
CI. The
regressionworkflow runs these fixtures in Docker, split into shards. On this PR's head (a606c6e), run 42955167571 passed all 10 shards. It covered 24 of the 25 changed fixtures, and every one passed. The shard logs show 78 downloads fromstatic.heygen.ai, all with status 200 and the full byte count. No asset was downloaded fromgen-os-static. (A later run on the same commit skipped the shards because that commit had already passed.)Table: CI result per fixture
chatfont-variant-numericmany-cutsoverlay-montage-prodpip-video-late-hoststyle-1-prodstyle-2-prodstyle-3-prodstyle-4-prodstyle-5-prodstyle-6-prodstyle-7-prodstyle-8-prodstyle-9-prodstyle-10-prodstyle-11-prodstyle-12-prodstyle-13-prodstyle-15-prodstyle-16-prodstyle-17-prodstyle-18-prodsub-composition-videovignelli-stackingdogs-captionsruns nightly only (shard-schedule.json: one long fixture, 7 to 10.5 min), so CI did not run it on this PR. No CI job rendersregistry/examples/kinetic-type.Local, on a Mac (arm64),
--mode=in-process. Docker was not available, so I could not use the CI image. To separate the link change from differences in this Mac's setup, I ran each fixture twice: once with the PR version, and once withmain's version of the same fixture.static.heygen.ai)main(fetchesgen-os-static)dogs-captionsoverlay-montage-prodstyle-1-prodstyle-2-proddata-end/data-durationoff by about 40 ms from the goldenkinetic-type(hyperframes render -q draft)The
style-1-prodandstyle-2-prodfailures happen onmaintoo, so the link change does not cause them. They likely come from this Mac's Chrome and ffmpeg/ffprobe (7.1.5), which differ from the CI image. Both fixtures pass in CI on this PR.Other checks:
bun run lintpasses, andoxfmt --checkon the edited source HTML passes.bun run build, the producer unit tests (86 files, 1,290 tests) and the producer typecheck pass. Some engine unit tests about ffmpeg colour and frame sampling fail locally, for the same local-ffmpeg reason. This PR changes no engine file.4. What I could not test
dogs-captionsin CI. It runs only in the nightly regression job. I rendered it locally only: it passed, with the same output asmain.kinetic-typein CI. No CI job renders registry examples. I rendered it locally only: the output is byte-identical tomain's.🤖 Generated with Claude Code