@oh-story/dsh 0.1.10 → 0.1.12

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 (444) hide show
  1. package/README.md +11 -11
  2. package/lib/client.js +7 -3
  3. package/lib/client.js.map +2 -2
  4. package/lib/drama/manifest.json +212 -142
  5. package/lib/drama/skills/short-drama/SKILL.md +14 -2
  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/project_tool.py +131 -0
  10. package/lib/drama/skills/short-drama-assets/SKILL.md +2 -1
  11. package/lib/drama/skills/short-drama-assets/references/asset-review-checklist.md +2 -0
  12. package/lib/drama/skills/short-drama-assets/references/era-anchors.md +37 -0
  13. package/lib/drama/skills/short-drama-assets/references/stage-contract.md +2 -0
  14. package/lib/drama/skills/short-drama-develop/SKILL.md +10 -4
  15. package/lib/drama/skills/short-drama-develop/assets/adaptation-map.example.jsonl +1 -1
  16. package/lib/drama/skills/short-drama-develop/assets/creative-brief.md +8 -0
  17. package/lib/drama/skills/short-drama-develop/references/adaptation-craft.md +80 -13
  18. package/lib/drama/skills/short-drama-develop/references/episode-design.md +95 -12
  19. package/lib/drama/skills/short-drama-develop/references/genre-and-hook-playbook.md +9 -5
  20. 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
  21. package/lib/drama/skills/short-drama-develop/references/genre-cards//347/263/273/347/273/237/346/265/201.md +51 -0
  22. package/lib/drama/skills/short-drama-develop/references/genre-cards//351/200/206/350/242/255.md +51 -0
  23. 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
  24. package/lib/drama/skills/short-drama-develop/references/genre-cards.md +10 -7
  25. package/lib/drama/skills/short-drama-develop/references/premise-devices.md +15 -9
  26. package/lib/drama/skills/short-drama-develop/references/serial-character-and-memory.md +3 -2
  27. package/lib/drama/skills/short-drama-develop/references/stage-contract.md +14 -7
  28. package/lib/drama/skills/short-drama-develop/references/story-craft.md +7 -3
  29. package/lib/drama/skills/short-drama-edit/SKILL.md +43 -20
  30. package/lib/drama/skills/short-drama-edit/assets/remotion/README.md +49 -13
  31. package/lib/drama/skills/short-drama-edit/assets/remotion/package.json +4 -2
  32. package/lib/drama/skills/short-drama-edit/assets/remotion/src/Overlay.tsx +31 -0
  33. package/lib/drama/skills/short-drama-edit/assets/remotion/src/Root.tsx +5 -5
  34. package/lib/drama/skills/short-drama-edit/assets/remotion/src/Subtitles.tsx +68 -69
  35. package/lib/drama/skills/short-drama-edit/assets/remotion/src/font.ts +39 -29
  36. package/lib/drama/skills/short-drama-edit/assets/remotion/src/rules.mjs +188 -0
  37. package/lib/drama/skills/short-drama-edit/assets/remotion/src/schema.ts +26 -13
  38. package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/Card.tsx +72 -0
  39. package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/CornerChip.tsx +39 -0
  40. package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/ScreenText.tsx +36 -0
  41. package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/SystemPanel.tsx +44 -0
  42. package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/TaskPanel.tsx +100 -0
  43. package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/chrome.tsx +197 -0
  44. package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/tokens.ts +62 -0
  45. package/lib/drama/skills/short-drama-edit/assets/remotion/tsconfig.json +1 -0
  46. package/lib/drama/skills/short-drama-edit/assets//345/211/252/350/276/221/345/215/225.md +4 -2
  47. package/lib/drama/skills/short-drama-edit/references/cut-craft.md +3 -1
  48. package/lib/drama/skills/short-drama-edit/references/delivery-verify.md +6 -2
  49. package/lib/drama/skills/short-drama-edit/references/generated-footage.md +12 -6
  50. package/lib/drama/skills/short-drama-edit/references/sound-and-subtitles.md +13 -8
  51. package/lib/drama/skills/short-drama-edit/references/stage-contract.md +2 -0
  52. package/lib/drama/skills/short-drama-edit/scripts/edit_tool.py +1153 -121
  53. package/lib/drama/skills/short-drama-edit/scripts/selftest.py +49 -9
  54. package/lib/drama/skills/short-drama-novel-analyze/SKILL.md +3 -3
  55. package/lib/drama/skills/short-drama-novel-analyze/assets/episode-candidate.example.jsonl +2 -2
  56. package/lib/drama/skills/short-drama-novel-analyze/references/adaptation-triage.md +8 -4
  57. package/lib/drama/skills/short-drama-novel-analyze/references/adaptation-value.md +10 -3
  58. package/lib/drama/skills/short-drama-novel-analyze/references/aggregation-and-entities.md +25 -1
  59. package/lib/drama/skills/short-drama-novel-analyze/references/stage-contract.md +1 -0
  60. package/lib/drama/skills/short-drama-review/SKILL.md +2 -2
  61. package/lib/drama/skills/short-drama-review/references/review-method.md +6 -1
  62. package/lib/drama/skills/short-drama-review/references/rubric-assets-prompts.md +11 -0
  63. package/lib/drama/skills/short-drama-review/references/rubric-story-script.md +77 -3
  64. package/lib/drama/skills/short-drama-review/references/rubric-visual-motion.md +15 -0
  65. package/lib/drama/skills/short-drama-review/references/stage-contract.md +3 -0
  66. package/lib/drama/skills/short-drama-storyboard/SKILL.md +13 -5
  67. package/lib/drama/skills/short-drama-storyboard/references/blocking-playbooks.md +1 -1
  68. package/lib/drama/skills/short-drama-storyboard/references/production-shot-grammar.md +2 -2
  69. package/lib/drama/skills/short-drama-storyboard/references/shot-craft.md +82 -14
  70. package/lib/drama/skills/short-drama-storyboard/references/stage-contract.md +4 -2
  71. package/lib/drama/skills/short-drama-video-prompts/SKILL.md +5 -3
  72. package/lib/drama/skills/short-drama-video-prompts/references/camera-audio-continuity.md +12 -0
  73. package/lib/drama/skills/short-drama-video-prompts/references/delivery-profile.md +4 -5
  74. package/lib/drama/skills/short-drama-video-prompts/references/generability.md +4 -2
  75. package/lib/drama/skills/short-drama-video-prompts/references/minimax-h3.md +40 -1
  76. package/lib/drama/skills/short-drama-video-prompts/references/motion-recipe.md +20 -14
  77. package/lib/drama/skills/short-drama-video-prompts/references/performance-action-timing.md +1 -1
  78. package/lib/drama/skills/short-drama-video-prompts/references/production-prompt-grammar.md +8 -7
  79. package/lib/drama/skills/short-drama-video-prompts/references/review-and-fixtures.md +1 -1
  80. package/lib/drama/skills/short-drama-video-prompts/references/stage-contract.md +1 -0
  81. package/lib/drama/skills/short-drama-video-prompts/references/target-model-profile.md +8 -1
  82. package/lib/drama/skills/short-drama-video-prompts/references/wan-3.0.md +103 -0
  83. package/lib/drama/skills/short-drama-video-prompts/scripts/motion_timing_check.py +8 -7
  84. package/lib/drama/skills/short-drama-write/SKILL.md +8 -3
  85. package/lib/drama/skills/short-drama-write/references/dialogue-craft.md +1 -1
  86. package/lib/drama/skills/short-drama-write/references/script-craft.md +56 -3
  87. package/lib/drama/skills/short-drama-write/references/stage-contract.md +4 -0
  88. package/lib/drama/skills/short-drama-write/scripts/duration_estimate.py +48 -2
  89. package/lib/index.js +71 -21
  90. package/lib/index.js.map +3 -3
  91. package/lib/oh-story/manifest.json +545 -310
  92. package/lib/oh-story/roles/chapter-extractor.md +11 -11
  93. package/lib/oh-story/roles/character-designer.md +1 -2
  94. package/lib/oh-story/roles/consistency-checker.md +11 -9
  95. package/lib/oh-story/roles/narrative-writer.md +24 -25
  96. package/lib/oh-story/roles/story-architect.md +9 -61
  97. package/lib/oh-story/roles/story-explorer.md +20 -125
  98. package/lib/oh-story/roles/story-researcher.md +0 -1
  99. package/lib/oh-story/skills/story/SKILL.md +6 -6
  100. package/lib/oh-story/skills/story/VERSION +1 -1
  101. package/lib/oh-story/skills/story/references/author-memory-maintenance.md +75 -0
  102. package/lib/oh-story/skills/story/references/author-memory.md +40 -118
  103. package/lib/oh-story/skills/story/scripts/author_memory_commit.py +3 -3
  104. package/lib/oh-story/skills/story-deslop/SKILL.md +24 -25
  105. package/lib/oh-story/skills/story-deslop/references/agent-calls.md +5 -0
  106. package/lib/oh-story/skills/story-deslop/references/anti-ai-writing.md +1 -1
  107. package/lib/oh-story/skills/story-deslop/references/author-memory-maintenance.md +75 -0
  108. package/lib/oh-story/skills/story-deslop/references/author-memory.md +40 -118
  109. package/lib/oh-story/skills/story-deslop/references/banned-words.md +2 -2
  110. package/lib/oh-story/skills/story-deslop/references/deslop-gates.md +21 -4
  111. package/lib/oh-story/skills/story-deslop/references/style-resolution.md +4 -4
  112. package/lib/oh-story/skills/story-deslop/scripts/author_memory_commit.py +3 -3
  113. package/lib/oh-story/skills/story-deslop/scripts/check-ai-patterns.js +155 -8
  114. package/lib/oh-story/skills/story-import/SKILL.md +63 -579
  115. package/lib/oh-story/skills/story-import/references/deep-analysis.md +47 -0
  116. package/lib/oh-story/skills/story-import/references/format-and-structure.md +1 -1
  117. package/lib/oh-story/skills/story-import/references/import-report.md +64 -0
  118. package/lib/oh-story/skills/story-import/references/import-special-cases.md +34 -0
  119. package/lib/oh-story/skills/story-import/references/import-tracking.md +95 -0
  120. package/lib/oh-story/skills/story-import/references/length-routing.md +1 -1
  121. package/lib/oh-story/skills/story-import/references/outline-reverse-rules.md +79 -0
  122. package/lib/oh-story/skills/story-import/references/outline-reverse.md +24 -0
  123. package/lib/oh-story/skills/story-import/references/structure-mapping-long.md +95 -91
  124. package/lib/oh-story/skills/story-import/references/structure-mapping-short.md +24 -12
  125. package/lib/oh-story/skills/story-import/references/tracking-initialization.md +1 -1
  126. package/lib/oh-story/skills/story-import/references/tracking-transaction.md +11 -9
  127. package/lib/oh-story/skills/story-import/scripts/build_outline_brief.py +332 -0
  128. package/lib/oh-story/skills/story-import/scripts/check-outline-contract.js +101 -14
  129. package/lib/oh-story/skills/story-import/scripts/tracking_commit.py +278 -23
  130. package/lib/oh-story/skills/story-import/scripts/wordcount_core.py +179 -23
  131. package/lib/oh-story/skills/story-long-analyze/SKILL.md +28 -50
  132. package/lib/oh-story/skills/story-long-analyze/references/author-facing.md +12 -5
  133. package/lib/oh-story/skills/story-long-analyze/references/deconstruction-notes.md +1 -1
  134. package/lib/oh-story/skills/story-long-analyze/references/final-checks.md +19 -0
  135. package/lib/oh-story/skills/story-long-analyze/references/index-rebuild.md +11 -0
  136. package/lib/oh-story/skills/story-long-analyze/references/pipeline-ops.md +21 -55
  137. package/lib/oh-story/skills/story-long-analyze/references/stage1-golden-chapters.md +128 -0
  138. package/lib/oh-story/skills/story-long-analyze/references/stage2-extraction.md +229 -0
  139. package/lib/oh-story/skills/story-long-analyze/references/stage3-plot-rhythm.md +480 -0
  140. package/lib/oh-story/skills/story-long-analyze/references/stage4-characters-settings.md +195 -0
  141. package/lib/oh-story/skills/story-long-analyze/references/stage5-report.md +33 -0
  142. package/lib/oh-story/skills/story-long-analyze/references/style-profile-generator.md +17 -0
  143. package/lib/oh-story/skills/story-long-analyze/references/style-profile-protocol.md +1 -1
  144. package/lib/oh-story/skills/story-long-analyze/references/synthesis-inputs.md +39 -0
  145. package/lib/oh-story/skills/story-long-analyze/scripts/manage_analysis_run.py +47 -8
  146. package/lib/oh-story/skills/story-long-scan/SKILL.md +41 -193
  147. package/lib/oh-story/skills/story-long-scan/references/platform-ciweimao.md +19 -0
  148. package/lib/oh-story/skills/story-long-scan/references/platform-fanqie.md +45 -0
  149. package/lib/oh-story/skills/story-long-scan/references/platform-jjwxc.md +28 -0
  150. package/lib/oh-story/skills/story-long-scan/references/platform-qidian.md +35 -0
  151. package/lib/oh-story/skills/story-long-scan/references/platform-qimao.md +27 -0
  152. package/lib/oh-story/skills/story-long-scan/references/topic-decision.md +6 -2
  153. package/lib/oh-story/skills/story-long-write/SKILL.md +32 -73
  154. package/lib/oh-story/skills/story-long-write/references/agent-calls.md +47 -0
  155. package/lib/oh-story/skills/story-long-write/references/anti-ai-writing.md +1 -1
  156. package/lib/oh-story/skills/story-long-write/references/artifact-protocols.md +18 -201
  157. package/lib/oh-story/skills/story-long-write/references/author-memory-maintenance.md +75 -0
  158. package/lib/oh-story/skills/story-long-write/references/author-memory.md +40 -118
  159. package/lib/oh-story/skills/story-long-write/references/banned-words.md +2 -2
  160. package/lib/oh-story/skills/story-long-write/references/benchmark-recall.md +6 -10
  161. package/lib/oh-story/skills/story-long-write/references/character-relations.md +49 -1
  162. package/lib/oh-story/skills/story-long-write/references/deslop-gates.md +171 -0
  163. package/lib/oh-story/skills/story-long-write/references/emotion-on-page.md +116 -0
  164. package/lib/oh-story/skills/story-long-write/references/emotional-arc-design.md +1 -114
  165. package/lib/oh-story/skills/story-long-write/references/genre-prose-cards.md +1 -1
  166. package/lib/oh-story/skills/story-long-write/references/long-chapter-quality.md +3 -2
  167. package/lib/oh-story/skills/story-long-write/references/long-format.md +0 -8
  168. package/lib/oh-story/skills/story-long-write/references/long-genre-catalog.md +1 -1
  169. package/lib/oh-story/skills/story-long-write/references/long-genre-mechanics.md +3 -3
  170. package/lib/oh-story/skills/story-long-write/references/opening-design.md +2 -2
  171. package/lib/oh-story/skills/story-long-write/references/outline-conflict.md +4 -4
  172. package/lib/oh-story/skills/story-long-write/references/outline-methods.md +7 -7
  173. package/lib/oh-story/skills/story-long-write/references/outline-rhythm.md +3 -3
  174. package/lib/oh-story/skills/story-long-write/references/outline-structure-theory.md +14 -69
  175. package/lib/oh-story/skills/story-long-write/references/plot-frameworks.md +1 -1
  176. package/lib/oh-story/skills/story-long-write/references/plot-special-topics.md +2 -2
  177. package/lib/oh-story/skills/story-long-write/references/project-files.md +10 -6
  178. package/lib/oh-story/skills/story-long-write/references/reader-contract-and-progression.md +1 -1
  179. package/lib/oh-story/skills/story-long-write/references/reference-index.md +4 -4
  180. package/lib/oh-story/skills/story-long-write/references/stop-and-fix.md +9 -0
  181. package/lib/oh-story/skills/story-long-write/references/style-combat-face.md +1 -58
  182. package/lib/oh-story/skills/story-long-write/references/style-genre-modules.md +1 -1
  183. package/lib/oh-story/skills/story-long-write/references/style-resolution.md +4 -4
  184. package/lib/oh-story/skills/story-long-write/references/tracking-initialization.md +1 -1
  185. package/lib/oh-story/skills/story-long-write/references/tracking-transaction.md +11 -9
  186. package/lib/oh-story/skills/story-long-write/references/workflow-chapter.md +33 -44
  187. package/lib/oh-story/skills/story-long-write/references/workflow-daily.md +18 -51
  188. package/lib/oh-story/skills/story-long-write/references/workflow-outline.md +157 -0
  189. package/lib/oh-story/skills/story-long-write/references/workflow-revision.md +53 -67
  190. package/lib/oh-story/skills/story-long-write/references/workflow-setup.md +112 -251
  191. package/lib/oh-story/skills/story-long-write/references/workflow-volume.md +142 -0
  192. package/lib/oh-story/skills/story-long-write/references/writer-prompt-fallback.md +5 -3
  193. package/lib/oh-story/skills/story-long-write/references/writing-craft.md +18 -56
  194. package/lib/oh-story/skills/story-long-write/scripts/author_memory_commit.py +3 -3
  195. package/lib/oh-story/skills/story-long-write/scripts/build_architect_brief.py +260 -0
  196. package/lib/oh-story/skills/story-long-write/scripts/build_writer_prompt.py +96 -16
  197. package/lib/oh-story/skills/story-long-write/scripts/check-ai-patterns.js +155 -8
  198. package/lib/oh-story/skills/story-long-write/scripts/check-outline-contract.js +101 -14
  199. package/lib/oh-story/skills/story-long-write/scripts/check-outline-copy.js +7 -2
  200. package/lib/oh-story/skills/story-long-write/scripts/outline_view.py +2 -1
  201. package/lib/oh-story/skills/story-long-write/scripts/storyctl.py +250 -50
  202. package/lib/oh-story/skills/story-long-write/scripts/tracking_commit.py +278 -23
  203. package/lib/oh-story/skills/story-long-write/scripts/wordcount_core.py +179 -23
  204. package/lib/oh-story/skills/story-review/SKILL.md +19 -273
  205. package/lib/oh-story/skills/story-review/references/agent-prompts.md +184 -0
  206. package/lib/oh-story/skills/story-review/references/anti-ai-writing.md +1 -1
  207. package/lib/oh-story/skills/story-review/references/author-memory-maintenance.md +75 -0
  208. package/lib/oh-story/skills/story-review/references/author-memory.md +40 -118
  209. package/lib/oh-story/skills/story-review/references/banned-words.md +2 -2
  210. package/lib/oh-story/skills/story-review/references/batch-review.md +19 -0
  211. package/lib/oh-story/skills/story-review/references/character-relations.md +49 -1
  212. package/lib/oh-story/skills/story-review/references/review-quality.md +2 -1
  213. package/lib/oh-story/skills/story-review/references/review-tracking.md +10 -0
  214. package/lib/oh-story/skills/story-review/references/solo.md +52 -0
  215. package/lib/oh-story/skills/story-review/references/style-resolution.md +4 -4
  216. package/lib/oh-story/skills/story-review/references/tracking-initialization.md +1 -1
  217. package/lib/oh-story/skills/story-review/references/tracking-transaction.md +11 -9
  218. package/lib/oh-story/skills/story-review/scripts/author_memory_commit.py +3 -3
  219. package/lib/oh-story/skills/story-review/scripts/check-ai-patterns.js +155 -8
  220. package/lib/oh-story/skills/story-review/scripts/tracking_commit.py +278 -23
  221. package/lib/oh-story/skills/story-review/scripts/wordcount_core.py +179 -23
  222. package/lib/oh-story/skills/story-setup/SKILL.md +69 -458
  223. package/lib/oh-story/skills/story-setup/references/agent-references/agent-quality.md +4 -4
  224. package/lib/oh-story/skills/story-setup/references/agent-references/anti-ai-writing.md +1 -1
  225. package/lib/oh-story/skills/story-setup/references/agent-references/banned-words.md +2 -2
  226. package/lib/oh-story/skills/story-setup/references/agent-references/benchmark-style-load.md +107 -0
  227. package/lib/oh-story/skills/story-setup/references/agent-references/character-relations.md +49 -1
  228. package/lib/oh-story/skills/story-setup/references/agent-references/deslop-gates.md +21 -4
  229. package/lib/oh-story/skills/story-setup/references/agent-references/emotion-on-page.md +116 -0
  230. package/lib/oh-story/skills/story-setup/references/agent-references/emotional-arc-design.md +1 -114
  231. package/lib/oh-story/skills/story-setup/references/agent-references/format-and-structure.md +1 -1
  232. package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards.md +1 -1
  233. package/lib/oh-story/skills/story-setup/references/agent-references/long-genre-catalog.md +1 -1
  234. package/lib/oh-story/skills/story-setup/references/agent-references/long-genre-mechanics.md +3 -3
  235. package/lib/oh-story/skills/story-setup/references/agent-references/long-quality.md +7 -5
  236. package/lib/oh-story/skills/story-setup/references/agent-references/opening-design.md +2 -2
  237. package/lib/oh-story/skills/story-setup/references/agent-references/outline-conflict.md +4 -4
  238. package/lib/oh-story/skills/story-setup/references/agent-references/outline-methods.md +7 -7
  239. package/lib/oh-story/skills/story-setup/references/agent-references/outline-rhythm.md +3 -3
  240. package/lib/oh-story/skills/story-setup/references/agent-references/short-emotional-methods.md +1 -1
  241. package/lib/oh-story/skills/story-setup/references/agent-references/short-genre-formulas.md +0 -15
  242. package/lib/oh-story/skills/story-setup/references/agent-references/short-reversal.md +1 -1
  243. package/lib/oh-story/skills/story-setup/references/agent-references/style-combat-face.md +1 -58
  244. package/lib/oh-story/skills/story-setup/references/agent-references/style-genre-modules.md +1 -1
  245. package/lib/oh-story/skills/story-setup/references/agent-references/style-resolution.md +4 -4
  246. package/lib/oh-story/skills/story-setup/references/agent-references/writing-craft.md +18 -56
  247. package/lib/oh-story/skills/story-setup/references/diagnostics.md +3 -3
  248. package/lib/oh-story/skills/story-short-analyze/SKILL.md +37 -110
  249. package/lib/oh-story/skills/story-short-analyze/references/analysis-character-relations.md +1 -1
  250. package/lib/oh-story/skills/story-short-analyze/references/analysis-method.md +42 -0
  251. package/lib/oh-story/skills/story-short-analyze/references/optional-modules.md +97 -0
  252. package/lib/oh-story/skills/story-short-analyze/references/output-contract.md +9 -47
  253. package/lib/oh-story/skills/story-short-analyze/references/quality-checklist.md +80 -0
  254. package/lib/oh-story/skills/story-short-analyze/references/source-story-quality.md +4 -4
  255. package/lib/oh-story/skills/story-short-analyze/references/stage2-3-structure-emotion.md +308 -0
  256. package/lib/oh-story/skills/story-short-analyze/references/{material-decomposition.md → stage4-6-reversal-summary.md} +303 -374
  257. package/lib/oh-story/skills/story-short-scan/SKILL.md +30 -64
  258. package/lib/oh-story/skills/story-short-scan/references/manual-rank-input.md +36 -0
  259. package/lib/oh-story/skills/story-short-scan/references/platform-dianzhong.md +24 -0
  260. package/lib/oh-story/skills/story-short-scan/references/platform-heiyan.md +21 -0
  261. package/lib/oh-story/skills/story-short-scan/references/topic-match.md +38 -0
  262. package/lib/oh-story/skills/story-short-write/SKILL.md +23 -34
  263. package/lib/oh-story/skills/story-short-write/references/agent-calls.md +13 -0
  264. package/lib/oh-story/skills/story-short-write/references/author-memory-maintenance.md +75 -0
  265. package/lib/oh-story/skills/story-short-write/references/author-memory.md +40 -118
  266. package/lib/oh-story/skills/story-short-write/references/banned-words.md +2 -2
  267. package/lib/oh-story/skills/story-short-write/references/benchmark-recall.md +1 -21
  268. package/lib/oh-story/skills/story-short-write/references/emotional-methods.md +1 -1
  269. package/lib/oh-story/skills/story-short-write/references/genre-writing-formulas.md +0 -15
  270. package/lib/oh-story/skills/story-short-write/references/output-contract.md +9 -47
  271. package/lib/oh-story/skills/story-short-write/references/reference-index.md +17 -49
  272. package/lib/oh-story/skills/story-short-write/references/scene-craft.md +40 -0
  273. package/lib/oh-story/skills/story-short-write/references/short-craft.md +7 -43
  274. package/lib/oh-story/skills/story-short-write/references/short-format.md +3 -3
  275. package/lib/oh-story/skills/story-short-write/references/short-prose-quality.md +2 -1
  276. package/lib/oh-story/skills/story-short-write/references/short-reversal.md +1 -1
  277. package/lib/oh-story/skills/story-short-write/references/style-resolution.md +4 -4
  278. package/lib/oh-story/skills/story-short-write/references/submission-craft.md +1 -1
  279. package/lib/oh-story/skills/story-short-write/references/villain-and-reveal.md +5 -10
  280. package/lib/oh-story/skills/story-short-write/references/workflow-design.md +19 -12
  281. package/lib/oh-story/skills/story-short-write/references/workflow-draft.md +22 -32
  282. package/lib/oh-story/skills/story-short-write/references/workflow-revision.md +84 -17
  283. package/lib/oh-story/skills/story-short-write/references/writing-workflow.md +7 -119
  284. package/lib/oh-story/skills/story-short-write/scripts/author_memory_commit.py +3 -3
  285. package/lib/oh-story/skills/story-short-write/scripts/check-ai-patterns.js +155 -8
  286. package/lib/oh-story/skills/story-short-write/scripts/check-outline-copy.js +7 -2
  287. package/lib/types/client/video-studio.d.ts.map +1 -1
  288. package/lib/types/native-hooks.d.ts +2 -2
  289. package/lib/types/native-hooks.d.ts.map +1 -1
  290. package/lib/types/role-tool.d.ts.map +1 -1
  291. package/lib/types/skill-provider.d.ts.map +1 -1
  292. package/lib/types/video-project.d.ts.map +1 -1
  293. package/lib/types/workspace-route.d.ts.map +1 -1
  294. package/lib/video-recap/CHANGELOG.md +60 -1
  295. package/lib/video-recap/README.en.md +348 -137
  296. package/lib/video-recap/README.md +340 -136
  297. package/lib/video-recap/manifest.json +406 -251
  298. package/lib/video-recap/skills/video-assemble/SKILL.md +30 -15
  299. package/lib/video-recap/skills/video-assemble/references/audio-modes.md +63 -0
  300. package/lib/video-recap/skills/video-assemble/references/explicit-audio-mix.md +75 -0
  301. package/lib/video-recap/skills/video-assemble/references/foreground-compose.md +118 -0
  302. package/lib/video-recap/skills/video-assemble/references/narration-adoption.md +103 -0
  303. package/lib/video-recap/skills/video-assemble/references/packaging.md +45 -0
  304. package/lib/video-recap/skills/video-assemble/references/pair-media.md +74 -0
  305. package/lib/video-recap/skills/video-assemble/references/source-score.md +147 -0
  306. package/lib/video-recap/skills/video-assemble/references/subtitle-track.md +202 -0
  307. package/lib/video-recap/skills/video-assemble/scripts/adoption/__init__.py +1 -0
  308. package/lib/video-recap/skills/video-assemble/scripts/adoption/audio_mix_binding.py +279 -0
  309. package/lib/video-recap/skills/video-assemble/scripts/adoption/frozen_audio.py +187 -0
  310. package/lib/video-recap/skills/video-assemble/scripts/adoption/narration_binding.py +323 -0
  311. package/lib/video-recap/skills/video-assemble/scripts/adoption/strict_inputs.py +109 -0
  312. package/lib/video-recap/skills/video-assemble/scripts/adoption/strict_publish.py +130 -0
  313. package/lib/video-recap/skills/video-assemble/scripts/artifacts.py +10 -46
  314. package/lib/video-recap/skills/video-assemble/scripts/assemble.py +378 -119
  315. package/lib/video-recap/skills/video-assemble/scripts/assemble_constants.py +29 -12
  316. package/lib/video-recap/skills/video-assemble/scripts/assembly_contract.py +95 -44
  317. package/lib/video-recap/skills/video-assemble/scripts/assembly_settings.py +75 -32
  318. package/lib/video-recap/skills/video-assemble/scripts/audio_mix.py +11 -11
  319. package/lib/video-recap/skills/video-assemble/scripts/compose_foreground.py +293 -0
  320. package/lib/video-recap/skills/video-assemble/scripts/export_jianying.py +71 -78
  321. package/lib/video-recap/skills/video-assemble/scripts/jianying/__init__.py +1 -0
  322. package/lib/video-recap/skills/video-assemble/scripts/{jianying_builders.py → jianying/builders.py} +39 -67
  323. package/lib/video-recap/skills/video-assemble/scripts/{jianying_model.py → jianying/model.py} +3 -11
  324. package/lib/video-recap/skills/video-assemble/scripts/{jianying_optional.py → jianying/optional.py} +1 -1
  325. package/lib/video-recap/skills/video-assemble/scripts/jianying/schema.py +53 -0
  326. package/lib/video-recap/skills/video-assemble/scripts/{jianying_templates.py → jianying/templates.py} +1 -1
  327. package/lib/video-recap/skills/video-assemble/scripts/{jianying_timeline_contract.py → jianying/timeline_contract.py} +34 -13
  328. package/lib/video-recap/skills/video-assemble/scripts/{jianying_writer.py → jianying/writer.py} +7 -17
  329. package/lib/video-recap/skills/video-assemble/scripts/lib.py +37 -4
  330. package/lib/video-recap/skills/video-assemble/scripts/media.py +12 -21
  331. package/lib/video-recap/skills/video-assemble/scripts/narration_audio.py +64 -34
  332. package/lib/video-recap/skills/video-assemble/scripts/packaging.py +122 -0
  333. package/lib/video-recap/skills/video-assemble/scripts/pair_media.py +216 -0
  334. package/lib/video-recap/skills/video-assemble/scripts/render_preflight.py +1 -3
  335. package/lib/video-recap/skills/video-assemble/scripts/source_score.py +469 -0
  336. package/lib/video-recap/skills/video-assemble/scripts/source_subtitles.py +25 -9
  337. package/lib/video-recap/skills/video-assemble/scripts/subtitles/__init__.py +1 -0
  338. package/lib/video-recap/skills/video-assemble/scripts/{subtitle_core.py → subtitles/core.py} +13 -6
  339. package/lib/video-recap/skills/video-assemble/scripts/{subtitle_render.py → subtitles/render.py} +5 -4
  340. package/lib/video-recap/skills/video-assemble/scripts/subtitles/track.py +324 -0
  341. package/lib/video-recap/skills/video-assemble/scripts/subtitles/track_binding.py +200 -0
  342. package/lib/video-recap/skills/video-assemble/scripts/timeline.py +30 -46
  343. package/lib/video-recap/skills/video-assemble/scripts/timeline_emit.py +91 -7
  344. package/lib/video-recap/skills/video-assemble/scripts/visual_render.py +22 -8
  345. package/lib/video-recap/skills/video-cut/SKILL.md +34 -16
  346. package/lib/video-recap/skills/video-cut/references/shot-review.md +50 -0
  347. package/lib/video-recap/skills/video-cut/scripts/cut.py +2 -28
  348. package/lib/video-recap/skills/video-cut/scripts/cut_cli.py +58 -62
  349. package/lib/video-recap/skills/video-cut/scripts/cut_contract.py +21 -106
  350. package/lib/video-recap/skills/video-cut/scripts/cut_render.py +14 -9
  351. package/lib/video-recap/skills/video-cut/scripts/lib.py +39 -0
  352. package/lib/video-recap/skills/video-cut/scripts/narration_mapping.py +2 -155
  353. package/lib/video-recap/skills/video-cut/scripts/narrative_selection.py +244 -0
  354. package/lib/video-recap/skills/video-cut/scripts/shot_review.py +357 -0
  355. package/lib/video-recap/skills/video-recap/SKILL.md +86 -42
  356. package/lib/video-recap/skills/video-recap/references/audio-routing.md +126 -0
  357. package/lib/video-recap/skills/video-recap/references/config-playbook.md +12 -8
  358. package/lib/video-recap/skills/video-recap/references/data-schema.md +44 -33
  359. package/lib/video-recap/skills/video-recap/references/resource-library.md +151 -0
  360. package/lib/video-recap/skills/video-recap/references/shift-left-qc-schema.md +1 -1
  361. package/lib/video-recap/skills/video-recap/scripts/doctor.py +123 -30
  362. package/lib/video-recap/skills/video-recap/scripts/final_qc.py +22 -75
  363. package/lib/video-recap/skills/video-recap/scripts/lib.py +3 -3
  364. package/lib/video-recap/skills/video-recap/scripts/library.py +509 -0
  365. package/lib/video-recap/skills/video-recap/scripts/materials.py +63 -91
  366. package/lib/video-recap/skills/video-recap/scripts/mimo_qc.py +8 -70
  367. package/lib/video-recap/skills/video-recap/scripts/project_binding.py +286 -0
  368. package/lib/video-recap/skills/video-recap/scripts/qc/__init__.py +1 -0
  369. package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_client.py → qc/mimo_client.py} +1 -1
  370. package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_evidence.py → qc/mimo_evidence.py} +33 -66
  371. package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_observations.py → qc/mimo_observations.py} +3 -11
  372. package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_payload.py → qc/mimo_payload.py} +4 -7
  373. package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_report.py → qc/mimo_report.py} +17 -28
  374. package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_runner.py → qc/mimo_runner.py} +2 -2
  375. package/lib/video-recap/skills/video-recap/scripts/qc_contract.py +0 -19
  376. package/lib/video-recap/skills/video-recap/scripts/recap_cli.py +119 -50
  377. package/lib/video-recap/skills/video-recap/scripts/recap_inspect.py +32 -114
  378. package/lib/video-recap/skills/video-recap/scripts/recap_review.py +9 -23
  379. package/lib/video-recap/skills/video-recap/scripts/recap_runner.py +387 -334
  380. package/lib/video-recap/skills/video-recap/scripts/recap_runtime.py +23 -23
  381. package/lib/video-recap/skills/video-recap/scripts/recap_source.py +278 -0
  382. package/lib/video-recap/skills/video-recap/scripts/recap_stage_qc.py +25 -12
  383. package/lib/video-recap/skills/video-recap/scripts/recap_timeline.py +59 -52
  384. package/lib/video-recap/skills/video-recap/scripts/resource_lock.py +162 -0
  385. package/lib/video-recap/skills/video-script/SKILL.md +16 -13
  386. package/lib/video-recap/skills/video-script/references/creative-editing-playbook.md +9 -5
  387. package/lib/video-recap/skills/video-script/references/promotional-copy.md +68 -0
  388. package/lib/video-recap/skills/video-script/references/research-guide.md +1 -1
  389. package/lib/video-recap/skills/video-script/scripts/evidence_bundle.py +24 -76
  390. package/lib/video-recap/skills/video-script/scripts/lib.py +10 -87
  391. package/lib/video-recap/skills/video-script/scripts/narration_lint.py +63 -39
  392. package/lib/video-recap/skills/video-script/scripts/review.py +0 -2
  393. package/lib/video-recap/skills/video-script/scripts/review_grounding.py +35 -59
  394. package/lib/video-recap/skills/video-script/scripts/review_response.py +66 -128
  395. package/lib/video-recap/skills/video-script/scripts/review_runner.py +12 -20
  396. package/lib/video-recap/skills/video-script/scripts/speech_ownership.py +4 -4
  397. package/lib/video-recap/skills/video-script/scripts/validate.py +53 -42
  398. package/lib/video-recap/skills/video-understanding/SKILL.md +6 -4
  399. package/lib/video-recap/skills/video-understanding/references/data-schema.md +50 -156
  400. package/lib/video-recap/skills/video-understanding/references/research-guide.md +4 -4
  401. package/lib/video-recap/skills/video-understanding/scripts/asr.py +85 -65
  402. package/lib/video-recap/skills/video-understanding/scripts/asr_timing_evidence.py +270 -0
  403. package/lib/video-recap/skills/video-understanding/scripts/brief.py +2 -5
  404. package/lib/video-recap/skills/video-understanding/scripts/briefing/__init__.py +1 -0
  405. package/lib/video-recap/skills/video-understanding/scripts/{agent_brief.py → briefing/builder.py} +38 -35
  406. package/lib/video-recap/skills/{video-script/scripts/brief_context.py → video-understanding/scripts/briefing/context.py} +4 -35
  407. package/lib/video-recap/skills/{video-script/scripts/brief_inputs.py → video-understanding/scripts/briefing/inputs.py} +9 -31
  408. package/lib/video-recap/skills/video-understanding/scripts/{brief_timeline.py → briefing/timeline.py} +5 -6
  409. package/lib/video-recap/skills/video-understanding/scripts/consolidate.py +65 -116
  410. package/lib/video-recap/skills/video-understanding/scripts/detect.py +31 -40
  411. package/lib/video-recap/skills/video-understanding/scripts/lib.py +30 -86
  412. package/lib/video-recap/skills/video-understanding/scripts/narration_lint.py +63 -39
  413. package/lib/video-recap/skills/video-understanding/scripts/speech_ownership.py +4 -4
  414. package/lib/video-recap/skills/video-understanding/scripts/storyboard.py +17 -79
  415. package/lib/video-recap/skills/video-understanding/scripts/understanding_brief.py +14 -40
  416. package/lib/video-recap/skills/video-understanding/scripts/understanding_cache.py +64 -46
  417. package/lib/video-recap/skills/video-understanding/scripts/understanding_runner.py +31 -11
  418. package/lib/video-recap/skills/video-understanding/scripts/understanding_storyboard.py +19 -14
  419. package/lib/video-recap/skills/video-understanding/scripts/vlm.py +80 -108
  420. package/lib/video-recap/skills/video-voiceover/SKILL.md +29 -19
  421. package/lib/video-recap/skills/video-voiceover/references/index-tts.md +31 -0
  422. package/lib/video-recap/skills/video-voiceover/scripts/approved_text_policy.py +123 -0
  423. package/lib/video-recap/skills/video-voiceover/scripts/dub.py +51 -59
  424. package/lib/video-recap/skills/video-voiceover/scripts/lib.py +8 -44
  425. package/lib/video-recap/skills/video-voiceover/scripts/providers/__init__.py +1 -0
  426. package/lib/video-recap/skills/video-voiceover/scripts/providers/index_tts.py +184 -0
  427. package/lib/video-recap/skills/video-voiceover/scripts/voiceover.py +212 -134
  428. package/package.json +41 -41
  429. package/lib/oh-story/skills/story-long-analyze/references/material-decomposition.md +0 -538
  430. package/lib/oh-story/skills/story-long-analyze/references/output-templates.md +0 -603
  431. package/lib/oh-story/skills/story-long-scan/references/scan-output-format.md +0 -207
  432. package/lib/oh-story/skills/story-short-analyze/references/output-templates.md +0 -561
  433. package/lib/video-recap/skills/video-assemble/scripts/jianying_schema.py +0 -98
  434. package/lib/video-recap/skills/video-recap/references/creative-editing-playbook.md +0 -225
  435. package/lib/video-recap/skills/video-recap/references/research-guide.md +0 -74
  436. package/lib/video-recap/skills/video-recap/references/timeline-and-jianying.md +0 -250
  437. package/lib/video-recap/skills/video-script/scripts/agent_brief.py +0 -399
  438. package/lib/video-recap/skills/video-script/scripts/brief_timeline.py +0 -327
  439. package/lib/video-recap/skills/video-script/scripts/narration.py +0 -12
  440. package/lib/video-recap/skills/video-understanding/scripts/brief_context.py +0 -348
  441. package/lib/video-recap/skills/video-understanding/scripts/brief_inputs.py +0 -290
  442. /package/lib/video-recap/skills/video-assemble/scripts/{jianying_tracks.py → jianying/tracks.py} +0 -0
  443. /package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_contract.py → qc/mimo_contract.py} +0 -0
  444. /package/lib/video-recap/skills/video-voiceover/scripts/{fish_audio.py → providers/fish_audio.py} +0 -0
