hyperframes 0.8.150 → 0.8.151

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 (174) hide show
  1. package/dist/{add-3ZIFEN2U.js → add-QKZZG7A2.js} +11 -11
  2. package/dist/{animatedGifPrep-77LPFLKJ.js → animatedGifPrep-YQDPYGOD.js} +6 -6
  3. package/dist/api.js +16 -16
  4. package/dist/{asset-EYSZEHM6.js → asset-3Q737Y4H.js} +2 -2
  5. package/dist/{assetCataloger-KX3HD7ZI.js → assetCataloger-BTHEBJJB.js} +2 -2
  6. package/dist/{auth-L6IWNRXY.js → auth-XL7EU3SO.js} +1 -1
  7. package/dist/{autoUpdate-2O3HZB65.js → autoUpdate-PJFLTQ3U.js} +2 -2
  8. package/dist/{backgroundChecks-BH2LMJYE.js → backgroundChecks-T5TIR5WK.js} +3 -3
  9. package/dist/backgroundChecksWorker.js +3 -3
  10. package/dist/{batchRender-ZBKAYLWU.js → batchRender-NFLVIDB4.js} +3 -3
  11. package/dist/{beats-IVLF2566.js → beats-JU4GZ26R.js} +12 -12
  12. package/dist/{benchmark-SYZFW2G7.js → benchmark-7U2YWLTW.js} +8 -8
  13. package/dist/{browser-OSW3L25S.js → browser-D57UPYDA.js} +5 -5
  14. package/dist/{bundleWithLocalizedFonts-I4CWOXLK.js → bundleWithLocalizedFonts-26MXQOZG.js} +2 -2
  15. package/dist/{capture-AZOQ57TM.js → capture-47BV25G3.js} +2 -2
  16. package/dist/{capture-V5ICGSVJ.js → capture-LT252COQ.js} +10 -10
  17. package/dist/{catalog-VBJOA2Y5.js → catalog-BEZXOV4O.js} +11 -11
  18. package/dist/{catch-up-TKSEDNJK.js → catch-up-KVV5X6BF.js} +4 -4
  19. package/dist/{check-3HFISKDB.js → check-6KQ433E6.js} +189 -53
  20. package/dist/{checkBrowser-MXBDNZJB.js → checkBrowser-PRDR6XBY.js} +170 -28
  21. package/dist/{chunk-AFRXL75S.js → chunk-35PWWBGZ.js} +1 -1
  22. package/dist/{chunk-WLIUULZQ.js → chunk-3SVC7SW4.js} +28 -14
  23. package/dist/{chunk-EL5QVJEG.js → chunk-3ZPFRDEJ.js} +1 -1
  24. package/dist/{chunk-UQYQ7TBA.js → chunk-4LE27ST4.js} +1 -1
  25. package/dist/{chunk-DUUFDLC4.js → chunk-4MLYMDQ4.js} +1 -1
  26. package/dist/{chunk-Z6WZDGCS.js → chunk-4PKQEKAI.js} +2 -2
  27. package/dist/{chunk-VQ7YIURZ.js → chunk-4YZYYP7V.js} +5 -5
  28. package/dist/{chunk-XPQSL5VS.js → chunk-54DMWFQZ.js} +8 -1
  29. package/dist/{chunk-UVVI2NJQ.js → chunk-BRF3O35X.js} +6 -6
  30. package/dist/chunk-DHPFXAUF.js +165 -0
  31. package/dist/{chunk-6SFPQ2RZ.js → chunk-DIOBKUBV.js} +2 -2
  32. package/dist/{chunk-XQMEGSHG.js → chunk-FAIYEIZ4.js} +1 -1
  33. package/dist/{chunk-LW5VFBSY.js → chunk-FLVI7FHU.js} +1 -1
  34. package/dist/{chunk-JDB65PPT.js → chunk-GNTVYF7E.js} +8 -7
  35. package/dist/{chunk-423DJVX2.js → chunk-HVXRYMGQ.js} +1 -1
  36. package/dist/{chunk-F2RLIE7P.js → chunk-IP73NMQT.js} +11 -11
  37. package/dist/{chunk-2KAL22B5.js → chunk-IPDS2SWI.js} +1 -1
  38. package/dist/{chunk-6KWA3XPS.js → chunk-IZ7L6V76.js} +1 -1
  39. package/dist/{chunk-5NAYNDBT.js → chunk-IZPN423R.js} +6 -2
  40. package/dist/{chunk-4WFNTWKZ.js → chunk-KQGWP4KH.js} +2 -2
  41. package/dist/{chunk-NFQY7EIC.js → chunk-KXX6NLOT.js} +1 -1
  42. package/dist/{chunk-S5F26DUL.js → chunk-L3N7RJHS.js} +3 -3
  43. package/dist/{chunk-73RBX2E7.js → chunk-L6RIMCMG.js} +3 -3
  44. package/dist/{chunk-7IEGPJ4P.js → chunk-LBT4AMSF.js} +1 -1
  45. package/dist/{chunk-6NPFJ255.js → chunk-LKQS72D5.js} +1 -1
  46. package/dist/{chunk-RW7NLGPD.js → chunk-N3I6RAOR.js} +22 -14
  47. package/dist/{chunk-M6UDJ2E7.js → chunk-N4IXP3MY.js} +2 -2
  48. package/dist/{chunk-7E4VHPKJ.js → chunk-O3DUX6P2.js} +5 -5
  49. package/dist/{chunk-O4DC5CHF.js → chunk-OSAH7S5M.js} +1 -1
  50. package/dist/{chunk-UJB7356Y.js → chunk-OZ4K46OV.js} +3 -3
  51. package/dist/{chunk-6QB7F2II.js → chunk-POEEDPJI.js} +1 -1
  52. package/dist/{chunk-DOVJRUFM.js → chunk-PUIELIFA.js} +1 -1
  53. package/dist/chunk-QBYHNRHU.js +3795 -0
  54. package/dist/{chunk-XANZ4R4P.js → chunk-QF7AE3DB.js} +3 -3
  55. package/dist/{chunk-A6ZO4BX7.js → chunk-QLGBNGXC.js} +2 -2
  56. package/dist/{chunk-FPAT5HTI.js → chunk-RJRGR5KF.js} +10 -10
  57. package/dist/{chunk-AXPNVC3N.js → chunk-RRBKEHST.js} +1 -1
  58. package/dist/{chunk-UAIUVPZE.js → chunk-RYL6ZIJP.js} +6 -6
  59. package/dist/{chunk-TZPZE5PS.js → chunk-S22FKF6G.js} +6 -3
  60. package/dist/{chunk-I6DATIHC.js → chunk-TCWMDCBX.js} +2 -2
  61. package/dist/{chunk-M5B42RL5.js → chunk-WUUOFMHU.js} +3 -3
  62. package/dist/{chunk-BLRJKBKP.js → chunk-XGLNQDLN.js} +1 -1
  63. package/dist/{chunk-FN6KAS7A.js → chunk-XKKBIFE5.js} +7 -7
  64. package/dist/{chunk-ZNHAJCEA.js → chunk-XNDXENJQ.js} +27 -12
  65. package/dist/{chunk-PCWOSS7G.js → chunk-XQKVEQNY.js} +2 -2
  66. package/dist/{chunk-R5A7454P.js → chunk-XYHBVSWD.js} +2 -2
  67. package/dist/{chunk-7JTFPUMA.js → chunk-YEBKEWKB.js} +1 -1
  68. package/dist/{chunk-CZQLCBWY.js → chunk-YG2Y55KF.js} +1 -1
  69. package/dist/{chunk-B3XLIBFL.js → chunk-YIJMVFEJ.js} +1 -1
  70. package/dist/{chunk-OQ7XMM3S.js → chunk-YZTVHRJ2.js} +1 -1
  71. package/dist/{chunk-3UAIVF4L.js → chunk-ZD3RDNZI.js} +1 -1
  72. package/dist/{chunk-AKYQGZLU.js → chunk-ZGCRVM5M.js} +2 -2
  73. package/dist/{clean-7HU7S7DT.js → clean-RLTHFTQA.js} +16 -16
  74. package/dist/cli.js +52 -52
  75. package/dist/{cloud-HAXHBO25.js → cloud-Q5TGBTW3.js} +4 -4
  76. package/dist/{cloudrun-A3PIJ6DX.js → cloudrun-4UZF74MV.js} +3 -3
  77. package/dist/{compare-6IPSQMSM.js → compare-Q5UNR2V4.js} +23 -23
  78. package/dist/{compiler-UQP2VXN6.js → compiler-ZXT27Z62.js} +3 -3
  79. package/dist/{component-FF3AU24M.js → component-H734P32V.js} +3 -3
  80. package/dist/{compositions-JSH4MZXB.js → compositions-YEHDSTDR.js} +10 -10
  81. package/dist/{delete-G763SW64.js → delete-LDBMPWRT.js} +2 -2
  82. package/dist/{dist-Z7Q3JS7K.js → dist-7JXLFD6U.js} +2 -2
  83. package/dist/{dist-HUMFCJ6T.js → dist-RGE4QASU.js} +1 -1
  84. package/dist/{doctor-WZB6WMBY.js → doctor-XNJFIWJ7.js} +12 -12
  85. package/dist/{events-MUWJJCC7.js → events-G6UFLNXR.js} +2 -2
  86. package/dist/{events-T4YFQC5G.js → events-UKCPUWMH.js} +3 -3
  87. package/dist/{feedback-AUTHQNN2.js → feedback-CK3KZ7DE.js} +6 -6
  88. package/dist/{ffmpeg-TZB5WAYE.js → ffmpeg-MJFMBBSF.js} +2 -2
  89. package/dist/{figma-NBG6WBI7.js → figma-3D5C737B.js} +3 -3
  90. package/dist/fontLocalizeCli.js +8 -8
  91. package/dist/{get-OXBJLKLV.js → get-QGTQUWFT.js} +2 -2
  92. package/dist/{gpuPolicy-HBCCEQUS.js → gpuPolicy-G5QAQDYF.js} +6 -6
  93. package/dist/{grade-compare-2LX4FDH7.js → grade-compare-XIHOM62P.js} +25 -25
  94. package/dist/{help-LJI46EDO.js → help-U5UBXT52.js} +1 -1
  95. package/dist/{history-MFKAQEHU.js → history-5J73QZSA.js} +5 -5
  96. package/dist/hyperframe-runtime.js +54 -54
  97. package/dist/hyperframe.manifest.json +1 -1
  98. package/dist/hyperframe.runtime.iife.js +54 -54
  99. package/dist/hyperframes-player.global.js +3 -3
  100. package/dist/{info-D6Y5O2QE.js → info-RJHQQQUP.js} +7 -7
  101. package/dist/{init-47NZPEBI.js → init-M6UQOYYC.js} +28 -28
  102. package/dist/{inspect-U5UXJK5D.js → inspect-PRQWDBTP.js} +24 -24
  103. package/dist/{installer-AW7VFVTQ.js → installer-ZL7UKYK5.js} +4 -4
  104. package/dist/{keyframes-5G334NWB.js → keyframes-VMUJYTCQ.js} +6 -6
  105. package/dist/{lambda-GASGXN3A.js → lambda-ON42DRQD.js} +4 -4
  106. package/dist/{layout-OXAQFLJS.js → layout-QKBFVDVY.js} +24 -24
  107. package/dist/{lint-F36QFSNF.js → lint-ZQHHL2SV.js} +7 -7
  108. package/dist/{lintProject-SSEXWCH6.js → lintProject-3Z6OJCSO.js} +1 -1
  109. package/dist/{list-TR6QCI53.js → list-YBRKIWGF.js} +2 -2
  110. package/dist/{login-6LA2RWTC.js → login-4B2YXGLB.js} +4 -4
  111. package/dist/{manager-ES2UFT4X.js → manager-X44GKUEL.js} +3 -3
  112. package/dist/{manager-GWU5J6RJ.js → manager-ZLJD3EAY.js} +2 -2
  113. package/dist/{media-treatment-BOHYDWVY.js → media-treatment-5C5EJAAP.js} +11 -11
  114. package/dist/{models-6GW5Q3IW.js → models-R7ZDWBJ6.js} +12 -12
  115. package/dist/{motionShot-O7AOMPUN.js → motionShot-ZHESZNUL.js} +13 -13
  116. package/dist/{normalize-audio-UO5B4O76.js → normalize-audio-EVWZVTBM.js} +4 -4
  117. package/dist/{open-JV2EHVKM.js → open-TV6HT4UT.js} +4 -4
  118. package/dist/{parakeetRunner-23DZUF6G.js → parakeetRunner-YVVF4CG6.js} +13 -13
  119. package/dist/{pipeline-KTICSIK7.js → pipeline-ETR5SEBS.js} +8 -8
  120. package/dist/{play-CMUYPXBC.js → play-C6WONRZV.js} +17 -17
  121. package/dist/{preflight-JOD4OXGC.js → preflight-JYOX64YP.js} +4 -4
  122. package/dist/{present-ZDT5FM2H.js → present-RANXTVPA.js} +13 -13
  123. package/dist/{preview-ASHLGKDD.js → preview-KF6UMBT2.js} +18 -18
  124. package/dist/{producer-FFH2KUAZ.js → producer-CY2GXBWN.js} +1 -1
  125. package/dist/{projectConfig-FHIAOPKW.js → projectConfig-KPXCNMBM.js} +6 -6
  126. package/dist/{publication-WO5ZXURT.js → publication-Y36N4A7E.js} +2 -2
  127. package/dist/{publish-QWO2W7FB.js → publish-RCQJO35C.js} +8 -8
  128. package/dist/{remove-background-BO5MQR25.js → remove-background-3ZMXVWLB.js} +9 -9
  129. package/dist/{render-SDHFXL3Y.js → render-FKVRCDT2.js} +57 -34
  130. package/dist/{render-XTJKGT3G.js → render-PTNEFO5U.js} +8 -8
  131. package/dist/{render-HS3YOLSD.js → render-WUSTRMUD.js} +3 -3
  132. package/dist/{render-batch-J64AJHQY.js → render-batch-AQHU2JWZ.js} +3 -3
  133. package/dist/renderSetupWorker.js +4 -4
  134. package/dist/{resolver-IHNWMDJA.js → resolver-L5BDZJKU.js} +4 -4
  135. package/dist/{sherpa-FXBBYMDR.js → sherpa-3S3ISG7G.js} +12 -12
  136. package/dist/skills/hyperframes/references/frame-worker-core.md +11 -9
  137. package/dist/skills/hyperframes/references/subagent-dispatch.md +1 -1
  138. package/dist/skills/media-use/audio/scripts/lib/tts.cleanup.test.mjs +175 -0
  139. package/dist/skills/media-use/audio/scripts/lib/tts.mjs +24 -19
  140. package/dist/skills/media-use/references/grading.md +1 -2
  141. package/dist/skills/media-use/references/meta.md +17 -17
  142. package/dist/skills/media-use/references/operations.md +6 -6
  143. package/dist/skills/media-use/references/setup-providers.md +3 -4
  144. package/dist/skills/media-use/scripts/lib/cutlist.mjs +9 -2
  145. package/dist/skills/media-use/scripts/lib/cutlist.test.mjs +12 -0
  146. package/dist/skills/media-use/scripts/lib/telemetry.mjs +4 -1
  147. package/dist/skills/media-use/scripts/lib/telemetry.test.mjs +20 -0
  148. package/dist/skills/media-use/scripts/transcript-cut.mjs +23 -4
  149. package/dist/skills/media-use/scripts/transcript-cut.test.mjs +224 -0
  150. package/dist/{skills-ALLSN7TB.js → skills-X4WQEKNF.js} +5 -5
  151. package/dist/{skillsUpdateCheck-EIT5NWM6.js → skillsUpdateCheck-UYCVHDZ6.js} +3 -3
  152. package/dist/{snapshot-Y3I76OIZ.js → snapshot-YEYHQEZQ.js} +250 -139
  153. package/dist/{src-7V6LBC56.js → src-2NN2WB6X.js} +7 -5
  154. package/dist/{src-S5IZVJUX.js → src-OLBDPEG6.js} +7 -7
  155. package/dist/{staticProjectServer-QLWWGHZE.js → staticProjectServer-7H35NMWB.js} +13 -13
  156. package/dist/studio/assets/{hyperframes-player-kup62bDR.js → hyperframes-player-DJt8E7k4.js} +1 -1
  157. package/dist/studio/assets/{index-CS_m0TkX.js → index-BGks9KLI.js} +73 -73
  158. package/dist/studio/assets/{index-B8BBYY8L.js → index-DWIHrAY2.js} +1 -1
  159. package/dist/studio/assets/{index-DQ5jGodF.js → index-DgbLblGR.js} +1 -1
  160. package/dist/studio/index.html +1 -1
  161. package/dist/{studio-api-UBFLZ3DA.js → studio-api-HGM2A5I3.js} +7 -7
  162. package/dist/{studioServer-REOVCIFP.js → studioServer-M6XFL7N6.js} +43 -43
  163. package/dist/{telemetry-C3GDIXHO.js → telemetry-KVCZKVTE.js} +3 -3
  164. package/dist/{timeline-H42EGLMT.js → timeline-VYYKZR4V.js} +66 -13
  165. package/dist/{tokens-2K7ISTKV.js → tokens-B5NFFL55.js} +2 -2
  166. package/dist/{transcribe-NUPASAUP.js → transcribe-SBETOIWI.js} +11 -11
  167. package/dist/{transcribe-DVM7UFZZ.js → transcribe-WNFRYZAC.js} +17 -17
  168. package/dist/{updateCheck-3RWFSEZD.js → updateCheck-5MM2DFUC.js} +2 -2
  169. package/dist/{upgrade-YKKL36N7.js → upgrade-LWID54R3.js} +2 -2
  170. package/dist/{urlDownloader-6JNJYLPN.js → urlDownloader-CVLNXFDG.js} +5 -5
  171. package/dist/{validate-Z7KQT7GO.js → validate-V4CGQ6OF.js} +18 -18
  172. package/dist/{video-EXL2JDSL.js → video-VJB2KRSS.js} +6 -6
  173. package/package.json +1 -1
  174. package/dist/chunk-CEND6BLF.js +0 -3795
