@oh-story/dsh 0.1.3 → 0.1.5

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 (524) hide show
  1. package/README.md +58 -12
  2. package/lib/client.js +2970 -537
  3. package/lib/client.js.map +4 -4
  4. package/lib/drama/manifest.json +218 -178
  5. package/lib/drama/skills/short-drama/SKILL.md +110 -117
  6. package/lib/drama/skills/short-drama/references/audience-reveal.md +14 -67
  7. package/lib/drama/skills/short-drama/references/contract-and-ownership.md +26 -77
  8. package/lib/drama/skills/short-drama/references/creator-documents.md +204 -0
  9. package/lib/drama/skills/short-drama/references/creator-workflow.md +73 -63
  10. package/lib/drama/skills/short-drama/references/knowhow-index.md +5 -0
  11. package/lib/drama/skills/short-drama/references/look-development.md +2 -3
  12. package/lib/drama/skills/short-drama/references/pickup-and-alternate.md +14 -48
  13. package/lib/drama/skills/short-drama/references/production-form-profiles.md +1 -1
  14. package/lib/drama/skills/short-drama/references/reference-roles.md +32 -135
  15. package/lib/drama/skills/short-drama/references/runtime-preflight.md +16 -19
  16. package/lib/drama/skills/short-drama/scripts/creator_markdown_check.py +1002 -0
  17. package/lib/drama/skills/short-drama/scripts/project_tool.py +485 -5
  18. package/lib/drama/skills/short-drama-assets/SKILL.md +59 -170
  19. package/lib/drama/skills/short-drama-assets/references/asset-review-checklist.md +18 -25
  20. package/lib/drama/skills/short-drama-assets/references/character-and-look.md +13 -15
  21. package/lib/drama/skills/short-drama-assets/references/continuity-delta.md +11 -14
  22. package/lib/drama/skills/short-drama-assets/references/continuity-lock.md +116 -0
  23. package/lib/drama/skills/short-drama-assets/references/identity-vs-variant.md +6 -12
  24. package/lib/drama/skills/short-drama-assets/references/occurrence-extraction.md +8 -11
  25. package/lib/drama/skills/short-drama-assets/references/prop-and-state.md +21 -2
  26. package/lib/drama/skills/short-drama-assets/references/stage-contract.md +12 -105
  27. package/lib/drama/skills/short-drama-assets/references/voice-direction.md +12 -32
  28. package/lib/drama/skills/short-drama-assets/scripts/asset_check.py +1 -1
  29. package/lib/drama/skills/short-drama-image-prompts/SKILL.md +45 -155
  30. package/lib/drama/skills/short-drama-image-prompts/references/character-and-look.md +12 -13
  31. package/lib/drama/skills/short-drama-image-prompts/references/common-recipe.md +12 -13
  32. package/lib/drama/skills/short-drama-image-prompts/references/edit-and-revision.md +39 -51
  33. package/lib/drama/skills/short-drama-image-prompts/references/location-plate.md +3 -4
  34. package/lib/drama/skills/short-drama-image-prompts/references/look-and-state-variant.md +15 -14
  35. package/lib/drama/skills/short-drama-image-prompts/references/lookdev-frame.md +11 -15
  36. package/lib/drama/skills/short-drama-image-prompts/references/production-sheet-recipes.md +1 -1
  37. package/lib/drama/skills/short-drama-image-prompts/references/prop-plate.md +4 -7
  38. package/lib/drama/skills/short-drama-image-prompts/references/review-and-fixtures.md +23 -23
  39. package/lib/drama/skills/short-drama-image-prompts/references/stage-contract.md +8 -65
  40. package/lib/drama/skills/short-drama-image-prompts/scripts/image_prompt_check.py +8 -8
  41. package/lib/drama/skills/short-drama-image-prompts/scripts/selftest.py +4 -2
  42. package/lib/drama/skills/short-drama-produce/SKILL.md +67 -15
  43. package/lib/drama/skills/short-drama-produce/references/adapter-contract.md +65 -8
  44. package/lib/drama/skills/short-drama-produce/references/providers/minimax-h3-video.md +85 -0
  45. package/lib/drama/skills/short-drama-produce/references/providers/seedance.md +27 -10
  46. package/lib/drama/skills/short-drama-produce/scripts/production_tool.py +362 -3
  47. package/lib/drama/skills/short-drama-produce/scripts/provider_adapters.py +627 -40
  48. package/lib/drama/skills/short-drama-produce/scripts/selftest.py +5 -4
  49. package/lib/drama/skills/short-drama-review/SKILL.md +61 -123
  50. package/lib/drama/skills/short-drama-review/references/anti-template-repair.md +10 -15
  51. package/lib/drama/skills/short-drama-review/references/production-quality-gates.md +15 -16
  52. package/lib/drama/skills/short-drama-review/references/project-calibration.md +7 -9
  53. package/lib/drama/skills/short-drama-review/references/review-method.md +8 -9
  54. package/lib/drama/skills/short-drama-review/references/rubric-assets-prompts.md +9 -13
  55. package/lib/drama/skills/short-drama-review/references/rubric-story-script.md +104 -4
  56. package/lib/drama/skills/short-drama-review/references/rubric-visual-motion.md +27 -19
  57. package/lib/drama/skills/short-drama-review/references/stage-contract.md +4 -63
  58. package/lib/drama/skills/short-drama-review/scripts/review_check.py +1 -1
  59. package/lib/drama/skills/short-drama-storyboard/SKILL.md +116 -238
  60. package/lib/drama/skills/short-drama-storyboard/assets/shot-template.jsonl +1 -1
  61. package/lib/drama/skills/short-drama-storyboard/references/blocking-playbooks.md +9 -34
  62. package/lib/drama/skills/short-drama-storyboard/references/comic-keyframe-lexicon.md +156 -0
  63. package/lib/drama/skills/short-drama-storyboard/references/coverage-audition.md +5 -10
  64. package/lib/drama/skills/short-drama-storyboard/references/keyframe-craft.md +12 -7
  65. package/lib/drama/skills/short-drama-storyboard/references/production-shot-grammar.md +19 -4
  66. package/lib/drama/skills/short-drama-storyboard/references/review-and-fixtures.md +27 -62
  67. package/lib/drama/skills/short-drama-storyboard/references/scene-visual-plan.md +16 -25
  68. package/lib/drama/skills/short-drama-storyboard/references/screenplay-to-keyframe-example.md +21 -23
  69. package/lib/drama/skills/short-drama-storyboard/references/shot-craft.md +8 -10
  70. package/lib/drama/skills/short-drama-storyboard/references/shot-revision-identity.md +9 -13
  71. package/lib/drama/skills/short-drama-storyboard/references/stage-contract.md +16 -71
  72. package/lib/drama/skills/short-drama-storyboard/scripts/storyboard_check.py +1 -1
  73. package/lib/drama/skills/short-drama-video-prompts/SKILL.md +123 -230
  74. package/lib/drama/skills/short-drama-video-prompts/assets/motion-spec.jsonl.md +6 -1
  75. package/lib/drama/skills/short-drama-video-prompts/assets/video-prompts.md +17 -1
  76. package/lib/drama/skills/short-drama-video-prompts/references/camera-audio-continuity.md +10 -8
  77. package/lib/drama/skills/short-drama-video-prompts/references/delivery-profile.md +24 -6
  78. package/lib/drama/skills/short-drama-video-prompts/references/generability.md +2 -2
  79. package/lib/drama/skills/short-drama-video-prompts/references/minimax-h3.md +154 -0
  80. package/lib/drama/skills/short-drama-video-prompts/references/motion-recipe.md +35 -27
  81. package/lib/drama/skills/short-drama-video-prompts/references/performance-action-timing.md +8 -11
  82. package/lib/drama/skills/short-drama-video-prompts/references/production-prompt-grammar.md +13 -10
  83. package/lib/drama/skills/short-drama-video-prompts/references/review-and-fixtures.md +34 -63
  84. package/lib/drama/skills/short-drama-video-prompts/references/seedance-2.0.md +41 -0
  85. package/lib/drama/skills/short-drama-video-prompts/references/seedance-2.5.md +66 -0
  86. package/lib/drama/skills/short-drama-video-prompts/references/stage-contract.md +17 -73
  87. package/lib/drama/skills/short-drama-video-prompts/references/target-model-profile.md +115 -0
  88. package/lib/drama/skills/short-drama-video-prompts/scripts/container_check.py +1 -1
  89. package/lib/drama/skills/short-drama-video-prompts/scripts/music_spec_check.py +1 -1
  90. package/lib/drama/skills/short-drama-write/SKILL.md +74 -268
  91. package/lib/drama/skills/short-drama-write/references/dialogue-craft.md +7 -0
  92. package/lib/drama/skills/short-drama-write/references/scene-handoff-capsule.md +17 -43
  93. package/lib/drama/skills/short-drama-write/references/screenplay-format.md +15 -15
  94. package/lib/drama/skills/short-drama-write/references/script-craft.md +208 -21
  95. package/lib/drama/skills/short-drama-write/references/stage-contract.md +11 -70
  96. package/lib/drama/skills/short-drama-write/scripts/duration_estimate.py +1 -1
  97. package/lib/drama/skills/short-drama-write/scripts/screenplay_index.py +2 -2
  98. package/lib/drama/skills/short-drama-write/scripts/voice_sheet_check.py +1 -1
  99. package/lib/index.js +971 -46
  100. package/lib/index.js.map +4 -4
  101. package/lib/novel-to-game/LICENSE +21 -0
  102. package/lib/novel-to-game/README.md +180 -0
  103. package/lib/novel-to-game/README_ZH.md +178 -0
  104. package/lib/novel-to-game/VERSION +1 -0
  105. package/lib/novel-to-game/examples/jin-ping-mei/build/BUILD_BRIEF.md +217 -0
  106. package/lib/novel-to-game/examples/jin-ping-mei/build/app/.vercelignore +3 -0
  107. package/lib/novel-to-game/examples/jin-ping-mei/build/app/RUN.md +130 -0
  108. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/compound_new_guofeng.webp +0 -0
  109. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/finale/fate_coda.webp +0 -0
  110. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/finale/meng.webp +0 -0
  111. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/finale/pan.webp +0 -0
  112. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/finale/pinger.webp +0 -0
  113. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/finale/xuee.webp +0 -0
  114. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/finale/yue.webp +0 -0
  115. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/group/inner_court_accord_five.webp +0 -0
  116. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/group/inner_court_afterglow_five.webp +0 -0
  117. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/group/inner_court_alliance.webp +0 -0
  118. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/group/public_day10.webp +0 -0
  119. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/group/public_day15.webp +0 -0
  120. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/group/public_day5.webp +0 -0
  121. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/group/title_new_guofeng.webp +0 -0
  122. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/joint/pan_pinger.webp +0 -0
  123. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/joint/pan_xuee.webp +0 -0
  124. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/joint/yue_meng.webp +0 -0
  125. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/joint/yue_pan.webp +0 -0
  126. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/joint/yue_pinger.webp +0 -0
  127. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/meng/explicit.webp +0 -0
  128. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/meng/prelude.webp +0 -0
  129. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/milestone/meng.webp +0 -0
  130. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/milestone/pan.webp +0 -0
  131. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/milestone/pinger.webp +0 -0
  132. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/milestone/xuee.webp +0 -0
  133. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/milestone/yue.webp +0 -0
  134. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/pan/explicit.webp +0 -0
  135. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/pan/prelude.webp +0 -0
  136. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/pinger/explicit.webp +0 -0
  137. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/pinger/prelude.webp +0 -0
  138. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/xuee/explicit.webp +0 -0
  139. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/xuee/prelude.webp +0 -0
  140. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/yue/explicit.webp +0 -0
  141. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/yue/prelude.webp +0 -0
  142. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/heroine/meng/night.webp +0 -0
  143. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/heroine/pan/night.webp +0 -0
  144. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/heroine/pinger/night.webp +0 -0
  145. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/heroine/xuee/night.webp +0 -0
  146. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/heroine/yue/night.webp +0 -0
  147. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/household/li_jiaoer.webp +0 -0
  148. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/scene/gate_collector.webp +0 -0
  149. package/lib/novel-to-game/examples/jin-ping-mei/build/app/css/new-guofeng.css +1105 -0
  150. package/lib/novel-to-game/examples/jin-ping-mei/build/app/css/style.css +2539 -0
  151. package/lib/novel-to-game/examples/jin-ping-mei/build/app/index.html +18 -0
  152. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/assets.js +147 -0
  153. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/audio.js +332 -0
  154. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/data.js +7472 -0
  155. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/engine.js +13077 -0
  156. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/main.js +3028 -0
  157. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/text.js +32 -0
  158. package/lib/novel-to-game/examples/jin-ping-mei/build/app/package.json +10 -0
  159. package/lib/novel-to-game/examples/jin-ping-mei/build/app/vercel.json +23 -0
  160. package/lib/novel-to-game/examples/jin-ping-mei/build/art/generated-art.json +161 -0
  161. package/lib/novel-to-game/examples/jin-ping-mei/example.json +12 -0
  162. package/lib/novel-to-game/examples/jin-ping-mei/qa/README.md +31 -0
  163. package/lib/novel-to-game/examples/jin-ping-mei/qa/playable-model.json +99 -0
  164. package/lib/novel-to-game/examples/jin-ping-mei/qa/verification.json +41 -0
  165. package/lib/novel-to-game/examples/jin-ping-mei/qa/verify_playable_model.mjs +129 -0
  166. package/lib/novel-to-game/manifest.json +508 -0
  167. package/lib/novel-to-game/skills/game-art-direction/SKILL.md +73 -0
  168. package/lib/novel-to-game/skills/game-art-direction/agents/openai.yaml +4 -0
  169. package/lib/novel-to-game/skills/game-art-direction/references/art-direction-method.md +119 -0
  170. package/lib/novel-to-game/skills/game-build/SKILL.md +84 -0
  171. package/lib/novel-to-game/skills/game-build/agents/openai.yaml +4 -0
  172. package/lib/novel-to-game/skills/game-build/references/build-brief-contract.md +109 -0
  173. package/lib/novel-to-game/skills/game-build/references/generative-media-pipeline.md +56 -0
  174. package/lib/novel-to-game/skills/game-build/references/playable-model-contract.md +81 -0
  175. package/lib/novel-to-game/skills/game-build/references/tts-production-contract.md +37 -0
  176. package/lib/novel-to-game/skills/game-concept/SKILL.md +72 -0
  177. package/lib/novel-to-game/skills/game-concept/agents/openai.yaml +4 -0
  178. package/lib/novel-to-game/skills/game-concept/references/concept-method.md +94 -0
  179. package/lib/novel-to-game/skills/game-qa/SKILL.md +50 -0
  180. package/lib/novel-to-game/skills/game-qa/agents/openai.yaml +4 -0
  181. package/lib/novel-to-game/skills/game-qa/references/qa-contract.md +66 -0
  182. package/lib/novel-to-game/skills/game-qa/references/test-design-method.md +45 -0
  183. package/lib/novel-to-game/skills/game-world-design/SKILL.md +63 -0
  184. package/lib/novel-to-game/skills/game-world-design/agents/openai.yaml +4 -0
  185. package/lib/novel-to-game/skills/game-world-design/references/dialogue-design-method.md +59 -0
  186. package/lib/novel-to-game/skills/game-world-design/references/game-writing-craft.md +53 -0
  187. package/lib/novel-to-game/skills/game-world-design/references/narrative-design-method.md +84 -0
  188. package/lib/novel-to-game/skills/game-world-design/references/numeric-design-method.md +56 -0
  189. package/lib/novel-to-game/skills/game-world-design/references/world-design-method.md +124 -0
  190. package/lib/novel-to-game/skills/novel-game-analyze/SKILL.md +77 -0
  191. package/lib/novel-to-game/skills/novel-game-analyze/agents/openai.yaml +4 -0
  192. package/lib/novel-to-game/skills/novel-game-analyze/references/gameability-protocol.md +65 -0
  193. package/lib/novel-to-game/skills/novel-to-game/SKILL.md +71 -0
  194. package/lib/novel-to-game/skills/novel-to-game/agents/openai.yaml +4 -0
  195. package/lib/novel-to-game/skills/novel-to-game/references/intake-benchmark-reference.md +42 -0
  196. package/lib/novel-to-game/skills/novel-to-game/references/intake-method.md +51 -0
  197. package/lib/novel-to-game/skills/novel-to-game/references/pipeline-contract.md +65 -0
  198. package/lib/oh-story/manifest.json +419 -309
  199. package/lib/oh-story/roles/character-designer.md +4 -4
  200. package/lib/oh-story/roles/consistency-checker.md +1 -1
  201. package/lib/oh-story/roles/narrative-writer.md +41 -42
  202. package/lib/oh-story/roles/story-architect.md +19 -23
  203. package/lib/oh-story/roles/story-explorer.md +8 -5
  204. package/lib/oh-story/skills/browser-cdp/SKILL.md +1 -1
  205. package/lib/oh-story/skills/story/SKILL.md +16 -9
  206. package/lib/oh-story/skills/story/VERSION +1 -1
  207. package/lib/oh-story/skills/story/references/author-memory.md +163 -0
  208. package/lib/oh-story/skills/story/scripts/author_memory_commit.py +871 -0
  209. package/lib/oh-story/skills/story-cover/SKILL.md +1 -1
  210. package/lib/oh-story/skills/story-deslop/SKILL.md +10 -5
  211. package/lib/oh-story/skills/story-deslop/references/anti-ai-writing.md +2 -1
  212. package/lib/oh-story/skills/story-deslop/references/author-memory.md +163 -0
  213. package/lib/oh-story/skills/story-deslop/references/banned-words.md +6 -4
  214. package/lib/oh-story/skills/story-deslop/scripts/author_memory_commit.py +871 -0
  215. package/lib/oh-story/skills/story-deslop/scripts/check-ai-patterns.js +64 -1
  216. package/lib/oh-story/skills/story-import/SKILL.md +21 -8
  217. package/lib/oh-story/skills/story-import/references/format-and-structure.md +9 -10
  218. package/lib/oh-story/skills/story-import/references/structure-mapping-long.md +2 -2
  219. package/lib/oh-story/skills/story-import/references/structure-mapping-short.md +1 -1
  220. package/lib/oh-story/skills/story-import/references/tracking-transaction.md +14 -6
  221. package/lib/oh-story/skills/story-import/scripts/check-outline-contract.js +251 -0
  222. package/lib/oh-story/skills/story-import/scripts/tracking_commit.py +98 -9
  223. package/lib/oh-story/skills/story-import/scripts/wordcount_core.py +246 -0
  224. package/lib/oh-story/skills/story-long-analyze/SKILL.md +4 -4
  225. package/lib/oh-story/skills/story-long-scan/SKILL.md +1 -1
  226. package/lib/oh-story/skills/story-long-write/SKILL.md +35 -21
  227. package/lib/oh-story/skills/story-long-write/references/anti-ai-writing.md +2 -1
  228. package/lib/oh-story/skills/story-long-write/references/artifact-protocols.md +7 -3
  229. package/lib/oh-story/skills/story-long-write/references/author-memory.md +163 -0
  230. package/lib/oh-story/skills/story-long-write/references/banned-words.md +6 -4
  231. package/lib/oh-story/skills/story-long-write/references/cross-book-recall.md +6 -6
  232. package/lib/oh-story/skills/story-long-write/references/genre-prose-cards.md +1 -1
  233. package/lib/oh-story/skills/story-long-write/references/genre-readers.md +1 -1
  234. package/lib/oh-story/skills/{story-setup/references/agent-references/hooks-chapter.md → story-long-write/references/long-chapter-hooks.md} +5 -5
  235. package/lib/oh-story/skills/story-long-write/references/{quality-checklist.md → long-chapter-quality.md} +2 -1
  236. package/lib/oh-story/skills/story-long-write/references/long-format.md +42 -0
  237. package/lib/oh-story/skills/{story-setup/references/agent-references/genre-catalog.md → story-long-write/references/long-genre-catalog.md} +11 -97
  238. package/lib/oh-story/skills/story-long-write/references/{genre-core-mechanics.md → long-genre-mechanics.md} +1 -1
  239. package/lib/oh-story/skills/story-long-write/references/{reversal-toolkit.md → long-reversal.md} +18 -32
  240. package/lib/oh-story/skills/story-long-write/references/{hooks-suspense.md → long-suspense.md} +6 -6
  241. package/lib/oh-story/skills/story-long-write/references/opening-design.md +1 -1
  242. package/lib/oh-story/skills/story-long-write/references/outline-structure-theory.md +1 -1
  243. package/lib/oh-story/skills/story-long-write/references/style-genre-modules.md +1 -1
  244. package/lib/oh-story/skills/story-long-write/references/tracking-transaction.md +14 -6
  245. package/lib/oh-story/skills/story-long-write/references/workflow-chapter.md +32 -27
  246. package/lib/oh-story/skills/story-long-write/references/workflow-daily.md +5 -4
  247. package/lib/oh-story/skills/story-long-write/references/workflow-revision.md +2 -2
  248. package/lib/oh-story/skills/story-long-write/references/workflow-setup.md +17 -11
  249. package/lib/oh-story/skills/story-long-write/references/writing-craft.md +54 -54
  250. package/lib/oh-story/skills/story-long-write/scripts/author_memory_commit.py +871 -0
  251. package/lib/oh-story/skills/story-long-write/scripts/check-ai-patterns.js +64 -1
  252. package/lib/oh-story/skills/story-long-write/scripts/check-outline-contract.js +251 -0
  253. package/lib/oh-story/skills/story-long-write/scripts/storyctl.py +303 -0
  254. package/lib/oh-story/skills/story-long-write/scripts/tracking_commit.py +98 -9
  255. package/lib/oh-story/skills/story-long-write/scripts/wordcount_core.py +246 -0
  256. package/lib/oh-story/skills/story-review/SKILL.md +26 -17
  257. package/lib/oh-story/skills/story-review/references/anti-ai-writing.md +2 -1
  258. package/lib/oh-story/skills/story-review/references/author-memory.md +163 -0
  259. package/lib/oh-story/skills/story-review/references/banned-words.md +6 -4
  260. package/lib/oh-story/skills/story-review/references/{quality-checklist.md → review-quality.md} +22 -21
  261. package/lib/oh-story/skills/story-review/references/tracking-transaction.md +14 -6
  262. package/lib/oh-story/skills/story-review/scripts/author_memory_commit.py +871 -0
  263. package/lib/oh-story/skills/story-review/scripts/check-ai-patterns.js +64 -1
  264. package/lib/oh-story/skills/story-review/scripts/tracking_commit.py +98 -9
  265. package/lib/oh-story/skills/story-review/scripts/wordcount_core.py +246 -0
  266. package/lib/oh-story/skills/story-setup/SKILL.md +85 -41
  267. package/lib/oh-story/skills/story-setup/references/agent-references/agent-quality.md +72 -0
  268. package/lib/oh-story/skills/story-setup/references/agent-references/agent-reference-profiles.md +55 -0
  269. package/lib/oh-story/skills/story-setup/references/agent-references/anti-ai-writing.md +2 -1
  270. package/lib/oh-story/skills/story-setup/references/agent-references/banned-words.md +6 -4
  271. package/lib/oh-story/skills/story-setup/references/agent-references/format-and-structure.md +9 -10
  272. package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards.md +1 -1
  273. package/lib/oh-story/skills/story-setup/references/agent-references/genre-readers.md +1 -1
  274. package/lib/oh-story/skills/{story-short-analyze/references/hooks-chapter.md → story-setup/references/agent-references/long-chapter-hooks.md} +5 -5
  275. package/lib/oh-story/skills/story-setup/references/agent-references/long-emotional-methods.md +209 -0
  276. package/lib/oh-story/skills/{story-long-write/references/genre-catalog.md → story-setup/references/agent-references/long-genre-catalog.md} +11 -97
  277. package/lib/oh-story/skills/story-setup/references/agent-references/{genre-core-mechanics.md → long-genre-mechanics.md} +1 -1
  278. package/lib/oh-story/skills/story-setup/references/agent-references/long-quality.md +40 -0
  279. package/lib/oh-story/skills/{story-short-write/references/reversal-toolkit.md → story-setup/references/agent-references/long-reversal.md} +18 -32
  280. package/lib/oh-story/skills/{story-short-write/references/hooks-suspense.md → story-setup/references/agent-references/long-suspense.md} +6 -6
  281. package/lib/oh-story/skills/story-setup/references/agent-references/opening-design.md +1 -1
  282. package/lib/oh-story/skills/story-setup/references/agent-references/{emotional-methods.md → short-emotional-methods.md} +4 -4
  283. package/lib/oh-story/skills/{story-long-write/references/genre-writing-formulas.md → story-setup/references/agent-references/short-genre-formulas.md} +32 -44
  284. package/lib/oh-story/skills/story-setup/references/agent-references/short-quality.md +39 -0
  285. package/lib/oh-story/skills/story-setup/references/agent-references/{reversal-toolkit.md → short-reversal.md} +29 -23
  286. package/lib/oh-story/skills/story-setup/references/agent-references/{hooks-suspense.md → short-suspense.md} +31 -31
  287. package/lib/oh-story/skills/story-setup/references/agent-references/style-genre-modules.md +1 -1
  288. package/lib/oh-story/skills/story-setup/references/agent-references/writing-craft.md +55 -55
  289. package/lib/oh-story/skills/story-short-analyze/SKILL.md +28 -28
  290. package/lib/oh-story/skills/story-short-analyze/references/{character-basics.md → analysis-character-basics.md} +1 -1
  291. package/lib/oh-story/skills/story-short-analyze/references/{character-design-methods.md → analysis-character-design.md} +1 -1
  292. package/lib/oh-story/skills/story-short-analyze/references/{character-relations.md → analysis-character-relations.md} +1 -1
  293. package/lib/oh-story/skills/story-short-analyze/references/{hooks-paragraph.md → analysis-paragraph-hooks.md} +1 -1
  294. package/lib/oh-story/skills/story-short-analyze/references/{genre-readers.md → analysis-reader-profile.md} +2 -2
  295. package/lib/oh-story/skills/story-short-analyze/references/analysis-report-style.md +45 -0
  296. package/lib/oh-story/skills/story-short-analyze/references/analysis-short-genres.md +65 -0
  297. package/lib/oh-story/skills/story-short-analyze/references/analysis-short-hooks.md +77 -0
  298. package/lib/oh-story/skills/story-short-analyze/references/analysis-short-mechanics.md +82 -0
  299. package/lib/oh-story/skills/story-short-analyze/references/analysis-short-patterns.md +50 -0
  300. package/lib/oh-story/skills/story-short-analyze/references/analysis-short-suspense.md +98 -0
  301. package/lib/oh-story/skills/story-short-analyze/references/{genre-writing-techniques.md → analysis-writing-techniques.md} +21 -19
  302. package/lib/oh-story/skills/story-short-analyze/references/deconstruction-examples.md +1 -1
  303. package/lib/oh-story/skills/story-short-analyze/references/material-decomposition.md +21 -28
  304. package/lib/oh-story/skills/story-short-analyze/references/output-contract.md +1 -1
  305. package/lib/oh-story/skills/story-short-analyze/references/output-templates.md +17 -17
  306. package/lib/oh-story/skills/story-short-analyze/references/{quality-checklist.md → source-story-quality.md} +28 -49
  307. package/lib/oh-story/skills/story-short-analyze/references/zhihu-style.md +2 -2
  308. package/lib/oh-story/skills/story-short-scan/SKILL.md +1 -1
  309. package/lib/oh-story/skills/story-short-write/SKILL.md +78 -55
  310. package/lib/oh-story/skills/story-short-write/references/author-memory.md +163 -0
  311. package/lib/oh-story/skills/story-short-write/references/banned-words.md +6 -4
  312. package/lib/oh-story/skills/story-short-write/references/cross-book-recall.md +3 -3
  313. package/lib/oh-story/skills/story-short-write/references/emotional-methods.md +4 -4
  314. package/lib/oh-story/skills/story-short-write/references/genre-styles//344/270/226/346/203/205/346/211/223/350/204/270.md +3 -3
  315. package/lib/oh-story/skills/story-short-write/references/genre-styles//345/217/214/347/224/267/344/270/273.md +2 -2
  316. package/lib/oh-story/skills/story-short-write/references/genre-styles//345/244/215/344/273/207/346/211/223/350/204/270.md +3 -3
  317. package/lib/oh-story/skills/story-short-write/references/genre-styles//345/256/205/346/226/227/345/256/253/346/226/227.md +6 -6
  318. package/lib/oh-story/skills/story-short-write/references/genre-styles//346/200/273/350/243/201/350/261/252/351/227/250.md +3 -3
  319. package/lib/oh-story/skills/story-short-write/references/genre-styles//346/202/254/347/226/221.md +4 -4
  320. package/lib/oh-story/skills/story-short-write/references/genre-styles//346/260/221/344/277/227/346/200/252/350/260/210.md +7 -7
  321. package/lib/oh-story/skills/story-short-write/references/genre-styles//346/262/231/351/233/225/350/204/221/346/264/236.md +5 -5
  322. package/lib/oh-story/skills/story-short-write/references/genre-styles//347/224/234/345/256/240.md +4 -4
  323. package/lib/oh-story/skills/story-short-write/references/genre-styles//350/277/275/345/246/273/347/201/253/350/221/254/345/234/272.md +3 -3
  324. package/lib/oh-story/skills/story-short-write/references/genre-writing-formulas.md +32 -44
  325. package/lib/oh-story/skills/story-short-write/references/genre-writing-techniques.md +20 -18
  326. package/lib/oh-story/skills/story-short-write/references/output-contract.md +1 -1
  327. package/lib/oh-story/skills/story-short-write/references/short-craft.md +18 -18
  328. package/lib/oh-story/skills/story-short-write/references/short-deslop.md +1 -1
  329. package/lib/oh-story/skills/story-short-write/references/short-format.md +38 -8
  330. package/lib/oh-story/skills/story-short-write/references/{quality-checklist.md → short-prose-quality.md} +22 -21
  331. package/lib/oh-story/skills/story-short-write/references/short-reversal.md +355 -0
  332. package/lib/oh-story/skills/{story-short-analyze/references/hooks-suspense.md → story-short-write/references/short-suspense.md} +31 -31
  333. package/lib/oh-story/skills/story-short-write/references/submission-craft.md +2 -2
  334. package/lib/oh-story/skills/story-short-write/references/writing-workflow.md +31 -22
  335. package/lib/oh-story/skills/story-short-write/scripts/author_memory_commit.py +871 -0
  336. package/lib/oh-story/skills/story-short-write/scripts/check-ai-patterns.js +64 -1
  337. package/lib/oh-story/skills/story-short-write/scripts/check-delivery-contract.js +212 -0
  338. package/lib/oh-story/skills/story-short-write/scripts/check-phase2-contract.js +363 -0
  339. package/lib/types/client/drama-production-view.d.ts +34 -0
  340. package/lib/types/client/drama-production-view.d.ts.map +1 -0
  341. package/lib/types/client/drama-production.d.ts +92 -0
  342. package/lib/types/client/drama-production.d.ts.map +1 -0
  343. package/lib/types/client/file-activity.d.ts +9 -2
  344. package/lib/types/client/file-activity.d.ts.map +1 -1
  345. package/lib/types/client/index.d.ts +1 -1
  346. package/lib/types/client/index.d.ts.map +1 -1
  347. package/lib/types/client/production-intents.d.ts +9 -0
  348. package/lib/types/client/production-intents.d.ts.map +1 -0
  349. package/lib/types/client/production-prompts.d.ts +9 -0
  350. package/lib/types/client/production-prompts.d.ts.map +1 -0
  351. package/lib/types/client/production-runtime.d.ts +58 -0
  352. package/lib/types/client/production-runtime.d.ts.map +1 -0
  353. package/lib/types/client/video-studio.d.ts +41 -0
  354. package/lib/types/client/video-studio.d.ts.map +1 -0
  355. package/lib/types/client/workbench-ui.d.ts +5 -0
  356. package/lib/types/client/workbench-ui.d.ts.map +1 -0
  357. package/lib/types/game-verification.d.ts +16 -0
  358. package/lib/types/game-verification.d.ts.map +1 -0
  359. package/lib/types/index.d.ts +5 -2
  360. package/lib/types/index.d.ts.map +1 -1
  361. package/lib/types/production-intent.d.ts +21 -0
  362. package/lib/types/production-intent.d.ts.map +1 -0
  363. package/lib/types/production-tool.d.ts +5 -0
  364. package/lib/types/production-tool.d.ts.map +1 -0
  365. package/lib/types/reference-tool.d.ts +6 -0
  366. package/lib/types/reference-tool.d.ts.map +1 -0
  367. package/lib/types/role-provider.d.ts.map +1 -1
  368. package/lib/types/role-tool.d.ts +3 -1
  369. package/lib/types/role-tool.d.ts.map +1 -1
  370. package/lib/types/skill-provider.d.ts +7 -0
  371. package/lib/types/skill-provider.d.ts.map +1 -1
  372. package/lib/types/video-project.d.ts +42 -0
  373. package/lib/types/video-project.d.ts.map +1 -0
  374. package/lib/types/workspace-request-trust.d.ts +6 -0
  375. package/lib/types/workspace-request-trust.d.ts.map +1 -1
  376. package/lib/types/workspace-route.d.ts +20 -0
  377. package/lib/types/workspace-route.d.ts.map +1 -1
  378. package/lib/video-recap/CHANGELOG.md +282 -0
  379. package/lib/video-recap/LICENSE +21 -0
  380. package/lib/video-recap/README.en.md +257 -0
  381. package/lib/video-recap/README.md +255 -0
  382. package/lib/video-recap/manifest.json +684 -0
  383. package/lib/video-recap/skills/video-assemble/SKILL.md +97 -0
  384. package/lib/video-recap/skills/video-assemble/references/jianying/LICENSE.duo-video +21 -0
  385. package/lib/video-recap/skills/video-assemble/references/jianying/SOURCE.md +15 -0
  386. package/lib/video-recap/skills/video-assemble/references/jianying/empty_draft_meta_info.json +69 -0
  387. package/lib/video-recap/skills/video-assemble/references/jianying/empty_jy_combination_segment.json +84 -0
  388. package/lib/video-recap/skills/video-assemble/references/jianying/empty_jy_combination_video_material.json +98 -0
  389. package/lib/video-recap/skills/video-assemble/references/jianying/empty_jy_draft.json +204 -0
  390. package/lib/video-recap/skills/video-assemble/references/jianying/empty_jy_material_video.json +83 -0
  391. package/lib/video-recap/skills/video-assemble/references/jianying/empty_jy_meta_material_value.json +23 -0
  392. package/lib/video-recap/skills/video-assemble/references/jianying/empty_jy_project_info.json +133 -0
  393. package/lib/video-recap/skills/video-assemble/references/jianying/empty_jy_segment.json +70 -0
  394. package/lib/video-recap/skills/video-assemble/references/jianying/empty_jy_text_styles.json +30 -0
  395. package/lib/video-recap/skills/video-assemble/references/jianying/empty_yj_material_audio.json +41 -0
  396. package/lib/video-recap/skills/video-assemble/references/jianying/empty_yj_material_text.json +109 -0
  397. package/lib/video-recap/skills/video-assemble/scripts/artifacts.py +88 -0
  398. package/lib/video-recap/skills/video-assemble/scripts/assemble.py +345 -0
  399. package/lib/video-recap/skills/video-assemble/scripts/assemble_constants.py +34 -0
  400. package/lib/video-recap/skills/video-assemble/scripts/assembly_contract.py +305 -0
  401. package/lib/video-recap/skills/video-assemble/scripts/assembly_settings.py +94 -0
  402. package/lib/video-recap/skills/video-assemble/scripts/audio_automation.py +205 -0
  403. package/lib/video-recap/skills/video-assemble/scripts/audio_mix.py +555 -0
  404. package/lib/video-recap/skills/video-assemble/scripts/export_jianying.py +261 -0
  405. package/lib/video-recap/skills/video-assemble/scripts/jianying_builders.py +767 -0
  406. package/lib/video-recap/skills/video-assemble/scripts/jianying_model.py +111 -0
  407. package/lib/video-recap/skills/video-assemble/scripts/jianying_optional.py +24 -0
  408. package/lib/video-recap/skills/video-assemble/scripts/jianying_schema.py +109 -0
  409. package/lib/video-recap/skills/video-assemble/scripts/jianying_templates.py +37 -0
  410. package/lib/video-recap/skills/video-assemble/scripts/jianying_timeline_contract.py +191 -0
  411. package/lib/video-recap/skills/video-assemble/scripts/jianying_tracks.py +75 -0
  412. package/lib/video-recap/skills/video-assemble/scripts/jianying_writer.py +394 -0
  413. package/lib/video-recap/skills/video-assemble/scripts/lib.py +239 -0
  414. package/lib/video-recap/skills/video-assemble/scripts/media.py +243 -0
  415. package/lib/video-recap/skills/video-assemble/scripts/narration_audio.py +477 -0
  416. package/lib/video-recap/skills/video-assemble/scripts/render_preflight.py +46 -0
  417. package/lib/video-recap/skills/video-assemble/scripts/source_subtitles.py +486 -0
  418. package/lib/video-recap/skills/video-assemble/scripts/subtitle_core.py +376 -0
  419. package/lib/video-recap/skills/video-assemble/scripts/subtitle_render.py +88 -0
  420. package/lib/video-recap/skills/video-assemble/scripts/timeline.py +248 -0
  421. package/lib/video-recap/skills/video-assemble/scripts/timeline_emit.py +89 -0
  422. package/lib/video-recap/skills/video-assemble/scripts/visual_render.py +512 -0
  423. package/lib/video-recap/skills/video-cut/SKILL.md +90 -0
  424. package/lib/video-recap/skills/video-cut/scripts/cut.py +67 -0
  425. package/lib/video-recap/skills/video-cut/scripts/cut_cli.py +320 -0
  426. package/lib/video-recap/skills/video-cut/scripts/cut_contract.py +545 -0
  427. package/lib/video-recap/skills/video-cut/scripts/cut_render.py +348 -0
  428. package/lib/video-recap/skills/video-cut/scripts/lib.py +77 -0
  429. package/lib/video-recap/skills/video-cut/scripts/media_geometry.py +341 -0
  430. package/lib/video-recap/skills/video-cut/scripts/narration_mapping.py +249 -0
  431. package/lib/video-recap/skills/video-cut/scripts/sentence_boundaries.py +745 -0
  432. package/lib/video-recap/skills/video-recap/SKILL.md +216 -0
  433. package/lib/video-recap/skills/video-recap/references/config-playbook.md +61 -0
  434. package/lib/video-recap/skills/video-recap/references/creative-editing-playbook.md +225 -0
  435. package/lib/video-recap/skills/video-recap/references/data-schema.md +534 -0
  436. package/lib/video-recap/skills/video-recap/references/research-guide.md +74 -0
  437. package/lib/video-recap/skills/video-recap/references/shift-left-qc-schema.md +23 -0
  438. package/lib/video-recap/skills/video-recap/references/timeline-and-jianying.md +251 -0
  439. package/lib/video-recap/skills/video-recap/scripts/doctor.py +483 -0
  440. package/lib/video-recap/skills/video-recap/scripts/final_qc.py +737 -0
  441. package/lib/video-recap/skills/video-recap/scripts/lib.py +242 -0
  442. package/lib/video-recap/skills/video-recap/scripts/materials.py +457 -0
  443. package/lib/video-recap/skills/video-recap/scripts/mimo_qc.py +95 -0
  444. package/lib/video-recap/skills/video-recap/scripts/mimo_qc_client.py +18 -0
  445. package/lib/video-recap/skills/video-recap/scripts/mimo_qc_contract.py +9 -0
  446. package/lib/video-recap/skills/video-recap/scripts/mimo_qc_evidence.py +371 -0
  447. package/lib/video-recap/skills/video-recap/scripts/mimo_qc_observations.py +201 -0
  448. package/lib/video-recap/skills/video-recap/scripts/mimo_qc_payload.py +227 -0
  449. package/lib/video-recap/skills/video-recap/scripts/mimo_qc_report.py +362 -0
  450. package/lib/video-recap/skills/video-recap/scripts/mimo_qc_runner.py +129 -0
  451. package/lib/video-recap/skills/video-recap/scripts/qc_contract.py +338 -0
  452. package/lib/video-recap/skills/video-recap/scripts/recap.py +9 -0
  453. package/lib/video-recap/skills/video-recap/scripts/recap_cli.py +140 -0
  454. package/lib/video-recap/skills/video-recap/scripts/recap_inspect.py +550 -0
  455. package/lib/video-recap/skills/video-recap/scripts/recap_review.py +77 -0
  456. package/lib/video-recap/skills/video-recap/scripts/recap_runner.py +654 -0
  457. package/lib/video-recap/skills/video-recap/scripts/recap_runtime.py +335 -0
  458. package/lib/video-recap/skills/video-recap/scripts/recap_stage_qc.py +217 -0
  459. package/lib/video-recap/skills/video-recap/scripts/recap_timeline.py +795 -0
  460. package/lib/video-recap/skills/video-script/SKILL.md +248 -0
  461. package/lib/video-recap/skills/video-script/references/creative-editing-playbook.md +225 -0
  462. package/lib/video-recap/skills/video-script/references/research-guide.md +75 -0
  463. package/lib/video-recap/skills/video-script/scripts/agent_brief.py +399 -0
  464. package/lib/video-recap/skills/video-script/scripts/agent_text.py +410 -0
  465. package/lib/video-recap/skills/video-script/scripts/brief_context.py +403 -0
  466. package/lib/video-recap/skills/video-script/scripts/brief_inputs.py +332 -0
  467. package/lib/video-recap/skills/video-script/scripts/brief_timeline.py +442 -0
  468. package/lib/video-recap/skills/video-script/scripts/deslop_qc.py +237 -0
  469. package/lib/video-recap/skills/video-script/scripts/evidence_bundle.py +492 -0
  470. package/lib/video-recap/skills/video-script/scripts/lib.py +327 -0
  471. package/lib/video-recap/skills/video-script/scripts/narration.py +12 -0
  472. package/lib/video-recap/skills/video-script/scripts/narration_lint.py +678 -0
  473. package/lib/video-recap/skills/video-script/scripts/review.py +42 -0
  474. package/lib/video-recap/skills/video-script/scripts/review_grounding.py +262 -0
  475. package/lib/video-recap/skills/video-script/scripts/review_response.py +761 -0
  476. package/lib/video-recap/skills/video-script/scripts/review_runner.py +200 -0
  477. package/lib/video-recap/skills/video-script/scripts/speech_ownership.py +204 -0
  478. package/lib/video-recap/skills/video-script/scripts/timeline_fusion.py +199 -0
  479. package/lib/video-recap/skills/video-script/scripts/validate.py +164 -0
  480. package/lib/video-recap/skills/video-understanding/SKILL.md +75 -0
  481. package/lib/video-recap/skills/video-understanding/references/data-schema.md +299 -0
  482. package/lib/video-recap/skills/video-understanding/references/prompt-templates.md +37 -0
  483. package/lib/video-recap/skills/video-understanding/references/research-guide.md +74 -0
  484. package/lib/video-recap/skills/video-understanding/scripts/agent_brief.py +399 -0
  485. package/lib/video-recap/skills/video-understanding/scripts/agent_text.py +410 -0
  486. package/lib/video-recap/skills/video-understanding/scripts/asr.py +260 -0
  487. package/lib/video-recap/skills/video-understanding/scripts/brief.py +12 -0
  488. package/lib/video-recap/skills/video-understanding/scripts/brief_context.py +403 -0
  489. package/lib/video-recap/skills/video-understanding/scripts/brief_inputs.py +332 -0
  490. package/lib/video-recap/skills/video-understanding/scripts/brief_timeline.py +442 -0
  491. package/lib/video-recap/skills/video-understanding/scripts/consolidate.py +647 -0
  492. package/lib/video-recap/skills/video-understanding/scripts/deslop_qc.py +237 -0
  493. package/lib/video-recap/skills/video-understanding/scripts/detect.py +513 -0
  494. package/lib/video-recap/skills/video-understanding/scripts/extract.py +62 -0
  495. package/lib/video-recap/skills/video-understanding/scripts/lib.py +470 -0
  496. package/lib/video-recap/skills/video-understanding/scripts/narration_lint.py +678 -0
  497. package/lib/video-recap/skills/video-understanding/scripts/speech_ownership.py +204 -0
  498. package/lib/video-recap/skills/video-understanding/scripts/storyboard.py +507 -0
  499. package/lib/video-recap/skills/video-understanding/scripts/timeline_fusion.py +199 -0
  500. package/lib/video-recap/skills/video-understanding/scripts/understand.py +9 -0
  501. package/lib/video-recap/skills/video-understanding/scripts/understanding_brief.py +216 -0
  502. package/lib/video-recap/skills/video-understanding/scripts/understanding_cache.py +327 -0
  503. package/lib/video-recap/skills/video-understanding/scripts/understanding_runner.py +367 -0
  504. package/lib/video-recap/skills/video-understanding/scripts/understanding_storyboard.py +162 -0
  505. package/lib/video-recap/skills/video-understanding/scripts/vlm.py +705 -0
  506. package/lib/video-recap/skills/video-voiceover/SKILL.md +81 -0
  507. package/lib/video-recap/skills/video-voiceover/scripts/dub.py +637 -0
  508. package/lib/video-recap/skills/video-voiceover/scripts/fish_audio.py +109 -0
  509. package/lib/video-recap/skills/video-voiceover/scripts/lib.py +421 -0
  510. package/lib/video-recap/skills/video-voiceover/scripts/tts_audio.py +113 -0
  511. package/lib/video-recap/skills/video-voiceover/scripts/voiceover.py +782 -0
  512. package/package.json +57 -41
  513. package/lib/drama/skills/short-drama/references/lifecycle-commands.md +0 -130
  514. package/lib/oh-story/skills/story-deslop/scripts/check-outline-copy.js +0 -241
  515. package/lib/oh-story/skills/story-long-write/references/format-and-structure.md +0 -169
  516. package/lib/oh-story/skills/story-setup/references/agent-references/genre-writing-formulas.md +0 -444
  517. package/lib/oh-story/skills/story-setup/references/agent-references/quality-checklist.md +0 -247
  518. package/lib/oh-story/skills/story-short-analyze/references/anti-ai-writing.md +0 -582
  519. package/lib/oh-story/skills/story-short-analyze/references/banned-words.md +0 -147
  520. package/lib/oh-story/skills/story-short-analyze/references/genre-catalog.md +0 -490
  521. package/lib/oh-story/skills/story-short-analyze/references/genre-core-mechanics.md +0 -425
  522. package/lib/oh-story/skills/story-short-analyze/references/genre-writing-formulas.md +0 -453
  523. /package/lib/oh-story/skills/{story-long-write/references/hooks-chapter.md → story-setup/references/agent-references/short-chapter-hooks.md} +0 -0
  524. /package/lib/oh-story/skills/{story-long-write/references/hooks-paragraph.md → story-setup/references/agent-references/short-paragraph-hooks.md} +0 -0
