hyperframes 0.8.150 → 0.8.152

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/dist/{add-3ZIFEN2U.js → add-SA33REHW.js} +14 -14
  2. package/dist/{animatedGifPrep-77LPFLKJ.js → animatedGifPrep-3YXJQZ7L.js} +9 -9
  3. package/dist/api.js +19 -19
  4. package/dist/{asset-EYSZEHM6.js → asset-PUVPTWPD.js} +2 -2
  5. package/dist/{assetCataloger-KX3HD7ZI.js → assetCataloger-VWE2PLBX.js} +4 -4
  6. package/dist/{auth-L6IWNRXY.js → auth-PS3M6AI7.js} +1 -1
  7. package/dist/{autoUpdate-2O3HZB65.js → autoUpdate-CMO4SHWU.js} +2 -2
  8. package/dist/{backgroundChecks-BH2LMJYE.js → backgroundChecks-EDZ2A55J.js} +3 -3
  9. package/dist/backgroundChecksWorker.js +3 -3
  10. package/dist/{batchRender-ZBKAYLWU.js → batchRender-7PLJISCN.js} +5 -5
  11. package/dist/{beats-IVLF2566.js → beats-2MDSIOE7.js} +15 -15
  12. package/dist/{benchmark-SYZFW2G7.js → benchmark-KBBXAPI4.js} +10 -10
  13. package/dist/{browser-OSW3L25S.js → browser-OMWKZRSW.js} +5 -5
  14. package/dist/{bundleWithLocalizedFonts-I4CWOXLK.js → bundleWithLocalizedFonts-76DMCRIW.js} +2 -2
  15. package/dist/{capture-AZOQ57TM.js → capture-LRUUXH5Q.js} +2 -2
  16. package/dist/{capture-V5ICGSVJ.js → capture-YGDC7GN3.js} +13 -13
  17. package/dist/{catalog-VBJOA2Y5.js → catalog-SMEBKEVO.js} +14 -14
  18. package/dist/{catch-up-TKSEDNJK.js → catch-up-OMILX3WE.js} +4 -4
  19. package/dist/{check-3HFISKDB.js → check-NUZ62LIW.js} +288 -64
  20. package/dist/{checkBrowser-MXBDNZJB.js → checkBrowser-MSTVEL4V.js} +181 -38
  21. package/dist/{chunk-73RBX2E7.js → chunk-3DZBQ7MH.js} +3 -3
  22. package/dist/{chunk-6QB7F2II.js → chunk-3E4OCOC5.js} +1 -1
  23. package/dist/{chunk-OQ7XMM3S.js → chunk-3HPJM5IQ.js} +1 -1
  24. package/dist/{chunk-UJB7356Y.js → chunk-3LO7BBJX.js} +3 -3
  25. package/dist/{chunk-APDLWWFG.js → chunk-3VGU2SH7.js} +1 -1
  26. package/dist/{chunk-DUUFDLC4.js → chunk-4MLYMDQ4.js} +1 -1
  27. package/dist/{chunk-AXPNVC3N.js → chunk-4UMKAUZI.js} +1 -1
  28. package/dist/{chunk-XPQSL5VS.js → chunk-54DMWFQZ.js} +8 -1
  29. package/dist/chunk-57GN6KWT.js +179 -0
  30. package/dist/{chunk-374QQGBQ.js → chunk-5CS4T6C6.js} +63 -12
  31. package/dist/{chunk-PCWOSS7G.js → chunk-5ERVRJMV.js} +3 -3
  32. package/dist/{chunk-TZPZE5PS.js → chunk-5VMSUW4Z.js} +6 -3
  33. package/dist/{chunk-M6UDJ2E7.js → chunk-6Z4YJ5Q3.js} +3 -3
  34. package/dist/{chunk-FJWEYVEM.js → chunk-7FYFEXD2.js} +658 -198
  35. package/dist/{chunk-UQYQ7TBA.js → chunk-7NPSXBIN.js} +2 -2
  36. package/dist/chunk-7TASSBN2.js +215 -0
  37. package/dist/{chunk-F2RLIE7P.js → chunk-ANS56TPS.js} +11 -11
  38. package/dist/{chunk-DOVJRUFM.js → chunk-BQK3J7XO.js} +1 -1
  39. package/dist/{chunk-FPAT5HTI.js → chunk-BYJYQWEX.js} +10 -10
  40. package/dist/{chunk-XXPYZBZ3.js → chunk-C6TPGUWD.js} +2 -2
  41. package/dist/{chunk-XQMEGSHG.js → chunk-D6RJXQLD.js} +1 -1
  42. package/dist/{chunk-RW7NLGPD.js → chunk-DFXK7KUO.js} +25 -17
  43. package/dist/{chunk-6SFPQ2RZ.js → chunk-E6EYZ33P.js} +2 -2
  44. package/dist/{chunk-AKYQGZLU.js → chunk-EVTHG34H.js} +2 -2
  45. package/dist/{chunk-5NAYNDBT.js → chunk-EXH6L2XZ.js} +6 -2
  46. package/dist/{chunk-AIJS74LG.js → chunk-FFDC5OWV.js} +8 -2
  47. package/dist/{chunk-4WFNTWKZ.js → chunk-FNN5QINS.js} +2 -2
  48. package/dist/{chunk-DMKI64EZ.js → chunk-FSZAFCU7.js} +1 -1
  49. package/dist/{chunk-S5F26DUL.js → chunk-GQETH4PE.js} +3 -3
  50. package/dist/{chunk-3UAIVF4L.js → chunk-H2SGM2V2.js} +1 -1
  51. package/dist/{chunk-O4DC5CHF.js → chunk-H7FXBK3Q.js} +1 -1
  52. package/dist/{chunk-UVVI2NJQ.js → chunk-HBCRRCTX.js} +109 -31
  53. package/dist/{chunk-NFQY7EIC.js → chunk-IBYC3VUA.js} +1 -1
  54. package/dist/{chunk-2KAL22B5.js → chunk-IEDT4EXE.js} +1 -1
  55. package/dist/{chunk-I6DATIHC.js → chunk-IZIRIDJH.js} +2 -2
  56. package/dist/{chunk-Z6WZDGCS.js → chunk-IZKXUYZE.js} +2 -2
  57. package/dist/chunk-KCFF4ENE.js +24 -0
  58. package/dist/{chunk-6KWA3XPS.js → chunk-KZ3L3W4Q.js} +1 -1
  59. package/dist/{chunk-7IEGPJ4P.js → chunk-LBT4AMSF.js} +1 -1
  60. package/dist/{chunk-7JTFPUMA.js → chunk-LECTCGGS.js} +1 -1
  61. package/dist/{chunk-7E4VHPKJ.js → chunk-LVPSWUS6.js} +5 -5
  62. package/dist/{chunk-6NPFJ255.js → chunk-MNHPG2UO.js} +1 -1
  63. package/dist/{chunk-FN6KAS7A.js → chunk-NHAG2KCE.js} +7 -7
  64. package/dist/{chunk-423DJVX2.js → chunk-PKO2EWO7.js} +1 -1
  65. package/dist/{chunk-ZNHAJCEA.js → chunk-PRXAOZWZ.js} +28 -13
  66. package/dist/{chunk-VQ7YIURZ.js → chunk-PTXZDSW5.js} +5 -5
  67. package/dist/{chunk-XANZ4R4P.js → chunk-QECEOV6W.js} +3 -3
  68. package/dist/{chunk-BLRJKBKP.js → chunk-QESSGUKX.js} +1 -1
  69. package/dist/{chunk-WLIUULZQ.js → chunk-RN5I2DP5.js} +29 -15
  70. package/dist/chunk-S3RCK56N.js +3795 -0
  71. package/dist/{chunk-UAIUVPZE.js → chunk-SWCSL6WS.js} +6 -6
  72. package/dist/{chunk-2PSPARWP.js → chunk-TYXH3EKP.js} +4 -0
  73. package/dist/{chunk-FMNVTKX2.js → chunk-U3BCDVZO.js} +1 -1
  74. package/dist/{chunk-LW5VFBSY.js → chunk-VS732BUG.js} +1 -1
  75. package/dist/{chunk-LFNQDTSH.js → chunk-VYKPBRCB.js} +63 -12
  76. package/dist/{chunk-M5B42RL5.js → chunk-WUUOFMHU.js} +3 -3
  77. package/dist/{chunk-A6ZO4BX7.js → chunk-XEFFJRYX.js} +2 -2
  78. package/dist/{chunk-EL5QVJEG.js → chunk-XINGD6MS.js} +4 -4
  79. package/dist/chunk-XSEGMQYA.js +30 -0
  80. package/dist/{chunk-CZQLCBWY.js → chunk-YG2Y55KF.js} +1 -1
  81. package/dist/{chunk-B3XLIBFL.js → chunk-YIJMVFEJ.js} +1 -1
  82. package/dist/{chunk-JDB65PPT.js → chunk-YOEGUBBY.js} +13 -12
  83. package/dist/{chunk-AFRXL75S.js → chunk-YYEYOFHW.js} +1 -1
  84. package/dist/{chunk-R5A7454P.js → chunk-ZTM3RMAD.js} +2 -2
  85. package/dist/{clean-7HU7S7DT.js → clean-F75G45BI.js} +56 -35
  86. package/dist/cli.js +53 -53
  87. package/dist/{cloud-HAXHBO25.js → cloud-KVJAOUWH.js} +4 -4
  88. package/dist/{cloudrun-A3PIJ6DX.js → cloudrun-Q7Q7O4GY.js} +6 -6
  89. package/dist/{compare-6IPSQMSM.js → compare-DGUJ4QWU.js} +30 -30
  90. package/dist/{compiler-UQP2VXN6.js → compiler-NCN6PTVH.js} +6 -6
  91. package/dist/{component-FF3AU24M.js → component-PSYGT3JV.js} +3 -3
  92. package/dist/{compositions-JSH4MZXB.js → compositions-J3GAETIC.js} +13 -13
  93. package/dist/{delete-G763SW64.js → delete-MR7LRGRP.js} +2 -2
  94. package/dist/{deterministicFonts-C5JQLCTS.js → deterministicFonts-EOMDR6ZF.js} +3 -3
  95. package/dist/{dist-HUMFCJ6T.js → dist-2YYJYYPY.js} +3 -3
  96. package/dist/{dist-Z7Q3JS7K.js → dist-3MHXG6EJ.js} +4 -4
  97. package/dist/{doctor-WZB6WMBY.js → doctor-JOUGR5UK.js} +15 -15
  98. package/dist/{events-T4YFQC5G.js → events-63BKDWVO.js} +3 -3
  99. package/dist/{events-MUWJJCC7.js → events-FZFBJCIH.js} +2 -2
  100. package/dist/{feedback-AUTHQNN2.js → feedback-QLKWUDXR.js} +8 -8
  101. package/dist/{ffmpeg-TZB5WAYE.js → ffmpeg-MJFMBBSF.js} +2 -2
  102. package/dist/{figma-NBG6WBI7.js → figma-YJ7HGVQC.js} +3 -3
  103. package/dist/fontLocalizeCli.js +12 -12
  104. package/dist/{get-OXBJLKLV.js → get-54MUUXMR.js} +2 -2
  105. package/dist/{gpuPolicy-HBCCEQUS.js → gpuPolicy-5OVNR75D.js} +9 -9
  106. package/dist/{grade-compare-2LX4FDH7.js → grade-compare-7IDUF673.js} +32 -32
  107. package/dist/{gsapParserAcorn-VXZ3ZIF2.js → gsapParserAcorn-7NCK2LVT.js} +2 -2
  108. package/dist/{help-LJI46EDO.js → help-GQFYO5LU.js} +1 -1
  109. package/dist/{history-MFKAQEHU.js → history-UI3O7CSO.js} +77 -205
  110. package/dist/hyperframe-runtime.js +54 -54
  111. package/dist/hyperframe.manifest.json +1 -1
  112. package/dist/hyperframe.runtime.iife.js +54 -54
  113. package/dist/hyperframes-player.global.js +3 -3
  114. package/dist/{info-D6Y5O2QE.js → info-VQV3APEX.js} +9 -9
  115. package/dist/{init-47NZPEBI.js → init-2UBFV5D7.js} +31 -31
  116. package/dist/{inspect-U5UXJK5D.js → inspect-36ACJ3CO.js} +31 -31
  117. package/dist/{installer-AW7VFVTQ.js → installer-GDUZDJG4.js} +7 -7
  118. package/dist/{keyframes-5G334NWB.js → keyframes-GPBU34BG.js} +227 -82
  119. package/dist/{lambda-GASGXN3A.js → lambda-CBJVLTHY.js} +7 -7
  120. package/dist/{layout-OXAQFLJS.js → layout-2IHFV6EI.js} +31 -31
  121. package/dist/{lint-F36QFSNF.js → lint-IR6IYCEO.js} +9 -9
  122. package/dist/{lintProject-SSEXWCH6.js → lintProject-XQWXJYSC.js} +3 -3
  123. package/dist/{list-TR6QCI53.js → list-UAGKWARH.js} +2 -2
  124. package/dist/{login-6LA2RWTC.js → login-2GYCNCZF.js} +4 -4
  125. package/dist/{manager-ES2UFT4X.js → manager-X44GKUEL.js} +3 -3
  126. package/dist/{manager-GWU5J6RJ.js → manager-ZLJD3EAY.js} +2 -2
  127. package/dist/{media-treatment-BOHYDWVY.js → media-treatment-Z553F7XI.js} +14 -14
  128. package/dist/{models-6GW5Q3IW.js → models-6AZTNNSO.js} +15 -15
  129. package/dist/{motionShot-O7AOMPUN.js → motionShot-ARRL7WXT.js} +29 -16
  130. package/dist/{normalize-audio-UO5B4O76.js → normalize-audio-CME4NUB6.js} +6 -6
  131. package/dist/{open-JV2EHVKM.js → open-HU2VXUFD.js} +4 -4
  132. package/dist/{parakeetRunner-23DZUF6G.js → parakeetRunner-X5MKFMCB.js} +16 -16
  133. package/dist/{pipeline-KTICSIK7.js → pipeline-MNFTEBJU.js} +11 -11
  134. package/dist/{play-CMUYPXBC.js → play-2BBJDDAZ.js} +24 -24
  135. package/dist/{preflight-JOD4OXGC.js → preflight-JYOX64YP.js} +4 -4
  136. package/dist/{present-ZDT5FM2H.js → present-OE2WL2NY.js} +20 -20
  137. package/dist/{preview-ASHLGKDD.js → preview-RYSCCAWJ.js} +21 -21
  138. package/dist/{producer-FFH2KUAZ.js → producer-SQWNRO66.js} +1 -1
  139. package/dist/{projectConfig-FHIAOPKW.js → projectConfig-B55Z7YKQ.js} +9 -9
  140. package/dist/{publication-WO5ZXURT.js → publication-MDZCOBJP.js} +4 -4
  141. package/dist/{publish-QWO2W7FB.js → publish-AILV36BO.js} +12 -12
  142. package/dist/{remove-background-BO5MQR25.js → remove-background-6F72LKHG.js} +12 -12
  143. package/dist/{render-XTJKGT3G.js → render-2MZKU3L5.js} +10 -10
  144. package/dist/{render-SDHFXL3Y.js → render-5EREH6YD.js} +95 -37
  145. package/dist/{render-HS3YOLSD.js → render-6GH5FSXU.js} +5 -5
  146. package/dist/{render-batch-J64AJHQY.js → render-batch-UMBUQWWS.js} +5 -5
  147. package/dist/renderSetupWorker.js +6 -6
  148. package/dist/{resolver-IHNWMDJA.js → resolver-KO6WWO5P.js} +6 -6
  149. package/dist/{sherpa-FXBBYMDR.js → sherpa-DADGYWNR.js} +15 -15
  150. package/dist/skills/hyperframes/references/frame-worker-core.md +11 -9
  151. package/dist/skills/hyperframes/references/subagent-dispatch.md +1 -1
  152. package/dist/skills/hyperframes-cli/SKILL.md +3 -0
  153. package/dist/skills/hyperframes-cli/references/lint-validate-inspect.md +5 -1
  154. package/dist/skills/media-use/audio/scripts/lib/tts.cleanup.test.mjs +175 -0
  155. package/dist/skills/media-use/audio/scripts/lib/tts.mjs +24 -19
  156. package/dist/skills/media-use/references/grading.md +1 -2
  157. package/dist/skills/media-use/references/meta.md +17 -17
  158. package/dist/skills/media-use/references/operations.md +6 -6
  159. package/dist/skills/media-use/references/setup-providers.md +3 -4
  160. package/dist/skills/media-use/scripts/lib/cutlist.mjs +9 -2
  161. package/dist/skills/media-use/scripts/lib/cutlist.test.mjs +12 -0
  162. package/dist/skills/media-use/scripts/lib/telemetry.mjs +4 -1
  163. package/dist/skills/media-use/scripts/lib/telemetry.test.mjs +20 -0
  164. package/dist/skills/media-use/scripts/transcript-cut.mjs +23 -4
  165. package/dist/skills/media-use/scripts/transcript-cut.test.mjs +224 -0
  166. package/dist/{skills-ALLSN7TB.js → skills-QLKSNU4Y.js} +5 -5
  167. package/dist/{skillsUpdateCheck-EIT5NWM6.js → skillsUpdateCheck-Z2QQGF2W.js} +3 -3
  168. package/dist/{snapshot-Y3I76OIZ.js → snapshot-D5BBFXOS.js} +342 -154
  169. package/dist/{src-7V6LBC56.js → src-AVQBAECC.js} +10 -8
  170. package/dist/{src-S5IZVJUX.js → src-V7263E47.js} +11 -11
  171. package/dist/{staticProjectServer-QLWWGHZE.js → staticProjectServer-HNWSVEWN.js} +20 -20
  172. package/dist/studio/assets/{hyperframes-player-kup62bDR.js → hyperframes-player-0BY7-PK7.js} +1 -1
  173. package/dist/studio/assets/{index-B8BBYY8L.js → index-COrWdzlj.js} +1 -1
  174. package/dist/studio/assets/{index-CS_m0TkX.js → index-p-VXwuJ2.js} +132 -132
  175. package/dist/studio/assets/{index-DQ5jGodF.js → index-rmD5k_ES.js} +1 -1
  176. package/dist/studio/index.html +1 -1
  177. package/dist/{studio-api-UBFLZ3DA.js → studio-api-UXKTDWLT.js} +30 -16
  178. package/dist/{studioServer-REOVCIFP.js → studioServer-JOVR24O3.js} +51 -51
  179. package/dist/{synthesize-22B7L5GX.js → synthesize-MBDVUSH3.js} +2 -1
  180. package/dist/{telemetry-C3GDIXHO.js → telemetry-UW7XAM5W.js} +3 -3
  181. package/dist/{timeline-H42EGLMT.js → timeline-JSGTZ3AN.js} +73 -20
  182. package/dist/{tokens-2K7ISTKV.js → tokens-ADDBGTQ7.js} +2 -2
  183. package/dist/{transcribe-NUPASAUP.js → transcribe-FEHOK626.js} +14 -14
  184. package/dist/{transcribe-DVM7UFZZ.js → transcribe-P6MJGSZJ.js} +20 -20
  185. package/dist/{tts-QSAQZVEZ.js → tts-POI553RG.js} +1 -1
  186. package/dist/{updateCheck-3RWFSEZD.js → updateCheck-IBWMLXQ4.js} +2 -2
  187. package/dist/{upgrade-YKKL36N7.js → upgrade-NHZ7AYPO.js} +2 -2
  188. package/dist/{urlDownloader-6JNJYLPN.js → urlDownloader-ULDRBWS5.js} +8 -8
  189. package/dist/{validate-Z7KQT7GO.js → validate-NVWNXNBV.js} +25 -25
  190. package/dist/{video-EXL2JDSL.js → video-74DRD2DN.js} +9 -9
  191. package/package.json +1 -1
  192. package/dist/chunk-CEND6BLF.js +0 -3795
  193. package/dist/chunk-WBLXWOYK.js +0 -15