@@ -19,7 +19,7 @@ import {
19
19
  import {
20
20
  RemoveBackgroundError,
21
21
  removeBackground
22
- } from "./chunk-LW5VFBSY.js";
22
+ } from "./chunk-FLVI7FHU.js";
23
23
  import {
24
24
  DEFAULT_MODEL,
25
25
  DEFAULT_QUALITY,
@@ -31,18 +31,18 @@ import {
31
31
  listAvailableProviders,
32
32
  modelPath,
33
33
  selectProviders
34
- } from "./chunk-TZPZE5PS.js";
34
+ } from "./chunk-S22FKF6G.js";
35
35
  import "./chunk-3DKN5WKL.js";
36
36
  import "./chunk-6BEFEWFB.js";
37
37
  import "./chunk-PO2SDVQA.js";
38
- import "./chunk-DUUFDLC4.js";
38
+ import "./chunk-4MLYMDQ4.js";
39
39
  import "./chunk-AMKC3AXA.js";
40
- import "./chunk-5NAYNDBT.js";
41
- import "./chunk-WLIUULZQ.js";
40
+ import "./chunk-IZPN423R.js";
41
+ import "./chunk-3SVC7SW4.js";
42
42
  import "./chunk-NE55C6S5.js";
43
43
  import "./chunk-JYVGYKXG.js";
