@oh-story/dsh 0.1.9 → 0.1.11

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 (529) hide show
  1. package/README.md +14 -14
  2. package/lib/client.js +209 -73
  3. package/lib/client.js.map +3 -3
  4. package/lib/drama/manifest.json +248 -168
  5. package/lib/drama/skills/short-drama/SKILL.md +16 -4
  6. package/lib/drama/skills/short-drama/assets/project-template/short-drama.json +3 -0
  7. package/lib/drama/skills/short-drama/references/creator-documents.md +3 -0
  8. package/lib/drama/skills/short-drama/references/knowhow-index.md +15 -0
  9. package/lib/drama/skills/short-drama/scripts/creator_markdown_check.py +14 -0
  10. package/lib/drama/skills/short-drama/scripts/project_tool.py +131 -0
  11. package/lib/drama/skills/short-drama-assets/SKILL.md +2 -1
  12. package/lib/drama/skills/short-drama-assets/references/asset-review-checklist.md +2 -0
  13. package/lib/drama/skills/short-drama-assets/references/character-and-look.md +10 -0
  14. package/lib/drama/skills/short-drama-assets/references/continuity-lock.md +6 -9
  15. package/lib/drama/skills/short-drama-assets/references/era-anchors.md +37 -0
  16. package/lib/drama/skills/short-drama-assets/references/stage-contract.md +2 -0
  17. package/lib/drama/skills/short-drama-assets/references/voice-direction.md +28 -0
  18. package/lib/drama/skills/short-drama-develop/SKILL.md +10 -4
  19. package/lib/drama/skills/short-drama-develop/assets/adaptation-map.example.jsonl +1 -1
  20. package/lib/drama/skills/short-drama-develop/assets/creative-brief.md +8 -0
  21. package/lib/drama/skills/short-drama-develop/references/adaptation-craft.md +80 -13
  22. package/lib/drama/skills/short-drama-develop/references/episode-design.md +95 -12
  23. package/lib/drama/skills/short-drama-develop/references/genre-and-hook-playbook.md +9 -5
  24. package/lib/drama/skills/short-drama-develop/references/genre-cards//345/244/215/344/273/207/346/211/223/350/204/270.md +1 -1
  25. package/lib/drama/skills/short-drama-develop/references/genre-cards//347/263/273/347/273/237/346/265/201.md +51 -0
  26. package/lib/drama/skills/short-drama-develop/references/genre-cards//351/200/206/350/242/255.md +51 -0
  27. package/lib/drama/skills/short-drama-develop/references/genre-cards//351/207/215/347/224/237/347/251/277/350/266/212.md +51 -0
  28. package/lib/drama/skills/short-drama-develop/references/genre-cards.md +10 -7
  29. package/lib/drama/skills/short-drama-develop/references/premise-devices.md +15 -9
  30. package/lib/drama/skills/short-drama-develop/references/serial-character-and-memory.md +3 -2
  31. package/lib/drama/skills/short-drama-develop/references/stage-contract.md +14 -7
  32. package/lib/drama/skills/short-drama-develop/references/story-craft.md +7 -3
  33. package/lib/drama/skills/short-drama-edit/SKILL.md +65 -44
  34. package/lib/drama/skills/short-drama-edit/assets/remotion/README.md +49 -13
  35. package/lib/drama/skills/short-drama-edit/assets/remotion/package.json +4 -2
  36. package/lib/drama/skills/short-drama-edit/assets/remotion/src/Overlay.tsx +31 -0
  37. package/lib/drama/skills/short-drama-edit/assets/remotion/src/Root.tsx +5 -5
  38. package/lib/drama/skills/short-drama-edit/assets/remotion/src/Subtitles.tsx +68 -69
  39. package/lib/drama/skills/short-drama-edit/assets/remotion/src/font.ts +39 -29
  40. package/lib/drama/skills/short-drama-edit/assets/remotion/src/rules.mjs +188 -0
  41. package/lib/drama/skills/short-drama-edit/assets/remotion/src/schema.ts +26 -13
  42. package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/Card.tsx +72 -0
  43. package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/CornerChip.tsx +39 -0
  44. package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/ScreenText.tsx +36 -0
  45. package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/SystemPanel.tsx +44 -0
  46. package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/TaskPanel.tsx +100 -0
  47. package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/chrome.tsx +197 -0
  48. package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/tokens.ts +62 -0
  49. package/lib/drama/skills/short-drama-edit/assets/remotion/tsconfig.json +1 -0
  50. package/lib/drama/skills/short-drama-edit/assets//345/211/252/350/276/221/345/215/225.md +6 -4
  51. package/lib/drama/skills/short-drama-edit/references/cut-craft.md +26 -67
  52. package/lib/drama/skills/short-drama-edit/references/delivery-verify.md +31 -56
  53. package/lib/drama/skills/short-drama-edit/references/generated-footage.md +42 -78
  54. package/lib/drama/skills/short-drama-edit/references/sound-and-subtitles.md +44 -92
  55. package/lib/drama/skills/short-drama-edit/references/stage-contract.md +14 -16
  56. package/lib/drama/skills/short-drama-edit/scripts/edit_tool.py +1272 -125
  57. package/lib/drama/skills/short-drama-edit/scripts/selftest.py +113 -9
  58. package/lib/drama/skills/short-drama-image-prompts/SKILL.md +2 -0
  59. package/lib/drama/skills/short-drama-image-prompts/references/common-recipe.md +11 -0
  60. package/lib/drama/skills/short-drama-novel-analyze/SKILL.md +3 -3
  61. package/lib/drama/skills/short-drama-novel-analyze/assets/episode-candidate.example.jsonl +2 -2
  62. package/lib/drama/skills/short-drama-novel-analyze/references/adaptation-triage.md +8 -4
  63. package/lib/drama/skills/short-drama-novel-analyze/references/adaptation-value.md +10 -3
  64. package/lib/drama/skills/short-drama-novel-analyze/references/aggregation-and-entities.md +25 -1
  65. package/lib/drama/skills/short-drama-novel-analyze/references/stage-contract.md +1 -0
  66. package/lib/drama/skills/short-drama-produce/SKILL.md +5 -1
  67. package/lib/drama/skills/short-drama-produce/references/adapter-contract.md +14 -20
  68. package/lib/drama/skills/short-drama-produce/references/providers/minimax-h3-video.md +8 -26
  69. package/lib/drama/skills/short-drama-produce/references/providers/minimax-speech.md +41 -0
  70. package/lib/drama/skills/short-drama-produce/scripts/provider_adapters.py +142 -1
  71. package/lib/drama/skills/short-drama-review/SKILL.md +4 -5
  72. package/lib/drama/skills/short-drama-review/references/production-quality-gates.md +6 -19
  73. package/lib/drama/skills/short-drama-review/references/review-method.md +6 -1
  74. package/lib/drama/skills/short-drama-review/references/rubric-assets-prompts.md +11 -0
  75. package/lib/drama/skills/short-drama-review/references/rubric-story-script.md +77 -3
  76. package/lib/drama/skills/short-drama-review/references/rubric-visual-motion.md +24 -35
  77. package/lib/drama/skills/short-drama-review/references/stage-contract.md +3 -0
  78. package/lib/drama/skills/short-drama-storyboard/SKILL.md +23 -11
  79. package/lib/drama/skills/short-drama-storyboard/references/blocking-playbooks.md +1 -1
  80. package/lib/drama/skills/short-drama-storyboard/references/lighting-craft.md +39 -0
  81. package/lib/drama/skills/short-drama-storyboard/references/production-shot-grammar.md +2 -2
  82. package/lib/drama/skills/short-drama-storyboard/references/shot-craft.md +139 -34
  83. package/lib/drama/skills/short-drama-storyboard/references/stage-contract.md +5 -3
  84. package/lib/drama/skills/short-drama-video-prompts/SKILL.md +15 -12
  85. package/lib/drama/skills/short-drama-video-prompts/references/camera-audio-continuity.md +29 -0
  86. package/lib/drama/skills/short-drama-video-prompts/references/delivery-profile.md +4 -5
  87. package/lib/drama/skills/short-drama-video-prompts/references/generability.md +4 -2
  88. package/lib/drama/skills/short-drama-video-prompts/references/minimax-h3.md +52 -39
  89. package/lib/drama/skills/short-drama-video-prompts/references/motion-recipe.md +24 -21
  90. package/lib/drama/skills/short-drama-video-prompts/references/performance-action-timing.md +9 -23
  91. package/lib/drama/skills/short-drama-video-prompts/references/production-prompt-grammar.md +14 -26
  92. package/lib/drama/skills/short-drama-video-prompts/references/review-and-fixtures.md +1 -1
  93. package/lib/drama/skills/short-drama-video-prompts/references/seedance-2.0.md +2 -3
  94. package/lib/drama/skills/short-drama-video-prompts/references/seedance-2.5.md +34 -9
  95. package/lib/drama/skills/short-drama-video-prompts/references/stage-contract.md +3 -2
  96. package/lib/drama/skills/short-drama-video-prompts/references/target-model-profile.md +8 -1
  97. package/lib/drama/skills/short-drama-video-prompts/references/wan-3.0.md +103 -0
  98. package/lib/drama/skills/short-drama-video-prompts/scripts/motion_timing_check.py +8 -7
  99. package/lib/drama/skills/short-drama-write/SKILL.md +10 -7
  100. package/lib/drama/skills/short-drama-write/references/dialogue-craft.md +1 -1
  101. package/lib/drama/skills/short-drama-write/references/script-craft.md +56 -3
  102. package/lib/drama/skills/short-drama-write/references/stage-contract.md +4 -0
  103. package/lib/drama/skills/short-drama-write/scripts/duration_estimate.py +48 -2
  104. package/lib/index.js +346 -98
  105. package/lib/index.js.map +4 -4
  106. package/lib/novel-to-game/README.md +299 -59
  107. package/lib/novel-to-game/README_ZH.md +299 -56
  108. package/lib/novel-to-game/VERSION +1 -1
  109. package/lib/novel-to-game/examples/jin-ping-mei/build/BUILD_BRIEF.md +3 -1
  110. package/lib/novel-to-game/examples/jin-ping-mei/build/app/RUN.md +11 -3
  111. package/lib/novel-to-game/examples/jin-ping-mei/build/app/css/new-guofeng.css +397 -8
  112. package/lib/novel-to-game/examples/jin-ping-mei/build/app/css/style.css +0 -31
  113. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/data.js +71 -73
  114. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/engine.js +78 -89
  115. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/main.js +37 -14
  116. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/text.js +5 -5
  117. package/lib/novel-to-game/examples/jin-ping-mei/build/app/package.json +2 -1
  118. package/lib/novel-to-game/examples/jin-ping-mei/qa/README.md +11 -16
  119. package/lib/novel-to-game/examples/jin-ping-mei/qa/verification.json +11 -11
  120. package/lib/novel-to-game/examples/jin-ping-mei/qa/verify_playable_model.mjs +23 -0
  121. package/lib/novel-to-game/manifest.json +77 -87
  122. package/lib/novel-to-game/skills/game-art-direction/SKILL.md +7 -12
  123. package/lib/novel-to-game/skills/game-art-direction/references/art-direction-method.md +27 -106
  124. package/lib/novel-to-game/skills/game-build/SKILL.md +13 -14
  125. package/lib/novel-to-game/skills/game-build/references/blender-asset-workflow.md +24 -0
  126. package/lib/novel-to-game/skills/game-build/references/build-brief-contract.md +45 -82
  127. package/lib/novel-to-game/skills/game-build/references/generative-media-pipeline.md +14 -45
  128. package/lib/novel-to-game/skills/game-build/references/playable-model-contract.md +30 -65
  129. package/lib/novel-to-game/skills/game-build/references/tts-production-contract.md +13 -27
  130. package/lib/novel-to-game/skills/game-concept/SKILL.md +13 -15
  131. package/lib/novel-to-game/skills/game-concept/references/concept-method.md +28 -75
  132. package/lib/novel-to-game/skills/game-qa/SKILL.md +6 -7
  133. package/lib/novel-to-game/skills/game-qa/references/test-design-method.md +9 -5
  134. package/lib/novel-to-game/skills/game-world-design/SKILL.md +12 -16
  135. package/lib/novel-to-game/skills/game-world-design/references/narrative-design-method.md +23 -72
  136. package/lib/novel-to-game/skills/game-world-design/references/numeric-design-method.md +14 -48
  137. package/lib/novel-to-game/skills/game-world-design/references/world-design-method.md +36 -103
  138. package/lib/novel-to-game/skills/novel-game-analyze/SKILL.md +4 -10
  139. package/lib/novel-to-game/skills/novel-game-analyze/references/gameability-protocol.md +4 -4
  140. package/lib/novel-to-game/skills/novel-to-game/SKILL.md +9 -21
  141. package/lib/novel-to-game/skills/novel-to-game/references/intake-method.md +5 -4
  142. package/lib/novel-to-game/skills/novel-to-game/references/pipeline-contract.md +5 -8
  143. package/lib/oh-story/manifest.json +607 -327
  144. package/lib/oh-story/roles/chapter-extractor.md +177 -237
  145. package/lib/oh-story/roles/character-designer.md +1 -2
  146. package/lib/oh-story/roles/consistency-checker.md +15 -13
  147. package/lib/oh-story/roles/narrative-writer.md +36 -38
  148. package/lib/oh-story/roles/story-architect.md +9 -61
  149. package/lib/oh-story/roles/story-explorer.md +20 -125
  150. package/lib/oh-story/roles/story-researcher.md +0 -1
  151. package/lib/oh-story/skills/story/SKILL.md +15 -9
  152. package/lib/oh-story/skills/story/VERSION +1 -1
  153. package/lib/oh-story/skills/story/references/author-memory-maintenance.md +75 -0
  154. package/lib/oh-story/skills/story/references/author-memory.md +46 -94
  155. package/lib/oh-story/skills/story/scripts/author_memory_commit.py +934 -170
  156. package/lib/oh-story/skills/story-cover/SKILL.md +10 -1
  157. package/lib/oh-story/skills/story-deslop/SKILL.md +59 -73
  158. package/lib/oh-story/skills/story-deslop/references/agent-calls.md +5 -0
  159. package/lib/oh-story/skills/story-deslop/references/anti-ai-writing.md +12 -11
  160. package/lib/oh-story/skills/story-deslop/references/author-memory-maintenance.md +75 -0
  161. package/lib/oh-story/skills/story-deslop/references/author-memory.md +46 -94
  162. package/lib/oh-story/skills/story-deslop/references/banned-words.md +2 -2
  163. package/lib/oh-story/skills/story-deslop/references/deslop-gates.md +22 -5
  164. package/lib/oh-story/skills/story-deslop/references/style-resolution.md +4 -4
  165. package/lib/oh-story/skills/story-deslop/scripts/author_memory_commit.py +934 -170
  166. package/lib/oh-story/skills/story-deslop/scripts/check-ai-patterns.js +155 -8
  167. package/lib/oh-story/skills/story-import/SKILL.md +64 -584
  168. package/lib/oh-story/skills/story-import/references/character-state-reverse.md +1 -1
  169. package/lib/oh-story/skills/story-import/references/deep-analysis.md +47 -0
  170. package/lib/oh-story/skills/story-import/references/format-and-structure.md +1 -1
  171. package/lib/oh-story/skills/story-import/references/import-report.md +64 -0
  172. package/lib/oh-story/skills/story-import/references/import-special-cases.md +34 -0
  173. package/lib/oh-story/skills/story-import/references/import-tracking.md +95 -0
  174. package/lib/oh-story/skills/story-import/references/length-routing.md +1 -1
  175. package/lib/oh-story/skills/story-import/references/outline-reverse-rules.md +79 -0
  176. package/lib/oh-story/skills/story-import/references/outline-reverse.md +24 -0
  177. package/lib/oh-story/skills/story-import/references/state-tracking.md +4 -69
  178. package/lib/oh-story/skills/story-import/references/structure-mapping-long.md +98 -92
  179. package/lib/oh-story/skills/story-import/references/structure-mapping-short.md +24 -12
  180. package/lib/oh-story/skills/story-import/references/tracking-initialization.md +1 -1
  181. package/lib/oh-story/skills/story-import/references/tracking-transaction.md +15 -11
  182. package/lib/oh-story/skills/story-import/scripts/build_outline_brief.py +332 -0
  183. package/lib/oh-story/skills/story-import/scripts/check-outline-contract.js +132 -27
  184. package/lib/oh-story/skills/story-import/scripts/tracking_commit.py +478 -15
  185. package/lib/oh-story/skills/story-import/scripts/wordcount_core.py +182 -23
  186. package/lib/oh-story/skills/story-long-analyze/SKILL.md +81 -270
  187. package/lib/oh-story/skills/story-long-analyze/references/author-facing.md +252 -0
  188. package/lib/oh-story/skills/story-long-analyze/references/deconstruction-notes.md +3 -3
  189. package/lib/oh-story/skills/story-long-analyze/references/final-checks.md +19 -0
  190. package/lib/oh-story/skills/story-long-analyze/references/index-rebuild.md +11 -0
  191. package/lib/oh-story/skills/story-long-analyze/references/inspiration-library.md +105 -0
  192. package/lib/oh-story/skills/story-long-analyze/references/pipeline-ops.md +138 -64
  193. package/lib/oh-story/skills/story-long-analyze/references/semantic-acceptance-fixtures.md +84 -0
  194. package/lib/oh-story/skills/story-long-analyze/references/stage1-golden-chapters.md +128 -0
  195. package/lib/oh-story/skills/story-long-analyze/references/stage2-extraction.md +229 -0
  196. package/lib/oh-story/skills/story-long-analyze/references/stage3-plot-rhythm.md +480 -0
  197. package/lib/oh-story/skills/story-long-analyze/references/stage4-characters-settings.md +195 -0
  198. package/lib/oh-story/skills/story-long-analyze/references/stage5-report.md +33 -0
  199. package/lib/oh-story/skills/story-long-analyze/references/style-profile-generator.md +55 -128
  200. package/lib/oh-story/skills/story-long-analyze/references/style-profile-protocol.md +6 -6
  201. package/lib/oh-story/skills/story-long-analyze/references/synthesis-inputs.md +39 -0
  202. package/lib/oh-story/skills/story-long-analyze/scripts/build_chapter_index.py +466 -0
  203. package/lib/oh-story/skills/story-long-analyze/scripts/inspect_existing_assets.py +702 -0
  204. package/lib/oh-story/skills/story-long-analyze/scripts/inspiration_index.py +864 -0
  205. package/lib/oh-story/skills/story-long-analyze/scripts/manage_analysis_run.py +1145 -0
  206. package/lib/oh-story/skills/story-long-analyze/scripts/render_relation_chart.py +425 -0
  207. package/lib/oh-story/skills/story-long-scan/SKILL.md +45 -194
  208. package/lib/oh-story/skills/story-long-scan/references/platform-ciweimao.md +19 -0
  209. package/lib/oh-story/skills/story-long-scan/references/platform-fanqie.md +45 -0
  210. package/lib/oh-story/skills/story-long-scan/references/platform-jjwxc.md +28 -0
  211. package/lib/oh-story/skills/story-long-scan/references/platform-qidian.md +35 -0
  212. package/lib/oh-story/skills/story-long-scan/references/platform-qimao.md +27 -0
  213. package/lib/oh-story/skills/story-long-scan/references/topic-decision.md +6 -2
  214. package/lib/oh-story/skills/story-long-write/SKILL.md +49 -81
  215. package/lib/oh-story/skills/story-long-write/references/agent-calls.md +47 -0
  216. package/lib/oh-story/skills/story-long-write/references/anti-ai-writing.md +12 -11
  217. package/lib/oh-story/skills/story-long-write/references/artifact-protocols.md +24 -202
  218. package/lib/oh-story/skills/story-long-write/references/author-memory-maintenance.md +75 -0
  219. package/lib/oh-story/skills/story-long-write/references/author-memory.md +46 -94
  220. package/lib/oh-story/skills/story-long-write/references/banned-words.md +2 -2
  221. package/lib/oh-story/skills/story-long-write/references/benchmark-recall.md +7 -11
  222. package/lib/oh-story/skills/story-long-write/references/character-relations.md +49 -1
  223. package/lib/oh-story/skills/story-long-write/references/cross-book-recall.md +26 -0
  224. package/lib/oh-story/skills/story-long-write/references/deslop-gates.md +171 -0
  225. package/lib/oh-story/skills/story-long-write/references/dialogue-mastery.md +4 -0
  226. package/lib/oh-story/skills/story-long-write/references/emotion-on-page.md +116 -0
  227. package/lib/oh-story/skills/story-long-write/references/emotional-arc-design.md +1 -114
  228. package/lib/oh-story/skills/story-long-write/references/emotional-methods.md +2 -2
  229. package/lib/oh-story/skills/story-long-write/references/genre-prose-cards.md +1 -1
  230. package/lib/oh-story/skills/story-long-write/references/long-chapter-quality.md +7 -15
  231. package/lib/oh-story/skills/story-long-write/references/long-format.md +0 -8
  232. package/lib/oh-story/skills/story-long-write/references/long-genre-catalog.md +1 -1
  233. package/lib/oh-story/skills/story-long-write/references/long-genre-mechanics.md +3 -3
  234. package/lib/oh-story/skills/story-long-write/references/opening-design.md +2 -2
  235. package/lib/oh-story/skills/story-long-write/references/outline-conflict.md +4 -4
  236. package/lib/oh-story/skills/story-long-write/references/outline-methods.md +7 -7
  237. package/lib/oh-story/skills/story-long-write/references/outline-rhythm.md +3 -3
  238. package/lib/oh-story/skills/story-long-write/references/outline-structure-theory.md +14 -69
  239. package/lib/oh-story/skills/story-long-write/references/plot-frameworks.md +1 -1
  240. package/lib/oh-story/skills/story-long-write/references/plot-special-topics.md +2 -2
  241. package/lib/oh-story/skills/story-long-write/references/project-files.md +19 -13
  242. package/lib/oh-story/skills/story-long-write/references/reader-contract-and-progression.md +13 -5
  243. package/lib/oh-story/skills/story-long-write/references/reference-index.md +5 -6
  244. package/lib/oh-story/skills/story-long-write/references/stop-and-fix.md +9 -0
  245. package/lib/oh-story/skills/story-long-write/references/style-combat-face.md +1 -58
  246. package/lib/oh-story/skills/story-long-write/references/style-genre-modules.md +1 -1
  247. package/lib/oh-story/skills/story-long-write/references/style-resolution.md +4 -4
  248. package/lib/oh-story/skills/story-long-write/references/tracking-initialization.md +1 -1
  249. package/lib/oh-story/skills/story-long-write/references/tracking-transaction.md +15 -11
  250. package/lib/oh-story/skills/story-long-write/references/workflow-chapter.md +81 -121
  251. package/lib/oh-story/skills/story-long-write/references/workflow-daily.md +41 -139
  252. package/lib/oh-story/skills/story-long-write/references/workflow-outline.md +157 -0
  253. package/lib/oh-story/skills/story-long-write/references/workflow-revision.md +57 -67
  254. package/lib/oh-story/skills/story-long-write/references/workflow-setup.md +112 -253
  255. package/lib/oh-story/skills/story-long-write/references/workflow-volume.md +142 -0
  256. package/lib/oh-story/skills/story-long-write/references/writer-prompt-fallback.md +6 -4
  257. package/lib/oh-story/skills/story-long-write/references/writing-craft.md +19 -65
  258. package/lib/oh-story/skills/story-long-write/scripts/author_memory_commit.py +934 -170
  259. package/lib/oh-story/skills/story-long-write/scripts/build_architect_brief.py +260 -0
  260. package/lib/oh-story/skills/story-long-write/scripts/build_writer_prompt.py +226 -25
  261. package/lib/oh-story/skills/story-long-write/scripts/check-ai-patterns.js +155 -8
  262. package/lib/oh-story/skills/story-long-write/scripts/check-outline-contract.js +132 -27
  263. package/lib/oh-story/skills/story-long-write/scripts/check-outline-copy.js +7 -2
  264. package/lib/oh-story/skills/story-long-write/scripts/outline_view.py +7 -4
  265. package/lib/oh-story/skills/story-long-write/scripts/storyctl.py +304 -46
  266. package/lib/oh-story/skills/story-long-write/scripts/tracking_commit.py +478 -15
  267. package/lib/oh-story/skills/story-long-write/scripts/wordcount_core.py +182 -23
  268. package/lib/oh-story/skills/story-review/SKILL.md +31 -302
  269. package/lib/oh-story/skills/story-review/references/agent-prompts.md +184 -0
  270. package/lib/oh-story/skills/story-review/references/anti-ai-writing.md +12 -11
  271. package/lib/oh-story/skills/story-review/references/author-memory-maintenance.md +75 -0
  272. package/lib/oh-story/skills/story-review/references/author-memory.md +46 -94
  273. package/lib/oh-story/skills/story-review/references/banned-words.md +2 -2
  274. package/lib/oh-story/skills/story-review/references/batch-review.md +19 -0
  275. package/lib/oh-story/skills/story-review/references/character-relations.md +49 -1
  276. package/lib/oh-story/skills/story-review/references/dialogue-mastery.md +4 -0
  277. package/lib/oh-story/skills/story-review/references/review-quality.md +6 -11
  278. package/lib/oh-story/skills/story-review/references/review-tracking.md +10 -0
  279. package/lib/oh-story/skills/story-review/references/solo.md +52 -0
  280. package/lib/oh-story/skills/story-review/references/style-resolution.md +4 -4
  281. package/lib/oh-story/skills/story-review/references/tracking-initialization.md +1 -1
  282. package/lib/oh-story/skills/story-review/references/tracking-transaction.md +15 -11
  283. package/lib/oh-story/skills/story-review/scripts/author_memory_commit.py +934 -170
  284. package/lib/oh-story/skills/story-review/scripts/check-ai-patterns.js +155 -8
  285. package/lib/oh-story/skills/story-review/scripts/tracking_commit.py +478 -15
  286. package/lib/oh-story/skills/story-review/scripts/wordcount_core.py +182 -23
  287. package/lib/oh-story/skills/story-setup/SKILL.md +71 -452
  288. package/lib/oh-story/skills/story-setup/references/agent-references/agent-quality.md +4 -4
  289. package/lib/oh-story/skills/story-setup/references/agent-references/anti-ai-writing.md +12 -11
  290. package/lib/oh-story/skills/story-setup/references/agent-references/banned-words.md +2 -2
  291. package/lib/oh-story/skills/story-setup/references/agent-references/benchmark-style-load.md +107 -0
  292. package/lib/oh-story/skills/story-setup/references/agent-references/character-relations.md +49 -1
  293. package/lib/oh-story/skills/story-setup/references/agent-references/deslop-gates.md +22 -5
  294. package/lib/oh-story/skills/story-setup/references/agent-references/dialogue-mastery.md +4 -0
  295. package/lib/oh-story/skills/story-setup/references/agent-references/emotion-on-page.md +116 -0
  296. package/lib/oh-story/skills/story-setup/references/agent-references/emotional-arc-design.md +1 -114
  297. package/lib/oh-story/skills/story-setup/references/agent-references/format-and-structure.md +1 -1
  298. package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards.md +1 -1
  299. package/lib/oh-story/skills/story-setup/references/agent-references/long-emotional-methods.md +2 -2
  300. package/lib/oh-story/skills/story-setup/references/agent-references/long-genre-catalog.md +1 -1
  301. package/lib/oh-story/skills/story-setup/references/agent-references/long-genre-mechanics.md +3 -3
  302. package/lib/oh-story/skills/story-setup/references/agent-references/long-quality.md +7 -5
  303. package/lib/oh-story/skills/story-setup/references/agent-references/opening-design.md +2 -2
  304. package/lib/oh-story/skills/story-setup/references/agent-references/outline-conflict.md +4 -4
  305. package/lib/oh-story/skills/story-setup/references/agent-references/outline-methods.md +7 -7
  306. package/lib/oh-story/skills/story-setup/references/agent-references/outline-rhythm.md +3 -3
  307. package/lib/oh-story/skills/story-setup/references/agent-references/short-emotional-methods.md +1 -1
  308. package/lib/oh-story/skills/story-setup/references/agent-references/short-genre-formulas.md +0 -15
  309. package/lib/oh-story/skills/story-setup/references/agent-references/short-reversal.md +1 -1
  310. package/lib/oh-story/skills/story-setup/references/agent-references/style-combat-face.md +1 -58
  311. package/lib/oh-story/skills/story-setup/references/agent-references/style-genre-modules.md +1 -1
  312. package/lib/oh-story/skills/story-setup/references/agent-references/style-resolution.md +4 -4
  313. package/lib/oh-story/skills/story-setup/references/agent-references/writing-craft.md +19 -65
  314. package/lib/oh-story/skills/story-setup/references/diagnostics.md +4 -4
  315. package/lib/oh-story/skills/story-short-analyze/SKILL.md +56 -110
  316. package/lib/oh-story/skills/story-short-analyze/references/analysis-character-relations.md +1 -1
  317. package/lib/oh-story/skills/story-short-analyze/references/analysis-method.md +42 -0
  318. package/lib/oh-story/skills/story-short-analyze/references/optional-modules.md +97 -0
  319. package/lib/oh-story/skills/story-short-analyze/references/output-contract.md +9 -47
  320. package/lib/oh-story/skills/story-short-analyze/references/quality-checklist.md +80 -0
  321. package/lib/oh-story/skills/story-short-analyze/references/source-story-quality.md +4 -4
  322. package/lib/oh-story/skills/story-short-analyze/references/stage2-3-structure-emotion.md +308 -0
  323. package/lib/oh-story/skills/story-short-analyze/references/stage4-6-reversal-summary.md +611 -0
  324. package/lib/oh-story/skills/story-short-scan/SKILL.md +35 -65
  325. package/lib/oh-story/skills/story-short-scan/references/manual-rank-input.md +36 -0
  326. package/lib/oh-story/skills/story-short-scan/references/platform-dianzhong.md +24 -0
  327. package/lib/oh-story/skills/story-short-scan/references/platform-heiyan.md +21 -0
  328. package/lib/oh-story/skills/story-short-scan/references/topic-match.md +38 -0
  329. package/lib/oh-story/skills/story-short-write/SKILL.md +23 -175
  330. package/lib/oh-story/skills/story-short-write/references/agent-calls.md +13 -0
  331. package/lib/oh-story/skills/story-short-write/references/author-memory-maintenance.md +75 -0
  332. package/lib/oh-story/skills/story-short-write/references/author-memory.md +46 -94
  333. package/lib/oh-story/skills/story-short-write/references/banned-words.md +2 -2
  334. package/lib/oh-story/skills/story-short-write/references/benchmark-recall.md +1 -21
  335. package/lib/oh-story/skills/story-short-write/references/dialogue-mastery.md +4 -0
  336. package/lib/oh-story/skills/story-short-write/references/emotional-methods.md +1 -1
  337. package/lib/oh-story/skills/story-short-write/references/genre-writing-formulas.md +0 -15
  338. package/lib/oh-story/skills/story-short-write/references/output-contract.md +9 -47
  339. package/lib/oh-story/skills/story-short-write/references/reference-index.md +17 -47
  340. package/lib/oh-story/skills/story-short-write/references/scene-craft.md +40 -0
  341. package/lib/oh-story/skills/story-short-write/references/short-craft.md +7 -43
  342. package/lib/oh-story/skills/story-short-write/references/short-format.md +3 -3
  343. package/lib/oh-story/skills/story-short-write/references/short-prose-quality.md +2 -1
  344. package/lib/oh-story/skills/story-short-write/references/short-reversal.md +1 -1
  345. package/lib/oh-story/skills/story-short-write/references/style-resolution.md +4 -4
  346. package/lib/oh-story/skills/story-short-write/references/submission-craft.md +1 -1
  347. package/lib/oh-story/skills/story-short-write/references/villain-and-reveal.md +5 -10
  348. package/lib/oh-story/skills/story-short-write/references/workflow-design.md +21 -13
  349. package/lib/oh-story/skills/story-short-write/references/workflow-draft.md +116 -0
  350. package/lib/oh-story/skills/story-short-write/references/workflow-revision.md +99 -0
  351. package/lib/oh-story/skills/story-short-write/references/writing-workflow.md +7 -119
  352. package/lib/oh-story/skills/story-short-write/scripts/author_memory_commit.py +934 -170
  353. package/lib/oh-story/skills/story-short-write/scripts/check-ai-patterns.js +155 -8
  354. package/lib/oh-story/skills/story-short-write/scripts/check-outline-copy.js +7 -2
  355. package/lib/types/client/drama-production-view.d.ts.map +1 -1
  356. package/lib/types/client/file-activity.d.ts +19 -1
  357. package/lib/types/client/file-activity.d.ts.map +1 -1
  358. package/lib/types/client/index.d.ts.map +1 -1
  359. package/lib/types/client/production-prompts.d.ts +7 -0
  360. package/lib/types/client/production-prompts.d.ts.map +1 -1
  361. package/lib/types/client/production-runtime.d.ts +16 -0
  362. package/lib/types/client/production-runtime.d.ts.map +1 -1
  363. package/lib/types/client/video-studio.d.ts.map +1 -1
  364. package/lib/types/drama-adapters.d.ts +5 -3
  365. package/lib/types/drama-adapters.d.ts.map +1 -1
  366. package/lib/types/native-hooks.d.ts +53 -1
  367. package/lib/types/native-hooks.d.ts.map +1 -1
  368. package/lib/types/role-identity.d.ts +17 -0
  369. package/lib/types/role-identity.d.ts.map +1 -0
  370. package/lib/types/role-tool.d.ts.map +1 -1
  371. package/lib/types/skill-provider.d.ts.map +1 -1
  372. package/lib/types/video-project.d.ts.map +1 -1
  373. package/lib/types/workspace-route.d.ts.map +1 -1
  374. package/lib/video-recap/CHANGELOG.md +60 -1
  375. package/lib/video-recap/README.en.md +348 -137
  376. package/lib/video-recap/README.md +340 -136
  377. package/lib/video-recap/manifest.json +406 -251
  378. package/lib/video-recap/skills/video-assemble/SKILL.md +30 -15
  379. package/lib/video-recap/skills/video-assemble/references/audio-modes.md +63 -0
  380. package/lib/video-recap/skills/video-assemble/references/explicit-audio-mix.md +75 -0
  381. package/lib/video-recap/skills/video-assemble/references/foreground-compose.md +118 -0
  382. package/lib/video-recap/skills/video-assemble/references/narration-adoption.md +103 -0
  383. package/lib/video-recap/skills/video-assemble/references/packaging.md +45 -0
  384. package/lib/video-recap/skills/video-assemble/references/pair-media.md +74 -0
  385. package/lib/video-recap/skills/video-assemble/references/source-score.md +147 -0
  386. package/lib/video-recap/skills/video-assemble/references/subtitle-track.md +202 -0
  387. package/lib/video-recap/skills/video-assemble/scripts/adoption/__init__.py +1 -0
  388. package/lib/video-recap/skills/video-assemble/scripts/adoption/audio_mix_binding.py +279 -0
  389. package/lib/video-recap/skills/video-assemble/scripts/adoption/frozen_audio.py +187 -0
  390. package/lib/video-recap/skills/video-assemble/scripts/adoption/narration_binding.py +323 -0
  391. package/lib/video-recap/skills/video-assemble/scripts/adoption/strict_inputs.py +109 -0
  392. package/lib/video-recap/skills/video-assemble/scripts/adoption/strict_publish.py +130 -0
  393. package/lib/video-recap/skills/video-assemble/scripts/artifacts.py +10 -46
  394. package/lib/video-recap/skills/video-assemble/scripts/assemble.py +378 -119
  395. package/lib/video-recap/skills/video-assemble/scripts/assemble_constants.py +29 -12
  396. package/lib/video-recap/skills/video-assemble/scripts/assembly_contract.py +95 -44
  397. package/lib/video-recap/skills/video-assemble/scripts/assembly_settings.py +75 -32
  398. package/lib/video-recap/skills/video-assemble/scripts/audio_mix.py +11 -11
  399. package/lib/video-recap/skills/video-assemble/scripts/compose_foreground.py +293 -0
  400. package/lib/video-recap/skills/video-assemble/scripts/export_jianying.py +71 -78
  401. package/lib/video-recap/skills/video-assemble/scripts/jianying/__init__.py +1 -0
  402. package/lib/video-recap/skills/video-assemble/scripts/{jianying_builders.py → jianying/builders.py} +39 -67
  403. package/lib/video-recap/skills/video-assemble/scripts/{jianying_model.py → jianying/model.py} +3 -11
  404. package/lib/video-recap/skills/video-assemble/scripts/{jianying_optional.py → jianying/optional.py} +1 -1
  405. package/lib/video-recap/skills/video-assemble/scripts/jianying/schema.py +53 -0
  406. package/lib/video-recap/skills/video-assemble/scripts/{jianying_templates.py → jianying/templates.py} +1 -1
  407. package/lib/video-recap/skills/video-assemble/scripts/{jianying_timeline_contract.py → jianying/timeline_contract.py} +34 -13
  408. package/lib/video-recap/skills/video-assemble/scripts/{jianying_writer.py → jianying/writer.py} +7 -17
  409. package/lib/video-recap/skills/video-assemble/scripts/lib.py +37 -4
  410. package/lib/video-recap/skills/video-assemble/scripts/media.py +12 -21
  411. package/lib/video-recap/skills/video-assemble/scripts/narration_audio.py +64 -34
  412. package/lib/video-recap/skills/video-assemble/scripts/packaging.py +122 -0
  413. package/lib/video-recap/skills/video-assemble/scripts/pair_media.py +216 -0
  414. package/lib/video-recap/skills/video-assemble/scripts/render_preflight.py +1 -3
  415. package/lib/video-recap/skills/video-assemble/scripts/source_score.py +469 -0
  416. package/lib/video-recap/skills/video-assemble/scripts/source_subtitles.py +25 -9
  417. package/lib/video-recap/skills/video-assemble/scripts/subtitles/__init__.py +1 -0
  418. package/lib/video-recap/skills/video-assemble/scripts/{subtitle_core.py → subtitles/core.py} +13 -6
  419. package/lib/video-recap/skills/video-assemble/scripts/{subtitle_render.py → subtitles/render.py} +5 -4
  420. package/lib/video-recap/skills/video-assemble/scripts/subtitles/track.py +324 -0
  421. package/lib/video-recap/skills/video-assemble/scripts/subtitles/track_binding.py +200 -0
  422. package/lib/video-recap/skills/video-assemble/scripts/timeline.py +30 -46
  423. package/lib/video-recap/skills/video-assemble/scripts/timeline_emit.py +91 -7
  424. package/lib/video-recap/skills/video-assemble/scripts/visual_render.py +22 -8
  425. package/lib/video-recap/skills/video-cut/SKILL.md +34 -16
  426. package/lib/video-recap/skills/video-cut/references/shot-review.md +50 -0
  427. package/lib/video-recap/skills/video-cut/scripts/cut.py +2 -28
  428. package/lib/video-recap/skills/video-cut/scripts/cut_cli.py +58 -62
  429. package/lib/video-recap/skills/video-cut/scripts/cut_contract.py +21 -106
  430. package/lib/video-recap/skills/video-cut/scripts/cut_render.py +14 -9
  431. package/lib/video-recap/skills/video-cut/scripts/lib.py +39 -0
  432. package/lib/video-recap/skills/video-cut/scripts/narration_mapping.py +2 -155
  433. package/lib/video-recap/skills/video-cut/scripts/narrative_selection.py +244 -0
  434. package/lib/video-recap/skills/video-cut/scripts/shot_review.py +357 -0
  435. package/lib/video-recap/skills/video-recap/SKILL.md +86 -42
  436. package/lib/video-recap/skills/video-recap/references/audio-routing.md +126 -0
  437. package/lib/video-recap/skills/video-recap/references/config-playbook.md +12 -8
  438. package/lib/video-recap/skills/video-recap/references/data-schema.md +44 -33
  439. package/lib/video-recap/skills/video-recap/references/resource-library.md +151 -0
  440. package/lib/video-recap/skills/video-recap/references/shift-left-qc-schema.md +1 -1
  441. package/lib/video-recap/skills/video-recap/scripts/doctor.py +123 -30
  442. package/lib/video-recap/skills/video-recap/scripts/final_qc.py +22 -75
  443. package/lib/video-recap/skills/video-recap/scripts/lib.py +3 -3
  444. package/lib/video-recap/skills/video-recap/scripts/library.py +509 -0
  445. package/lib/video-recap/skills/video-recap/scripts/materials.py +63 -91
  446. package/lib/video-recap/skills/video-recap/scripts/mimo_qc.py +8 -70
  447. package/lib/video-recap/skills/video-recap/scripts/project_binding.py +286 -0
  448. package/lib/video-recap/skills/video-recap/scripts/qc/__init__.py +1 -0
  449. package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_client.py → qc/mimo_client.py} +1 -1
  450. package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_evidence.py → qc/mimo_evidence.py} +33 -66
  451. package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_observations.py → qc/mimo_observations.py} +3 -11
  452. package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_payload.py → qc/mimo_payload.py} +4 -7
  453. package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_report.py → qc/mimo_report.py} +17 -28
  454. package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_runner.py → qc/mimo_runner.py} +2 -2
  455. package/lib/video-recap/skills/video-recap/scripts/qc_contract.py +0 -19
  456. package/lib/video-recap/skills/video-recap/scripts/recap_cli.py +119 -50
  457. package/lib/video-recap/skills/video-recap/scripts/recap_inspect.py +32 -114
  458. package/lib/video-recap/skills/video-recap/scripts/recap_review.py +9 -23
  459. package/lib/video-recap/skills/video-recap/scripts/recap_runner.py +387 -334
  460. package/lib/video-recap/skills/video-recap/scripts/recap_runtime.py +23 -23
  461. package/lib/video-recap/skills/video-recap/scripts/recap_source.py +278 -0
  462. package/lib/video-recap/skills/video-recap/scripts/recap_stage_qc.py +25 -12
  463. package/lib/video-recap/skills/video-recap/scripts/recap_timeline.py +59 -52
  464. package/lib/video-recap/skills/video-recap/scripts/resource_lock.py +162 -0
  465. package/lib/video-recap/skills/video-script/SKILL.md +16 -13
  466. package/lib/video-recap/skills/video-script/references/creative-editing-playbook.md +9 -5
  467. package/lib/video-recap/skills/video-script/references/promotional-copy.md +68 -0
  468. package/lib/video-recap/skills/video-script/references/research-guide.md +1 -1
  469. package/lib/video-recap/skills/video-script/scripts/evidence_bundle.py +24 -76
  470. package/lib/video-recap/skills/video-script/scripts/lib.py +10 -87
  471. package/lib/video-recap/skills/video-script/scripts/narration_lint.py +63 -39
  472. package/lib/video-recap/skills/video-script/scripts/review.py +0 -2
  473. package/lib/video-recap/skills/video-script/scripts/review_grounding.py +35 -59
  474. package/lib/video-recap/skills/video-script/scripts/review_response.py +66 -128
  475. package/lib/video-recap/skills/video-script/scripts/review_runner.py +12 -20
  476. package/lib/video-recap/skills/video-script/scripts/speech_ownership.py +4 -4
  477. package/lib/video-recap/skills/video-script/scripts/validate.py +53 -42
  478. package/lib/video-recap/skills/video-understanding/SKILL.md +6 -4
  479. package/lib/video-recap/skills/video-understanding/references/data-schema.md +50 -156
  480. package/lib/video-recap/skills/video-understanding/references/research-guide.md +4 -4
  481. package/lib/video-recap/skills/video-understanding/scripts/asr.py +85 -65
  482. package/lib/video-recap/skills/video-understanding/scripts/asr_timing_evidence.py +270 -0
  483. package/lib/video-recap/skills/video-understanding/scripts/brief.py +2 -5
  484. package/lib/video-recap/skills/video-understanding/scripts/briefing/__init__.py +1 -0
  485. package/lib/video-recap/skills/{video-script/scripts/agent_brief.py → video-understanding/scripts/briefing/builder.py} +38 -35
  486. package/lib/video-recap/skills/video-understanding/scripts/{brief_context.py → briefing/context.py} +4 -35
  487. package/lib/video-recap/skills/{video-script/scripts/brief_inputs.py → video-understanding/scripts/briefing/inputs.py} +9 -31
  488. package/lib/video-recap/skills/{video-script/scripts/brief_timeline.py → video-understanding/scripts/briefing/timeline.py} +5 -6
  489. package/lib/video-recap/skills/video-understanding/scripts/consolidate.py +65 -116
  490. package/lib/video-recap/skills/video-understanding/scripts/detect.py +31 -40
  491. package/lib/video-recap/skills/video-understanding/scripts/lib.py +30 -86
  492. package/lib/video-recap/skills/video-understanding/scripts/narration_lint.py +63 -39
  493. package/lib/video-recap/skills/video-understanding/scripts/speech_ownership.py +4 -4
  494. package/lib/video-recap/skills/video-understanding/scripts/storyboard.py +17 -79
  495. package/lib/video-recap/skills/video-understanding/scripts/understanding_brief.py +14 -40
  496. package/lib/video-recap/skills/video-understanding/scripts/understanding_cache.py +64 -46
  497. package/lib/video-recap/skills/video-understanding/scripts/understanding_runner.py +31 -11
  498. package/lib/video-recap/skills/video-understanding/scripts/understanding_storyboard.py +19 -14
  499. package/lib/video-recap/skills/video-understanding/scripts/vlm.py +80 -108
  500. package/lib/video-recap/skills/video-voiceover/SKILL.md +29 -19
  501. package/lib/video-recap/skills/video-voiceover/references/index-tts.md +31 -0
  502. package/lib/video-recap/skills/video-voiceover/scripts/approved_text_policy.py +123 -0
  503. package/lib/video-recap/skills/video-voiceover/scripts/dub.py +51 -59
  504. package/lib/video-recap/skills/video-voiceover/scripts/lib.py +8 -44
  505. package/lib/video-recap/skills/video-voiceover/scripts/providers/__init__.py +1 -0
  506. package/lib/video-recap/skills/video-voiceover/scripts/providers/index_tts.py +184 -0
  507. package/lib/video-recap/skills/video-voiceover/scripts/voiceover.py +212 -134
  508. package/package.json +45 -45
  509. package/lib/novel-to-game/skills/game-world-design/references/dialogue-design-method.md +0 -58
  510. package/lib/novel-to-game/skills/game-world-design/references/game-writing-craft.md +0 -53
  511. package/lib/novel-to-game/skills/novel-to-game/references/intake-benchmark-reference.md +0 -38
  512. package/lib/oh-story/skills/story-long-analyze/references/material-decomposition.md +0 -530
  513. package/lib/oh-story/skills/story-long-analyze/references/output-templates.md +0 -559
  514. package/lib/oh-story/skills/story-long-scan/references/scan-output-format.md +0 -207
  515. package/lib/oh-story/skills/story-long-write/references/state-tracking.md +0 -108
  516. package/lib/oh-story/skills/story-short-analyze/references/material-decomposition.md +0 -678
  517. package/lib/oh-story/skills/story-short-analyze/references/output-templates.md +0 -561
  518. package/lib/video-recap/skills/video-assemble/scripts/jianying_schema.py +0 -98
  519. package/lib/video-recap/skills/video-recap/references/creative-editing-playbook.md +0 -225
  520. package/lib/video-recap/skills/video-recap/references/research-guide.md +0 -74
  521. package/lib/video-recap/skills/video-recap/references/timeline-and-jianying.md +0 -250
  522. package/lib/video-recap/skills/video-script/scripts/brief_context.py +0 -348
  523. package/lib/video-recap/skills/video-script/scripts/narration.py +0 -12
  524. package/lib/video-recap/skills/video-understanding/scripts/agent_brief.py +0 -399
  525. package/lib/video-recap/skills/video-understanding/scripts/brief_inputs.py +0 -290
  526. package/lib/video-recap/skills/video-understanding/scripts/brief_timeline.py +0 -327
  527. /package/lib/video-recap/skills/video-assemble/scripts/{jianying_tracks.py → jianying/tracks.py} +0 -0
  528. /package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_contract.py → qc/mimo_contract.py} +0 -0
  529. /package/lib/video-recap/skills/video-voiceover/scripts/{fish_audio.py → providers/fish_audio.py} +0 -0