@@ -6,15 +6,19 @@ var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  maybePromptRenderFeedback
9
- } from "./chunk-UJB7356Y.js";
9
+ } from "./chunk-3LO7BBJX.js";
10
+ import {
11
+ captureArtifactRevision
12
+ } from "./chunk-KCFF4ENE.js";
13
+ import "./chunk-7TASSBN2.js";
10
14
  import {
11
15
  reportVariableIssues,
12
16
  resolveVariablesArg,
13
17
  validateVariablesAgainstProject
14
- } from "./chunk-UQYQ7TBA.js";
18
+ } from "./chunk-7NPSXBIN.js";
15
19
  import {
16
20
  loadProducer
17
- } from "./chunk-6QB7F2II.js";
21
+ } from "./chunk-3E4OCOC5.js";
18
22
  import {
19
23
  renderJobObservabilityTelemetryPayload
20
24
  } from "./chunk-VXVRPIJA.js";
@@ -26,11 +30,16 @@ import {
26
30
  resolveCompositionEntryArg,
27
31
  resolveDefaultFpsArg,
28
32
  windowsChromeCrashRemediation
29
- } from "./chunk-423DJVX2.js";
33
+ } from "./chunk-PKO2EWO7.js";
30
34
  import "./chunk-WPNE5NEP.js";
