@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
@@ -0,0 +1,103 @@
1
+ # Wan 3.0 提示词方言
2
+
3
+ 只在目标档案明确写 `target_video_model: wan-3.0` 时使用。推荐档案:
4
+
5
+ ```json
6
+ {
7
+ "target_video_model": "wan-3.0",
8
+ "video_prompt_dialect": "wan-3.0",
9
+ "video_prompt_language": "zh-CN",
10
+ "native_duration_seconds": {"min": 2, "max": 30},
11
+ "supported_generation_modes": ["text", "first_frame", "first_last_frame", "reference"],
12
+ "audio_generation": "same_pass"
13
+ }
14
+ ```
15
+
16
+ Wan 3.0 用中文自然指令,素材写成 `图1`、`视频1`、`音频1`。它和 Seedance 一样读中文长句,
17
+ 但素材标记、多镜时间段和对白写法都不同,不套用 Seedance 的 `@图片N`、`{…}` 或 `<声音>`。
18
+
19
+ ## 选哪一种模式
20
+
21
+ | 本镜绑定的图 | Wan 3.0 模式 | 正文怎么指代 |
22
+ |---|---|---|
23
+ | 没有图,且创作者已明确选择文生视频 | 文生 | 静态视觉锚点写进正文,不出现素材标记 |
24
+ | 只有一张 `用途:起始帧` | 首帧 | 从输入帧的可见姿态写起,不另起标记 |
25
+ | 一张 `用途:起始帧` + 一张 `用途:结束帧` | 首尾帧 | 终点只投影分镜已接受的终点 |
26
+ | 其他任何组合 | 参考 | `图N` 逐张点名职责 |
27
+
28
+ 首帧、尾帧与 `reference_image`、`reference_video`、`reference_audio` 在同一请求里**互斥**。
29
+ 「起始帧 + 角色图 + 场景图」整组走参考模式,起始帧也作为参考图送入,正文写
30
+ 「图1 是本镜开场画面」,不拆成首帧加参考图。没有起始帧、只挂身份或地点图时写具体取景,见
31
+ [目标模型能力档案](target-model-profile.md#参考条件方式)。首帧与首尾帧模式本套件未实测。
32
+
33
+ ## 素材编号与上限
34
+
35
+ `图N`、`视频N`、`音频N` 各自从 1 开始,按同类素材在请求数组里的次序编号,也就是本镜
36
+ 「输入参考图」里的 `顺序`。每次使用都写清这张图负责什么:「图1 中的年轻女子站在图2 的旧书店里」,
37
+ 不让一张图顺带决定身份、构图和动作。
38
+
39
+ 一次最多 10 张参考图、5 段参考视频、5 段参考音频;视频与音频每段 1–15 秒,各自合计不超过 15 秒。
40
+ 首帧、尾帧各 1 张。正文不超过 20000 字符。超过上限时在分镜阶段按重要性取舍,并写明放弃了哪些参考。
41
+
42
+ ## 时长
43
+
44
+ `duration` 为 2–30 的整数秒;带视频输入时,输入视频时长加输出时长不超过 30 秒。`-1` 是智能时长,
45
+ 由模型自己选。固定时长交付显式传分镜已接受的秒数,不把规划镜长写成自动时长下已经保证的输出长度。
46
+ 分辨率可选 1080P、720P、480P,画幅按项目已接受的那一个传。
47
+
48
+ ## 多镜时间段
49
+
50
+ 多镜按 `(0:00 - 0:03) 镜头1,远景:…` 写时间段,段与段首尾相接,最后一段终点等于总时长。
51
+
52
+ 几个相邻镜头装进一次生成、每切挂自己的已接受关键帧时,先写一句「图1、图2、图3 依次是三个镜头的
53
+ 画面,图4 是老人,图5 是年轻女子」,再在各段里写「按图N构图」。成员资格与容器算术按
54
+ [交付形态](delivery-profile.md) 的多镜容器记账,关键帧按切的顺序排在参考清单前面。
55
+
56
+ 这种写法可用,但切点不准。一组 9 秒三切的小样本(要求 3.0/6.0 秒切)3 次:切点落在 2.46–3.46 /
57
+ 4.92–6.17 秒,第三切与关键帧的构图相似度也明显低于前两切。需要准确切点的交付逐镜生成,
58
+ 或者生成后按实际切点剪辑。
59
+
60
+ ## 对白与语速
61
+
62
+ - 对白写成 `说道:“逐字台词”`,用中文引号,跟在说话人的可见动作后面:
63
+ 「她望着镜头,声音轻而稳,用普通话说道:“……”」。这是官方示例的写法。花括号
64
+ `{年轻女子用中文说:“……”}` 在小样本里同样逐字完整、括号里的说明没有被念出来,但不作为本方言写法。
65
+ - 语速按 [对白预算](performance-action-timing.md#对白预算) 先估再排时。Wan 3.0 中文小样本约
66
+ 4.6 个可发声字/秒:21 字配 5 秒、41 字配 10 秒都以常速说完。41 字塞进 5 秒仍说完,但赶到
67
+ 8.2–8.7 字/秒;66 字塞进 5 秒时只说出前 21–24 字,其余静默丢掉,接口不报错。所以超出容量时
68
+ 看不到失败提示,生成后逐字核对台词是否说完。
69
+ - 说话人的声音要跟参考音频走时,写「图1 中的女子说话时,音色参考音频1」;这是官方写法,本套件未实测。
70
+ - 双人镜里不说话的人按 [对白、口型与声音](camera-audio-continuity.md#精确引用) 的顺序处理;Wan 3.0 的
71
+ 小样本太小,写不写「他不说话、嘴唇闭合」没有看出差别。
72
+
73
+ ## 声音与文字
74
+
75
+ 写全本镜声景:环境底声、每个音效事件及其时机,并单独写一句配乐层——需要配乐就写情绪与进出,
76
+ 不需要就写「无背景音乐」。一组小样本里写全环境声、不提配乐与加「无背景音乐」各 4 次,
77
+ 8 次都没有配乐;仍把配乐层写明,不留给模型决定。
78
+
79
+ 默认禁字幕时写「全程无字幕,画面中不出现任何文字」;画内获准文字另行逐字说明。
80
+
81
+ ## 智能改写
82
+
83
+ 官方 API 的 `prompt_extend` 默认 `true`,会先用大模型改写提示词再生成。已审过的正文可能被改掉逐字
84
+ 台词、声音层或镜头数。直接调用 API 时显式传这个参数;所用平台不暴露它时,默认它在改写,
85
+ 生成后对照正文核对台词、声音层与切数。
86
+
87
+ ## 编辑与延长
88
+
89
+ 编辑和延长都是「`reference_video` + 写明意图的正文」,没有单独的任务类型字段,所以不写
90
+ Seedance 2.5 的「任务类型」一行:
91
+
92
+ - 编辑:「编辑视频,把视频1 中……改成……」,或用「去掉」「替换」「改成」点名要改的那一处,
93
+ 其余照原片保留。
94
+ - 延长:「将视频1 向后延长 N 秒」「延续」,或「向前延长」;需要 `ratio: adaptive`。
95
+ 从输入视频的实际终点写唯一动作和新终点,预算的是新增片段的时长与对白。
96
+
97
+ 连续段需要上一段实际视频和实际尾帧时,因为首帧与参考互斥,两者都走参考模式:视频为 `视频1`,
98
+ 控制动作、节奏和声音连续;尾帧为 `图1`,只控制新段开场的可见姿态与构图。
99
+
100
+ 依据(2026-09-26 核对):[Wan 3.0 视频生成 API](https://help.aliyun.com/zh/model-studio/wan3-video-generation-api-reference):
101
+ 输入模式与互斥、素材上限、时长、`prompt_extend`、编辑与延长;
102
+ [Wan 3.0 视频生成指南](https://platform.qianwenai.com/docs/developer-guides/video-generation/wan30-video):
103
+ 时间段写法、`说道` 对白、素材编号、编辑与延长关键词。
@@ -7,9 +7,10 @@ differently:
7
7
  * **Overflow** — segments extend past the accepted duration. Whatever falls
8
8
  outside is truncated, taking the closing action, the verbatim dialogue tail
9
9
  and the end pose with it.
10
- * **Shortfall** — segments stop short. The unallocated remainder does not
11
- render as a held frame; the execution end fills it with motion, expression or
12
- camera movement that has no upstream source at all.
10
+ * **Shortfall** — segments stop short. The execution end may not stop or
11
+ hold at the last written mark; in a small H3 sample it stretched the written
12
+ action to fill the shot, so the written seconds landed later than planned and
13
+ the plan no longer described the output.
13
14
 
14
15
  Both are the same rule, so both are reported under the same ID with distinct
15
16
  diagnostic codes. Relative timing plans are out of scope by contract: only a
@@ -327,8 +328,8 @@ def check(
327
328
  # purpose. Comparing one total against the duration hides the plan that
328
329
  # commits both at once: 0.0-2.0 plus 3.0-5.0 covers exactly 4.0s of a
329
330
  # 4.0s shot, so the totals match — while a segment runs a second past
330
- # the end (truncated) and the 2-3s window sits unallocated (filled with
331
- # unsourced motion). Overflow is therefore read off the endpoint, and
331
+ # the end (truncated) and the 2-3s window sits unallocated (the written
332
+ # action stretches over it). Overflow is therefore read off the endpoint, and
332
333
  # shortfall off the union clipped to the shot.
333
334
  covered = _union_length(ordered)
334
335
  # max(), not ordered[-1][1]: sorting (start, end) tuples orders by
@@ -365,8 +366,8 @@ def check(
365
366
  "VID_EXPLICIT_TIMING_SHORTFALL",
366
367
  motion_id,
367
368
  f"explicit timing leaves {round(unallocated, 6)}s of an accepted "
368
- f"{duration}s shot unallocated; the remainder will be filled with "
369
- "unsourced motion",
369
+ f"{duration}s shot unallocated; the written action may be stretched "
370
+ "to fill it, so the written seconds may not be where it lands",
370
371
  accepted_duration_seconds=duration,
371
372
  allocated_seconds=round(inside, 6),
372
373
  unallocated_seconds=round(unallocated, 6),
@@ -40,10 +40,12 @@ license: MIT
40
40
  - 先服从输入已经给出的事实、`必须/禁止`、题材观看契约和退出状态;本技能的审查项与手艺默认只帮助实现这些要求,不能反过来补造题面没有的精确数字、记录、资源、程序、关系或机关。
41
41
  - 每场改变信息、权力、关系、情绪、物理状态或风险;无变化的场删掉或合并。核心阻力的转向要有可追溯的事实、筹码、权限、代价或人物行动,不能只靠对手停止反应。
42
42
  - 对白必须在争取、回避、试探、逼迫或重新定义关系;用可见、可听、可触的行为表现状态,不用解释替代行动,也不把已经演清的机制再说一遍。
43
+ - 自己写的对白初稿,写完读一遍,删掉不承担动作或冲突的句子;留下的每句都要能转成演员的一个动作或表情,转不成的删掉或改成动作。创作者带来的原文不按这条删。
44
+ - 全集第一拍自己要是钩子,见[开场第一拍](references/script-craft.md#81-开场接住进入状态)。
43
45
  - 观众理解当前行动所必需的赌注要进入剧本,但载体服从题材;选择、证据、有限单位、精确死线等专项规则只在输入真正以它为发动机时启用,并按需读取[剧作手艺](references/script-craft.md),普通决定、普通物件和模糊时间压力不升级成同一套机关。
44
46
  - 压缩过程时只保留会改变策略、关系、风险或结果的节点。资源与外部反应必须来自输入或前文建立,且不能替人物完成最难的戏剧行动。
45
47
  - 承担主要冲突的角色要保持相称的目标、判断或策略;事务性、环境性角色保持简洁,不为检查表硬加秘密、反转或人物弧。
46
- - 已建立的代价、不可逆后果、关键持物、空间和知识状态要进入可追溯的退出状态;结尾可推进、留白、反讽、安静收束或形成余韵,不强制追加外部事件。
48
+ - 已建立的代价、不可逆后果、关键持物、空间和知识状态要进入可追溯的退出状态;结尾可推进、留白、反讽、安静收束、形成余韵或让既有动作变义,不强制追加外部事件;已接受节奏档案的 `end_on_peak` 为 `true` 时,停在峰值上,不接余韵(见[项目节奏档案](references/script-craft.md#65-项目节奏档案))。
47
49
  - `[连续性]` 只交接由前文动作已经建立、又容易在下游丢失的状态;不能用作者标签证明镜头外从未发生某事,也不复述正文已清楚呈现的结果。
48
50
  - 交稿前静默做一次经济性检查:是否增加了输入没有要求的精确数字或记录链;是否用标签/对白重复动作;是否在回报后堆了多个同方向后果。没有新作用的内容删掉,knowhow 本身不删。
49
51
  - 输入给出目标时长时按真实表演、动作和停顿通读压稿,先删重复验证、解释和同义收尾;不用统一字数、镜头数或节拍数填模板。
@@ -62,10 +64,12 @@ license: MIT
62
64
  - 声源、留白与 sound bridge:[场景声音戏剧](references/scene-sound-dramaturgy.md)
63
65
  - 同一故事义务的不同可拍实现:[可替代实现](references/substitutable-realization.md)
64
66
  - 长单集跨上下文时的最小交接:[场景交接胶囊](references/scene-handoff-capsule.md),只留在上下文
67
+ - 本集要用 `[VO]` 或内心独白交代信息,或有痛点要交代:[能演的不说](references/script-craft.md#44-能演的不说vo内心独白与痛点)
68
+ - `short-drama.json` 里有 `status` 为 `accepted` 的 `creator_authority.rhythm_profile`:[项目节奏档案](references/script-craft.md#65-项目节奏档案)
65
69
 
66
70
  ## 时长估算(按需)
67
71
 
68
- 用户问时长时才把索引写入系统临时目录。先用 Python 查询跨平台临时目录,把第一条命令打印的完整
72
+ 用户问时长,或项目已接受节奏档案、需要核对 VO 占比时,才把索引写入系统临时目录。先用 Python 查询跨平台临时目录,把第一条命令打印的完整
69
73
  路径原样替换进后两条命令的引号内。以下每条都是一行完整命令,不依赖 shell 变量或续行符;Windows
70
74
  没有 `python3` 命令时使用 `py -3`。`--speaker` 的示例值必须替换为本集实际说话者。
71
75
  `--project short-drama.json` **只加在第三条命令上**(`duration_estimate.py` 才接受它,
@@ -82,17 +86,16 @@ python3 "{技能目录}/scripts/duration_estimate.py" "剧集/EP001/剧本.md" -
82
86
  要保留原有块 ID 就加 `--previous-index <同一路径>`,要从头重编号就加 `--no-previous`;
83
87
  或者干脆回到第一条命令另取一个临时路径。
84
88
 
85
- **字数单位不要混用**:`duration_estimate.py` 报的 `dialogue_characters` **把标点计入**
86
- (`关窗,水进来了!` 记 8 而不是 6,这是它的既定口径,有测试固定)。而视频提示词阶段
87
- 「对白预算」给出的那个「约 4.1 字/秒」是按**可发声字**(不含标点)实测的。两个数直接相乘
88
- 会高估两成左右——要按秒核对容量时,用可发声字数自己数一遍,别拿 `dialogue_characters` 去乘。
89
+ 估时前区分计数口径:`dialogue_characters` 包含标点,视频提示词中的参考语速按可发声字数计算。
90
+ 按语速换算时排除标点,并按实际读法处理数字和缩写;不把两个计数混用。
91
+ 项目已接受节奏档案时,输出里多一项 `vo_share`:`[VO]` 字数占全部台词字数的比例、档案上限,以及是否超过。
89
92
 
90
93
  估算是参考,不是门禁;没有语速或动作段速率时只报告可数事实,不猜秒数。但任务已给目标时长时,
91
94
  写作者仍须用真实朗读和动作通读判断能否容纳,并直接压缩重复节拍;“不能精确估秒”不是忽略目标的理由。
92
95
 
93
96
  ## 完成
94
97
 
95
- 点名范围已写入、场景因果连贯、对白与行动可表演、承诺有兑现或有意延迟、结尾完成本集预定的戏剧或情绪功能,即完成。最后一拍可以推进,也可以安静收束、形成余韵或让既有动作变义;判断它是否有效,不用“是否又发生一件事”代替。
98
+ 点名范围已写入、场景因果连贯、对白与行动可表演、承诺有兑现或有意延迟、结尾完成本集预定的戏剧或情绪功能,即完成。最后一拍的形态按上文结尾一条;判断它是否有效,不用“是否又发生一件事”代替。
96
99
  资产、分镜、审查与生产只有用户点名时开始。
97
100
  五份创作文档齐备后,可转 `$short-drama` 对跨文档结构做一次机械核对;内容质量仍由创作者审查。
98
101
 
@@ -26,7 +26,7 @@
26
26
  - **`craft_default`**:让信息通过争取、回避、交换和后果出现;创作者可说明理由覆盖。
27
27
  - **`taste_option`**:口语程度、方言、停顿、沉默、直白、诗性、打断和句式长短;遵从人物与作品风格。
28
28
 
29
- 对白比例、金句数量、句长和口癖数量不能证明质量。
29
+ 对白比例、金句数量、句长和口癖数量不能证明质量。唯一的数值核对是创作者已接受的节奏档案里的 VO 占比上限,见[剧作手艺](script-craft.md#44-能演的不说vo内心独白与痛点)。
30
30
 
31
31
  ## 2. 先写议程,再写句子
32
32
 
@@ -28,7 +28,7 @@
28
28
  | `craft_default` | 晚进早出、用选择和后果推进、动作经济 | 创作者可说明理由覆盖 |
29
29
  | `taste_option` | 静场、旁白、沉默、现实/风格化程度 | 保留创作者选择 |
30
30
 
31
- 长度、场景数量、对白比例和转折位置不属于质量证明。
31
+ 长度、场景数量、对白比例和转折位置本身不证明质量,也不拿别的项目的数字来比。项目已接受节奏档案时,档案里的数值是本项目的核对依据,见 [6.5](#65-项目节奏档案)。
32
32
 
33
33
  ## 2. 从单集契约到场景
34
34
 
@@ -263,6 +263,25 @@
263
263
 
264
264
  **`craft_default`**:重大信息或关系动作后,给受影响者一个有后果的反应;普通往返不需要逐句配动作。
265
265
 
266
+ ### 4.4 能演的不说:VO、内心独白与痛点
267
+
268
+ 画面已经演出来的事,`[VO]` 不再说一遍。她当众把欠条撕成两半,已经说明她不认这笔账,旁白就不必再补
269
+ 一句“这钱我不会还”。反过来,台词已经说清的事,下一场也不再演一遍。两种载体重复时,留演出来的那一个。
270
+ `[VO]` 只承担画面给不出的东西:与画面相反的判断、被隐瞒的打算、跨时间的认知。
271
+
272
+ 内心独白能外化就外化。大段“我穿越了”“我一定要……”换成一个动作加一句台词;让旁人把心里话说出口;
273
+ 让手机屏幕、证件、胎记这类物件在画面里交代身份;必要的回忆写成三行以内的短闪回。系统面板与提示
274
+ 交给 `[画面文字]` 或已接受的声音方案,不让系统声替主角想事情。
275
+
276
+ 痛点写成观众亲眼看见的一场戏。“他一直被人看不起”不是痛点;“酒席上,反派当众把酒泼在他脸上”才是。
277
+ 观众看见了被压下去的那一下,后面的回报才有落点。
278
+
279
+ 项目已接受节奏档案时,`[VO]` 的可发声字数占全集可发声字数的比例不超过 `vo_share_max`。时长估算
280
+ 脚本加上 `--project` 会报出这个比例。
281
+
282
+ **`craft_default · SCR-20`**:`[VO]` 不复述画面已经演出的信息;内心独白尽量外化为动作加一句台词、
283
+ 旁人的话或可见物件;痛点落成具体场景;项目已接受节奏档案时,VO 占比不超过 `vo_share_max`。
284
+
266
285
  ## 5. 用空间、物件与反应组织冲突
267
286
 
268
287
  ### 5.1 空间是可用关系
@@ -443,6 +462,33 @@
443
462
 
444
463
  有限单位不是新的模板:题面没有此类结构时不要主动分拍、报数或增加倒计时;题面使用诗性、主观或仪式化计数时,按它已经建立的完成约定判断,不擅自改成现实秒表。
445
464
 
465
+ ### 6.5 项目节奏档案
466
+
467
+ 节奏档案写在 `short-drama.json#/creator_authority/rhythm_profile`,由开发阶段按制作形态提出、创作者接受。
468
+ 本阶段只读,不改。`status` 为 `accepted` 时本节生效;档案缺失、`unset` 或 `proposed` 时不启用,按前文写。
469
+
470
+ 生效时,剧本在写作阶段就把这些数值兑现出来。秒数按真实朗读与动作通读估;项目声明了语速时,可以
471
+ 用时长估算脚本辅助。
472
+
473
+ - **`first_hook_seconds`**:开场在这个秒数内给出第一个钩子。危机、冲突、反常或本剧承诺的奇观已经在
474
+ 画面里发生,而不是在为它铺垫。
475
+ - **`beat_interval_seconds_max`**:相邻两个情绪触点的间隔不超过它。触点是一句冲突台词、一个改变局面的
476
+ 动作或一条新信息;同一信息的第二次说明、客套往来和环境描写都不算。
477
+ - **`opposed_reversals_per_episode_min`**:每集至少这么多次反转,每次都有一个带着自己议程的人在施压或
478
+ 承受。系统、数字或环境单独完成的变化不算。
479
+ 改编项目里这个人从原著已有的人里找,按他在原著里的立场;原著这一段没有时报出偏差,不在剧本里
480
+ 新增对手或改写人物立场,那是 `$short-drama-develop` 的改编决定。
481
+ - **`end_on_peak`**:为 `true` 时,集尾停在峰值上或峰值前一刻,例如身份揭穿、重大抉择、秘密揭晓的前
482
+ 一秒,或把高潮劈成两半、停在悬崖边。峰值之后不再加余韵、总结或安静收束,8.2 里的其他收束形态让位于档案。
483
+ - **`reprise_previous_last_beat`**:为 `true` 时,本集开头先接上一集的最后一拍,重演那个动作、那句话或
484
+ 那个画面,再往前推。重演的这一拍通常就是本集首钩。第一集没有上一集,此项不适用。
485
+
486
+ 这些数值是边界,不是节拍模板:满足之后,触点用什么载体、反转落在哪一场,仍由本集故事决定。
487
+ 创作者对某一集说明理由即可偏离。
488
+
489
+ **`craft_default · SCR-19`**:节奏档案已接受时,剧本兑现它的单集数值:首钩时限、触点间隔上限、
490
+ 有人形对手的反转次数、停在峰值、接上一集最后一拍。
491
+
446
492
  ## 7. 写动作段落与生产事实
447
493
 
448
494
  ### 7.1 动作段落
@@ -496,14 +542,21 @@
496
542
 
497
543
  若环境本身携带威胁、限制或信息,它可以成为开场主体;不要无条件禁止氛围。
498
544
 
545
+ **第一拍自己就是钩子**。全集第一段动作描写就是观众开场第一帧看到的画面。静止的第一拍可以是一件
546
+ 不该在那里的东西、一张盯着什么的脸;要读字才成立的信息换个做法:一排惨淡的数字配上看着它的人
547
+ 正在变的脸,或者让压他的人已经站在画里。
548
+
549
+ **`craft_default · SCR-22`**:全集第一拍单独成立为钩子:看得见的冲突、反常画面、悬着的问题或
550
+ 峰值的最后一拍,静止画面只要自己提出问题也算;靠读字、认人或下一句台词才成立的信息不单独做第一拍。
551
+
499
552
  **`craft_default`**:在压力活跃处进入,并用具体行动证明进入状态,而非先由人物复述上集。
500
553
 
501
- **`taste_option`**:冷开场、缓慢观察、先果后因、平静日常都可以选择;它们必须服务作品的观看契约。
554
+ **`taste_option`**:冷开场、缓慢观察、先果后因、平静日常都可以选择;它们必须服务作品的观看契约。项目已接受节奏档案时,无论哪种开场,钩子都要在档案的首钩时限内到达(见 6.5)。
502
555
 
503
556
  ### 8.2 收束完成本集承诺
504
557
 
505
558
  结尾可以让局部结果被看见,也可以让关系、情绪、喜剧节奏、恐惧或主题意象获得落点。连载需要交接时,
506
- 再写清下一集继承的行动、知识、关系或物理状态;不是所有单集都必须把新压力顶到最后一秒。
559
+ 再写清下一集继承的行动、知识、关系或物理状态;不是所有单集都必须把新压力顶到最后一秒。项目已接受的节奏档案要求停在峰值时,按 6.5 收尾。
507
560
 
508
561
  收束先回答本集承诺的功能是否完成:可以是局部结果、关系重新定义、认知变化、喜剧落点、恐惧余波、
509
562
  讽刺反照或有意保持开放。连载作品通常还需要可交接状态,但不等于最后一拍必须追加外部事件。
@@ -30,6 +30,10 @@
30
30
  | SCR-16 | reviewed_invariant | When a literal precise deadline is foregrounded and audience-auditable, its action chain fits the stated time and established resources, or the screenplay makes compression, failure, or a changed objective legible. Qualitative urgency is not upgraded into invented minutes, timestamps, notifications, or records. Montage, ellipsis, subjective time, and declared stylization follow their own established convention rather than an automatic real-time test. |
31
31
  | SCR-17 | reviewed_invariant | When the brief defines a limited number of attempts, turns, breaths, beats, or other units, each unit is counted by its visible end-state. A label, count, request, authorization, preparation step, or cleanup after the boundary does not substitute for the required completion; intentional partial completion or failure remains valid when it is the legible result of that unit. |
32
32
  | SCR-18 | craft_default | An action paragraph does not open with a noun phrase followed by a full-width colon. `第二格:一只手把杯子推过去。` is byte-for-byte the dialogue form `角色名:台词`, so the indexer can only return `ambiguous_dialogue_or_action` and hand it back for a human read; every such line costs one round trip for nothing. A dash, a comma, or a verb removes the collision. Colons inside a sentence are unaffected — only the start of the line collides. |
33
+ | SCR-19 | craft_default | When `creator_authority.rhythm_profile` has status `accepted`, the screenplay realizes its episode values: the first hook lands within `first_hook_seconds`; no gap between emotional touchpoints (a conflict line, a situation-changing action, or new information) exceeds `beat_interval_seconds_max`; at least `opposed_reversals_per_episode_min` reversals are driven or suffered by a human opponent with an agenda—in an adaptation, a source character first; where the source has none, the deviation is reported and any new opponent is a creator-confirmed addition from `$short-drama-develop`; with `end_on_peak` the episode stops on or just before its peak; with `reprise_previous_last_beat` it opens by replaying the previous episode's last beat. The values are bounds, not a beat template. A missing or proposed profile leaves the rule inactive; this stage reads the profile and never sets it. |
34
+ | SCR-20 | craft_default | Show rather than narrate: `[VO]` does not restate what the picture has already performed; inner monologue is externalized into an action plus one line, another character's words, or a visible object wherever possible; a pain point the episode trades on is staged as a concrete scene rather than reported. Under an accepted rhythm profile the `[VO]` share of spoken characters stays within `vo_share_max`. |
35
+ | SCR-21 | craft_default | The writer reads back its own dialogue draft and cuts every line that carries neither action nor conflict; every line kept converts to an action or expression an actor can play. Creator-supplied text is not trimmed under this rule. |
36
+ | SCR-22 | craft_default | The episode's first beat stands alone as a hook, since it is what the viewer sees in the opening frame: a visible conflict, an anomalous image, an open question, or the last beat of a peak. A still image qualifies when it raises the question by itself; information that works only after reading on-screen text, knowing who someone is, or hearing the next line is not staged alone as the first beat. |
33
37
 
34
38
  规则分级由高到低:`structural_invariant`(结构缺陷,阻断)、
35
39
  `reviewed_invariant`(需证据判断)、`craft_default`(常用做法,可覆盖)、
@@ -25,6 +25,7 @@ from __future__ import annotations
25
25
 
26
26
  import argparse
27
27
  import json
28
+ import math
28
29
  import re
29
30
  import sys
30
31
  from pathlib import Path
@@ -92,6 +93,7 @@ def measure(screenplay: bytes, blocks: Iterable[Mapping[str, Any]]) -> dict[str,
92
93
  """Count the timed material, taking every classification from the index."""
93
94
  dialogue_lines = 0
94
95
  dialogue_characters = 0
96
+ voiceover_characters = 0
95
97
  action_paragraphs = 0
96
98
  tag_lines = 0
97
99
  unreadable_blocks: list[str] = []
@@ -126,11 +128,15 @@ def measure(screenplay: bytes, blocks: Iterable[Mapping[str, Any]]) -> dict[str,
126
128
  unreadable_blocks.append(str(block.get("block_id")))
127
129
  continue
128
130
  dialogue_lines += 1
129
- dialogue_characters += _spoken_characters(spoken.group("line"))
131
+ characters = _spoken_characters(spoken.group("line"))
132
+ dialogue_characters += characters
133
+ if block.get("tag") == "VO":
134
+ voiceover_characters += characters
130
135
 
131
136
  counts: dict[str, Any] = {
132
137
  "dialogue_lines": dialogue_lines,
133
138
  "dialogue_characters": dialogue_characters,
139
+ "voiceover_characters": voiceover_characters,
134
140
  "action_paragraphs": action_paragraphs,
135
141
  "production_tag_lines": tag_lines,
136
142
  }
@@ -185,6 +191,40 @@ def declared_rates(project: dict[str, Any] | None) -> dict[str, Any]:
185
191
  }
186
192
 
187
193
 
194
+ def accepted_vo_share(
195
+ counts: Mapping[str, Any], project: dict[str, Any] | None
196
+ ) -> dict[str, Any] | None:
197
+ """The [VO] share of spoken characters against an accepted ceiling.
198
+
199
+ [OS] is off-screen dialogue inside the scene, not narration or inner
200
+ voice, so it counts as spoken but not as voice-over.
201
+
202
+ Only a rhythm profile the creator accepted carries a ceiling; a missing or
203
+ proposed one declares nothing, so nothing is compared. The comparison is
204
+ reported, never enforced: the creator may keep an episode over its own cap.
205
+ """
206
+ authority = (project or {}).get("creator_authority")
207
+ profile = authority.get("rhythm_profile") if isinstance(authority, dict) else None
208
+ if not isinstance(profile, dict) or profile.get("status") != "accepted":
209
+ return None
210
+ ceiling = profile.get("vo_share_max")
211
+ if isinstance(ceiling, bool) or not isinstance(ceiling, (int, float)):
212
+ return None
213
+ if not (math.isfinite(ceiling) and 0 <= ceiling <= 1):
214
+ # A hand-edited ceiling outside a share is no ceiling: comparing
215
+ # against NaN or 5 reports a verdict nobody accepted.
216
+ return None
217
+ spoken = counts["dialogue_characters"]
218
+ if not spoken:
219
+ return None
220
+ share = counts["voiceover_characters"] / spoken
221
+ return {
222
+ "share": round(share, 3),
223
+ "vo_share_max": ceiling,
224
+ "over_max": share > ceiling,
225
+ }
226
+
227
+
188
228
  def estimate(
189
229
  screenplay: bytes,
190
230
  blocks: Iterable[Mapping[str, Any]],
@@ -197,6 +237,9 @@ def estimate(
197
237
 
198
238
  result: dict[str, Any] = {"counts": counts, "rates": rates, "seconds": None}
199
239
  result["target_seconds"] = target if isinstance(target, (int, float)) else None
240
+ vo_share = accepted_vo_share(counts, project)
241
+ if vo_share is not None:
242
+ result["vo_share"] = vo_share
200
243
 
201
244
  # Material the index could not classify is material this estimate did not
202
245
  # time. Reporting the seconds without that fact is how an incomplete number
@@ -276,7 +319,10 @@ def main(argv: list[str] | None = None) -> int:
276
319
  "--project",
277
320
  type=Path,
278
321
  default=None,
279
- help="short-drama.json carrying format.pacing and target_seconds_per_episode",
322
+ help=(
323
+ "short-drama.json carrying format.pacing, target_seconds_per_episode "
324
+ "and, when accepted, creator_authority.rhythm_profile.vo_share_max"
325
+ ),
280
326
  )
281
327
  args = parser.parse_args(argv)
282
328