44
- import "./chunk-PCWOSS7G.js";
45
- import "./chunk-CEND6BLF.js";
44
+ import "./chunk-XQKVEQNY.js";
45
+ import "./chunk-QBYHNRHU.js";
46
46
  import "./chunk-VC76R6W2.js";
47
47
  import "./chunk-UJKQWGFF.js";
48
48
  import "./chunk-LFNQDTSH.js";
@@ -51,9 +51,9 @@ import "./chunk-DPVXBVLL.js";
51
51
  import "./chunk-T76PLPD6.js";
52
52
  import "./chunk-FXMKHHPO.js";
53
53
  import "./chunk-RQVDTPGD.js";
54
- import "./chunk-XPQSL5VS.js";
54
+ import "./chunk-54DMWFQZ.js";
55
55
  import "./chunk-TWWSYAKJ.js";
56
- import "./chunk-JDB65PPT.js";
56
+ import "./chunk-GNTVYF7E.js";
57
57
  import "./chunk-IWFLMU2N.js";
58
58
  import "./chunk-APDLWWFG.js";
59
59
  import "./chunk-VAS6HQX3.js";
@@ -6,15 +6,15 @@ 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-OZ4K46OV.js";
10
10
  import {
11
11
  reportVariableIssues,
12
12
  resolveVariablesArg,
13
13
  validateVariablesAgainstProject
14
- } from "./chunk-UQYQ7TBA.js";
14
+ } from "./chunk-4LE27ST4.js";
15
15
  import {
16
16
  loadProducer
17
- } from "./chunk-6QB7F2II.js";
17
+ } from "./chunk-POEEDPJI.js";
18
18
  import {
19
19
  renderJobObservabilityTelemetryPayload
20
20
  } from "./chunk-VXVRPIJA.js";