@@ -91,7 +91,7 @@ python3 {技能目录}/scripts/project_tool.py set-authority <project> \
91
91
  --decision-ref "创作者决策/production-profile.jsonl#CD-H3"
92
92
  ```
93
93
 
94
- 各字段取值由命中的模型方言给出:`$short-drama-video-prompts` 的 MiniMax H3 / Seedance 方言文件都写了
94
+ 各字段取值由命中的模型方言给出:`$short-drama-video-prompts` 的 MiniMax H3 / Seedance / Wan 3.0 方言文件都写了
95
95
  推荐档案。写完用 `status` 复核 `video_model_profile` 是否已经出现。
96
96
 
97
97
  项目定位与安全写入见 [运行预检](references/runtime-preflight.md)。用户明确要求 Dashboard 时运行:
@@ -112,13 +112,25 @@ python3 {技能目录}/scripts/dashboard_server.py --workspace <workspace> --sto
112
112
  同一 workspace 已有在跑的 Dashboard 时,再次启动只会打印同一个链接,不再开第二个端口;确实要换
113
113
  端口或换令牌时加 `--restart`。不加 `--detach` 时行为不变:前台运行,Ctrl-C 结束。
114
114
 
115
- Dashboard 展示和编辑创作文件,不负责工作流编排或媒体生产。
115
+ Dashboard 按阶段展示项目:全剧页给出下一步和分集进度,每集分剧本、设定、分镜、提示词、成片、审查
116
+ 六个视图,⌘K 搜索全剧。结构视图只读,改动在「编辑原文」里保存 Markdown。画面只认文档里的绑定:
117
+ 缩略图是分镜里 `用途:起始帧` 的 `REF-...`,每镜素材是剪辑单的「来源」,成片是剪辑输出;没有绑定
118
+ 就显示空位,不按文件名配图。它不负责工作流编排或媒体生产,需要写作或生成的地方只复制一句请求交回对话。
119
+ 每集目标时长取自 `status` 的 `format`,节奏对照只用已接受的 `rhythm_profile`。
116
120
 
117
121
  ## 项目级创作决定
118
122
 
119
123
  制作形态、视觉方向、播放面和集长目标确实约束多个阶段时,展示选择及影响后由用户决定。
120
124
  Look Development 是可选分支,不是进入图片提示词或分镜的固定门槛。
121
125
 
126
+ 节奏数值(首钩秒数、情绪触点间隔、反转次数、VO 占比、平均镜长等)住在
127
+ `creator_authority.rhythm_profile`。字段与默认值由 `$short-drama-develop` 按制作形态提出,
128
+ 创作者接受或改写后,按上文三步写入:决策的 `accepted_value` 是完整档案对象,`--field`
129
+ 写 `/creator_authority/rhythm_profile`;档案已接受后,单改一个值时 `--field` 指向该字段。
130
+ `set-authority` 只校验类型与范围,缺字段、越界或多出未知字段都拒绝写入。下游只按 `status` 为 `accepted` 的档案做算术核对,缺失、`unset` 或
131
+ `proposed` 都表示「未声明,不核对」。写完用 `status` 复核 `rhythm_profile`;手改后档案不合法时
132
+ 它返回空档案,问题列在 `rhythm_profile_problems`。
133
+
122
134
  按问题只读取一份相关知识:
123
135
 
124
136
  - 规则分级与 owner 路由:[规则与路由索引](references/knowhow-index.md)
@@ -31,6 +31,9 @@
31
31
  "aspect": null,
32
32
  "overlay_regions": [],
33
33
  "source_ref": null
34
+ },
35
+ "rhythm_profile": {
36
+ "status": "unset"
34
37
  }
35
38
  }
36
39
  }
@@ -56,6 +56,7 @@
56
56
  - 时长:4s
57
57
  - 目的:先让观众看见他不敢进门,再揭示门内争吵。
58
58
  - 景别/机位:中近景,门框外侧,轻微低机位。
59
+ - 运镜:固定;他收手的那一下要自己被看见,机位不抢。
59
60
  - 起点:江辰右手悬在门把上方。
60
61
  - 唯一动作:门内玻璃落地声触发江辰收回右手,视线从门把转向门缝。
61
62
  - 终点:江辰右手垂回身侧,视线落在门缝。
@@ -67,6 +68,8 @@
67
68
  > 按项目提示词语言编写的冻结瞬间正文……
68
69
  ```