@@ -41,13 +41,21 @@ MAX_ERROR_BODY_BYTES = 64 * 1024
41
41
  TERMINAL_FAILURES = {"failed", "cancelled", "canceled", "timeout", "expired"}
42
42
  SEEDANCE_RATIOS = {"adaptive", "1:1", "3:4", "4:3", "9:16", "16:9", "21:9"}
43
43
  SEEDANCE_REFERENCE_ROLES = {
44
+ "first_frame": "image_url",
45
+ "last_frame": "image_url",
44
46
  "reference_image": "image_url",
45
47
  "reference_video": "video_url",
46
48
  "reference_audio": "audio_url",
47
49
  }
50
+ # One opening frame and one closing frame, because each names a single position
51
+ # in the take. Note what is deliberately absent: the sibling adapter forbids
52
+ # mixing frame conditioning with reference conditioning, and that rule belongs
53
+ # to that provider's reference, not to this one. Do not carry it across.
54
+ SEEDANCE_SINGULAR_ROLES = {"first_frame", "last_frame"}
48
55
  MINIMAX_VIDEO_RATIOS = {"adaptive", "1:1", "3:4", "4:3", "9:16", "16:9", "21:9"}
49
56
  MINIMAX_VIDEO_RESOLUTIONS = {"480P", "768P", "2K"}