@@ -26,11 +26,11 @@ import {
26
26
  resolveCompositionEntryArg,
27
27
  resolveDefaultFpsArg,
28
28
  windowsChromeCrashRemediation
29
- } from "./chunk-423DJVX2.js";
29
+ } from "./chunk-HVXRYMGQ.js";
30
30
  import "./chunk-WPNE5NEP.js";
31
31
  import {
32
32
  resolveProject
33
- } from "./chunk-NFQY7EIC.js";
33
+ } from "./chunk-KXX6NLOT.js";
34
34
  import {
35
35
  formatLintStartupMessage
36
36
  } from "./chunk-6CSYCFQV.js";
@@ -48,21 +48,21 @@ import {
48
48
  import "./chunk-DCAI5DBR.js";
49
49
  import {
50
50
  runEnvironmentChecks
51
- } from "./chunk-M5B42RL5.js";
51
+ } from "./chunk-WUUOFMHU.js";
52
52
  import "./chunk-442JNXRM.js";
53
53
  import {
54
54
  loadProjectConfig,
55
55
  readProjectConfigWithStatus,
56
56
  seedProjectAuthoringSkill
57
- } from "./chunk-XQMEGSHG.js";
57
+ } from "./chunk-FAIYEIZ4.js";
58
58
  import "./chunk-XT7X6QCP.js";