69
70
 
71
+ 「运镜」写行为和理由,固定也要写理由,如「运镜:固定;这句话没有落到谁身上」。
72
+
70
73
  只写有镜头职责的镜头。关键帧提示词必须与该镜“起点”一致;终点才出现的文字、动作或状态不得
71
74
  提前进入静帧,也不要把整段动作塞进静帧。
72
75
 
@@ -22,27 +22,38 @@
22
22
  | 故事承诺与冲突引擎 | `$short-drama-develop` | 从点子建立可持续压力与回报 | 不用题材词直接生成剧情 |
23
23
  | 单集契约与集尾交接 | `$short-drama-develop` | 规划进入状态、局部结果与出去压力 | 不代替剧本场景执行 |
24
24
  | 单元里被反复运行的机制与耗尽 | `$short-drama-develop` | 单元故事靠同一套机制反复兑现,或中段开始重复、越写越薄 | 不规定运行次数与换代位置;不替单集决定怎么写 |
25
+ | 爽点排名与开篇替换点 | `$short-drama-novel-analyze` | 选段与切候选集之前,按观众收益给全书情节点排名 | 排名是候选;从哪里开篇、提前哪段由创作者与 develop 定 |
26
+ | 项目节奏档案 | `$short-drama-develop` | 按制作形态提出首钩、触点间隔、反转、VO 占比、镜长等项目数值 | 只提起点值;创作者接受后下游只做算术核对,未声明不核对 |
25
27
  | 单集容量可行性 | `$short-drama-develop` | 进入场景化前估算各集镜头与时长量级 | 用项目自身比例,不设跨项目门槛,不阻断交付 |