35
+ import {
36
+ recordRenderSuccess,
37
+ registerRenderOutput
38
+ } from "./chunk-7FYFEXD2.js";
39
+ import "./chunk-FFDC5OWV.js";
31
40
  import {
32
41
  resolveProject
33
- } from "./chunk-NFQY7EIC.js";
42
+ } from "./chunk-IBYC3VUA.js";
34
43
  import {
35
44
  formatLintStartupMessage
36
45
  } from "./chunk-6CSYCFQV.js";
@@ -46,23 +55,24 @@ import {
46
55
  resolvePrintedCaptureMode
47
56
  } from "./chunk-K2FLNJVB.js";
48
57
  import "./chunk-DCAI5DBR.js";
58
+ import "./chunk-DQBY7FRR.js";
49
59
  import {
50
60
  runEnvironmentChecks
51
- } from "./chunk-M5B42RL5.js";
61
+ } from "./chunk-WUUOFMHU.js";
52
62
  import "./chunk-442JNXRM.js";
53
63
  import {
54
64
  loadProjectConfig,
55
65
  readProjectConfigWithStatus,
56
66
  seedProjectAuthoringSkill
57
- } from "./chunk-XQMEGSHG.js";
67
+ } from "./chunk-D6RJXQLD.js";
58
68
  import "./chunk-XT7X6QCP.js";