59
59
  import "./chunk-4YYJOFKS.js";
60
60
  import {
61
61
  normalizeSkillSlug
62
62
  } from "./chunk-HVW7ABXD.js";
63
- import "./chunk-BLRJKBKP.js";
64
- import "./chunk-M6UDJ2E7.js";
65
- import "./chunk-OQ7XMM3S.js";
63
+ import "./chunk-XGLNQDLN.js";
64
+ import "./chunk-N4IXP3MY.js";
65
+ import "./chunk-YZTVHRJ2.js";
66
66
  import "./chunk-AWDFDFI3.js";
67
67
  import "./chunk-P6LJ4Y32.js";
68
68
  import "./chunk-GMECXFAN.js";
@@ -71,8 +71,8 @@ import {
71
71
  trackRenderError,
72
72
  trackRenderObservation,
73
73
  trackRenderPreflightRejected
74
- } from "./chunk-3UAIVF4L.js";
75
- import "./chunk-6KWA3XPS.js";
74
+ } from "./chunk-ZD3RDNZI.js";
75
+ import "./chunk-IZ7L6V76.js";
76
76
  import "./chunk-VWG7OQKU.js";
77
77
  import {
78
78
  bytesToMb
@@ -98,7 +98,7 @@ import {
98
98
  import {
99
99
  hasDefinitiveEntryMismatch
100
100
  } from "./chunk-Q5X2B5WT.js";
101
- import "./chunk-7IEGPJ4P.js";
101
+ import "./chunk-LBT4AMSF.js";
102
102
  import "./chunk-K4WIOZFP.js";
103
103
  import {
104
104
  readConfigFresh,
@@ -112,11 +112,11 @@ import {
112
112
  } from "./chunk-ISN5GRYI.js";
113
113
  import {
114
114
  VERSION
115
- } from "./chunk-I6DATIHC.js";
115
+ } from "./chunk-TCWMDCBX.js";
116
116
  import "./chunk-EOVYQ3IG.js";
117
117
  import {
118
118
  createRenderCancellationScope
119
- } from "./chunk-4WFNTWKZ.js";
119
+ } from "./chunk-KQGWP4KH.js";
120
120
  import {
121
121
  H264EncoderUnavailableError,
122
122
  chromeLaunchRemediation,
@@ -124,15 +124,15 @@ import {
124
124
  findFFmpeg,
125
125
  findFFprobe,
126
126
  getFFmpegInstallHint
127
- } from "./chunk-DUUFDLC4.js";
127
+ } from "./chunk-4MLYMDQ4.js";
128
128
  import "./chunk-AMKC3AXA.js";
129
129
  import {
130
130
  EXTRACT_CACHE_DIR_DISABLED_ALIASES,
131
131
  MAX_VP9_CPU_USED,
132
132
  MIN_VP9_CPU_USED,
133
133
  isVideoFrameFormat
134
- } from "./chunk-5NAYNDBT.js";
135
- import "./chunk-WLIUULZQ.js";
134
+ } from "./chunk-IZPN423R.js";
135
+ import "./chunk-3SVC7SW4.js";
136
136
  import "./chunk-NE55C6S5.js";