26
28
  | 连载人物与恢复记忆 | `$short-drama-develop` | 跨集人物策略、信息权限与铺垫债务较重 | 单场任务不必建立全量记忆 |
27
29
  | 长材料改编 | `$short-drama-develop` | 压缩、合并或把说明转成屏幕载体 | 不复制原句或文风到新剧本 |
30
+ | 改编守住人物与新增登记 | `$short-drama-develop` | 改编时想新增人物、场景或对手,或想改一个原著人物的立场与关系 | 核心人物立场、核心关系与主线不改;新增登记为 `add` 交创作者确认 |
28
31
  | 题材条件与钩子 | `$short-drama-develop` | 需要按压力机制比较题材写法 | 不把案例节拍、数字或标签当公式 |
29
32
  | 单题材执行细节 | `$short-drama-develop` | 已确定题材、要落到场面颗粒与打法 | 一次只读一张卡;卡片不产生可阻断约束 |
30
33
  | 前提装置(先知或外部授权) | `$short-drama-develop` | 主角带着已知结果开局,或获得一套外部规则给的能力 | 装置叠加在题材之上,不替代题材卡,也不新建题材 |
31
34
  | 单形态执行细节 | `$short-drama` | 已确定制作形态、要按表定位一张形态卡 | 一次只读一张卡;形态不改写身份与地理 |