50
57
  MINIMAX_VIDEO_PROMPT_LIMIT = 7000
58
+ MINIMAX_SPEECH_TEXT_LIMIT = 5000
51
59
  MINIMAX_VIDEO_ROLES = {
52
60
  "first_frame": "image_url",
53
61
  "last_frame": "image_url",
@@ -369,10 +377,18 @@ def compile_seedance_payload(
369
377
  counters = {"image_url": 0, "video_url": 0, "audio_url": 0}
370
378
  labels = {"image_url": "图片", "video_url": "视频", "audio_url": "音频"}
371
379
  reference_tokens: list[str] = []
380
+ singular_seen: set[str] = set()
372
381
  for role in reference_roles:
373
382
  field = SEEDANCE_REFERENCE_ROLES.get(role)
374
383
  if field is None:
375
384
  raise ValueError(f"unsupported Seedance reference role: {role}")
385
+ if role in SEEDANCE_SINGULAR_ROLES:
386
+ if role in singular_seen:
387
+ raise ValueError(f"Seedance accepts one {role} reference")
388
+ singular_seen.add(role)
389
+ # A frame role still occupies a picture slot, so it keeps counting: the
390
+ # tokens are positional, and skipping one would point every later
391
+ # `@图片N` in the prose at the wrong picture.
376
392
  counters[field] += 1
377
393
  reference_tokens.append(f"@{labels[field]}{counters[field]}")
378
394
  if task_type in {"edit", "extend"} and "reference_video" not in reference_roles:
@@ -738,6 +754,82 @@ def compile_gpt_image_2_payload(job: Mapping[str, Any]) -> dict[str, Any]:
738
754
  }
739
755
 
740
756
 
757
+ MINIMAX_SPEECH_EMOTIONS = {
758
+ "happy", "sad", "angry", "fearful", "disgusted", "surprised", "neutral",
759
+ }
760
+
761
+
762
+ def compile_minimax_speech_payload(job: Mapping[str, Any]) -> dict[str, Any]:
763
+ """Compile a tts job into the official MiniMax speech JSON body.
764
+
765
+ The voice catalogue is deliberately not enumerated here. Which preset voices
766
+ an account can reach depends on the model and the account, no published list
767
+ is authoritative for both, and a list frozen into this file would either
768
+ refuse a voice that works or vouch for one that does not. The document owns
769
+ the value and a reviewer reads it; the adapter only checks its shape.
770
+ """
771
+
772
+ text, parameters = _require_job(job, "tts")
773
+ parameters = _take(
774
+ parameters,
775
+ {"model", "voice_id", "speed", "vol", "pitch", "emotion",
776
+ "sample_rate", "bitrate", "format"},
777
+ )
778
+ model = parameters.pop("model", "")
779
+ if not isinstance(model, str) or not model.strip():
780
+ raise ValueError("MiniMax speech model must be explicitly configured")
781
+ voice_id = parameters.pop("voice_id", "")
782
+ if not isinstance(voice_id, str) or not voice_id.strip() or voice_id != voice_id.strip():
783
+ raise ValueError("MiniMax speech requires a confirmed voice_id")
784
+ if len(text) > MINIMAX_SPEECH_TEXT_LIMIT:
785
+ raise ValueError("MiniMax speech text exceeds the provider limit")
786
+
787
+ target_format = Path(job["outputs"][0]).suffix.casefold().lstrip(".")
788
+ requested_format = parameters.pop("format", target_format)
789
+ if requested_format != target_format or requested_format not in {"mp3", "wav"}:
790
+ raise ValueError("MiniMax output format must match a supported target extension")
791
+ sample_rate = parameters.pop("sample_rate", 32000)
792
+ bitrate = parameters.pop("bitrate", 128000)
793
+ if sample_rate not in {16000, 24000, 32000, 44100}:
794
+ raise ValueError("unsupported MiniMax sample rate")
795
+ if bitrate not in {32000, 64000, 128000, 256000}:
796
+ raise ValueError("unsupported MiniMax bitrate")
797
+
798
+ voice_setting: dict[str, Any] = {"voice_id": voice_id}
799
+ emotion = parameters.pop("emotion", None)
800
+ if emotion is not None:
801
+ if emotion not in MINIMAX_SPEECH_EMOTIONS:
802
+ raise ValueError("unsupported MiniMax speech emotion")
803
+ voice_setting["emotion"] = emotion
804
+ for name, low, high in (("speed", 0.5, 2.0), ("vol", 0.1, 10.0)):
805
+ value = parameters.pop(name, None)
806
+ if value is None:
807
+ continue
808
+ if isinstance(value, bool) or not isinstance(value, (int, float)):
809
+ raise ValueError(f"MiniMax speech {name} must be a number")
810
+ if not low <= float(value) <= high:
811
+ raise ValueError(f"MiniMax speech {name} is outside the supported range")
812
+ voice_setting[name] = float(value)
813
+ pitch = parameters.pop("pitch", None)
814
+ if pitch is not None:
815
+ if isinstance(pitch, bool) or not isinstance(pitch, int) or not -12 <= pitch <= 12:
816
+ raise ValueError("MiniMax speech pitch is outside the supported range")
817
+ voice_setting["pitch"] = pitch
818
+
819
+ return {
820
+ "model": model.strip(),
821
+ "text": text,
822
+ "stream": False,
823
+ "output_format": "hex",
824
+ "voice_setting": voice_setting,
825
+ "audio_setting": {
826
+ "sample_rate": sample_rate,
827
+ "bitrate": bitrate,
828
+ "format": requested_format,
829
+ },
830
+ }
831
+
832
+
741
833
  def compile_minimax_music_payload(job: Mapping[str, Any]) -> dict[str, Any]:
742
834
  """Compile an audio job into the official MiniMax Music 3.0 JSON body."""
743
835
  prompt, parameters = _require_job(job, "music")
@@ -1372,6 +1464,44 @@ def _run_minimax(job: Mapping[str, Any]) -> tuple[Path, str | None]:
1372
1464
  )