59
69
  import "./chunk-4YYJOFKS.js";
60
70
  import {
61
71
  normalizeSkillSlug
62
72
  } from "./chunk-HVW7ABXD.js";
63
- import "./chunk-BLRJKBKP.js";
64
- import "./chunk-M6UDJ2E7.js";
65
- import "./chunk-OQ7XMM3S.js";
73
+ import "./chunk-QESSGUKX.js";
74
+ import "./chunk-6Z4YJ5Q3.js";
75
+ import "./chunk-3HPJM5IQ.js";
66
76
  import "./chunk-AWDFDFI3.js";
67
77
  import "./chunk-P6LJ4Y32.js";
68
78
  import "./chunk-GMECXFAN.js";
@@ -71,8 +81,8 @@ import {
71
81
  trackRenderError,
72
82
  trackRenderObservation,
73
83
  trackRenderPreflightRejected
74
- } from "./chunk-3UAIVF4L.js";
75
- import "./chunk-6KWA3XPS.js";
84
+ } from "./chunk-H2SGM2V2.js";
85
+ import "./chunk-KZ3L3W4Q.js";
76
86
  import "./chunk-VWG7OQKU.js";
77
87
  import {
78
88
  bytesToMb
@@ -95,10 +105,11 @@ import {
95
105
  import {
96
106
  c
97
107
  } from "./chunk-ZTZA4UWZ.js";
108
+ import "./chunk-EOOEC32M.js";
98
109
  import {
99
110
  hasDefinitiveEntryMismatch
100
111
  } from "./chunk-Q5X2B5WT.js";
101
- import "./chunk-7IEGPJ4P.js";
112
+ import "./chunk-LBT4AMSF.js";
102
113
  import "./chunk-K4WIOZFP.js";
103
114
  import {
104
115
  readConfigFresh,
@@ -112,11 +123,11 @@ import {
112
123
  } from "./chunk-ISN5GRYI.js";
113
124
  import {
114
125
  VERSION
115
- } from "./chunk-I6DATIHC.js";
126
+ } from "./chunk-IZIRIDJH.js";
116
127
  import "./chunk-EOVYQ3IG.js";
117
128
  import {
118
129
  createRenderCancellationScope
119
- } from "./chunk-4WFNTWKZ.js";
130
+ } from "./chunk-FNN5QINS.js";
120
131
  import {
121
132
  H264EncoderUnavailableError,
122
133
  chromeLaunchRemediation,
@@ -124,15 +135,15 @@ import {
124
135
  findFFmpeg,
125
136
  findFFprobe,
126
137
  getFFmpegInstallHint
127
- } from "./chunk-DUUFDLC4.js";
138
+ } from "./chunk-4MLYMDQ4.js";
128
139
  import "./chunk-AMKC3AXA.js";
129
140
  import {
130
141
  EXTRACT_CACHE_DIR_DISABLED_ALIASES,
131
142
  MAX_VP9_CPU_USED,
132
143
  MIN_VP9_CPU_USED,
133
144
  isVideoFrameFormat
134
- } from "./chunk-5NAYNDBT.js";
135
- import "./chunk-WLIUULZQ.js";
145
+ } from "./chunk-EXH6L2XZ.js";
146
+ import "./chunk-RN5I2DP5.js";
136
147
  import "./chunk-NE55C6S5.js";
137
148
  import "./chunk-JYVGYKXG.js";
138
149
  import {
@@ -140,8 +151,8 @@ import {
140
151
  fpsToFfmpegArg,
141
152
  fpsToNumber,
142
153
  parseFps
143
- } from "./chunk-PCWOSS7G.js";
144
- import "./chunk-CEND6BLF.js";
154
+ } from "./chunk-5ERVRJMV.js";
155
+ import "./chunk-S3RCK56N.js";
145
156
  import "./chunk-VC76R6W2.js";
146
157
  import "./chunk-UJKQWGFF.js";
147
158
  import {
@@ -149,7 +160,7 @@ import {
149
160
  isAspectAgnosticResolutionAlias,
150
161
  normalizeResolutionFlag,
151
162
  suggestMatchingPreset
152
- } from "./chunk-LFNQDTSH.js";
163
+ } from "./chunk-VYKPBRCB.js";
153
164
  import "./chunk-OFQWTKPW.js";
154
165
  import "./chunk-DPVXBVLL.js";
155
166
  import "./chunk-T76PLPD6.js";
@@ -157,24 +168,24 @@ import "./chunk-FXMKHHPO.js";
157
168
  import "./chunk-RQVDTPGD.js";
158
169
  import {
159
170
  killOrphanedProcessesForRender
160
- } from "./chunk-B3XLIBFL.js";
171
+ } from "./chunk-YIJMVFEJ.js";
161
172
  import {
162
173
  runRenderSetupWorker
163
- } from "./chunk-XPQSL5VS.js";
174
+ } from "./chunk-54DMWFQZ.js";
164
175
  import "./chunk-TWWSYAKJ.js";
165
176
  import {
166
177
  lintProject,
167
178
  shouldBlockRender
168
- } from "./chunk-JDB65PPT.js";
179
+ } from "./chunk-YOEGUBBY.js";
169
180
  import {
170
181
  collectSubCompositionSrcs
171
182
  } from "./chunk-IWFLMU2N.js";
172
- import "./chunk-APDLWWFG.js";
183
+ import "./chunk-3VGU2SH7.js";
173
184
  import "./chunk-VAS6HQX3.js";
174
185
  import "./chunk-3RM2ETQT.js";
175
186
  import "./chunk-BSQ7XANM.js";
176
187
  import "./chunk-SDYDNHEE.js";
177
- import "./chunk-2PSPARWP.js";
188
+ import "./chunk-TYXH3EKP.js";
178
189
  import "./chunk-IXLUTE6N.js";