32
35
  | Look Development 与风格帧 | `$short-drama` | 把视觉方向变成人物、地点和高压力代表帧的可观察规则 | `$short-drama-image-prompts` 只投影提示词;风格不接管身份、地理或剧情 |
33
36
  | 场景与可表演行动 | `$short-drama-write` | 把单集节拍落实成场景 | 不决定分镜景别和运镜 |
37
+ | 开场第一拍 | `$short-drama-write` | 写每集第一段动作描写,也就是观众开场第一帧的画面 | 静止画面自己能提出问题也算;不规定第一拍必须动 |
34
38
  | 对白行动与人物声音 | `$short-drama-write` | 写、改或诊断对白 | 不按句长、口癖数量判权力 |
35
39
  | 多人场次的可辨识度与主角缺席场 | `$short-drama-write` | 一场里人多到分不清谁在与谁交手,或某场/某集不给主角 | 不决定站位、景别与镜头切换;那属于分镜 |
36
40
  | 场次声音戏剧 | `$short-drama-write` | 声源、留白或 sound bridge 承担故事信息与压力 | 不替逐镜实现或混音,不让配乐替代表演 |
37
41
  | 剧本生产标签 | `$short-drama-write` | 规范化对白、动作、VO/OS、文字与连续性 | 不借格式补造剧情 |
42
+ | 节奏档案落地 | `$short-drama-write` | 项目已接受节奏档案,要让首钩、触点间隔、有对手的反转与集尾落在档案数值内 | 只读档案、不改档案;数值是上下限不是节拍模板;未接受不核对 |
43
+ | 旁白占比与能演的不说 | `$short-drama-write` | 旁白复述已演出的信息、内心独白过多,或痛点只被说出没被演出 | 占比只按已接受档案核对 |
44
+ | 对白初稿回读删句 | `$short-drama-write` | 对白初稿写完回读,删掉不承担动作或冲突、演不出来的句子 | 不修剪创作者提供的原文 |
38
45
  | 有限行动单位与精确时限 | `$short-drama-write` | 题面明确给出可核对的次数、轮次、节拍或字面死线 | 按完成状态与题面约定检查,不把定性压力升级为数字或主动增加计数结构 |
39
46
  | 资产出现证据 | `$short-drama-assets` | 从剧本拆角色、地点、道具与状态 | 不用名词/人名匹配直接建资产 |
40
47
  | 身份、变体与复用 | `$short-drama-assets` | 决定复用、新变体、新身份或未决 | 相机角度通常不是资产变体 |
41
48
  | 原著自带的真实品牌与现实实体 | `$short-drama-assets` | 剧本沿用了原著专名,且该专名指向现实存在的品牌、商标、机构或人物 | 不判断合规、不给禁令、不内置清单;只把选择交给创作者并留痕 |
49
+ | 时代锚点 | `$short-drama-assets` | 定项目时代,或场所、设备、制服要落到某个年代的形制 | 时代从原著事实定;旧、老式、复古要有原著依据或创作者选择 |
42
50
  | 资产图片提示词 | `$short-drama-image-prompts` | 把已接受资产投影为单帧可见规格 | 不承载有先后顺序的剧情动作 |
43
51
  | 场景板光线与跨 View 一致 | `$short-drama-image-prompts` | 同一地点要拆多个观察方向、且这些板会被互相剪接 | 朝向造成的逆光/落影差异不需拉平 |
44
52
  | 图片提示词定点修改 | `$short-drama-image-prompts` | 修改局部并冻结 preserve set | 不把重写整图伪装成局部编辑 |
45
53
  | 镜头目的与覆盖 | `$short-drama-storyboard` | 从剧本建立有动机的镜头 | 不为景别多样性硬拆镜 |
54
+ | 逐镜运镜 | `$short-drama-storyboard` | 每镜决定摄影机动不动、怎么动、为什么 | 按本镜目的选,固定也写出来;执行端术语归视频提示词方言 |
55
+ | 镜长推导与对白覆盖 | `$short-drama-storyboard` | 定镜长,决定一句台词给说话人还是听者、要不要反应镜与正反打 | 镜长不按剧本字数折算;平均镜长是场级目标,不是逐镜配额 |
56
+ | 峰值强调与冲击重复 | `$short-drama-storyboard` | 情绪爆发或重大反转要推近、定格、闪白,或把同一关键动作从两三个角度重复 | 只用在峰值;冲击重复要声明主镜,状态只变一次 |
46
57
  | 场次视觉计划与 Coverage Audition | `$short-drama-storyboard` | 关键场次需先比较观众立场、信息时机、空间、摄影与声音运动 | 可选中间层,不拥有剧本事实或 shot 边界,不规定宫格/镜头数 |
47
58
  | 冻结关键帧 | `$short-drama-storyboard` | 写镜头起点的可冻结瞬间 | 不写动作链或镜头终态 |
48
59
  | 漫剧关键帧视觉词表 | `$short-drama-storyboard` | 视觉方向已接受为漫剧/二维漫画形态,要为关键帧稳定投影共享画风与当前可读性约束 | 全部是 `taste_option` 选项,不设质量门槛,不替代身份、地理与边界事实 |
@@ -51,12 +62,16 @@
51
62
  | 交付容器与分段算术 | `$short-drama-video-prompts` | 项目声明了分段或多镜打包的交付方式 | 打包方式不改写镜头边界与可审查性 |
52
63
  | 交付路由与执行触发词 | `$short-drama-video-prompts` | 项目声明了逐镜以外的路由,或某路由要求固定字样 | 触发词与路由都由创作者档案声明,本套件不自造字样,续接不产生第二个起点权威 |
53
64
  | 表演动作与时长 | `$short-drama-video-prompts` | 动作、台词与落点可能超载 | 不用每秒动作数设通用阈值 |
65
+ | 表演强度按形态与题材 | `$short-drama-video-prompts` | 导演没定表演强度,漫剧或爽文峰值需要外放、AI 真人需要可读的表演 | 仍写成常见的全身动作,不让剧情压在微表情上 |
54
66
  | 摄影机、声音与相连边界 | `$short-drama-video-prompts` | 写运镜、环境运动、口型或声音方向 | 不添加无来源的音乐/事件 |
55
67
  | 目标执行端能力档案 | `$short-drama-video-prompts` | 执行端的时长、参考方式、声音同轨或长度上限会改变正文写法 | 能力由创作者声明不由推断;不内置模型清单,不因收敛改写已接受边界 |
56
68
  | 跨场与跨镜连续性 | `$short-drama-assets` | 状态变化会传给下一场/镜/集 | 不复制整本 设定集 到每镜 |
57
69
  | 跨镜可见事实上锁 | `$short-drama-assets` | 服装、道具的颜色/材质在镜与镜之间漂移,参考图管不到 | 锁不变事实,不锁状态、姿势与镜头瞬态;锁面不替创作者选颜色 |
58
70
  | 制作形态翻译 | `$short-drama` | 把实拍、二维、三维、水墨等方向投影到各阶段 | 风格名或模型代码不是生产决策 |
59
71
  | 独立证据审查 | `$short-drama-review` | 冻结目标后写 finding 与 verdict | reviewer 不编辑 owner 来源 |
72
+ | 节奏档案算术核对 | `$short-drama-review` | 项目已接受节奏档案,要按档案数值核对单集 | 只做已接受值上的算术,偏差不阻断;不拿别的项目或套件数字比较 |
73
+ | 三道局部检查 | `$short-drama-review` | 整集通读之外,分别只读开场、结尾与中段,看钩子、悬念与反转密度 | 每道只读自己那一段,不替代整集判断 |
74
+ | 只打补丁与被删强钩子回收 | `$short-drama-review` | 提修改要求,或润色删掉了强钩子、兑现台词或喜剧反应 | 修改是带保留集的定点补丁,不整集重写 |
60
75
  | 项目生产观察与校准 | `$short-drama-review` | 有授权文字观察且需定位到准确 prompt/spec/reference/config | 只在当前项目和版本有效;未观察结果保持未知 |
61
76
  | 结果处置判断 | `$short-drama-review` | 已有诊断,要决定保留、后期、局部编辑、重新提交还是改写 | 处置先于修订;重复提交同一文本与追加形容词都不算修复 |
62
77
  | 模板感诊断 | `$short-drama-review` | 至少两个位置出现同构机制或表达损失 | 不用禁词或单次类型惯例定罪 |
@@ -120,6 +120,23 @@ PACING_POINTER = "/format/pacing"
120
120
  # are read by the write stage to turn a screenplay into seconds, so leaving them
121
121
  # out of set-authority left hand-editing short-drama.json as the only way in.
122
122
  FORMAT_POINTERS = (EPISODE_LENGTH_POINTER, PACING_POINTER)
123
+ RHYTHM_PROFILE_TOKENS = [AUTHORITY_ROOT_TOKEN, "rhythm_profile"]
124
+ # The project rhythm profile: what develop proposes and the creator accepts, so
125
+ # that later stages can do arithmetic on accepted numbers. Only types and ranges
126
+ # are checked here; which values suit a project is the creator's call.
127
+ RHYTHM_PROFILE_FORMS = ("ai_live_action", "motion_comic")
128
+ RHYTHM_PROFILE_FIELDS = {
129
+ "form": "form",
130
+ "first_hook_seconds": "seconds",
131
+ "beat_interval_seconds_max": "seconds",
132
+ "opposed_reversals_per_episode_min": "count",
133
+ "end_on_peak": "boolean",
134
+ "reprise_previous_last_beat": "boolean",
135
+ "vo_share_max": "share",
136
+ "target_avg_shot_seconds": "seconds",
137
+ "close_shot_share_min": "share",
138
+ "first_major_payoff_by_episode": "episode",
139
+ }
123
140
 
124
141
  class ProjectConflictError(RuntimeError):
125
142
  """A file changed while a guarded operation was in progress."""
@@ -258,6 +275,96 @@ def project_video_model_profile(project: Mapping[str, Any]) -> dict[str, Any]:
258
275
  return {field: choices[field] for field in fields if field in choices}
259
276
 
260
277
 