137
137
  import "./chunk-JYVGYKXG.js";
138
138
  import {
@@ -140,8 +140,8 @@ import {
140
140
  fpsToFfmpegArg,
141
141
  fpsToNumber,
142
142
  parseFps
143
- } from "./chunk-PCWOSS7G.js";
144
- import "./chunk-CEND6BLF.js";
143
+ } from "./chunk-XQKVEQNY.js";
144
+ import "./chunk-QBYHNRHU.js";
145
145
  import "./chunk-VC76R6W2.js";
146
146
  import "./chunk-UJKQWGFF.js";
147
147
  import {
@@ -157,15 +157,15 @@ import "./chunk-FXMKHHPO.js";
157
157
  import "./chunk-RQVDTPGD.js";
158
158
  import {
159
159
  killOrphanedProcessesForRender
160
- } from "./chunk-B3XLIBFL.js";
160
+ } from "./chunk-YIJMVFEJ.js";
161
161
  import {
162
162
  runRenderSetupWorker
163
- } from "./chunk-XPQSL5VS.js";
163
+ } from "./chunk-54DMWFQZ.js";
164
164
  import "./chunk-TWWSYAKJ.js";
165
165
  import {
166
166
  lintProject,
167
167
  shouldBlockRender
168
- } from "./chunk-JDB65PPT.js";
168
+ } from "./chunk-GNTVYF7E.js";
169
169
  import {
170
170
  collectSubCompositionSrcs
171
171
  } from "./chunk-IWFLMU2N.js";