@@ -0,0 +1,534 @@
1
+ # 数据格式(中间 JSON)
2
+
3
+ 所有中间文件均在 pipeline 工作目录(work_dir/)下。
4
+
5
+ ## vlm_analysis.json
6
+
7
+ 每场景的 VLM 分析结果,数组格式:
8
+
9
+ ```json
10
+ [
11
+ {
12
+ "scene_id": 1,
13
+ "start": 5.0,
14
+ "end": 15.0,
15
+ "description": "男子闯入房间",
16
+ "depth_analysis": "角色情绪分析...",
17
+ "frame_facts": {
18
+ "5.0": ["男子闯入房间, 头发蓬乱表情紧张"],
19
+ "10.0": ["男子俯身盯着床上男孩, 男孩睁眼惊醒"]
20
+ }
21
+ }
22
+ ]
23
+ ```
24
+
25
+ | 字段 | 类型 | 说明 |
26
+ |------|------|------|
27
+ | `scene_id` | int | 场景编号 |
28
+ | `start` | float | 开始时间(秒) |
29
+ | `end` | float | 结束时间(秒) |
30
+ | `description` | string | 画面简述(≤80字) |
31
+ | `depth_analysis` | string | 深层分析(情绪/关系/潜台词) |
32
+ | `frame_facts` | object | 帧级事实,key 为时间戳字符串 |
33
+
34
+ ## asr_result.json
35
+
36
+ 语音转文字结果:
37
+
38
+ ```json
39
+ [
40
+ {"start": 0.0, "end": 3.5, "text": "What are you doing here?"}
41
+ ]
42
+ ```
43
+
44
+ ## asr_writing_chunks.json
45
+
46
+ 由 CLI 在生成 `agent_narration_brief.md` 时自动写出。它把长 ASR 按句子边界拆成适合 Agent 消化的语义块;中文按字符计数,非 CJK 文本按词数计数,并尽量保留 scene 对齐。
47
+
48
+ ```json
49
+ [
50
+ {
51
+ "chunk_id": 0,
52
+ "start": 0.0,
53
+ "end": 28.5,
54
+ "scene_ids": [0, 1],
55
+ "char_count": 642,
56
+ "text": "第一段对白……",
57
+ "segments": [
58
+ {"start": 0.0, "end": 3.5, "text": "第一句。", "char_count": 4}
59
+ ]
60
+ }
61
+ ]
62
+ ```
63
+
64
+ ## silence_periods.json
65
+
66
+ 静音窗口列表(适合放解说):
67
+
68
+ ```json
69
+ [
70
+ {"start": 2.0, "end": 8.5, "duration": 6.5, "has_speech": false}
71
+ ]
72
+ ```
73
+
74
+ `has_speech` 标记该窗口是否与检测到的 ASR 语音重叠;下游(pipeline / narration)只把 `has_speech=false` 的窗口当作可放解说的安静窗口。
75
+
76
+ ## speech_boundary_anchors.json
77
+
78
+ 原声句末安全切入点。脚本把 ASR 终止标点的估算时间吸附到短声学停顿;它与
79
+ `silence_periods.json` 分开,因为约 0.1–0.5 秒的停顿适合作为旁白入口,却不足以容纳整段旁白。
80
+
81
+ ```json
82
+ {
83
+ "schema_version": 1,
84
+ "sentence_anchors": [
85
+ {
86
+ "time": 5.809,
87
+ "confidence": "high",
88
+ "text_tail": "带你重走詹姆斯的二十一年。",
89
+ "pause_start": 5.222,
90
+ "pause_end": 5.809
91
+ }
92
+ ]
93
+ }
94
+ ```
95
+
96
+ 当 `overlaps_speech=true` 且旁白不是从 0 秒冷开场时,`narration` lint 要求 `start`
97
+ 贴近 `high`/`medium` 锚点。否则在 TTS 前用 `interrupts_source_sentence` 阻断,并返回
98
+ `suggested_start` 与 `source_text_tail` 给 Agent 调整。常规块使用
99
+ `source_entry_policy: "sentence_boundary"`;原声语句完整性没有抢断 override。最后一个可靠
100
+ 锚点之后又进入已声明的原声讲话区时,`suggested_start` 可为 `null`,Agent 必须移动、缩短或删除该旁白块。
101
+
102
+ 剪辑模式第二阶段会另外生成 `speech_boundary_anchors_output.json`,把锚点、ASR 语音区间和
103
+ 安静窗口映射到剪后 OUTPUT 时间轴,避免拿原片时间检查剪后旁白:
104
+
105
+ ```json
106
+ {
107
+ "schema_version": 2,
108
+ "timeline": "cut_output",
109
+ "clip_plan_fingerprint": "md5-of-canonical-clip-plan",
110
+ "sentence_anchors": [{"time": 4.0, "pause_start": 3.8, "confidence": "high"}],
111
+ "speech_spans": [{"start": 0.0, "end": 3.8}],
112
+ "quiet_windows": [{"start": 3.8, "end": 4.1}]
113
+ }
114
+ ```
115
+
116
+ `clip_plan_fingerprint` 必须与当前 `clip_plan_validated.json` 一致。缺失、过期或畸形的
117
+ output 证据一律 fail closed,不能回退到原片时钟或信任 Agent 写入的
118
+ `overlaps_speech=false`。多来源剪辑的每条映射记录还保留 `source_id` 和原片起止时间。
119
+
120
+ ## timeline_fusion.json
121
+
122
+ 由 CLI 在生成 brief 时自动写出。它把 VLM 场景、ASR 对白和静音窗口按时间轴 overlap 合并,减少写稿时手工推断“这一幕有没有对白/能不能插解说”的成本。
123
+
124
+ ```json
125
+ [
126
+ {
127
+ "scene_id": 0,
128
+ "time_range": [0.0, 10.0],
129
+ "visual_description": "两人在门口对峙",
130
+ "depth_analysis": "关系紧张",
131
+ "frame_facts": {"1.0": ["女子回头"]},
132
+ "dialogue_segments": [
133
+ {"start": 2.0, "end": 4.0, "overlap_seconds": 2.0, "text": "你到底是谁"}
134
+ ],
135
+ "dialogue_overlap_seconds": 2.0,
136
+ "narration_slots": [
137
+ {"start": 5.0, "end": 7.0, "duration": 2.0, "char_budget": 5}
138
+ ],
139
+ "recommended_mode": "ducked-bed"
140
+ }
141
+ ]
142
+ ```
143
+
144
+ ## narration.json
145
+
146
+ Agent 撰写的解说词。full 模式下使用原视频时间;**orchestrated cut 模式(`video-recap --edit-mode cut`)下,第二次暂停时已经先剪出 `edited_source.mp4`,因此 `narration.json` 必须直接使用剪后成片的 OUTPUT 时间轴(0..成片总时长),不会再生成或消费 `narration_mapped.json`。只有 legacy direct `video-cut` 单 pass 路径才会把原视频时间的 narration remap 成 `narration_mapped.json`:
147
+
148
+ ```json
149
+ [
150
+ {"start": 2.5, "end": 7.0, "narration": "解说文本", "pause_after_ms": 250, "overlaps_speech": true}
151
+ ]
152
+ ```
153
+
154
+ ## narration_lint.json
155
+
156
+ `--step script` 或续跑验证 `narration.json` 时生成的预检结果。它检查写稿、时间安全和解说覆盖。`metrics` 为 full 模式下的诊断指标(cut 模式为空对象),不是要求命中某个旁白比例的创作配额;低覆盖 warning 应回到 `visual_audio_board.json` 检查是否为有意的原声/沉默选择。
157
+
158
+ ```json
159
+ {
160
+ "ok": false,
161
+ "error_count": 1,
162
+ "warning_count": 1,
163
+ "metrics": {
164
+ "segment_count": 12,
165
+ "narration_coverage": 0.68,
166
+ "narration_seconds": 61.2,
167
+ "timeline_seconds": 90.0,
168
+ "avg_block_chars": 48,
169
+ "original_block_count": 4
170
+ },
171
+ "errors": [
172
+ {"level": "error", "index": 2, "code": "time_overlap", "message": "Segment overlaps the previous narration segment"}
173
+ ],
174
+ "warnings": [
175
+ {"level": "warning", "index": 0, "code": "over_budget", "budget_chars": 28, "actual_chars": 42}
176
+ ]
177
+ }
178
+ ```
179
+
180
+ 常见 code:`invalid_time`、`empty_narration`、`time_overlap`、`outside_clip_plan`、`over_budget`、`incomplete_sentence`、`slot_too_short`、`under_narrated`、`over_narrated`、`fragmented_beats`、`no_original_blocks`。
181
+
182
+ ## recap_story_plan.json / visual_audio_board.json(Agent 创作工作产物)
183
+
184
+ 这两个 JSON 是 skill 层的创作决策记录:前者保存导演意图、备选剪辑假设、POV/主线和 change-based beats;后者保存每拍的画面/表演选择、入点/出点、原声锚点、`audio_owner` 与 `narration_job`。完整字段与工作流见本技能的 `creative-editing-playbook.md`。
185
+
186
+ CLI 不以它们作为渲染硬门禁,也不新增解析服务;建议型解说评审在文件存在时读取它们,Agent 则用它们保证 cut、旁白和声音选择没有偏离同一个创作意图。
187
+
188
+ ## style_card.json(Agent 撰写,可选/按 brief 要求)
189
+
190
+ `style_card.json` 是表达层契约:由 Agent 根据 `--style`、`--context`、素材证据、ASR 和用户偏好信号综合撰写。`--style` 是 freeform verbatim guidance(原样自由文本指导),不是枚举、preset、switch,也不是一组可穷举风格名;不要把它翻译成固定档位。它是当前版本的活动契约:用户对声音、节奏、字幕阅读或禁忌提出新反馈后,更新原文件并移除过期偏好,不要只改 `narration.json`。
191
+
192
+ 这个文件记录声音、节奏、回收意图和证据支撑的表达判断;字段可以随项目增减,下游只把它当 JSON object 读取,不要求固定键名。它不负责标题、封面、首句承诺或卖点包装。
193
+
194
+ ```json
195
+ {
196
+ "voice": "冷静但有压迫感,少讲大道理,多用人物动作和台词里的证据推进",
197
+ "pacing": "前 15 秒紧凑建立冲突,每个 beat 连续说完一个思路;中段留原声喘息,结尾回收开头疑问",
198
+ "payoff_intent": "让观众先看到误会,再看到人物选择的代价",
199
+ "subtitle_read_posture": "TTS 保持连续口语,字幕按阅读宽度拆 cue,不用字幕换行切碎朗读",
200
+ "evidence_intent": ["优先引用画面动作", "关键转折保留原声"]
201
+ }
202
+ ```
203
+
204
+ ## packaging_plan.json(Agent 撰写,可选)
205
+
206
+ `packaging_plan.json` 是内容锁定后的可选包装层契约:标题、封面帧/视觉钩子、首句、观众承诺、卖点和发布包装信息。它帮助 review 判断“包装承诺”和正文前 15 秒是否对齐;不应反过来驱动故事取舍。
207
+
208
+ 它不是文风策略,不覆盖 `style_card.json` 的声音、节奏或表达规则;如果包装需要某个承诺,正文仍要用素材证据兑现。
209
+
210
+ ```json
211
+ {
212
+ "title": "一句能对外展示的标题",
213
+ "cover_frame": {"time": 12.4, "reason": "人物第一次正面做出关键选择"},
214
+ "first_line": "开场第一句解说",
215
+ "viewer_promise": "观众看完会明白的冲突/反转/信息增量",
216
+ "selling_points": ["强冲突", "原声高光"],
217
+ "packaging_notes": "发布侧备注,不写文风规则"
218
+ }
219
+ ```
220
+
221
+ ## deslop_qc_requirements.json(工具/brief 生成的运行契约)
222
+
223
+ `deslop_qc_requirements.json` 是 tool/brief generated run contract:工具或 brief 生成本次运行的 QC 要求,供 `deslop_qc` 读取,不由 Agent 手写。字段为 `schema_version` 与 `style_card_required`。
224
+
225
+ `style_card_required` 默认 `false`(advisory):缺少 `style_card.json` 只是 warning,不阻断出片。将来的 opt-in 运行可把它设为 `true`,让 `style_card.json` 成为硬性要求——`deslop_qc` 只读这个字段判断缺少 `style_card.json` 是否是 blocker,不扫描 `agent_narration_brief.md` 的 prompt wording 来推断。如果 requirements 文件缺失或损坏,按 legacy/migration advisory 处理,不作为 hard failure。
226
+
227
+ 该契约不改变 `--style`:`--style` 仍是 freeform verbatim guidance,不增加固定风格档位。它也不改变 `deslop_qc` 边界:仍然是 report-only,不是 AIGC detector,不自动改写。
228
+
229
+ 最小示例:
230
+
231
+ ```json
232
+ {
233
+ "schema_version": 1,
234
+ "style_card_required": false
235
+ }
236
+ ```
237
+
238
+ ## deslop_qc.json(CLI 生成,报告型 QC)
239
+
240
+ `deslop_qc.json` 由本地 deterministic scanner 生成,Agent 不手写。它只是 report-only QC:不是 AIGC detector,不判断文本是不是 AI 写的,不会自动改写。修改仍由 Agent/人工根据报告回到 `narration.json`、`style_card.json` 或字幕源里处理。
241
+
242
+ 报告分两层:
243
+
244
+ - `blockers`:客观阻断项,会并入 `narration_lint.json` 的 error,例如 requirements 要求但缺少/损坏 `style_card.json`、破折号、占位符泄漏。
245
+ - `advisories`:建议项,只提示可读性/口语化风险,例如模板化“不是……而是……”转折、套话密度、抽象总结词、解释链、比喻标记、过长段落;它们不自动阻断,也不自动改写。
246
+
247
+ ```json
248
+ {
249
+ "ok": false,
250
+ "contract": "Local readability/QC report only: this is not an AIGC detector, does not claim AI-generation accuracy, and never rewrites text. Corrections remain human/agent rewrite work.",
251
+ "scanner": "deslop_qc.py",
252
+ "style_card_required": true,
253
+ "blocker_count": 1,
254
+ "advisory_count": 1,
255
+ "blockers": [
256
+ {"severity": "blocker", "code": "missing_style_card", "source": "style_card", "index": null, "message": "style_card.json is required by this expression/packaging run but is missing"}
257
+ ],
258
+ "advisories": [
259
+ {"severity": "advisory", "code": "cliche_density", "source": "narration", "index": null, "message": "套话/高频抽象词偏密,建议换成具体行动、选择和后果"}
260
+ ],
261
+ "metrics": {"segments_scanned": 12, "text_units": 860, "sentence_count": 38}
262
+ }
263
+ ```
264
+
265
+ ## multi_source_manifest.json(多视频 cut)
266
+
267
+ 多视频剪辑模式下,项目级 `work_dir/multi_source_manifest.json` 是编排、剪辑与合成阶段共用的来源契约。`source_id` 默认由源文件 SHA-256 派生为 `src_<fingerprint[:12]>`;同一项目里重复 fingerprint 的不同路径会追加短 path hash 后缀。
268
+
269
+ ```json
270
+ {
271
+ "schema_version": 1,
272
+ "sources": [
273
+ {
274
+ "source_id": "src_0123456789ab",
275
+ "source_path": "/abs/episode1.mp4",
276
+ "source_name": "episode1.mp4",
277
+ "source_video_fingerprint": "0123456789abcdef...",
278
+ "source_work_dir": "sources/src_0123456789ab",
279
+ "material_id": "episode1-0123456789ab"
280
+ }
281
+ ]
282
+ }
283
+ ```
284
+
285
+ ## clip_plan.json
286
+
287
+ cut 模式下 Agent 选择要保留的原片片段,数组或 `{ "clips": [...] }` 都可接受。默认片段不能重叠,避免同一原片时间映射到多个输出位置:
288
+
289
+ ```json
290
+ {
291
+ "target_duration": "10m",
292
+ "clips": [
293
+ {"start": 12.0, "end": 38.0, "reason": "b01 | hook | knowledge: unknown→threat | POV=主角 | 保留倾听反应 | 入点=问题已问出 | 出点=沉默落地"}
294
+ ]
295
+ }
296
+ ```
297
+
298
+ | 字段 | 类型 | 说明 |
299
+ |------|------|------|
300
+ | `start` | float | 原视频片段开始秒数 |
301
+ | `end` | float | 原视频片段结束秒数 |
302
+ | `reason` | string | 选择该片段的剧情/信息原因 |
303
+
304
+ 多视频 cut 的 `clip_plan.json` 必须给每个片段加 `source_id`;重叠检测按 `source_id` 分开计算,不同源视频的相同时间范围不互相冲突:
305
+
306
+ ```json
307
+ {
308
+ "target_duration": "10m",
309
+ "clips": [
310
+ {"source_id": "src_0123456789ab", "start": 12.0, "end": 38.0, "reason": "b01 | setup | knowledge: unknown→clue | POV=主角 | 保留迟疑反应 | 入点=线索出现 | 出点=疑问成立"},
311
+ {"source_id": "src_fedcba987654", "start": 4.0, "end": 22.0, "reason": "b02 | payoff | power: suspect→hero | POV=主角 | 保留最终选择 | 入点=证据落下 | 出点=代价显现"}
312
+ ]
313
+ }
314
+ ```
315
+
316
+ ## clip_plan_validated.json
317
+
318
+ CLI 校验 `clip_plan.json` 后写出,额外包含输出时间轴:
319
+
320
+ ```json
321
+ {
322
+ "clips": [
323
+ {
324
+ "clip_id": 0,
325
+ "source_start": 12.0,
326
+ "source_end": 38.0,
327
+ "output_start": 0.0,
328
+ "output_end": 26.0,
329
+ "duration": 26.0,
330
+ "reason": "b01 | hook | knowledge: unknown→threat | POV=主角 | 保留倾听反应 | 入点=问题已问出 | 出点=沉默落地"
331
+ }
332
+ ],
333
+ "total_duration": 26.0,
334
+ "target_duration": 600.0
335
+ }
336
+ ```
337
+
338
+ `qc.boundary_status.sentence_checks` 逐项记录每个片段 start/end 是 `safe`、`unchecked`
339
+ 还是 `blocking`。理解阶段已有 ASR 讲话时间时,任何未落到源头/源尾、可靠句末/静音窗,且
340
+ 不是同源无损连续连接的边界都会写入 `qc.blocking[].code=unsafe_clip_sentence_boundary`。
341
+ 切镜吸附先执行,句末吸附最后执行,保证视觉边界不会覆盖声音安全边界。
342
+
343
+ 多视频 validated clip 会额外保留来源字段,供 pass2 brief、timeline 和剪映导出追溯原素材:
344
+
345
+ ```json
346
+ {
347
+ "clips": [
348
+ {
349
+ "clip_id": 0,
350
+ "source_id": "src_0123456789ab",
351
+ "source_path": "/abs/episode1.mp4",
352
+ "source_start": 12.0,
353
+ "source_end": 38.0,
354
+ "output_start": 0.0,
355
+ "output_end": 26.0,
356
+ "duration": 26.0,
357
+ "reason": "b01 | hook | knowledge: unknown→threat | POV=主角 | 保留倾听反应 | 入点=问题已问出 | 出点=沉默落地"
358
+ }
359
+ ]
360
+ }
361
+ ```
362
+
363
+ ## material library(可选,grep 复用)
364
+
365
+ `--material-library-dir <dir> --save-materials` 会把每个源视频的已分析小文件复制到 `<dir>/materials/<material_id>/`,不复制原始媒体。`--use-materials` 会在 fingerprint 和 settings fingerprint 匹配时把这些 JSON/MD 产物恢复到当前 per-source `work_dir`。
366
+
367
+ ```text
368
+ .video-materials/
369
+ materials_index.jsonl # 追加式 grep journal;旧行可保留为历史
370
+ materials/<material_id>/
371
+ material.json # 当前权威 metadata
372
+ material.md # grep 友好摘要
373
+ artifacts/scenes.json
374
+ artifacts/asr_result.json
375
+ artifacts/asr_clean.json # 启用 --consolidate-asr 时保留,恢复后 brief/review 优先使用
376
+ artifacts/vlm_analysis.json
377
+ artifacts/understanding_index.json
378
+ ```
379
+
380
+ `materials_index.jsonl` 每次保存追加一行,字段包括 `schema_version`, `event`, `material_id`, `source_name`, `source_path`, `source_video_fingerprint`, `settings_fingerprint`, `summary`, `tags`, `material_dir`, `updated_at`。当前权威状态始终以 `materials/<material_id>/material.json` 为准。MVP 只承诺 `grep -R "关键词" <library>` 这类文件检索;没有 DB、embedding 或语义搜索。
381
+
382
+ 保存时会对凭证形态(`tp-`/`sk-`/`gh*_`/`AKIA`/JWT 与 `KEY=VALUE` 赋值)和凭证命名的 JSON key 做脱敏,但这只是**尽力而为**的兜底,不是保证:陌生格式的密钥仍可能漏过。请从源头避免把密钥写进分析产物——key 从环境变量/`.env` 读取,不需要落进 scenes/ASR/VLM/summary 等 JSON。
383
+
384
+ ## narration_mapped.json
385
+
386
+ 仅 legacy direct `video-cut` 单 pass 路径会生成。orchestrated cut 模式不使用它:Agent 在 pass2 直接按剪后成片 OUTPUT 时间轴写 `narration.json`。当 legacy 路径启用时,`start/end` 已变成短视频输出时间,`source_start/source_end` 保留原视频时间:
387
+
388
+ ```json
389
+ [
390
+ {
391
+ "start": 2.0,
392
+ "end": 7.0,
393
+ "source_start": 14.0,
394
+ "source_end": 19.0,
395
+ "source_clip_id": 0,
396
+ "narration": "解说文本"
397
+ }
398
+ ]
399
+ ```
400
+
401
+ ## original_subtitles.json / user_subtitles.{json,srt,ass}(可选,原声留白字幕)
402
+
403
+ 解说块之间的原声留白会把【原声台词】烧成字幕(assemble 阶段用 `「」` 包裹以区分解说)。来源优先级(高→低):
404
+
405
+ 1. **`work_dir/user_subtitles.json`**(用户自带,最准)— 数组 `[{start,end,text}]` 默认按**成片 OUTPUT** 时间轴直接使用;也可写成 `{"timeline": "source"|"output", "lines": [...]}`,`source` 表示按**原片**时间轴给出,由 assemble 依 `clip_plan_validated.json` 映射到成片。
406
+ 2. **`work_dir/user_subtitles.srt` / `.ass`**(用户自带)— 默认按**原片**时间轴解析后映射到成片。
407
+ 3. **`work_dir/original_subtitles.json`**(Agent 校对,cut pass2 写)— OUTPUT 时间轴 `[{start,end,text}]`,订正 ASR 错字/人名、只写留白里真正出声的句子。
408
+ 4. **ASR 兜底** — 无上述文件时,用 `asr_result.json` 按留白粗略映射(中点估时,可能偏多偏乱)。
409
+
410
+ 来源 1–3 为「精确来源」:每条按句**区间裁剪**落到所覆盖的留白边界(跨边界会拆分),不走 ASR 兜底的中点估时;over-dense 行截断显示而非丢弃。
411
+
412
+ ```json
413
+ [
414
+ {"start": 2.0, "end": 5.0, "text": "原声台词一句"}
415
+ ]
416
+ ```
417
+
418
+ ## background_research.json
419
+
420
+ 可选的背景调研结果(由 Agent 使用任意可用搜索/浏览方式整理):
421
+
422
+ ```json
423
+ {
424
+ "synopsis": "剧情概要",
425
+ "characters": {"角色名": "角色简介"},
426
+ "worldbuilding": "世界观设定",
427
+ "episode_context": "集数上下文",
428
+ "character_details": {
429
+ "角色名": {
430
+ "aliases": ["别名/昵称"],
431
+ "role": "主角|配角|反派|次要角色",
432
+ "relationships": ["与XX是夫妻", "与YY是师徒"]
433
+ }
434
+ },
435
+ "plot_arcs": [
436
+ {"name": "线索名称", "description": "简要描述", "status": "进行中|已解决|伏笔"}
437
+ ],
438
+ "cultural_notes": [
439
+ {"item": "文化梗/典故/时代背景", "explanation": "解释"}
440
+ ]
441
+ }
442
+ ```
443
+
444
+ > `character_details`、`plot_arcs`、`cultural_notes` 为(可选,新增)字段。仅含 `synopsis`、`characters`、`worldbuilding`、`episode_context` 四个原始字段的旧 JSON 仍然有效。
445
+
446
+ ## narration_review.json
447
+
448
+ 解说评审阶段输出 LLM-as-judge 结果。旧字段 `verdict/summary/findings` 仍然有效;新增一份 **advisory** 的内容效果 scorecard 与改稿清单。**scorecard 不改变 verdict、也不作硬门禁**——硬门禁仍是 `findings` 里的 error(事实矛盾/残句)经 `--require-narration-review` 严格模式拦截。`verdict` 词表为 `PASS|REVISE|FAIL`,`OK` 作为旧值的兼容别名。
449
+
450
+ ```json
451
+ {
452
+ "verdict": "PASS|REVISE|FAIL|OK",
453
+ "summary": "总体判断",
454
+ "scorecard": {
455
+ "promise_match": 4, "hook_3s": 4, "first_15s_delivery": 4, "spine_clarity": 4,
456
+ "stakes_escalation": 4, "information_gain": 4, "spoken_language": 4, "sentence_brevity": 4,
457
+ "tts_pacing": 4, "grounding": 4, "original_audio_use": 4, "subtitle_readability": 4
458
+ },
459
+ "hook_candidates_review": [{"candidate": "首句", "type": "suspense", "score": 4, "keep": true}],
460
+ "retention_risk_points": [{"time": "00:28", "risk": "信息重复可能掉人", "fix": "删掉复述画面的句子"}],
461
+ "highest_return_edits": ["最值得先改的一件事"],
462
+ "information_gain_notes": [{"segment": 0, "label": "motive|...|visual_restatement", "note": "证据/改法"}],
463
+ "spoken_language_rewrites": [{"segment": 0, "original": "原句", "rewrite": "口语改写", "why": "为什么更适合听"}],
464
+ "grounding_assertions": [{"segment": 0, "assertion": "人物/关系/因果断言", "source": "visual|asr|research|user_context|unsupported", "risk": "谨慎说明"}],
465
+ "findings": [{"segment": 0, "severity": "warning", "category": "weak_hook", "issue": "问题", "fix": "改法"}]
466
+ }
467
+ ```
468
+
469
+ > 若 `work_dir` 提供了 `packaging_plan.json` / `recap_story_plan.json` / `visual_audio_board.json`(可选、Agent 撰写),review 会把它们并入评估上下文;缺失时 review 仅基于解说与画面/对白证据评分,行为不受影响。
470
+
471
+ ## tts_meta.json(partial 失败可见性)
472
+
473
+ `video-voiceover` 正常输出 `{segments, engine, narration}`。当显式允许 partial TTS(`--allow-partial-tts` / `ALLOW_PARTIAL_TTS=1`)让运行在部分段失败后继续时,失败段不会只埋在日志里,而会写入 `partial` 与 `failures[]`:
474
+
475
+ ```json
476
+ {
477
+ "segments": [{"index": 0, "start": 0.0, "end": 1.0, "narration": "第一段。", "audio_path": "tts_segments/narr_000.wav"}],
478
+ "engine": "mimo-tts",
479
+ "narration": "narration.json",
480
+ "partial": true,
481
+ "failures": [{"index": 1, "start": 1.0, "end": 2.5, "text": "第二段。", "error": "network timeout"}]
482
+ }
483
+ ```
484
+
485
+ > 正常(无失败)运行也会带 `"partial": false, "failures": []`。partial 成片只适合预览,不建议直接发布。
486
+
487
+ 组装后,`assembly_manifest.json.audio_segments[]` 另外记录 `fit_status`、`truncated`、
488
+ `truncate_reason`、`placed_audio_duration`、`placed_audio_path`、`source_duck_end`、
489
+ `source_restore_at` 与 `source_handoff_status`。组装阶段从不按时间裁旁白尾音:放不下时用
490
+ `no_safe_fit` 阻断。`placed_audio_path` 是实际写入 canonical `narration.wav` 的完整逐段 PCM;
491
+ `timeline.json`/剪映必须引用它而不是更长的加速前文件。素材时长与序列化后的时间线段长不一致时,
492
+ `assembly_qc.json` 用 `timeline_audio_mismatch` 阻断。原声恢复在 `pause_start` 前保持压低,
493
+ 只在实测停顿内渐强,并于 `source_restore_at` 完成,避免渐强提前泄露上一句尾音。
494
+
495
+ ## dub_lint.json / dub_review.json
496
+
497
+ Dub 模式下,`dub_script.json` 在 voiceclone **之前**先经过 deterministic lint,把明显不可发布的脚本挡在昂贵的克隆 TTS 之前。空译文、相邻行重叠、时间越界、`room < 0.4s` 等 **error** 会 `verdict=FAIL` 并阻断 render;`fast_speech`、`trim_risk` 等是 warning,不阻断。
498
+
499
+ 每行 voiceclone 原始 WAV 会按模型、合成提示、中文台词和参考音频 SHA-256 写入相邻的 `*.wav.meta.json`。指纹完全匹配且 WAV 可读取时,dub render 直接复用并在 `dub_manifest.json.lines[].tts_cache` 记录 `hit`;台词、参考音频、模型或提示变化都会自动失效并重新合成。
500
+
501
+ ```json
502
+ {
503
+ "schema_version": 1,
504
+ "verdict": "PASS|FAIL",
505
+ "blocking": false,
506
+ "errors": [],
507
+ "issues": [{"severity": "warning", "code": "fast_speech", "line": 2, "message": "translation is dense (8.4 chars/s)", "start": 1.0, "end": 2.0}],
508
+ "summary": {"lines": 12, "errors": 0, "warnings": 1, "max_chars_per_second": 8.4, "trim_risk_lines": []}
509
+ }
510
+ ```
511
+
512
+ `dub_review.json` 是脚本级 review scaffold(确定性派生自 lint,语义忠实/语气仍需 agent/人工判断):
513
+
514
+ ```json
515
+ {
516
+ "schema_version": 1,
517
+ "verdict": "PASS|REVISE|FAIL",
518
+ "checks": {"faithful_to_source": "needs_agent_review", "spoken_chinese": "PASS", "speaker_tone": "needs_agent_review", "timing_fit": "PASS", "platform_fit": "needs_agent_review"},
519
+ "highest_return_edits": [],
520
+ "coverage": {"transcript_windows": 8, "script_lines": 12}
521
+ }
522
+ ```
523
+
524
+ > CLI:`dub.py --stage lint|review`(无需 video)、`dub.py --print-schema` 打印以上全部 dub artifact 契约;`--stage render` 会在克隆前自动写 `dub_lint.json` / `dub_review.json`,lint 非 PASS 即中止。
525
+ > 最终 `dub_<name>.mp4` 显式输出 48 kHz AAC;不能沿用 `loudnorm` 内部的 96 kHz 分析采样率。
526
+ ## shift-left QC artifacts
527
+
528
+ `preflight_qc.json`、`final_qc.json`、`golden_eval.json`、`mimo_qc.json` 共用最小 QC 契约;stage 仅允许 `pre_cut` / `post_cut` / `pre_tts` / `post_tts` / `pre_assemble` / `post_render` / `golden`,其中 `mimo_qc.json` 是 artifact 而不是 stage。详见 `shift-left-qc-schema.md`。
529
+
530
+ `recap.py` 可通过 `--mimo-qc pre-assemble|post-render|both`(默认 `off`)在组装前和/或成片后写 `mimo_qc.json`。每个 stage 最多一次 live request;相同素材/模型命中内容缓存,`--mimo-qc-refresh` 可刷新。`post_render` 最多临时抽取 6 张、最长边 768px 的 JPEG;base64 只进入请求,不写进 artifact。多 stage 报告聚合在 `metadata.stages`,状态为 `completed` / `cached` / `unavailable` / `failed`,任何状态都不阻断、也不自动修复。关闭功能会清理旧 `mimo_qc.json`,避免陈旧建议被误认为本轮结果。
531
+
532
+ QC 证据把 `source_asr` 与 `generated_subtitles` 分开:前者只用于源事实/原声时序,后者是本轮旁白派生字幕,不能反过来充当事实证据。多视频项目从 `multi_source_manifest.json` 指向的逐源 work dir 汇集 ASR;`cut_output` 解说评审同样按 `source_id` 映射逐源 VLM/ASR,避免项目根目录没有单一 ASR 文件时产生空证据。
533
+
534
+ 渲染后,`recap.py` 先更新 `preflight_qc.json` 的 `post_render` stage,再运行可选 MiMo 提示,最后写 `final_qc.json` 和 `golden_eval.json`。`final_qc.json` 汇总最终 mp4、`assembly_manifest.json`、`assembly_qc.json`、`visual_qc.json`、`preflight_qc.json`、`mimo_qc.json` 的本地元数据;缺失/空成片、ffprobe 不可用或失败、以及 assembly/visual QC 的客观 blocker 会进入 deterministic blockers。MiMo 和其他 non-deterministic finding 永远不能成为 blocker;客观佐证必须由 deterministic producer 另发 finding。`golden_eval.json` 默认要求 `final_qc.json.ok=true`,也可用 golden fixture 做简单的时长、codec 和必需 artifact 断言。所有 QC metadata/evidence 写入前都经过 `qc_contract.redact_secrets`:secret-looking key/value 会被替换,URL userinfo/query/fragment 会被移除,仅保留必要 host/path 诊断信息。
@@ -0,0 +1,74 @@
1
+ # 背景调研指南(可选)
2
+
3
+ Agent 在开始视频理解**之前**先做背景调研,确认作品名、角色关系、剧情背景或科普概念,写入 `work_dir/background_research.json`。理解阶段会把它并入 VLM 的画面分析上下文,让场景描述能直接叫出人物名字、带着剧情读画面,而不是把人都标成「黑衣男子」。**调研不是必需步骤**;没有浏览器工具、网络不可用或用户未提供明确片名时,直接跳过,不阻塞视频生成。
4
+
5
+ ## 工具选择
6
+
7
+ 使用当前环境里可用的任意检索方式即可,例如:
8
+
9
+ - Codex / Claude 自带的联网搜索或网页浏览工具
10
+ - 用户已经配置好的浏览器自动化或页面读取工具
11
+ - 普通浏览器手动查找后把结果整理进 JSON
12
+ - 已知资料、用户给的剧情背景或项目内已有文档
13
+
14
+ ## 通用流程
15
+
16
+ 1. 从 `--context`、文件名或用户描述里提取可搜索关键词。
17
+ 2. 搜索 1-3 个高价值问题,不要过度调研。
18
+ 3. 只记录对解说有帮助的事实:人物关系、剧情前提、世界观、当前集上下文、术语解释。
19
+ 4. 写入 `work_dir/background_research.json`。
20
+ 5. 如果查不到可靠信息,跳过调研并继续视频理解;不要在理解索引生成前提前写 `narration.json`。
21
+
22
+ ## 按视频类型搜索策略
23
+
24
+ ### 短剧 / 电视剧
25
+
26
+ | 搜索关键词 | 目标字段 |
27
+ |-----------|---------|
28
+ | `{作品名} 剧情 介绍 人物` | synopsis, characters |
29
+ | `{作品名} 人物 关系` | characters |
30
+ | `{作品名} 第{N}集 剧情` | episode_context |
31
+
32
+ ### 电影
33
+
34
+ | 搜索关键词 | 目标字段 |
35
+ |-----------|---------|
36
+ | `{电影名} 剧情 简介` | synopsis |
37
+ | `{电影名} 影评 解读` | cultural_notes |
38
+
39
+ ### 纪录片 / 科普视频
40
+
41
+ | 搜索关键词 | 目标字段 |
42
+ |-----------|---------|
43
+ | `{主题} 背景 知识` | worldbuilding |
44
+ | `{核心概念} 解释` | synopsis |
45
+ | `{主题} 最新 进展` | cultural_notes |
46
+
47
+ ## 写入格式
48
+
49
+ 写入 `work_dir/background_research.json`,只填搜到的字段,未搜到的字段省略,不要写 `null` 或空字符串。
50
+
51
+ ```json
52
+ {
53
+ "synopsis": "...",
54
+ "characters": {
55
+ "角色名": "简介或关系"
56
+ },
57
+ "worldbuilding": "...",
58
+ "episode_context": "...",
59
+ "cultural_notes": [
60
+ {"item": "...", "explanation": "..."}
61
+ ]
62
+ }
63
+ ```
64
+
65
+ ## 错误处理
66
+
67
+ | 场景 | 处理 |
68
+ |------|------|
69
+ | 没有浏览器 / 搜索工具 | 跳过调研,继续视频理解 |
70
+ | 搜索无结果 | 换一组关键词重试一次,仍无结果则继续视频理解 |
71
+ | 结果互相矛盾 | 只使用用户提供的上下文或画面/ASR 可验证的信息 |
72
+ | 信息可能剧透后续 | 只用于理解人物关系,不在解说里剧透用户没要求的后续剧情 |
73
+
74
+ **原则**:背景资料只能补上下文,不能替代 `vlm_analysis.json` / `asr_result.json` 里的画面和对白证据。
@@ -0,0 +1,23 @@
1
+ # 前置 QC 数据契约
2
+
3
+ `final_qc.json`、`golden_eval.json`、`mimo_qc.json` 与 `preflight_qc.json` 共用一套最小结构,由本技能的 `scripts/qc_contract.py` 实现。
4
+
5
+ ## 字段契约
6
+
7
+ - `schema_version`:整数 `1`。
8
+ - `artifact`:只能是 `final_qc.json`、`golden_eval.json`、`mimo_qc.json` 或 `preflight_qc.json`。
9
+ - `stage`:只能是 `pre_cut`、`post_cut`、`pre_tts`、`post_tts`、`pre_assemble`、`post_render`、`golden`。
10
+ - 不得使用 `pre_voiceover`、`post_voiceover`、`pre_export`、`post_export`、`final`、`golden_eval` 或 `mimo_qc` 作为阶段值。
11
+ - `mimo_qc.json` 是产物名;MiMo finding 必须挂在 `post_tts`、`pre_assemble` 等真实阶段上。
12
+ - `findings[]`:每项必须包含 `finding_id`、`stage`、`severity`、`blocking`、`deterministic`、`confidence`、`rule_id`、`decision_reason`、`location`、`evidence`、`sample_policy`、`model_used`、`artifact_fingerprints` 与 `next_action`。
13
+ - `sample_policy`:至少包含 `type`;其值只能是 `all`、`deterministic`、`sampled`、`semantic` 或 `aesthetic`。
14
+ - `location.timecode` 与 `location.source_span` 必须存在;剪辑前阶段可以把任一字段设为 `null`。
15
+ - 为兼容与诊断,当前辅助函数还可能写出 `id`、`category`、`code`、`message`、`source` 与 `objective_corroboration`。
16
+
17
+ ## 阻断语义
18
+
19
+ 只有确定性的客观规则可以阻断,例如产物缺失或过期、时长或媒体流错误、字幕与 TTS 放置错误、数据结构无效。
20
+
21
+ MiMo 语义/审美 finding 以及其他所有非确定性 finding **始终只给建议,不能阻断**。若存在客观佐证,必须由确定性生产者单独写成确定性 finding;它不能把主观模型观察升级成 blocker。运行时不存在 allow-list 或规则表逃生口。
22
+
23
+ `qc_contract.py` 只负责数据结构:不调用 MiMo、不连接流水线,也不自动修复。独立的 `mimo_qc.py` 只有在显式开启时,才会在 `pre_assemble` 和/或 `post_render` 各发起一次实时请求;它保持 fail-open,且不落盘凭证或抽帧 base64。所有报告构建器都通过 `qc_contract.redact_secrets` 处理元数据与证据:脱敏疑似密钥的键值,并从 URL 移除 userinfo、query 与 fragment,同时保留有用的 host/path 上下文。