1373
1465
 
1374
1466
 
1467
+ def _run_minimax_speech(job: Mapping[str, Any]) -> tuple[Path, str | None]:
1468
+ token = _credential("MINIMAX_API_KEY")
1469
+ body = compile_minimax_speech_payload(job)
1470
+ base = _base_url("MINIMAX_BASE_URL", MINIMAX_BASE_URL)
1471
+ result, _ = _request_json(
1472
+ f"{base}/t2a_v2",
1473
+ provider="minimax-speech",
1474
+ body=body,
1475
+ token=token,
1476
+ )
1477
+ base_resp = result.get("base_resp")
1478
+ if not isinstance(base_resp, Mapping) or base_resp.get("status_code") != 0:
1479
+ raise AdapterFailure(
1480
+ "MiniMax speech synthesis failed",
1481
+ code=_provider_code(result) or "generation_failed",
1482
+ request_id=_safe_token(result.get("trace_id")),
1483
+ )
1484
+ data = result.get("data")
1485
+ audio = data.get("audio") if isinstance(data, Mapping) else None
1486
+ if not isinstance(audio, str) or not audio:
1487
+ raise AdapterFailure(
1488
+ "MiniMax did not return audio data",
1489
+ code="missing_audio",
1490
+ request_id=_safe_token(result.get("trace_id")),
1491
+ )
1492
+ try:
1493
+ content = bytes.fromhex(audio)
1494
+ except ValueError as exc:
1495
+ raise AdapterFailure("MiniMax returned invalid audio data") from exc
1496
+ if not content:
1497
+ raise AdapterFailure("MiniMax returned empty audio data")
1498
+ trace_id = result.get("trace_id")
1499
+ return (
1500
+ _temporary_output(job, job["outputs"][0], content),
1501
+ trace_id if isinstance(trace_id, str) else None,
1502
+ )
1503
+
1504
+
1375
1505
  def _run_minimax_video(job: Mapping[str, Any]) -> tuple[Path, str]:
1376
1506
  token = _credential("MINIMAX_API_KEY")
1377
1507
  base = _base_url("MINIMAX_VIDEO_BASE_URL", MINIMAX_VIDEO_BASE_URL)
@@ -1484,8 +1614,15 @@ def _selftest() -> None:
1484
1614
  "modality": "music", "prompt": "cinematic", "references": [],
1485
1615
  "outputs": ["制作成果/a.mp3"], "parameters": {"lyrics": "[Verse]\nHello"},
1486
1616
  }
1617
+ speech = {
1618
+ "modality": "tts", "prompt": "你们做了多久?", "references": [],
1619
+ "outputs": ["制作成果/a.mp3"],
1620
+ "parameters": {"model": "configured-speech-model", "voice_id": "a-preset"},
1621
+ }
1487
1622
  if compile_gpt_image_2_payload(image)["model"] != OPENAI_MODEL:
1488
1623
  raise RuntimeError("GPT Image 2 self-test failed")
1624
+ if compile_minimax_speech_payload(speech)["voice_setting"]["voice_id"] != "a-preset":
1625
+ raise RuntimeError("MiniMax speech self-test failed")
1489
1626
  seedance = compile_seedance_payload(
1490
1627
  video,
1491
1628
  model="configured-model",
@@ -1553,7 +1690,10 @@ def main() -> int:
1553
1690
  parser.add_argument(
1554
1691
  "provider",
1555
1692
  nargs="?",
1556
- choices=("seedance", "gpt-image-2", "minimax-music", "minimax-h3"),
1693
+ choices=(
1694
+ "seedance", "gpt-image-2", "minimax-music", "minimax-h3",
1695
+ "minimax-speech",
1696
+ ),
1557
1697
  )
1558
1698
  parser.add_argument("--selftest", action="store_true")
1559
1699
  args = parser.parse_args()
@@ -1571,6 +1711,7 @@ def main() -> int:
1571
1711
  "gpt-image-2": _run_openai,
1572
1712
  "minimax-music": _run_minimax,
1573
1713
  "minimax-h3": _run_minimax_video,
1714
+ "minimax-speech": _run_minimax_speech,
1574
1715
  }