@@ -672,7 +672,7 @@ async function executeRenderPlan(plan, dependencies, cancellation) {
672
672
  let batchModule;
673
673
  let preparedBatch;
674
674
  if (plan.batchPath) {
675
- batchModule = await import("./batchRender-ZBKAYLWU.js");
675
+ batchModule = await import("./batchRender-NFLVIDB4.js");
676
676
  try {
677
677
  preparedBatch = batchModule.prepareBatchRender({
678
678
  batchPath: plan.batchPath,
@@ -761,7 +761,7 @@ function assertRenderActive(cancellation) {
761
761
  cancellation?.signal.throwIfAborted();
762
762
  }
763
763
  async function ensureRenderBrowser(plan, signal) {
764
- const { ensureBrowser } = await import("./manager-GWU5J6RJ.js");
764
+ const { ensureBrowser } = await import("./manager-ZLJD3EAY.js");
765
765
  let browserSpinner;
766
766
  try {
767
767
  if (plan.effectiveQuiet) {
@@ -1147,6 +1147,34 @@ var DockerRenderExitError = class extends Error {
1147
1147
  }
1148
1148
  };
1149
1149
 
1150
+ // src/utils/dockerBuildFailure.ts
1151
+ var DOCKER_BUILD_TIMEOUT_MINUTES = 10;
1152
+ function isSpawnTimeout(error) {
1153
+ return error instanceof Error && "code" in error && error.code === "ETIMEDOUT";
1154
+ }
1155
+ function describeDockerBuildFailure(error) {
1156
+ if (error instanceof Error && isSpawnTimeout(error.cause)) {
1157
+ return {
1158
+ title: "Docker image build timed out",
1159
+ message: `Building the render image took longer than ${DOCKER_BUILD_TIMEOUT_MINUTES} minutes, so it was stopped.`,
1160
+ hint: "Run the same command again. Docker keeps the layers it already built, so the build picks up where it stopped."
1161
+ };
1162
+ }
1163
+ const message = normalizeErrorMessage(error);
1164
+ if (/connect|not found|ENOENT/i.test(message)) {
1165
+ return {
1166
+ title: "Docker not available",
1167
+ message,
1168
+ hint: "Install Docker: https://docs.docker.com/get-docker/"
1169
+ };
1170
+ }
1171
+ return {
1172
+ title: "Docker image build failed",
1173
+ message,
1174
+ hint: "Check Docker is running: docker info"
1175
+ };
1176
+ }
1177
+
1150
1178
  // src/browser/macosOldChromeCrash.ts
1151
1179
  var DYLD_SYMBOL_NOT_FOUND = /Symbol not found:/i;
1152
1180
  var MACOS_13_ONLY_SYMBOL = /_kVTCompressionPropertyKey_ReferenceBufferCount/;
@@ -1543,11 +1571,11 @@ function ensureDockerImage(version, platform, quiet) {
1543
1571
  tag,
1544
1572
  tmpDir
1545
1573
  ],
1546
- { stdio: quiet ? "pipe" : "inherit", timeout: 6e5 }
1574
+ { stdio: quiet ? "pipe" : "inherit", timeout: DOCKER_BUILD_TIMEOUT_MINUTES * 6e4 }
1547
1575
  );
1548
1576
  } catch (error) {
1549
1577
  const message = normalizeErrorMessage(error);
1550
- throw new Error(`Failed to build Docker image: ${message}`);
1578
+ throw new Error(`Failed to build Docker image: ${message}`, { cause: error });
1551
1579
  } finally {
1552
1580
  rmSync(tmpDir, { recursive: true, force: true });
1553
1581
  }
@@ -1584,13 +1612,8 @@ async function renderDocker(projectDir, outputPath, options) {
1584
1612
  try {
1585
1613
  imageTag = ensureDockerImage(dockerVersion, platform, options.quiet);
1586
1614
  } 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
- );
1615
+ const failure = describeDockerBuildFailure(error);
1616
+ errorBox(failure.title, failure.message, failure.hint);
1594
1617
  failCommand();
1595
1618
  }
1596
1619
  const outputDir = dirname2(outputPath);
@@ -25,7 +25,7 @@ import {
25
25
  reportVariableIssues,
26
26
  resolveVariablesArg,
27
27
  validateVariablesAgainstProject
28
- } from "./chunk-UQYQ7TBA.js";
28
+ } from "./chunk-4LE27ST4.js";
29
29
  import {
30
30
  buildPublishFileMap,
31
31
  zipPublishFileMap
@@ -35,15 +35,15 @@ import "./chunk-KMAAOHLO.js";
35
35
  import "./chunk-NAMGMP3R.js";
36
36
  import {
37
37
  resolveProject
38
- } from "./chunk-NFQY7EIC.js";
38
+ } from "./chunk-KXX6NLOT.js";
39
39
  import {
40
40
  errorBox,
41
41
  formatBytes,
42
42
  formatDuration
43
43
  } from "./chunk-K2FLNJVB.js";
44
44
  import "./chunk-442JNXRM.js";
45
- import "./chunk-3UAIVF4L.js";
46
- import "./chunk-6KWA3XPS.js";
45
+ import "./chunk-ZD3RDNZI.js";
46
+ import "./chunk-IZ7L6V76.js";
47
47
  import "./chunk-VWG7OQKU.js";
48
48
  import "./chunk-XBSPQ52S.js";
49
49
  import {
@@ -58,20 +58,20 @@ import {
58
58
  } from "./chunk-ZTZA4UWZ.js";
59
59
  import {
60
60
  withMeta
61
- } from "./chunk-AFRXL75S.js";
61
+ } from "./chunk-35PWWBGZ.js";
62
62
  import "./chunk-K4WIOZFP.js";
63
63
  import "./chunk-XUXGIA7H.js";
64
64
  import "./chunk-WERLJGIC.js";
65
65
  import "./chunk-ISN5GRYI.js";
66
- import "./chunk-I6DATIHC.js";
66
+ import "./chunk-TCWMDCBX.js";
67
67
  import {
68
68
  downloadToFile
69
69
  } from "./chunk-BXCMXMJQ.js";
70
70
  import "./chunk-EOVYQ3IG.js";
71
71
  import "./chunk-AMKC3AXA.js";
72
72
  import "./chunk-JYVGYKXG.js";
73
- import "./chunk-PCWOSS7G.js";
74
- import "./chunk-CEND6BLF.js";
73
+ import "./chunk-XQKVEQNY.js";
74
+ import "./chunk-QBYHNRHU.js";
75
75
  import "./chunk-VC76R6W2.js";
76
76
  import "./chunk-UJKQWGFF.js";
77
77
  import "./chunk-LFNQDTSH.js";
@@ -15,7 +15,7 @@ import {
15
15
  reportVariableIssues,
16
16
  resolveVariablesArg,
17
17
  validateVariablesAgainstProject
18
- } from "./chunk-UQYQ7TBA.js";
18
+ } from "./chunk-4LE27ST4.js";
19
19
  import "./chunk-FH7WODJH.js";
20
20
  import "./chunk-K2FLNJVB.js";
21
21
  import "./chunk-442JNXRM.js";
@@ -25,8 +25,8 @@ 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-XQKVEQNY.js";
29
+ import "./chunk-QBYHNRHU.js";
30
30
  import "./chunk-VC76R6W2.js";
31
31
  import "./chunk-UJKQWGFF.js";
32
32
  import "./chunk-LFNQDTSH.js";
@@ -14,7 +14,7 @@ import {
14
14
  loadProjectVariableSchema,
15
15
  reportVariableIssues,
16
16
  validateVariablesAgainstSchema
17
- } from "./chunk-UQYQ7TBA.js";
17
+ } from "./chunk-4LE27ST4.js";
18
18
  import "./chunk-FH7WODJH.js";
19
19
  import {
20
20
  errorBox
@@ -27,8 +27,8 @@ 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-XQKVEQNY.js";
31
+ import "./chunk-QBYHNRHU.js";
32
32
  import "./chunk-VC76R6W2.js";
33
33
  import "./chunk-UJKQWGFF.js";
34
34
  import "./chunk-LFNQDTSH.js";
@@ -8,19 +8,19 @@ 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-GNTVYF7E.js";
24
24
  import "./chunk-IWFLMU2N.js";
25
25
  import "./chunk-APDLWWFG.js";
26
26
  import "./chunk-VAS6HQX3.js";
@@ -11,13 +11,13 @@ import {
11
11
  resolveItemWithDependencies,
12
12
  resolveItemsByTag,
13
13
  unreachableRegistryMessage
14
- } from "./chunk-BLRJKBKP.js";
15
- import "./chunk-OQ7XMM3S.js";
14
+ } from "./chunk-XGLNQDLN.js";
15
+ import "./chunk-YZTVHRJ2.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-XQKVEQNY.js";
20
+ import "./chunk-QBYHNRHU.js";
21
21
  import "./chunk-VC76R6W2.js";
22
22
  import "./chunk-UJKQWGFF.js";
23
23
  import "./chunk-LFNQDTSH.js";
@@ -16,23 +16,23 @@ import {
16
16
  sherpaRuntimeLoadError,
17
17
  sherpaUnsupportedReason,
18
18
  transcribeWithSherpa
19
- } from "./chunk-6SFPQ2RZ.js";
19
+ } from "./chunk-DIOBKUBV.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-QF7AE3DB.js";
24
+ import "./chunk-KQGWP4KH.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-IZPN423R.js";
31
+ import "./chunk-3SVC7SW4.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-XQKVEQNY.js";
35
+ import "./chunk-QBYHNRHU.js";
36
36
  import "./chunk-VC76R6W2.js";
37
37
  import "./chunk-UJKQWGFF.js";
38
38
  import "./chunk-LFNQDTSH.js";
@@ -41,10 +41,10 @@ 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-GNTVYF7E.js";
48
48
  import "./chunk-IWFLMU2N.js";
49
49
  import "./chunk-APDLWWFG.js";
50
50
  import "./chunk-VAS6HQX3.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.