278
+ def project_format(project: Mapping[str, Any]) -> dict[str, Any]:
279
+ """The episode shape the creator set: count, length and frame.
280
+
281
+ Only well-formed values are reported, so a reader can do arithmetic on
282
+ them without re-validating; anything else in the format block (pacing
283
+ rates, prompt language) is working detail the status does not repeat.
284
+ """
285
+ block = project.get("format")
286
+ if not isinstance(block, Mapping):
287
+ return {}
288
+ result: dict[str, Any] = {}
289
+ count = block.get("episode_count")
290
+ if isinstance(count, int) and not isinstance(count, bool) and count > 0:
291
+ result["episode_count"] = count
292
+ seconds = block.get("target_seconds_per_episode")
293
+ if (
294
+ isinstance(seconds, (int, float))
295
+ and not isinstance(seconds, bool)
296
+ and math.isfinite(seconds)
297
+ and seconds > 0
298
+ ):
299
+ result["target_seconds_per_episode"] = seconds
300
+ ratio = block.get("aspect_ratio")
301
+ if isinstance(ratio, str) and ratio.strip():
302
+ result["aspect_ratio"] = ratio.strip()
303
+ return result
304
+
305
+
306
+ def rhythm_profile_problems(profile: Any) -> list[str]:
307
+ """Type and range problems in a rhythm profile block; empty when usable.
308
+
309
+ A profile is complete or it is not a profile: a downstream stage doing
310
+ arithmetic on it cannot tell a field left out from a field meant as zero.
311
+ """
312
+ if not isinstance(profile, Mapping):
313
+ return ["rhythm_profile must be an object"]
314
+ problems: list[str] = []
315
+ for name in sorted(set(profile) - set(RHYTHM_PROFILE_FIELDS) - {"status"}):
316
+ problems.append(
317
+ f"rhythm_profile has no field {name}; fields are "
318
+ f"{', '.join(RHYTHM_PROFILE_FIELDS)}"
319
+ )
320
+ for name, kind in RHYTHM_PROFILE_FIELDS.items():
321
+ if name not in profile:
322
+ problems.append(f"rhythm_profile.{name} is missing")
323
+ continue
324
+ value = profile[name]
325
+ number = isinstance(value, (int, float)) and not isinstance(value, bool)
326
+ whole = isinstance(value, int) and not isinstance(value, bool)
327
+ if kind == "form":
328
+ ok = value in RHYTHM_PROFILE_FORMS
329
+ expected = " or ".join(RHYTHM_PROFILE_FORMS)
330
+ elif kind == "boolean":
331
+ ok = isinstance(value, bool)
332
+ expected = "true or false"
333
+ elif kind == "seconds":
334
+ ok = number and math.isfinite(value) and value > 0
335
+ expected = "a positive number of seconds"
336
+ elif kind == "share":
337
+ ok = number and 0 <= value <= 1
338
+ expected = "a share between 0 and 1"
339
+ elif kind == "count":
340
+ ok = whole and value >= 0
341
+ expected = "a whole number of 0 or more"
342
+ else:
343
+ ok = whole and value >= 1
344
+ expected = "an episode number of 1 or more"
345
+ if not ok:
346
+ problems.append(f"rhythm_profile.{name} must be {expected}, not {value!r}")
347
+ return problems
348
+
349
+
350
+ def project_rhythm_profile(project: Mapping[str, Any]) -> tuple[dict[str, Any], list[str]]:
351
+ """The accepted rhythm profile values and the problems that void them.
352
+
353
+ A missing, unset or merely proposed profile is undeclared: nothing
354
+ downstream checks against it. An accepted profile that no longer passes
355
+ validation (a hand edit) is reported with its problems and declares
356
+ nothing either, since arithmetic on a bad value is a wrong number.
357
+ """
358
+ authority = project.get("creator_authority")
359
+ profile = authority.get("rhythm_profile") if isinstance(authority, Mapping) else None
360
+ if not isinstance(profile, Mapping) or profile.get("status") != "accepted":
361
+ return {}, []
362
+ problems = rhythm_profile_problems(profile)
363
+ if problems:
364
+ return {}, problems
365
+ return {name: profile[name] for name in RHYTHM_PROFILE_FIELDS}, []
366
+
367
+
261
368
  def initialize_project(
262
369
  path: Path,
263
370
  *,
@@ -911,6 +1018,7 @@ def _build_status(
911
1018
  ownership[output] = owner
912
1019
  languages = project_languages(project)
913
1020
  video_model_profile = project_video_model_profile(project)
1021
+ rhythm_profile, rhythm_problems = project_rhythm_profile(project)
914
1022
  return {
915
1023
  "project_id": project.get("project_id"),
916
1024
  "title": project.get("title"),
@@ -918,6 +1026,9 @@ def _build_status(
918
1026
  "prompt_language": languages["prompt_language"],
919
1027
  "video_prompt_language": languages["video_prompt_language"],
920
1028
  "video_model_profile": video_model_profile,
1029
+ "format": project_format(project),
1030
+ "rhythm_profile": rhythm_profile,
1031
+ "rhythm_profile_problems": rhythm_problems,
921
1032
  "project_root": project_root,
922
1033
  "last_action": state.get("last_action"),
923
1034
  "layout": dict(layout),
@@ -1548,7 +1659,27 @@ def set_creator_authority(
1548
1659
  project = json.loads(project_path.read_text(encoding="utf-8"))
1549
1660
  if not isinstance(project, dict):
1550
1661
  raise ValueError("project manifest must be an object")
1662
+ rhythm = tokens[:2] == RHYTHM_PROFILE_TOKENS
1663
+ authority = project.get(AUTHORITY_ROOT_TOKEN)
1664
+ if rhythm and len(tokens) > 2:
1665
+ # Writing one field accepts the block it sits in, so a leaf write
1666
+ # into a proposed or unset profile would promote numbers nobody
1667
+ # accepted. A single value can only change an accepted profile.
1668
+ current = authority.get("rhythm_profile") if isinstance(authority, dict) else None
1669
+ if not isinstance(current, Mapping) or current.get("status") != "accepted":
1670
+ raise ValueError(
1671
+ "rhythm_profile is not accepted; accept the whole profile "
1672
+ "before changing one of its fields"
1673
+ )
1674
+ if rhythm and isinstance(authority, dict) and "rhythm_profile" not in authority:
1675
+ # The project template declares this slot as unset; a manifest made
1676
+ # from an older template lacks it, so a whole-profile write adds it.
1677
+ authority["rhythm_profile"] = {"status": "unset"}
1551
1678
  written = _write_authority_value(project, tokens, value)
1679
+ if rhythm:
1680
+ problems = rhythm_profile_problems(project[AUTHORITY_ROOT_TOKEN]["rhythm_profile"])
1681
+ if problems:
1682
+ raise ValueError("; ".join(problems))
1552
1683
  if field == PACING_POINTER:
1553
1684
  # Check what the manifest will hold, not what the decision said: an
1554
1685
  # object slot is merged, so a half decision leaves the other rate at
@@ -26,7 +26,7 @@ license: MIT
26
26
 
27
27
  ## 工作流
28
28
 
29
- 1. 只读当前范围的剧本和已决定的视觉方向。
29
+ 1. 只读当前范围的剧本和已决定的视觉方向;视觉方向还没有时代锚点时,先按原著事实定时代。
30
30
  2. 逐场找实体、可见描述、状态变化和含混指代,先不创建资产。
31
31
  3. 对每项决定新建、复用、增加变体或标记未决;含混指代不猜。
32
32
  4. 写最小可识别设定:统一使用 `识别锚点`、本集状态和变化原因;会持续限制后续动作的身体—物件—空间关系写进有生效范围的状态,不当成一次姿势略过。
@@ -55,6 +55,7 @@ license: MIT
55
55
  默认只读本 SKILL、当前剧本和视觉方向。遇到对应问题时只打开一份:
56
56
 
57
57
  - 阶段边界与规则分级:[阶段契约](references/stage-contract.md)
58
+ - 定时代、写时代锚点,或想把场所、设备、服装写旧:[时代锚点](references/era-anchors.md)
58
59
  - 从剧本找真正的资产出现证据:[出现提取](references/occurrence-extraction.md)
59
60
  - 新身份、复用、变体或未决:[身份与变体](references/identity-vs-variant.md)
60
61
  - 人物识别与造型层次:[人物与造型](references/character-and-look.md)
@@ -34,6 +34,7 @@
34
34
  - [ ] Prop 形制/功能身份没有因 owner、开合、破损、内容或文字状态被复制。
35
35
  - [ ] 每个新 asset 有不能复用的持久证据;每个 variant 说明 base 什么保持不变。
36
36
  - [ ] 提取没有凭空补脸、品牌、门窗、内容物、伤势、灯光或可读文字。
37
+ - [ ] 时代不与原著事实矛盾;旧、老式、复古一类词有原著依据或创作者选择(`AST-14`)。
37
38
  - [ ] transfer、伤势、换装、停电、天气/光态和知识变化都有足以支持的剧情原因。
38
39
  - [ ] occurrence 的 production disposition 合理:提及不被误当出镜,关键操作物不被
39
40
  降成普通布景。
@@ -48,6 +49,7 @@ Reviewer finding 应含文件与标题 ID、证据、影响、修订结果、own
48
49
  - [ ] 设定集 只保留识别、复用、prompt、镜头和连续性所需事实。
49
50
  - [ ] Location 先有地理/入口/固定锚点,再有氛围;Prop 有尺度/形制/材料/功能;
50
51
  Character 有可观察的区分锚点。
52
+ - [ ] 项目视觉方向写了时代锚点,地点、造型、道具条目写出时代形制(`AST-15`)。
51
53
  - [ ] outgoing 精简但足以让下一场/集无脑内补全地继续。
52
54
 
53
55
  Creator 可用制作原因覆盖,例如需要逐件审批背景陈设;记录 override,而非改成硬规则。
@@ -0,0 +1,37 @@
1
+ # 时代锚点
2
+
3
+ ## 时代从原著事实来
4
+
5
+ 拆资产之前先定时代。能定时代的是原著与剧本里的事实:设备(智能手机、U 盘、液晶屏)、平台与传播方式
6
+ (热搜、短视频账号、直播带货)、流行语、写明的年份,或能从年龄与事件推出的年代。按这些事实在
7
+ `视觉设定.md` 顶部的项目视觉方向写一行时代锚点:先写年份或年代,再写设备、制服、家具和灯光在这个
8
+ 年代长什么样。
9
+
10
+ ```markdown
11
+ - 时代锚点:当下(2020 年代);设备:全面屏智能手机、笔记本电脑、液晶显示器;制服:现行常服;陈设:白色工位桌、网面办公椅;光:嵌入式 LED 面板灯,冷白。
12
+ ```
13
+
14
+ 原著没有能定时代的事实时,把时代标为「需创作者决定」,不默认成过去。
15
+
16
+ ## 旧要有来源
17
+
18
+ 部队办公室、机关、学校、医院这类机构场所,模型和写作者都会顺手写成旧的:老式显示器、积灰的主机、
19
+ 褪色的墙、旧款手机。原著写的是智能手机和短视频账号,画面却回到二三十年前,观众第一眼就出戏。
20
+
21
+ **`reviewed_invariant` AST-14**:`视觉设定.md` 与从它投影出的提示词所呈现的时代,不与原著事实矛盾。
22
+ 「旧」「老式」「复古」「褪色」「斑驳」,以及 old、worn、dusty、period、CRT 这类让画面变旧的词,要有原著依据
23
+ 或创作者明确的选择;两样都没有就删掉,改用时代锚点里的写法。原著写某件东西旧,旧是这件物的状态,
24
+ 写在它自己的条目里,不把整个地点带回过去。
25
+
26
+ ## 条目带上时代形制
27
+
28
+ **`craft_default` AST-15**:项目视觉方向写出时代锚点;地点、造型和道具条目在年代会改变外观的地方写具体
29
+ 形制——写液晶显示器,不写显示器;写现行常服,不写军装。图片和视频提示词照条目写,时代线索就随地点、
30
+ 服装和道具进入下游。
31
+
32
+ ## 合成例
33
+
34
+ 原著:主角刷热搜、开短视频账号、用 U 盘拷资料,故事发生在部队宣传部门的办公室。
35
+
36
+ - 错:「老旧的机关办公室,老式显示器,旧款智能手机」——原著里没有一处支撑。
37
+ - 对:时代锚点写当下;办公室条目写液晶显示器、嵌入式 LED 面板灯、网面办公椅;手机写全面屏智能手机。
@@ -25,6 +25,8 @@
25
25
  | AST-11 | reviewed_invariant | Characters designed together are not bound to confusable references; each names the audible trait telling it apart from its nearest neighbour, and names that character. |
26
26
  | AST-12 | craft_default | Selection criteria are few, audible and counter-exampled; they judge a candidate reference or a clone result, they do not stand in for one. |
27
27
  | AST-13 | structural_invariant | When the project's prompt language is not the language of the entry headings, every 人物 entry a shot's 视觉依据 references reaches a stated conclusion: `画面代称` carrying the exact spelling prompt bodies use, or `画面代称:无` when no body names it. One accepted name uses one spelling, case included. 地点/道具 declare one only when a body names them. |
28
+ | AST-14 | reviewed_invariant | The era shown in `视觉设定.md` and in the prompts projected from it does not contradict source facts—devices, platforms, slang, stated years. A retro or aged descriptor (旧/老式/复古/褪色/斑驳, old, worn, dusty, period, CRT) cites a source basis or an explicit creator choice. |
29
+ | AST-15 | craft_default | The project visual direction states explicit era anchors: the year or decade, and how devices, uniforms, furniture and lighting look in it. Location, costume and prop entries carry the era-specific form that image and video prompts copy. |
28
30
 
29
31
  ### `CON`
30
32
 
@@ -86,7 +86,11 @@ python3 {技能目录}/scripts/episode_intake.py index <多集整稿> --out <epi
86
86
  读取 [episode-design.md](references/episode-design.md),再复制 [episode-map.jsonl](assets/episode-map.jsonl)。每一集记录进入状态、开场、当集追求、阻力、方向性转折、当集结果、信息释放、出去的压力以及下一集必须继承的事实。
87
87
 
88
88
  先保证每集产生局部戏剧结果、相邻集能精确交接,再讨论外部压力/情感负荷的双轨
89
- 节奏。集数、钩子类型、是否反转和高潮位置由创作者与项目决定。
89
+ 节奏。第 1 集入口先比较收益入口与冷开;改编项目先读原著分析的爽点表,把高光排到观众
90
+ 最早能拿到的位置。集数、钩子类型、是否反转和高潮位置由创作者与项目决定。
91
+
92
+ 制作形态一定下,就按分集设计里的默认值提出项目节奏档案,写进创作简报交创作者接受;
93
+ 接受后由 `$short-drama` 写入 `creator_authority.rhythm_profile`。
90
94
 
91
95
  ### 5. 做所有者检查并交接
92
96
 
@@ -96,6 +100,7 @@ python3 {技能目录}/scripts/episode_intake.py index <多集整稿> --out <epi
96
100
  - 候选确实改变机制,选定方向贯穿简报、引擎与分集地图;
97
101
  - 每次升级能指出权力、信息、关系、暴露、资源、时间或代价的变化;
98
102
  - 每集先兑现一部分当集承诺,再留下具体的决定、危险或问题;
103
+ - 改编项目里核心人物的立场、核心关系和主线没有被改写;原著没有的新增内容都登记为 `add`,并列在简报里;
99
104
  - 没有把格式偏好冒充普遍规律。
100
105
 
101
106
  这些是所有者自检,不是终审。展示创作者可读的新增/修改摘要,请创作者接受后再作为下游来源;
@@ -112,7 +117,8 @@ python3 {技能目录}/scripts/episode_intake.py index <多集整稿> --out <epi
112
117
  - **`craft_default`**:通常有帮助的做法;创作者说明理由后可覆盖。
113
118
  - **`taste_option`**:钩子、弧线、视角、结局气质等选择;不得单独阻断。
114
119
 
115
- 不要用固定的情节点、转折时刻、篇幅比例或数量配方替代因果判断。
120
+ 不要用固定的情节点、转折时刻、篇幅比例或数量配方替代因果判断;节奏数值只以创作者接受的
121
+ 项目节奏档案出现。
116
122
 
117
123
  ## 产物与边界
118
124
 
@@ -133,12 +139,12 @@ python3 {技能目录}/scripts/episode_intake.py index <多集整稿> --out <epi
133
139
  ## 按需加载
134
140
 
135
141
  - **承诺、引擎、人物压力、升级与铺垫兑现**:[story-craft.md](references/story-craft.md)
136
- - **分集契约、因果节拍、集间交接与地图修订**:[episode-design.md](references/episode-design.md)
142
+ - **分集契约、因果节拍、集间交接、首集入口、门槛集与项目节奏档案**:[episode-design.md](references/episode-design.md)
137
143
  - **已有多集完整剧本/散稿,要避免整稿进入上下文并可中断续跑**:
138
144
  [multi-episode-intake.md](references/multi-episode-intake.md)
139
145
  - **人物驱动力、前史与切入、跨集变化、信息权限、双轨节奏与恢复记忆**:
140
146
  [serial-character-and-memory.md](references/serial-character-and-memory.md)
141
- - **有原材料、需要压缩/合并人物场景/把信息视觉化**:
147
+ - **有原材料、需要按爽点压缩、提前或冷开后文、合并人物场景、把信息视觉化**:
142
148
  [adaptation-craft.md](references/adaptation-craft.md)
143
149
  - **创作者提供对标作品、样例剧本或提示词,希望学习机制而非仿写表达**:
144
150
  [creative-reference-intake.md](references/creative-reference-intake.md)
@@ -1 +1 @@
1
- {"example_only":true,"destination":"项目开发/adaptation-map.jsonl","schema_version":"1.0.0-draft","record_type":"adaptation_mapping","mapping_id":"ADAPT-EXAMPLE","status":"candidate","source_ref":{"owner":"creator","artifact":"输入/original-source.txt"},"source_span":{"byte_start":120,"byte_end":268,"line_start":8,"line_end":14},"function_summary":"一次旧选择使两名角色对当前证据承担不同风险;摘要不复制来源原句","mentioned_entities":[{"source_label":"称谓甲","proposed_identity":"CHAR-CANDIDATE-A","resolution":"unresolved"}],"adaptation_decision":{"disposition":"preserve | merge | change_carrier | compress | omit | unresolved","candidate_episode":"EP-CANDIDATE","new_carrier":"可见行动/证据/空间/对白策略或 unresolved","preserved_functions":["关系压力"],"lost_or_changed":[]},"creator_acceptance":{"status":"pending","decision_ref":null}}
1
+ {"example_only":true,"destination":"项目开发/adaptation-map.jsonl","schema_version":"1.0.0-draft","record_type":"adaptation_mapping","mapping_id":"ADAPT-EXAMPLE","status":"candidate","source_ref":{"owner":"creator","artifact":"输入/original-source.txt"},"source_span":{"byte_start":120,"byte_end":268,"line_start":8,"line_end":14},"function_summary":"一次旧选择使两名角色对当前证据承担不同风险;摘要不复制来源原句","mentioned_entities":[{"source_label":"称谓甲","proposed_identity":"CHAR-CANDIDATE-A","resolution":"unresolved"}],"adaptation_decision":{"disposition":"preserve | merge | change_carrier | compress | omit | move_earlier | cold_open | add | unresolved","candidate_episode":"EP-CANDIDATE","new_carrier":"可见行动/证据/空间/对白策略或 unresolved","preserved_functions":["关系压力"],"lost_or_changed":[],"causal_compensation":"null;move_earlier / cold_open 时写:依赖的铺垫在哪一集以什么载体先出现,或观众靠什么定位时间,以及原位置怎样处理","addition_rationale":"null;add 时写:为什么原著已有的人和事承担不了这个功能,核对过哪些原著事实、逐条说明不矛盾"},"creator_acceptance":{"status":"pending","decision_ref":null}}
@@ -12,6 +12,8 @@
12
12
  - 【事实 → 落在 EPxxx,观众看到的是:〈可见载体〉;或:延后到 EPxxx;没有则写“暂无”】
13
13
  - **允许改编/探索的范围**:
14
14
  - 【填写】
15
+ - **原著没有、本轮新增的内容**:新增的人物、场景、对手,或提议改变的人物立场与关系,逐条交创作者确认。
16
+ - 【新增什么 → 承担什么功能;为什么原著已有的人和事承担不了;核对过的原著事实;没有则写“暂无”】
15
17
 
16
18
  ## 2. 创作者契约
17
19
 
@@ -30,6 +32,11 @@
30
32
  - **可用角色与场景规模**:【填写】
31
33
  - **难以承受的制作元素**:【填写】
32
34
  - **必须保留的视觉/声音特征**:【填写】
35
+ - **项目节奏档案(候选)**:【按制作形态从分集设计的默认值起步;改了哪项写一句理由。创作者接受后写入项目配置】
36
+
37
+ ```json
38
+ {"status": "proposed", "form": "ai_live_action", "first_hook_seconds": 5, "beat_interval_seconds_max": 30, "opposed_reversals_per_episode_min": 1, "end_on_peak": true, "reprise_previous_last_beat": true, "vo_share_max": 0.3, "target_avg_shot_seconds": 2.5, "close_shot_share_min": 0.45, "first_major_payoff_by_episode": 1}
39
+ ```
33
40
 
34
41
  ## 4. 戏剧承诺(工作版)
35
42
 
@@ -92,6 +99,7 @@
92
99
 
93
100
  - **故事切入前已经运行的压力**:【填写】
94
101
  - **叙事切入窗口**:【从哪个必须行动的时刻开始】
102
+ - **第 1 集入口候选**:【至少三个:时序入口、收益入口、后文高潮提前的冷开;每个写开场第一帧观众看见的那一格画面和它提出的问题,再写整集收益;写选了哪个、为什么】
95
103
  - **为什么不更早/更晚开始**:【更早会变成什么准备;更晚会丢掉哪个选择】
96
104
  - **开场可见证据**:【让观众从行为、物件、关系或异常结果反推前因】
97
105
  - **观众现在必须知道**:【只列当前行动所需】
@@ -5,20 +5,24 @@
5
5
  - [改编契约](#1-先建立改编契约)
6
6
  - [长材料导入](#长材料导入先建立可追溯语义层)
7
7
  - [功能账本](#2-用功能账本压缩)
8
+ - [按爽点压缩](#先按爽点取舍)
8
9
  - [信息视觉化](#3-信息视觉化阶梯)
9
10
  - [因果桥](#4-保住因果桥)
11
+ - [重排登记](#重排也要登记)
12
+ - [新增登记](#新增也要登记)
10
13
  - [单集化](#5-单集化而不肢解)
11
14
  - [登记不等于兑现](#5b-登记不等于兑现)
12
15
  - [分级审查](#6-规则分级与审查)
13
16
 
14
- 改编不是把原文缩短,也不是为短剧补一套流行结构。目标是保留原材料真正承担的戏剧功能,
15
- 再为屏幕、单集边界和制作条件寻找新的载体。
17
+ 改编不是把原文按顺序缩短,也不是为短剧补一套原著没有的流行结构。先找出原著里观众为之
18
+ 而来的爽点,把它们排到观众最早能拿到的位置;再保住让这些爽点成立的戏剧功能,为屏幕、
19
+ 单集边界和制作条件寻找新的载体。
16
20
 
17
21
  ## 1. 先建立改编契约
18
22
 
19
23
  | 类别 | 含义 | 处理 |
20
24
  |---|---|---|
21
- | 不可改承诺 | 核心关系、关键选择、结局含义、必要世界规则 | 保持事实与功能 |
25
+ | 不可改承诺 | 核心人物的立场与性情、核心关系、主线、关键选择、结局含义、必要世界规则 | 保持事实与功能 |
22
26
  | 可换载体 | 叙述顺序、场景、配角、信息出现方式 | 可压缩/合并,但记录替代关系 |
23
27
  | 可删冗余 | 重复说明、只连接路程的段落、无新状态的复述 | 删除并说明没有损失什么 |
24
28
  | 未决歧义 | 原材料本身矛盾或授权不清 | 保留问题,不替作者定案 |
@@ -72,18 +76,25 @@ development,避免交付包把输入材料带出边界。
72
76
  谁已经与谁结盟、主角手里已经有什么。任何一项超前,这段就只能作为风格或信息参考,
73
77
  不能作为当前集的依据。
74
78
 
75
- **召回只补细节,不新增剧情**。 已接受的分集契约决定这一集发生什么;回原文是把已经
76
- 决定的事写具体。原文里另有更好看的段落时,它要走修订已接受契约的路径,由 develop
77
- owner 改分集地图,而不是在写正文时顺手塞进来。
79
+ **召回补细节;把后文提前是改地图**。 已接受的分集契约决定这一集发生什么;回原文是把
80
+ 已经决定的事写具体。原文后段另有该提前的高光时,把它提前是正当的改编,不是虚构——但它
81
+ 要作为 `move_earlier` 或 `cold_open` 登记进改编映射、由 develop owner 改分集地图,而不是
82
+ 在写正文时顺手塞进来。
78
83
 
79
84
  **`craft_default · STY-22`**:回原文取细节时,用"人物 + 地点/物件 + 当前动作或冲突"
80
85
  的事件锚点检索,回读命中段落而不是凭摘要写,并在使用前把片段的知情状态与当前集进入
81
- 状态对照;超前的片段只作参考。召回用于补足已接受契约的细节,不用于新增剧情。
86
+ 状态对照;超前的片段只作参考。召回只补足已接受契约的细节;要提前后文的情节,先改分集地图。
82
87
 
83
88
  ## 2. 用功能账本压缩
84
89
 
85
- **`STY-07 · reviewed_invariant`**:人物或场景合并必须保留戏剧作用、知情范围、
86
- 关系位置和因果桥;“人更少”不能单独证明合并成功。
90
+ **`STY-07 · reviewed_invariant`**:任何改编处理——合并、换载体、压缩、重排、新增——都保住
91
+ 原著核心人物的立场与性情、核心关系和主线,不与原著事实相矛盾,创作者已接受的改动除外;人物或
92
+ 场景合并还要保留戏剧作用、知情范围、关系位置和因果桥。“人更少”不能单独证明合并成功。
93
+
94
+ 立场与性情指这个人对主角是帮、是压还是观望,为什么,以及他做事的方式。压力可以放大、外化:
95
+ 原著里温和护短、只是不看好主角的上级,可以把怀疑当面说出来,成为第一个被打脸的人;改成冷脸拒绝、
96
+ 深夜来关灯的压制者,就换了一个人。改人物立场或关系不是换载体:映射按实际处理登记,在
97
+ `lost_or_changed` 写明改了什么,`creator_acceptance.status` 保持 `pending`,把提议写进简报交创作者决定。
87
98
 
88
99
  为候选人物、场景和信息记录它承担的功能:
89
100
 
@@ -93,6 +104,19 @@ owner 改分集地图,而不是在写正文时顺手塞进来。
93
104
  - 哪段建立后续兑现所需的误信/承诺;
94
105
  - 哪个空间限制让冲突必须现在发生。
95
106
 
107
+ ### 先按爽点取舍
108
+
109
+ 压缩分两步:先只留热度最高的情节点——爽点、糖点、虐点,排名来自原著分析的爽点表;
110
+ 再删掉不服务这些点的支线,合并功能重复的人物。一个改编实例只保留了原著约六成情节。
111
+ 核心人物通常 3–5 人,全剧不超过 20 人,高潮集新增的人物不超过 2 个。
112
+
113
+ 集数与章数的关系由爽点分布决定,不按章 1:1 切:没有爽点的长段并进相邻集或删掉,
114
+ 一章里有两个大爽点时可以拆成两集,后文的高光可以提前。按原著顺序一章一集往下切,
115
+ 结果通常是拉长而不是压缩,第一个爽点被推到好几集之后。
116
+
117
+ **`craft_default · STY-28`**:压缩先按爽点表留下热度最高的情节点,再删支线、合并功能重复的
118
+ 人物;集数跟着爽点分布走,不按章节 1:1 切分。
119
+
96
120
  ### 先删线,再合并
97
121
 
98
122
  删掉整条支线和合并人物是两种操作,判据不同,顺序也不能反。**先删线**:合并是把功能
@@ -112,8 +136,9 @@ owner 改分集地图,而不是在写正文时顺手塞进来。
112
136
  5. **删掉后会留下多少孤儿铺垫**?前面为它埋的每一处都要跟着删或改指向。孤儿铺垫比
113
137
  支线本身更伤:它们看起来像伏笔,观众会一直等。
114
138
 
115
- **最常见的错误删法**:把节奏慢的线删掉、把好看的线留下。慢线经常正是让快线成立的
116
- 条件——铺垫、代价、信息落差都住在慢线里。删掉之后快线还在,但它不再打中人。
139
+ **要防的误删**:慢线里常住着让快线成立的条件——铺垫、代价、信息落差。整条删掉之后
140
+ 快线还在,但它不再打中人。先留好看的线本身没有错;把这些条件压缩或换载体转移到保留的线上,
141
+ 不必连同慢线整条保留。
117
142
 
118
143
  删线时把这条线承担的功能逐项列出来(用本节开头的功能账本),标明每一项是**一起删掉**
119
144
  还是**转移到哪条保留的线**。转移的每一项都要写清接收方多承担了什么;只写"合并到主线"
@@ -177,13 +202,51 @@ owner 改分集地图,而不是在写正文时顺手塞进来。
177
202
  }
178
203
  ~~~
179
204
 
205
+ ### 重排也要登记
206
+
207
+ 改编映射的 `disposition` 取值:`preserve`(保留)、`merge`(合并)、`change_carrier`(换载体)、
208
+ `compress`(压缩)、`omit`(删去)、`move_earlier`(提前到更早的集)、`cold_open`(提前做某集
209
+ 开场,再回到原时序)、`add`(新增原著没有的人物、场景或对手,见[新增也要登记](#新增也要登记))、
210
+ `unresolved`(未决)。
211
+
212
+ `move_earlier` 和 `cold_open` 带一项因果补偿义务,写进 `causal_compensation`:
213
+
214
+ - **铺垫要跟着提前**:被提前的一拍依赖哪些事实,每条写清在哪一集、用什么可见载体先埋下;
215
+ 来不及埋的,改由开场后的补充交代承担,并写明补在哪里。
216
+ - **观众要能定位**:冷开之后回到起点时,观众靠什么知道时间回拨了——字幕卡、同一物件或场所
217
+ 的前后对照、一句点明时间的台词;提前到正常时序里的,写清它和前后集的因果怎样接上。
218
+ - **原位置要处理**:原来那一拍所在的集现在少了什么,是删去、改成余波,还是由别的爽点顶上。
219
+
220
+ **`reviewed_invariant · STY-29`**:登记为 `move_earlier` 或 `cold_open` 的映射写明它依赖的
221
+ 铺垫在哪一集、以什么载体先出现,或观众靠什么定位时间,以及原位置怎样处理;审查者按映射
222
+ 对照分集记录与剧本,提前的一拍在观众缺少必要事实时出现即为缺陷。
223
+
224
+ ### 新增也要登记
225
+
226
+ 原著没有的东西——一个新人物、一场新编的戏、一个新对手或换掉的对手——单独登记一条 `add`,
227
+ 不藏在 `change_carrier` 或 `move_earlier` 的备注里:
228
+
229
+ - `source_span` 指向它插进去的位置,或它服务的那段原著;
230
+ - `preserved_functions` 写它承担的功能;
231
+ - `addition_rationale` 写两件事:为什么原著已有的人和事承担不了这个功能;核对过哪些原著事实,
232
+ 逐条说明不矛盾;
233
+ - 在简报「原著没有、本轮新增的内容」里列出,交创作者确认。
234
+
235
+ 节奏档案要的有对手反转、题材卡要的当众压迫,先从原著已有的人和他们真做过的事里找:原著里的
236
+ 质疑者、起哄的群体、竞争者、规章与期限。某一集原著确实没有对手时,报出档案偏差,或把反转交给
237
+ 已有的人;不把支持者改成压迫者,也不为凑数新增对手。
238
+
239
+ **`craft_default · STY-30`**:原著没有的人物、场景或对手登记为 `add`,写明承担的功能、为什么
240
+ 原著已有的人和事承担不了、核对过哪些原著事实,并列进简报交创作者确认;对手先从原著已有的人和
241
+ 他们做过的事里找。
242
+
180
243
  ## 5. 单集化而不肢解
181
244
 
182
245
  短剧单集应完成一个局部状态变化,同时保持长线:
183
246
 
184
247
  - 当集兑现原材料的一部分吸引力;
185
248
  - 结尾压力由本集选择/后果产生;
186
- - 不靠把一个完整反应切掉来制造“卡点”;
249
+ - 卡点停在下一次揭晓之前,不靠把本集的局部结果切掉来制造;
187
250
  - 下一集的进入状态是精确事实,不是“局势更紧张”。
188
251
 
189
252
  可把一段长叙事拆成多集,但每集都要回答“本集观众具体得到了什么”。
@@ -200,6 +263,9 @@ owner 改分集地图,而不是在写正文时顺手塞进来。
200
263
 
201
264
  两种都答不出来的,它就不是“不可更改的事实”,是一句备注,按备注处理。
202
265
 
266
+ 世界设定尤其适合延后。第 1 集只需要观众看懂眼前这场冲突用到的那一条规则,其余设定登记到
267
+ 它第一次改变人物选择的那一集。把整套设定塞进首集,只会换来大段说明和旁白。
268
+
203
269
  同一个失败也发生在单集内部:分集记录写了“可见载体”“载体直接支持的判断”,剧本却从没演过
204
270
  那个载体。最常见的一种是需要对照才成立的证据——“装置生效前后哼的同一句,音准完全不同”——
205
271
  剧本只写了“之后”,“之前”从没上过屏幕,于是这条信息释放在纸面上成立、在画面上不成立。
@@ -212,7 +278,8 @@ owner 改分集地图,而不是在写正文时顺手塞进来。
212
278
  ## 6. 规则分级与审查
213
279
 
214
280
  - `structural_invariant`:来源与功能对应表、授权边界、铺垫、兑现和交接引用都能解析。
215
- - `reviewed_invariant`:合并没有造成知情穿帮,压缩没有删断因果,新的表现方式保留核心含义。
281
+ - `reviewed_invariant`:合并没有造成知情穿帮,压缩没有删断因果,新的表现方式保留核心含义,
282
+ 人物立场、核心关系和主线没有被改写(STY-07)。
216
283
  - `craft_default`:优先用选择、证据和空间后果承载说明;有明确风格理由时可以调整。
217
284
  - `taste_option`:保留旁白、倒叙、多声部人物、慢场或开放结尾均是创作者选择。
218
285