1575
1716
  path, provider_job_id = runners[args.provider](job)
1576
1717
  response: dict[str, Any] = {
@@ -49,8 +49,8 @@ license: MIT
49
49
  只读对应资料,不预加载整个项目:
50
50
 
51
51
  - 原著分析:[原著分析审查表](references/rubric-source-analysis.md)
52
- - 故事、场景、行动与对白:[故事剧本审查表](references/rubric-story-script.md)
53
- - 身份、变体、连续性与图片提示词:[资产提示词审查表](references/rubric-assets-prompts.md)
52
+ - 故事、场景、行动与对白,改编是否守住原著人物与主线,已接受节奏档案的核对,开场、结尾与中段的局部检查:[故事剧本审查表](references/rubric-story-script.md)
53
+ - 身份、变体、连续性、时代与图片提示词:[资产提示词审查表](references/rubric-assets-prompts.md)
54
54
  - 原文落实、镜头、关键帧与视频运动:[视觉运动审查表](references/rubric-visual-motion.md)
55
55
  - 完整审查方法:[审查方法](references/review-method.md)
56
56
  - 制作端常见缺陷:[生产质量门](references/production-quality-gates.md)
@@ -71,9 +71,8 @@ license: MIT
71
71
  - 剧本对白、动作、声音、画面文字是否都有画面/声音承载;
72
72
  - 人物、地点、道具状态和镜头起止是否连续;
73
73
  - 提示词是否从准确起点到准确终点;
74
- - 目标模型画音同轨时,可复制正文的声音段是否写成正面闭合事件集:无对白镜不靠 `No dialogue`、
75
- `无对白` 关闭语音通道,完整性声明也不枚举本镜没有的层(`VID-22`、`VID-23`,见
76
- [视觉运动审查表](references/rubric-visual-motion.md));
74
+ - 目标模型画音同轨时,声音内容、时序和发声边界是否与来源一致;无对白镜是否交代底声或静默
75
+ (`VID-22`、`VID-23`,见 [视觉运动审查表](references/rubric-visual-motion.md));
77
76
  - 私有输入、凭据、绝对路径或内部流程文字是否泄漏。
78
77
 
79
78
  缺少必要输入时只停止依赖它的判断,其他问题可以继续汇总。
@@ -71,25 +71,12 @@
71
71
  - 角色名/资产引用进入台词内文;
72
72
  - 音效、环境底噪与对白方向没有来源或相互遮蔽。
73
73
 
74
- 目标模型画音同轨时(`VID-23`),这一节多四条只在同轨条件下成立的核对。四条里只有配乐那条
75
- 有实测后果,其余三条是「正文要如实、完整地交代本镜声音」,按这个理由报,不要替它们编一套
76
- 生成机制:
77
-
78
- - **配乐层在正文里整个缺席**(实测有后果):写了空形式(H3 为 `non_diegetic_music: N/A`)的
79
- 14 次生成没有一次自带配乐,完全不提配乐的 3 次里 2 次返回了自造配乐。这一条按 major 起报。
80
- **空形式本身就是合规写法**:`non_diegetic_music: N/A` 是「本镜没有非画内配乐」的正面陈述,
81
- 不是待填占位符。只有整行不存在时才报,永远不要要求 owner 删掉已经写好的空形式;
82
- - 用排除句代替声轨描述:正文出现 `No dialogue`、`无对白` 而没有正面写出这条声轨由什么组成、
83
- 覆盖多长——问题在于正文没交代本镜该有什么声音,不在于"否定会招来它";
84
- - 完整性声明枚举了本镜没有的层:无对白镜写出
85
- `The audio timeline is complete after the listed ambience, effects and timed dialogue.`
86
- 是一句与本镜事实不符的话;
87
- - 无对白镜从没说清声轨**是什么**:既没有覆盖全时长的底声构成,也没给在场人物一个可见的
88
- 不说话状态(嘴唇闭合)。
89
-
90
- 中间两条同时出现时按一个 finding 报,证据引这两句话本身:它们互相矛盾,本身就是声音契约
91
- 没写清。修订要求写成正面声轨,不能是"再加一句不要对白"。本套件实测未观察到这组写法导致
92
- 模型补出台词,报 finding 时不要这样断言。
74
+ 目标模型画音同轨时(`VID-23`),检查声音内容、时序、发声边界是否符合来源,
75
+ 总结是否错误地引入不存在的声音层。无对白镜也应交代需要的底声或静默。
76
+ H3 无非画内配乐时,`non_diegetic_music: N/A` 是有效的空形式。
77
+
78
+ 按实际遗漏、矛盾与影响报告问题,不因出现 `No dialogue` 或第二个否定句判错,
79
+ 不把 H3 的小样本表现套到所有同轨模型上。相关证据指向同一个问题时合并报告。
93
80
 
94
81
  ### 5. 负面补丁淹没动作
95
82
 
@@ -71,7 +71,12 @@ Resolve upstream meaning first; do not polish prompt wording when the shot or as
71
71
  ## Revision and re-review
72
72
 
73
73
  Group duplicate findings and route them to the owning skill. A revision request states the target outcome, preserve
74
- set and review scope to rerun. On a later explicit re-review request, read the current version, confirm the finding is addressed, check the
74
+ set and review scope to rerun.
75
+
76
+ `REV-14`: a revision request is a patch, not a rewrite. It names the smallest change at a cited location; local
77
+ findings never add up to a request to rewrite the episode. When the review compares a revision with the version before
78
+ it, any strong hook, payoff line, or comic beat that polishing removed is listed under `## 被删的强钩子` with its prior
79
+ location and a short quote, so the owner can restore it. The reviewer lists it; the owner decides. On a later explicit re-review request, read the current version, confirm the finding is addressed, check the
75
80
  preserve set and close or retain each affected finding. A different reviewer is useful but not mechanically required.
76
81
 
77
82
  ## Anti-template review
@@ -72,6 +72,17 @@ validity.
72
72
 
73
73
  Fail when a prop teleports, changes scale/material, or readable evidence is erased.
74
74
 
75
+ ## Era
76
+
77
+ The era comes from source facts: devices, platforms, slang, stated years. Fail
78
+ when the era shown in `视觉设定.md`, `图片提示词.md` or `视频提示词.md` contradicts
79
+ them, or when a retro or aged descriptor (旧/老式/复古/褪色/斑驳, old, worn, dusty,
80
+ period, CRT) has neither a source basis nor an explicit creator choice (`AST-14`).
81
+ This is the visual layer of the source-fidelity check (`STY-07`): cite the source
82
+ fact and the conflicting line. A visual direction with
83
+ no era anchors, or entries that leave the era-specific form unstated, is a craft
84
+ note (`AST-15`).
85
+
75
86
  ## Prompt recipe review
76
87
 
77
88
  All prompt types need purpose, exact binding, identifying facts, current variant,
@@ -5,9 +5,12 @@
5
5
  - [Promise](#story-promise-and-engine)
6
6
  - [Episode](#episode-shape)
7
7
  - [Entry and serial memory](#entry-character-and-serial-memory)
8
+ - [Adaptation fidelity](#adaptation-fidelity)
8
9
  - [Scene](#scene-test)
9
10
  - [Action](#action-and-production-meaning)
10
11
  - [Dialogue](#dialogue)
12
+ - [Rhythm profile](#rhythm-profile-rev-12)
13
+ - [Local passes](#local-passes-rev-13)
11
14
  - [Findings](#common-findings)
12
15
 
13
16
  ## Story promise and engine
@@ -55,8 +58,9 @@
55
58
  A capacity estimate (`STY-16`) is informational, never a blocking finding. If a
56
59
  planned episode's shot/duration magnitude is far from the project's own accepted
57
60
  ratios, note it as an advisory observation with the sampled basis, and leave the
58
- resolution to the creator. Never derive a word, line, or shot quota from it, and
59
- never compare against another project's numbers.
61
+ resolution to the creator. Do not derive a word, line, or shot quota from it. The only
62
+ numbers a review checks are the ones in an accepted rhythm profile
63
+ ([below](#rhythm-profile-rev-12)), and never another project's numbers.
60
64
 
61
65
  When the premise grants foreknowledge or externally authorized ability (`STY-17`), keep
62
66
  two layers apart and cite each from its own place:
@@ -117,7 +121,28 @@ What is reportable:
117
121
  A breathing scene should process a consequence rather than suspend the story.
118
122
 
119
123
  Do not require a fixed hook type, beat count, reversal, climax timestamp, or
120
- dialogue quota.
124
+ dialogue quota beyond what an accepted rhythm profile declares.
125
+
126
+ ## Adaptation fidelity
127
+
128
+ Active only when the project adapts a source. Read the source span each mapping in
129
+ `项目开发/adaptation-map.jsonl` cites, then the episode record and screenplay.
130
+
131
+ - For each core source character: is their stance toward the protagonist, their way of
132
+ acting, and their relationships the same on screen as in the source (`STY-07`)?
133
+ Pressure made louder or spoken aloud is fine; a supportive figure turned oppressor,
134
+ or a relationship reversed, is a finding unless the creator accepted the change.
135
+ Cite the source fact and the conflicting screenplay line (`REV-03`).
136
+ - Does the main line still run the source's way, and does any invented detail
137
+ contradict a source fact?
138
+ - Is every character, scene, or opponent the source lacks registered as its own `add`
139
+ mapping, with the function it serves, why existing source material cannot carry it,
140
+ the source facts checked against it, and a line in the brief for the creator (`STY-30`)?
141
+ An addition hidden inside `change_carrier`, `merge`, or `move_earlier` notes is a
142
+ `craft_default` finding; an unregistered addition that also contradicts the source
143
+ is a `STY-07` finding.
144
+ - When an episode's opponent was manufactured to meet `opposed_reversals_per_episode_min`,
145
+ say so: the profile deviation is the honest outcome, not a new antagonist.
121
146
 
122
147
  ## Scene test
123
148
 
@@ -197,6 +222,54 @@ them fit this checklist. A loud scene can fail when nothing changes.
197
222
  Silence, interruption, slang, narration, and sentence length are creator options,
198
223
  not universal scoring ratios.
199
224
 
225
+ ## Rhythm profile (`REV-12`)
226
+
227
+ Active only when `short-drama.json#/creator_authority/rhythm_profile` has `status`
228
+ `accepted`. A missing, `unset`, or `proposed` profile means nothing here is checked.
229
+ The review does arithmetic on the accepted values against the current screenplay and
230
+ nothing else:
231
+
232
+ | Field | What the reviewer measures |
233
+ |---|---|
234
+ | `first_hook_seconds` | Seconds from the episode start to the first hook: crisis, conflict, anomaly, or promised spectacle already happening on screen. |
235
+ | `beat_interval_seconds_max` | The longest gap between consecutive emotional touchpoints: a conflict line, a situation-changing action, or new information. |
236
+ | `opposed_reversals_per_episode_min` | Reversals driven or suffered by a human opponent with an agenda; changes completed by a system, a number, or the environment alone do not count. |
237
+ | `end_on_peak` | Whether the last beat sits on or just before the peak, with no afterglow, summary, or quiet coda after it. |
238
+ | `reprise_previous_last_beat` | Whether the opening replays the previous episode's last beat. Not applicable to the first episode. |
239
+ | `vo_share_max` | `[VO]` spoken characters as a share of all spoken characters; `$short-drama-write`'s duration estimate reports it when run with the project file. |
240
+ | `first_major_payoff_by_episode` | Series review only: the episode in which the first major payoff lands. |
241
+
242
+ Seconds come from the project's declared pacing, or from a real-time read-through
243
+ labelled as a text estimate; state which. A deviation is a `craft_default` finding that
244
+ cites the field, the accepted value, the measured value, and the location. Severity
245
+ follows audience impact and is never `blocker`; the creator may keep the episode with a
246
+ stated reason. Storyboard fields (`target_avg_shot_seconds`, `close_shot_share_min`)
247
+ are measured in the [visual rubric](rubric-visual-motion.md#rhythm-profile-shots).
248
+
249
+ ## Local passes (`REV-13`)
250
+
251
+ After the whole-episode read, run three passes that each read one part only. A whole
252
+ read lets a strong middle excuse a flat opening; a part read cannot.
253
+
254
+ 1. **Opening hook**: read only the first segment, up to `first_hook_seconds` or, with
255
+ no accepted profile, the first scene. Would a viewer who saw only this stay? Name
256
+ the hook and say whether it is happening or only being set up. Then read the first
257
+ beat alone, the opening frame: does it raise a question by itself,
258
+ or does it need on-screen text read, a character recognized, or the next line heard
259
+ first (`SCR-22`)? A still image that poses its own question passes. For a first
260
+ episode, also check that the brief compared the entry candidates on that same image
261
+ (`STY-25`).
262
+ 2. **Ending suspense**: read only the last segment, the final scene's closing beats.
263
+ What question is left open? Does it grow out of this episode's result? Is it a line
264
+ hook (an unfinished question, an identity hint) or an image hook (a door half open,
265
+ an envelope half torn)? Does it stop before the answer?
266
+ 3. **Mid-episode reversal density**: read only the middle. List each reversal with its
267
+ location and the person driving or suffering it; flag long stretches with no
268
+ touchpoint and reversals bunched at the end.
269
+
270
+ Each finding cites its own segment. The passes apply with or without a profile; only
271
+ the numeric comparisons need one.
272
+
200
273
  ## Replaceable realization (`SCR-10`)
201
274
 
202
275
  Only for beats the creator marked. **An unmarked beat leaves this section
@@ -230,6 +303,7 @@ the benefit is not, and the mark exists precisely so the strong version can stay
230
303
  - cliffhanger withholds all payoff;
231
304
  - episode pauses an unfinished action without producing a local result (`STY-13`);
232
305
  - first episode dumps the backstory reservoir instead of selecting an active entry;
306
+ - an adaptation hardens a source character or invents an opponent without an `add` mapping or creator acceptance;
233
307
  - a declared character arc has no pressure test, choice, cost, or changed strategy;
234
308
  - serial summary omits an information permission or unpaid setup obligation;
235
309
  - generic emotion adjectives replace visible performance;
@@ -7,6 +7,7 @@
7
7
  - [Keyframe](#frozen-keyframe)
8
8
  - [Motion](#motion)
9
9
  - [Continuity](#cross-shot-continuity)
10
+ - [Rhythm profile](#rhythm-profile-shots)
10
11
  - [Findings](#common-findings)
11
12
  - [Production risks and authorized observations](#production-risk-and-authorized-observation-checklist-rev-08)
12
13
 
@@ -31,6 +32,11 @@
31
32
  - Why is this a new shot?
32
33
  - Do framing and camera behavior serve attention, alignment, pressure, reveal, or
33
34
  rhythm rather than decorate the prose?
35
+ - Does each shot's `运镜` line state a behavior and a reason chosen from the shot's
36
+ purpose (`SHT-04`)? A stated lock-off with its reason passes. An episode locked on
37
+ nearly every shot while its peak gets no movement is a finding; so is a missing line,
38
+ which leaves the choice to the video-prompt stage; a bare 「运镜:固定」 with no reason
39
+ is also a finding.
34
40
  - Are Location/View, axis, screen direction, eyelines, entrances, positions,
35
41
  hands, and props coherent?
36
42
  - Are exact asset variants bound?
@@ -39,6 +45,15 @@
39
45
  - Do crop, occlusion, focus, back view, and offscreen space serve that information
40
46
  permission rather than accidentally reveal or conceal it?
41
47
 
48
+ ## Rhythm profile: shots
49
+
50
+ Under the `REV-12` conditions in the [story rubric](rubric-story-script.md#rhythm-profile-rev-12),
51
+ measure two storyboard fields: the average shot length per scene (scene duration divided
52
+ by its shot count) against `target_avg_shot_seconds`, and the share of close-range shots
53
+ across the episode, as the profile field defines them, against `close_shot_share_min`. The average is a
54
+ scene-level target; one long or short shot is not a finding. Also report durations folded
55
+ from screenplay word counts instead of the scene's sound timeline (`SHT-28`).
56
+
42
57
  ## Frozen keyframe
43
58
 
44
59
  - Can all described facts exist in one still instant?
@@ -86,41 +101,15 @@
86
101
  - Does each media reference state its exact purpose, what may be copied, and what
87
102
  must not be copied, rather than treating all visible pixels as authority?
88
103
 
89
- For a copyable body, ask these separately — they are the two rules a rewrite regresses on
90
- most often, because a body that reads "complete" can still carry both defects. Findings here
91
- are about whether the body states this shot's sound and text truthfully and completely; only
92
- the music-layer item below has a measured generation consequence behind it:
93
-
94
- - Does the body carry only what will be filmed (`VID-22`)? Negative action intent must
95
- already be rewritten as a visible positive state. The one permitted negation is the
96
- no-subtitle/caption/dialogue-overlay declaration; a second exclusion clause is a defect,
97
- not extra safety. (The often-repeated reason — that a noun inside a negation gets
98
- rendered — did not reproduce in this suite's probes, so cite the body's own clarity,
99
- not that mechanism, when you raise this.)
100
- - When the target model generates audio in the same pass (`VID-23`), is the sound written
101
- as a closed positive event set — what the track consists of, and across what span —
102
- rather than a list of what must not be heard? Check three failures by name:
103
- - an exclusion clause (`No dialogue`, `无对白`, `no music`) standing in for a positive
104
- soundscape, so the body never says what this shot sounds like;
105
- - a completeness declaration that enumerates a layer this shot does not have. "The audio
106
- timeline is complete after the listed ambience, effects and timed dialogue" on a shot
107
- with no lines states something untrue of this shot. Read the declaration against the
108
- shot's actual layers, not against a template;
109
- - a shot that leaves the non-diegetic music layer unstated. This is the one sound defect
110
- with measured consequences: bodies that omitted the layer came back with an invented
111
- score. **The dialect's empty form satisfies this** — for H3 that is the literal line
112
- `non_diegetic_music: N/A`, which is a correct statement of "no non-diegetic music",
113
- not a placeholder. Raise this only when the layer is missing from the body altogether;
114
- never ask an owner to delete a present empty form;
115
- - a shot with no lines whose body never says what the track *is* for the full duration,
116
- and never gives the on-screen performers a visible non-speaking state.
117
- Report a contradictory pair — an exclusion clause plus a declaration that enumerates the
118
- excluded layer — as one finding against the body's sound contract, and quote both
119
- sentences. Raise it as an internally inconsistent sound contract, which it is; do not
120
- assert that it makes the model invent lines, which this suite has probed and not seen.
121
-
122
- These two apply to a body the review itself is about to ask an owner to rewrite. A revision
123
- request that removes a defect by adding `no ...` has moved the defect, not fixed it.
104
+ For a copyable body (`VID-22`, `VID-23`), check that actions and sound match the
105
+ source and that the timeline accounts for the intended ambience or silence.
106
+ A summary must not introduce a layer absent from the shot. H3's
107
+ `non_diegetic_music: N/A` is a valid empty music layer.
108
+
109
+ Report a concrete contradiction, omission or ambiguity. A negative clause is
110
+ not a defect by itself; do not impose a clause count or assume that negation
111
+ causes the model to generate the excluded content. Keep model-specific
112
+ observations scoped to their tested model and execution path.
124
113
 
125
114
  For a pickup or alternate, ask these separately:
126
115
 
@@ -22,6 +22,9 @@
22
22
  | REV-09 | reviewed_invariant | After prompt revision or repackaging, recheck source coverage and every applicable accepted directive; correct asset bindings alone do not prove compliance. |
23
23
  | REV-10 | reviewed_invariant | A project-calibration finding distinguishes input-reference from generated-result observation, binds the exact project, the prompt/spec records it observed, stable reference slots, production configuration, method and limits, and—when its disposition calls for a change (see REV-11)—proposes the smallest owner-routed one with a preserve set; it does not generalize across projects or infer quality from task state. |
24
24
  | REV-11 | reviewed_invariant | A calibration finding carries `disposition` (keep, post_production, targeted_edit, resubmit, rewrite) and `disposition_rationale` before any revision text, justified by whether the defect is text-controllable and whether it has already recurred. Dispositions that call for no change leave `required_change` empty rather than inventing one. Resubmitting identical text and appending quality adjectives are not repairs; a recurring defect routes to a structural change instead. Findings outside project calibration use `not_applicable`. |
25
+ | REV-12 | craft_default | When the project's rhythm profile has status `accepted`, review checks the episode against it by arithmetic on the accepted values only and reports a deviation as a non-blocking finding citing field, accepted value, measured value, and location; the creator may keep the episode with a stated reason. A missing or proposed profile leaves the check inactive, and no finding compares against another project's or a suite-wide number. |
26
+ | REV-13 | craft_default | Beyond the whole-episode read, three local passes each read one part only: an opening-hook pass on the first segment, which also reads the first beat alone as the opening frame, an ending-suspense pass on the last segment, and a reversal-density pass on the middle. |
27
+ | REV-14 | craft_default | A revision request is a patch at a cited location with a preserve set, never a whole-episode rewrite; a strong hook, payoff line, or comic beat removed by polishing is logged with its prior location and quote so the owner can restore it. |
25
28
 
26
29
  规则分级由高到低:`structural_invariant`(结构缺陷,阻断)、
27
30
  `reviewed_invariant`(需证据判断)、`craft_default`(常用做法,可覆盖)、
@@ -7,7 +7,8 @@ license: MIT
7
7
  # 短剧分镜与冻结关键帧
8
8
 
9
9
  把剧本和视觉事实转成有镜头职责、空间连续性和可冻结起点的 `剧集/<EP>/分镜.md`。
10
- 每镜使用二级标题 `## SHOT-...`,同镜下用 `### 冻结关键帧提示词` 写起始帧正文。
10
+ 每镜使用二级标题 `## SHOT-...`,同镜下用 `### 冻结关键帧提示词` 写起始帧正文;
11
+ 需要时另加 `### 收尾关键帧提示词` 写终点正文。
11
12
 
12
13
  ## Quick Start
13
14
 
@@ -25,6 +26,9 @@ license: MIT
25
26
  分配镜头时长前读取
26
27
  `short-drama.json#/creator_authority/production_profile/choices/native_duration_seconds`。已声明目标模型但
27
28
  没有原生时长时先补这一个选择;目标模型也未声明时照常按叙事节奏设计,不猜供应商限制。
29
+ 同时读取 `short-drama.json#/creator_authority/rhythm_profile`:`status` 为 `accepted` 时,镜长按
30
+ [镜长从哪来](references/shot-craft.md#镜长从哪来-sht-28) 由声音事件与 `target_avg_shot_seconds` 推出,
31
+ 全集近景类镜头占比不低于 `close_shot_share_min`;档案缺失或未接受时不核对这些数值。
28
32
 
29
33
  冻结关键帧写完之前,谁会出现在这一格画面里还没有定下来。所以三条依据都在关键帧之后回填,
30
34
  读的是成稿画面,不是镜头意图。
@@ -47,12 +51,17 @@ license: MIT
47
51
  2. 确定观众何时知道什么、对齐谁、空间如何揭示、转折落在哪个可见动作。
48
52
  剧本或 Brief 用“前半段 / 后半段 / 前三分之一 / 最后 N 秒”等相对时间限定首次出现、释放或禁止时,
49
53
  先用已接受集长换成明确时间边界再分镜;例如 60 秒作品的“后半段首次出现”不得早于 30 秒。
50
- 3. 每镜写清唯一职责、来源、时长、景别/机位、起点、唯一主要动作、终点和声音;用
54
+ 3. 每镜写清唯一职责、来源、时长、景别/机位、运镜、起点、唯一主要动作、终点和声音;用
51
55
  `起点 → 唯一动作 → 终点` 直接说明人物、双手与持物怎样完成本镜状态转换。三条依据留到第 6 步。
56
+ 「运镜」按本镜目的逐镜选,写行为和理由,固定也写理由,见 [运镜逐镜选](references/shot-craft.md#运镜逐镜选-sht-04)。
52
57
  有对白、VO 或 OS 时,先按原文和人物说话方式估算完整发声时间,再安排不能重叠的动作、停顿与
53
58
  末尾反应;把估时依据简写在本镜「声音」里。具体做法见 [对白估时](references/shot-craft.md#对白估时)。
59
+ 对白场先按 [对白覆盖默认](references/shot-craft.md#对白场怎么切-sht-29) 放切点;镜长不按剧本字数折算。
54
60
  4. 锁定人物朝向、位置、视线、持物、出入口、屏幕方向和必要状态;上游已有会限制动作空间的持续关系时,把关系投影进本镜起点与终点。
55
61
  5. 冻结关键帧只投影镜头起点;删除终点才出现的文字、动作、姿态或道具状态。
62
+ 镜头的职责落在收尾那一下时,另写 `### 收尾关键帧提示词` 投影**终点**——同一格画面的
63
+ 另一端,规则完全对称:删除起点才有、终点已经不在的东西。它是可选的,写法与取舍见
64
+ [首尾成对](references/shot-craft.md#首尾成对)。
56
65
  6. 关键帧成稿后,先从成稿正文读出这一格里需要保持身份、造型或地理的人物、地点和道具,
57
66
  再用同一份清单一次填满三条依据:
58
67
 
@@ -71,22 +80,24 @@ license: MIT
71
80
 
72
81
  - 每镜有唯一职责、明确来源、可见起止状态和合理时长。「来源」以《剧本.md》里真实存在的场景 ID 开头,
73
82
  ID 之后可以跟必要短引文,跨场次的镜头用 `、` 连写多条;`creator_markdown_check.py` 会核对每个 ID 都解析得到。
74
- - **引文是认领,不是背景。** 「来源」里引了哪一句,就等于说这一镜负责拍它。引一个本镜画面里
75
- 根本没有的人做的动作——把「另一个人低头去翻自己的稿子」写进一个只拍某一个人的特写——
76
- 那个动作就从所有人的清单上消失了:没有别的镜头认领它,也没有任何一步报它缺失,
77
- 于是它根本不会被拍出来,而这个缺口只有等人看完成片、问「他的反应呢」才浮出来。
78
- 确实看不见就在「视觉依据」末尾写 `;画外:<类别>「<名称>」`,机械核对认这个写法。
83
+ - 「来源」短引文应对应本镜承担的动作或声音。正文提到画外人物时,可在视觉依据写
84
+ `;画外:<类别>「<名称>」`;这只声明其不在画面,不能代替必要动作的落实。
85
+ 需要看见的动作应另有镜头承载,或说明为何省略。
86
+
79
87
  - 剧本里的每个场景都要有镜头承载。确实决定不拍某一场时,在《分镜.md》正文开头写一行
80
88
  `- 未拍场次:<场景 ID>(理由:……)`,多项用 `;` 连接。SHT-01 一直允许带理由的省略,
81
89
  但省略和漏拍在成稿文档里长得一模一样,所以理由要写下来,而不是留在对话里。
82
- - 已声明原生时长时,每个一镜一生成的镜头都落在其最短与最长秒数内。短于下限的叙事动作在合法
83
- 镜长内完成后保持终点;长于上限的动作按可见状态闭合点拆镜,拆出的每镜仍各有唯一职责与可信交界。
90
+ - 已声明原生时长时,每镜照常有自己的唯一职责、起止边界和冻结关键帧,镜长先按叙事需要定。短于最短秒数
91
+ 的镜头,向创作者提议把同场相邻的几镜装进一个多镜容器,在交付档案里声明;目标方言要求时,容器的每一切
92
+ 都要有已接受的关键帧图片,能否装、怎么装由 `$short-drama-video-prompts` 的方言决定。创作者没有声明
93
+ 多镜容器、或方言不支持时,镜头落在最短秒数内,动作完成后保持终点。长于上限的动作按可见状态闭合点拆镜,
94
+ 拆出的每镜仍各有唯一职责与可信交界。
84
95
  - 「唯一动作」写从本镜起点到终点的那条可见状态链;涉及交接、换手、放置或取回时,把接触者、
85
96
  接触方式和物件落点写在同一链里,不能让合法终点之间靠镜外瞬移衔接。
86
97
  - 切镜必须带来信息、权力、情绪、空间或节奏变化;同义重复镜头删掉。
87
98
  - 相对时间词约束的是事件首次可见或可听的时刻,不因前置动作已经完成就提前释放;分镜时间轴直接
88
99
  写出该边界,不把“稍后”“交接后”等叙事顺序当成数值时间的替代。
89
- - 同一动作不跨镜重复发生;终点应能成为下一镜可信起点。
100
+ - 同一动作不跨镜重复发生,峰值处声明过的[冲击重复](references/shot-craft.md#动作落实表)除外;终点应能成为下一镜可信起点。
90
101
  - 关键信息的可读性优先于装饰性运镜,竖屏构图优先保证主体和反应可见。
91
102
  - 复杂群戏先锁空间锚点和屏幕方向,再决定景别变化。
92
103
  - 起终边界除了逐人姿态,还要写清本镜依赖的身体—物件—空间关系。关系在镜内不变时两端都保留;确需改变时,过程与终点必须有剧本依据。
@@ -140,11 +151,12 @@ license: MIT
140
151
  默认只读本 SKILL、当前剧本和必要视觉事实。遇到对应问题时只打开一份:
141
152
 
142
153
  - 阶段边界与规则分级:[阶段契约](references/stage-contract.md)
143
- - 镜头职责、切镜理由和边界:[镜头手艺](references/shot-craft.md)
154
+ - 镜头职责、切镜理由、镜长推导、对白覆盖和边界:[镜头手艺](references/shot-craft.md)
144
155
  - 实际制作所需的镜头语法:[生产镜头语法](references/production-shot-grammar.md)
145
156
  - 关键场次比较导演方案:[场次视觉计划](references/scene-visual-plan.md)
146
157
  - 检查原文是否都有画面承载:[Coverage Audition](references/coverage-audition.md)
147
158
  - 多人、群体和复杂空间调度:[调度手册](references/blocking-playbooks.md)
159
+ - 谁被照亮、怎么写才执行得出:[光的设计](references/lighting-craft.md)
148
160
  - 冻结瞬间、注意中心和可读性:[关键帧手艺](references/keyframe-craft.md)
149
161
  - 漫剧/二维漫画形态的共享画风词汇:[漫剧关键帧词表](references/comic-keyframe-lexicon.md)
150
162
  - 剧本事实到关键帧的完整示例:[剧本到关键帧](references/screenplay-to-keyframe-example.md)
@@ -24,7 +24,7 @@
24
24
  - 先保证进出方向和视线连续,再用近景强化选择。
25
25
 
26
26
  可以按以下顺序设计:空间锚点与入口 → 每人的行动目标和筹码 → 群体注意中心 →
27
- 关键动作前后的站位 → 哪些同时反应必须留在全景中 → 只有丢失信息时才切插入镜头或近景。
27
+ 关键动作前后的站位 → 哪些同时反应必须留在全景中 → 再按[对白覆盖默认](shot-craft.md#对白场怎么切-sht-29)切到说话者、听者和插入镜。
28
28
 
29
29
  常见问题:每句台词都切一个头像近景;站位只为填满画面;背景人物在切镜后无原因换边;
30
30
  重要人物一直被前景遮住,但剧情并未利用这种遮挡。