179
190
  import {
180
191
  normalizeErrorMessage
@@ -672,7 +683,7 @@ async function executeRenderPlan(plan, dependencies, cancellation) {
672
683
  let batchModule;
673
684
  let preparedBatch;
674
685
  if (plan.batchPath) {
675
- batchModule = await import("./batchRender-ZBKAYLWU.js");
686
+ batchModule = await import("./batchRender-7PLJISCN.js");
676
687
  try {
677
688
  preparedBatch = batchModule.prepareBatchRender({
678
689
  batchPath: plan.batchPath,
@@ -761,7 +772,7 @@ function assertRenderActive(cancellation) {
761
772
  cancellation?.signal.throwIfAborted();
762
773
  }
763
774
  async function ensureRenderBrowser(plan, signal) {
764
- const { ensureBrowser } = await import("./manager-GWU5J6RJ.js");
775
+ const { ensureBrowser } = await import("./manager-ZLJD3EAY.js");
765
776
  let browserSpinner;
766
777
  try {
767
778
  if (plan.effectiveQuiet) {
@@ -1147,6 +1158,34 @@ var DockerRenderExitError = class extends Error {
1147
1158
  }
1148
1159
  };
1149
1160
 
1161
+ // src/utils/dockerBuildFailure.ts
1162
+ var DOCKER_BUILD_TIMEOUT_MINUTES = 10;
1163
+ function isSpawnTimeout(error) {
1164
+ return error instanceof Error && "code" in error && error.code === "ETIMEDOUT";
1165
+ }
1166
+ function describeDockerBuildFailure(error) {
1167
+ if (error instanceof Error && isSpawnTimeout(error.cause)) {
1168
+ return {
1169
+ title: "Docker image build timed out",
1170
+ message: `Building the render image took longer than ${DOCKER_BUILD_TIMEOUT_MINUTES} minutes, so it was stopped.`,
1171
+ hint: "Run the same command again. Docker keeps the layers it already built, so the build picks up where it stopped."
1172
+ };
1173
+ }
1174
+ const message = normalizeErrorMessage(error);
1175
+ if (/connect|not found|ENOENT/i.test(message)) {
1176
+ return {
1177
+ title: "Docker not available",
1178
+ message,
1179
+ hint: "Install Docker: https://docs.docker.com/get-docker/"
1180
+ };
1181
+ }
1182
+ return {
1183
+ title: "Docker image build failed",
1184
+ message,
1185
+ hint: "Check Docker is running: docker info"
1186
+ };
1187
+ }
1188
+
1150
1189
  // src/browser/macosOldChromeCrash.ts
1151
1190
  var DYLD_SYMBOL_NOT_FOUND = /Symbol not found:/i;
1152
1191
  var MACOS_13_ONLY_SYMBOL = /_kVTCompressionPropertyKey_ReferenceBufferCount/;
@@ -1543,11 +1582,11 @@ function ensureDockerImage(version, platform, quiet) {
1543
1582
  tag,
1544
1583
  tmpDir
1545
1584
  ],
1546
- { stdio: quiet ? "pipe" : "inherit", timeout: 6e5 }
1585
+ { stdio: quiet ? "pipe" : "inherit", timeout: DOCKER_BUILD_TIMEOUT_MINUTES * 6e4 }
1547
1586
  );
1548
1587
  } catch (error) {
1549
1588
  const message = normalizeErrorMessage(error);
1550
- throw new Error(`Failed to build Docker image: ${message}`);
1589
+ throw new Error(`Failed to build Docker image: ${message}`, { cause: error });
1551
1590
  } finally {
1552
1591
  rmSync(tmpDir, { recursive: true, force: true });
1553
1592
  }
@@ -1573,7 +1612,14 @@ function resolveDockerHostPlatform(options) {
1573
1612
  }
1574
1613
  return platform;
1575
1614
  }
1615
+ async function registerRenderOutputOrWarn(projectDir, outputPath) {
1616
+ await registerRenderOutput(projectDir, outputPath).catch(
1617
+ (error) => console.warn(`Render output was not registered: ${normalizeErrorMessage(error)}`)
1618
+ );
1619
+ }
1576
1620
  async function renderDocker(projectDir, outputPath, options) {
1621
+ await registerRenderOutputOrWarn(projectDir, outputPath);
1622
+ const capture = await captureArtifactRevision(projectDir).catch(() => void 0);
1577
1623
  const startTime = Date.now();
1578
1624
  const dockerVersion = isDevMode() ? "latest" : VERSION;
1579
1625
  if (!options.quiet && isDevMode()) {
@@ -1584,13 +1630,8 @@ async function renderDocker(projectDir, outputPath, options) {
1584
1630
  try {
1585
1631
  imageTag = ensureDockerImage(dockerVersion, platform, options.quiet);
1586
1632
  } catch (error) {
1587
- const message = normalizeErrorMessage(error);
1588
- const isDockerMissing = /connect|not found|ENOENT/i.test(message);
1589
- errorBox(
1590
- isDockerMissing ? "Docker not available" : "Docker image build failed",
1591
- message,
1592
- isDockerMissing ? "Install Docker: https://docs.docker.com/get-docker/" : "Check Docker is running: docker info"
1593
- );
1633
+ const failure = describeDockerBuildFailure(error);
1634
+ errorBox(failure.title, failure.message, failure.hint);
1594
1635
  failCommand();
1595
1636
  }
1596
1637
  const outputDir = dirname2(outputPath);
@@ -1654,6 +1695,11 @@ async function renderDocker(projectDir, outputPath, options) {
1654
1695
  }
1655
1696
  const elapsed = Date.now() - startTime;
1656
1697
  markRenderSucceeded();
1698
+ await runPostRenderStepAsync(
1699
+ "recordRenderSuccess",
1700
+ () => recordRenderSuccess(projectDir, outputPath, "completed", capture).then(() => {
1701
+ })
1702
+ );
1657
1703
  runPostRenderStep(
1658
1704
  "trackRenderComplete",
1659
1705
  () => trackRenderComplete({
@@ -1700,6 +1746,8 @@ async function renderLocal(projectDir, outputPath, options, commandCancellation)
1700
1746
  }
1701
1747
  }
1702
1748
  async function executeLocalRender(projectDir, outputPath, options, cancellation) {
1749
+ await registerRenderOutputOrWarn(projectDir, outputPath);
1750
+ const capture = await captureArtifactRevision(projectDir).catch(() => void 0);
1703
1751
  cancellation.checkAncestors();
1704
1752
  cancellation.signal.throwIfAborted();
1705
1753
  let recoveredOrphanTrees = 0;
@@ -1870,6 +1918,16 @@ async function executeLocalRender(projectDir, outputPath, options, cancellation)
1870
1918
  );
1871
1919
  }
1872
1920
  markRenderSucceeded();
1921
+ await runPostRenderStepAsync(
1922
+ "recordRenderSuccess",
1923
+ () => recordRenderSuccess(
1924
+ projectDir,
1925
+ outputPath,
1926
+ job.outcome === "completed_with_warnings" ? "completed_with_warnings" : "completed",
1927
+ capture
1928
+ ).then(() => {
1929
+ })
1930
+ );
1873
1931
  maybeConsumeDeParallelRouterTrial(deParallelRouterActive, job, options.quiet);
1874
1932
  const elapsed = Date.now() - startTime;
1875
1933
  if (job.outcome === "completed_with_warnings") {
@@ -15,7 +15,7 @@ import {
15
15
  reportVariableIssues,
16
16
  resolveVariablesArg,
17
17
  validateVariablesAgainstProject
18
- } from "./chunk-UQYQ7TBA.js";
18
+ } from "./chunk-7NPSXBIN.js";
19
19
  import "./chunk-FH7WODJH.js";
20
20
  import "./chunk-K2FLNJVB.js";
21
21
  import "./chunk-442JNXRM.js";
@@ -25,11 +25,11 @@ import {
25
25
  import {
26
26
  c
27
27
  } from "./chunk-ZTZA4UWZ.js";
28
- import "./chunk-PCWOSS7G.js";
29
- import "./chunk-CEND6BLF.js";
28
+ import "./chunk-5ERVRJMV.js";
29
+ import "./chunk-S3RCK56N.js";
30
30
  import "./chunk-VC76R6W2.js";
31
31
  import "./chunk-UJKQWGFF.js";
32
- import "./chunk-LFNQDTSH.js";
32
+ import "./chunk-VYKPBRCB.js";
33
33
  import "./chunk-OFQWTKPW.js";
34
34
  import "./chunk-DPVXBVLL.js";
35
35
  import "./chunk-T76PLPD6.js";
@@ -38,7 +38,7 @@ import "./chunk-RQVDTPGD.js";
38
38
  import "./chunk-3RM2ETQT.js";
39
39
  import "./chunk-BSQ7XANM.js";
40
40
  import "./chunk-SDYDNHEE.js";
41
- import "./chunk-2PSPARWP.js";
41
+ import "./chunk-TYXH3EKP.js";
42
42
  import "./chunk-IXLUTE6N.js";
43
43
  import "./chunk-M2WBOQ2Q.js";
44
44
 
@@ -14,7 +14,7 @@ import {
14
14
  loadProjectVariableSchema,
15
15
  reportVariableIssues,
16
16
  validateVariablesAgainstSchema
17
- } from "./chunk-UQYQ7TBA.js";
17
+ } from "./chunk-7NPSXBIN.js";
18
18
  import "./chunk-FH7WODJH.js";
19
19
  import {
20
20
  errorBox
@@ -27,11 +27,11 @@ import {
27
27
  import {
28
28
  c
29
29
  } from "./chunk-ZTZA4UWZ.js";
30
- import "./chunk-PCWOSS7G.js";
31
- import "./chunk-CEND6BLF.js";
30
+ import "./chunk-5ERVRJMV.js";
31
+ import "./chunk-S3RCK56N.js";
32
32
  import "./chunk-VC76R6W2.js";
33
33
  import "./chunk-UJKQWGFF.js";
34
- import "./chunk-LFNQDTSH.js";
34
+ import "./chunk-VYKPBRCB.js";
35
35
  import "./chunk-OFQWTKPW.js";
36
36
  import "./chunk-DPVXBVLL.js";
37
37
  import "./chunk-T76PLPD6.js";
@@ -40,7 +40,7 @@ import "./chunk-RQVDTPGD.js";
40
40
  import "./chunk-3RM2ETQT.js";
41
41
  import "./chunk-BSQ7XANM.js";
42
42
  import "./chunk-SDYDNHEE.js";
43
- import "./chunk-2PSPARWP.js";
43
+ import "./chunk-TYXH3EKP.js";
44
44
  import "./chunk-IXLUTE6N.js";
45
45
  import {
46
46
  normalizeErrorMessage
@@ -8,26 +8,26 @@ import "./chunk-Q5X2B5WT.js";
8
8
  import {
9
9
  ensureBrowser,
10
10
  releaseOwnedBrowserInstallLock
11
- } from "./chunk-7IEGPJ4P.js";
11
+ } from "./chunk-LBT4AMSF.js";
12
12
  import {
13
13
  killOrphanedProcesses
14
- } from "./chunk-B3XLIBFL.js";
14
+ } from "./chunk-YIJMVFEJ.js";
15
15
  import {
16
16
  installRenderSetupSignalHandlers,
17
17
  renderSetupErrorLine,
18
18
  renderSetupResultLine
19
- } from "./chunk-XPQSL5VS.js";
19
+ } from "./chunk-54DMWFQZ.js";
20
20
  import "./chunk-TWWSYAKJ.js";
21
21
  import {
22
22
  lintProject
23
- } from "./chunk-JDB65PPT.js";
23
+ } from "./chunk-YOEGUBBY.js";
24
24
  import "./chunk-IWFLMU2N.js";
25
- import "./chunk-APDLWWFG.js";
25
+ import "./chunk-3VGU2SH7.js";
26
26
  import "./chunk-VAS6HQX3.js";
27
27
  import "./chunk-3RM2ETQT.js";
28
28
  import "./chunk-BSQ7XANM.js";
29
29
  import "./chunk-SDYDNHEE.js";
30
- import "./chunk-2PSPARWP.js";
30
+ import "./chunk-TYXH3EKP.js";
31
31
  import "./chunk-IXLUTE6N.js";
32
32
  import "./chunk-KNU5COPB.js";
33
33
  import "./chunk-KGPLIH7B.js";
@@ -11,16 +11,16 @@ import {
11
11
  resolveItemWithDependencies,
12
12
  resolveItemsByTag,
13
13
  unreachableRegistryMessage
14
- } from "./chunk-BLRJKBKP.js";
15
- import "./chunk-OQ7XMM3S.js";
14
+ } from "./chunk-QESSGUKX.js";
15
+ import "./chunk-3HPJM5IQ.js";
16
16
  import "./chunk-AWDFDFI3.js";
17
17
  import "./chunk-P6LJ4Y32.js";
18
18
  import "./chunk-GMECXFAN.js";
19
- import "./chunk-PCWOSS7G.js";
20
- import "./chunk-CEND6BLF.js";
19
+ import "./chunk-5ERVRJMV.js";
20
+ import "./chunk-S3RCK56N.js";
21
21
  import "./chunk-VC76R6W2.js";
22
22
  import "./chunk-UJKQWGFF.js";
23
- import "./chunk-LFNQDTSH.js";
23
+ import "./chunk-VYKPBRCB.js";
24
24
  import "./chunk-OFQWTKPW.js";
25
25
  import "./chunk-DPVXBVLL.js";
26
26
  import "./chunk-T76PLPD6.js";
@@ -29,7 +29,7 @@ import "./chunk-RQVDTPGD.js";
29
29
  import "./chunk-3RM2ETQT.js";
30
30
  import "./chunk-BSQ7XANM.js";
31
31
  import "./chunk-SDYDNHEE.js";
32
- import "./chunk-2PSPARWP.js";
32
+ import "./chunk-TYXH3EKP.js";
33
33
  import "./chunk-IXLUTE6N.js";
34
34
  import "./chunk-M2WBOQ2Q.js";
35
35
  export {
@@ -16,42 +16,42 @@ import {
16
16
  sherpaRuntimeLoadError,
17
17
  sherpaUnsupportedReason,
18
18
  transcribeWithSherpa
19
- } from "./chunk-6SFPQ2RZ.js";
19
+ } from "./chunk-E6EYZ33P.js";
20
20
  import "./chunk-BXCMXMJQ.js";
21
21
  import "./chunk-3DKN5WKL.js";
22
22
  import "./chunk-EOVYQ3IG.js";
23
- import "./chunk-XANZ4R4P.js";
24
- import "./chunk-4WFNTWKZ.js";
23
+ import "./chunk-QECEOV6W.js";
24
+ import "./chunk-FNN5QINS.js";
25
25
  import "./chunk-6BEFEWFB.js";
26
- import "./chunk-CZQLCBWY.js";
26
+ import "./chunk-YG2Y55KF.js";
27
27
  import "./chunk-PO2SDVQA.js";
28
- import "./chunk-DUUFDLC4.js";
28
+ import "./chunk-4MLYMDQ4.js";
29
29
  import "./chunk-AMKC3AXA.js";
30
- import "./chunk-5NAYNDBT.js";
31
- import "./chunk-WLIUULZQ.js";
30
+ import "./chunk-EXH6L2XZ.js";
31
+ import "./chunk-RN5I2DP5.js";
32
32
  import "./chunk-NE55C6S5.js";
33
33
  import "./chunk-JYVGYKXG.js";
34
- import "./chunk-PCWOSS7G.js";
35
- import "./chunk-CEND6BLF.js";
34
+ import "./chunk-5ERVRJMV.js";
35
+ import "./chunk-S3RCK56N.js";
36
36
  import "./chunk-VC76R6W2.js";
37
37
  import "./chunk-UJKQWGFF.js";
38
- import "./chunk-LFNQDTSH.js";
38
+ import "./chunk-VYKPBRCB.js";
39
39
  import "./chunk-OFQWTKPW.js";
40
40
  import "./chunk-DPVXBVLL.js";
41
41
  import "./chunk-T76PLPD6.js";
42
42
  import "./chunk-FXMKHHPO.js";
43
43
  import "./chunk-RQVDTPGD.js";
44
- import "./chunk-B3XLIBFL.js";
45
- import "./chunk-XPQSL5VS.js";
44
+ import "./chunk-YIJMVFEJ.js";
45
+ import "./chunk-54DMWFQZ.js";
46
46
  import "./chunk-TWWSYAKJ.js";
47
- import "./chunk-JDB65PPT.js";
47
+ import "./chunk-YOEGUBBY.js";
48
48
  import "./chunk-IWFLMU2N.js";
49
- import "./chunk-APDLWWFG.js";
49
+ import "./chunk-3VGU2SH7.js";
50
50
  import "./chunk-VAS6HQX3.js";
51
51
  import "./chunk-3RM2ETQT.js";
52
52
  import "./chunk-BSQ7XANM.js";
53
53
  import "./chunk-SDYDNHEE.js";
54
- import "./chunk-2PSPARWP.js";
54
+ import "./chunk-TYXH3EKP.js";
55
55
  import "./chunk-IXLUTE6N.js";
56
56
  import "./chunk-KNU5COPB.js";
57
57
  import "./chunk-JZIEZCQM.js";
@@ -7,8 +7,9 @@ You build the frame composition file(s) assigned in your dispatch and nothing el
7
7
  **INPUT** — your dispatch provides this role, your frame packet(s), and:
8
8
 
9
9
  - `PROJECT_DIR` — the project root; all paths are relative to it.
10
- - `frame_id` — e.g. `03-feature`. Use it **verbatim** as the composition id, the `window.__timelines` key, and the file name (`compositions/frames/03-feature.html`) — that path **is** the frame's `src` in `STORYBOARD.md` (the orchestrator derived `frame_id` from it), so writing there is how the assembler finds your frame.
10
+ - `frame_id` — e.g. `03-feature`. Use it **verbatim** as the composition id, the `window.__timelines` key, and the file name. Write to the exact `src` in your packet's storyboard block (e.g. `compositions/frames/<frame_id>.html` or `compositions/<frame_id>.html`); the orchestrator derived `frame_id` from that path, and the assembler reads it verbatim.
11
11
  - Your **packet** (`.hyperframes/frame-packets/<frame_id>.md`) — everything selected upstream for this frame. You never open the shared `STORYBOARD.md` (see below); the packet carries your exact **`## Frame N` block**:
12
+ - `src` — the exact output HTML path, relative to `PROJECT_DIR`. Preserve it; do not add or remove a `frames/` directory.
12
13
  - `scene` — a one-line contact-sheet caption. **Design intent, never visible DOM text.**
13
14
  - `voiceover` — the narration line. **Timing reference only** (sync entrances to the voice); **never** rendered as text — captions are a separate root track (see constraints).
14
15
  - `duration` — your render length in seconds. **Fixed upstream; never change it or tween to fill a different length.**
@@ -24,7 +25,7 @@ You build the frame composition file(s) assigned in your dispatch and nothing el
24
25
 
25
26
  **Retry** — if your context carries `lint` / `check` feedback from a prior pass, read it first and re-author so none of those findings recur; treat each as a hard constraint.
26
27
 
27
- **OUTPUT** — `compositions/frames/<frame_id>.html` for each assigned packet: exactly one bare `<template>…</template>` fragment. The first non-whitespace bytes are `<template`; the last are `</template>`. Never emit `<!doctype>`, `<html>`, `<head>`, `<body>`, or any markup outside that single template. Writing your assigned file(s) (past the self-check below) is your **terminal action** — you do not edit `STORYBOARD.md`, mint audio, assemble the index, run the CLI, or report back. The orchestrator picks up the file and marks the frame's `status`.
28
+ **OUTPUT** — the HTML file at each assigned packet's `src`: exactly one bare `<template>…</template>` fragment. The first non-whitespace bytes are `<template`; the last are `</template>`. Never emit `<!doctype>`, `<html>`, `<head>`, `<body>`, or any markup outside that single template. The workflow delta specifies any required sidecars and the dispatch specifies which packets you own. Writing all assigned HTML files and required sidecars (past the self-check below) is your **terminal action** — you do not edit `STORYBOARD.md`, mint audio, assemble the index, run the CLI, or report back. The orchestrator picks up the file and marks the frame's `status`.
28
29
 
29
30
  ## When a confirmed sketch exists
30
31
 
@@ -56,24 +57,25 @@ Shared law for every narrative frame, each load-bearing; your workflow's delta a
56
57
 
57
58
  1. **Read** — your packet top to bottom (your frame block, the inlined blueprint, the inlined rule recipes), then `frame.md` (the look). Internalize the self-check codes below before you write — most lethal is **template transport**: every `<style>` + `<script>` (including the gsap load) must live INSIDE `<template>`, because the runtime only clones template contents and the assembled-project `lint` / `check` gate can miss an unwired blank sub-composition.
58
59
  2. **Design** — turn the time-coded shot sequence into a timeline using `frame.md`'s components and type ramp: each Scene window becomes a phase revealed on its `voiceover` cue, each named motion built from the recipe in your packet, the blueprint's signature move kept recognizable. Find a visual idea that reinforces the beat, not a literal restyle of the words.
59
- 3. **Author** — write the full sub-composition to `compositions/frames/<frame_id>.html` (rewrite to iterate; last write wins). `<template>`-wrapped root carrying `data-composition-id="<frame_id>"` and styled via `#root` (not a class on that element — see the self-check below), exactly one `gsap.timeline({ paused: true })` registered at `window.__timelines["<frame_id>"]`, built synchronously.
60
+ 3. **Author** — write the full sub-composition to the exact `src` in your packet (rewrite to iterate; last write wins). `<template>`-wrapped root carrying `data-composition-id="<frame_id>"` and styled via `#root` (not a class on that element — see the self-check below), exactly one `gsap.timeline({ paused: true })` registered at `window.__timelines["<frame_id>"]`, built synchronously.
60
61
  Prefix authored ids and globally reusable class names with `<frame_id>-` so sibling frames assembled from parallel workers cannot collide. Contract selectors such as `#root` and `.clip` are the only exceptions.
61
- 4. **Self-check, then finish** — re-read your file against the checklist below and fix in place; then continue to your next assigned packet, if any. You do **not** run the CLI.
62
+ 4. **Self-check, then finish** — re-read your file against the checklist below and fix in place; write any sidecar required by the workflow delta, then continue to your next assigned packet, if any. You do **not** run the CLI.
62
63
 
63
64
  ## Self-check before finishing (you do NOT run the CLI)
64
65
 
65
- You **can't** meaningfully run `hyperframes lint` / `check` here: they operate on the **assembled project** (the `index.html` graph / bundle), and your frame isn't wired in yet — so they report on _other_ files, not yours (a false green). The **orchestrator** runs them after assembly (the correct unit), and **re-dispatches you with the finding** if your frame fails (see **Retry** above). So get it right on write: re-read your file against this checklist before finishing — the codes in parens are `hyperframes lint`'s and what the orchestrator may cite back:
66
+ You **can't** meaningfully run `hyperframes lint` / `check` here: they operate on the **assembled project** (the `index.html` graph / bundle), and your frame isn't wired in yet — so they report on _other_ files, not yours (a false green). The **orchestrator** runs them after assembly (the correct unit), and **re-dispatches you with the finding** if your frame fails (see **Retry** above). So get it right on write: re-read your file against this checklist before finishing — backticked diagnostic codes below are emitted by `hyperframes lint`; bold labels are manual workflow checks, not lint codes:
66
67
 
67
- - `missing_template_wrapper` / `missing_composition_id` — the entire file is exactly one bare `<template>…</template>` fragment (no DOCTYPE / full document); root carries `data-composition-id="<frame_id>"`.
68
+ - **Template wrapper (manual)** — the entire file is exactly one bare `<template>…</template>` fragment (no DOCTYPE / full document).
69
+ - `root_missing_composition_id` — root carries `data-composition-id="<frame_id>"`; check that the value matches your assigned frame id.
68
70
  - **Template transport** — every `<style>` and `<script>` block, including the GSAP load, lives inside `<template>`.
69
71
  - `subcomposition_root_styled_by_class` — **style the frame root via `#root`, never a class on the `data-composition-id` element**: at render a class on the root gets scoped to a descendant selector that can't match it, so the **whole scene renders unstyled** (Studio preview still looks right — trust this rule, not the preview). Descendants use plain selectors.
70
72
  - **Full-bleed background on a `class="clip"` layer, never `#root`** — author a frame's full-bleed ground (color field / gradient / grid) as a dedicated full-duration `class="clip"` background element on the lowest content track, **not** as a `background` on the `#root` / `data-composition-id` element. At assembly the frame root is clip-gated to its scene window, so a background painted on the root is not a dependable full-frame ground — dark content can end up over the host `body` (black) and render invisible. The video's base ground is painted separately by the assembler from `frame.md`'s `canvas` color onto the index `#root`; your full-bleed clip rides on top of it.
71
- - `clip_missing_data_attrs` — every `class="clip"` element has `data-start` / `data-duration` / `data-track-index`.
72
- - `timeline_not_paused` / `timeline_not_registered` — one paused timeline, registered at `window.__timelines["<frame_id>"]`.
73
+ - **Clip attributes (manual)** — every `class="clip"` element has `data-start` / `data-duration` / `data-track-index`.
74
+ - **Paused timeline + registration (manual for template frames)** — one paused timeline, registered at `window.__timelines["<frame_id>"]`. `gsap_timeline_not_registered` is a real lint code for standalone compositions, but the rule skips template/sub-compositions; it does not verify your frame registration.
73
75
  - `css_transition_used` + repeat / yoyo / non-deterministic logic — none present (the renderer seeks frame-by-frame).
74
76
  - `gsap_css_transform_conflict` — never put a CSS `transform` (e.g. `translateY(-50%)` centering) on an element you then GSAP-animate a transform prop on (`x` / `y` / `scale` / `rotation`): GSAP overwrites the whole `transform` and silently drops the CSS centering (the element jumps). Center with `margin` / `inset` (or `top`/`left` + offset), fold the offset into the tween via `xPercent` / `yPercent`, or use `fromTo` (the rule exempts it).
75
77
  - **Hero visibility** — the main subject is visible by `t <= 0.5s`; entrance tweens use `fromTo` instead of CSS-hidden starting states.
76
- - `exit_animation_on_non_final_scene` — no exit tween unless you are the final frame.
78
+ - **Non-final exit (manual)** — no exit tween unless you are the final frame.
77
79
  - **No front-loading (not a slide)** — the shot's pieces reveal on their `voiceover` cues across the duration, not all fired at `t=0`; a non-still frame keeps content arriving rather than holding a full canvas from ~25%.
78
80
  - **Shot-sequence fidelity** — every Scene in the time-coded sequence is realized as a phase, the blueprint's signature move (unless `compose`) is present and recognizable, and the shot reveals to the voiceover (never front-loaded at `t=0`).
79
81
  - `font_family_without_font_face` — every font you name has a matching `@font-face` **inside this file**. **Only use fonts that ship as files** with the project: the families declared in `frame.md` (their `.woff2` live in `assets/fonts/` or `capture/assets/fonts/` — point the `@font-face` `src` at the real file you find there). **Never name a font that has no file**, including system CJK / Japanese / Devanagari families (`Hiragino Sans`, `Yu Gothic`, `Noto Sans CJK`, `Noto Sans Devanagari`, …): the render machine is a clean headless Chrome with none of them installed, so the text silently falls back to a generic font and the typography is wrong in the MP4. For non-Latin or multilingual visible text, either use a shipped font that covers the script, or romanize / transliterate it (e.g. `日本語` → `Japanese`); if neither is possible it is out of scope for this frame — do not invent a font name.
@@ -10,7 +10,7 @@ The video workflows (`product-launch-video` / `faceless-explainer` / `pr-to-vide
10
10
 
11
11
  ## Concurrency cap → batching rule (cap never changes scope)
12
12
 
13
- A harness concurrency limit **reduces parallelism, not work**: every scene still gets built, one scene per dispatch, with the available slots chewing through the full list.
13
+ A harness concurrency limit **reduces parallelism, not work**: every scene still gets built, with the available slots chewing through the full list. The workflow sets how many scenes each worker gets (`general-video` assigns 2–3).
14
14
 
15
15
  - When the harness queues excess children internally, submit **all N at once** and let the queue drain.
16
16
  - Harness hard-caps active children (e.g. OpenClaw `maxChildrenPerAgent`) → dispatch in **waves of the cap size**: start `cap` workers, wait for their artifacts, start the next wave, until all N scenes exist. Example: 9 scenes on a cap-3 harness = 3 waves of 3 — never drop scenes, never merge scenes into one worker to fit the cap.
@@ -79,6 +79,9 @@ Static audits cannot catch every mount failure. When the project uses sub-compos
79
79
 
80
80
  ```bash
81
81
  npx hyperframes snapshot --at <t1>,<t2>,<t3>
82
+ # For multiple samples within one scene or interval:
83
+ npx hyperframes snapshot --composition <data-composition-id> --frames 8
84
+ npx hyperframes snapshot --range 3:5 --frames 8
82
85
  ```
83
86
 
84
87
  Treat tiny unstyled content, canvas-sized icons, missing hero elements, or timeline-registration timeouts as render-blocking mount defects. See `hyperframes-core/references/sub-compositions.md` for the corresponding fixes.
@@ -104,9 +104,13 @@ Drop a `*.motion.json` sidecar next to the composition (matching the html basena
104
104
  npx hyperframes snapshot # 5 key frames as PNG
105
105
  npx hyperframes snapshot ./my-project # specific project
106
106
  npx hyperframes snapshot --frames 10 # evenly-spaced N frames
107
+ npx hyperframes snapshot --range 3:5 --frames 8 # 8 frames within root-timeline seconds 3–5
108
+ npx hyperframes snapshot --composition intro --frames 8 # 8 frames within this data-composition-id
107
109
  ```
108
110
 
109
- Captures still PNGs from the composition for visual diffing, thumbnails, or attaching to a PR. Faster than rendering a video when you only need a few hero frames. Output lands in the project's snapshots directory. Not deprecated: it remains the standalone capture utility, while `check --snapshots` covers the gate's needs (overview frames annotated with labeled finding boxes, plus `finding-NN-<code>.png` crops for every error finding with a bbox).
111
+ Still PNGs. Each run writes `.hyperframes/artifacts/snapshots/<id>/` unless `--output` is set. `snapshot` is the standalone capture; `check --snapshots` is the gate.
112
+
113
+ One of `--at`, `--range START:END` (seconds), or `--composition <data-composition-id>` (not a CSS selector). `--frames` defaults to 5. Range and composition sample just before the end and add no extra end frame; `--at` adds one unless `--no-end`.
110
114
 
111
115
  ### Zooming into a reported finding
112
116