@oh-story/dsh 0.1.12 → 0.1.13

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 (264) hide show
  1. package/README.md +17 -11
  2. package/lib/client.js +85 -35
  3. package/lib/client.js.map +3 -3
  4. package/lib/drama/manifest.json +41 -36
  5. package/lib/drama/skills/short-drama/scripts/creator_markdown_check.py +340 -13
  6. package/lib/drama/skills/short-drama-assets/references/voice-direction.md +4 -2
  7. package/lib/drama/skills/short-drama-edit/SKILL.md +32 -12
  8. package/lib/drama/skills/short-drama-edit/references/still-cuts.md +90 -0
  9. package/lib/drama/skills/short-drama-edit/scripts/edit_tool.py +1035 -145
  10. package/lib/drama/skills/short-drama-edit/scripts/selftest.py +48 -0
  11. package/lib/drama/skills/short-drama-produce/SKILL.md +6 -1
  12. package/lib/drama/skills/short-drama-produce/references/adapter-contract.md +12 -0
  13. package/lib/drama/skills/short-drama-produce/scripts/production_tool.py +138 -9
  14. package/lib/drama/skills/short-drama-produce/scripts/provider_adapters.py +6 -0
  15. package/lib/drama/skills/short-drama-storyboard/SKILL.md +2 -0
  16. package/lib/drama/skills/short-drama-storyboard/references/production-shot-grammar.md +3 -1
  17. package/lib/drama/skills/short-drama-video-prompts/SKILL.md +7 -0
  18. package/lib/drama/skills/short-drama-video-prompts/references/performance-action-timing.md +14 -0
  19. package/lib/drama/skills/short-drama-video-prompts/references/seedance-2.5.md +19 -6
  20. package/lib/drama/skills/short-drama-video-prompts/references/stage-contract.md +1 -0
  21. package/lib/drama/skills/short-drama-video-prompts/references/target-model-profile.md +5 -0
  22. package/lib/drama/skills/short-drama-video-prompts/references/wan-3.0.md +4 -1
  23. package/lib/index.js +16 -7
  24. package/lib/index.js.map +2 -2
  25. package/lib/novel-to-game/README.md +98 -44
  26. package/lib/novel-to-game/README_ZH.md +100 -46
  27. package/lib/novel-to-game/VERSION +1 -1
  28. package/lib/novel-to-game/examples/jin-ping-mei/build/BUILD_BRIEF.md +27 -202
  29. package/lib/novel-to-game/examples/jin-ping-mei/build/app/RUN.md +23 -115
  30. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/chamber.webp +0 -0
  31. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/court_night.webp +0 -0
  32. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/court_rain.webp +0 -0
  33. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/garden.webp +0 -0
  34. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/hall.webp +0 -0
  35. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/kitchen.webp +0 -0
  36. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/street.webp +0 -0
  37. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/street_dawn.webp +0 -0
  38. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/temple.webp +0 -0
  39. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/yue/moon.webp +0 -0
  40. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/meng/angry.webp +0 -0
  41. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/meng/blush.webp +0 -0
  42. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/meng/neutral.webp +0 -0
  43. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/meng/sad.webp +0 -0
  44. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/meng/smile.webp +0 -0
  45. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/meng/surprised.webp +0 -0
  46. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pan/angry.webp +0 -0
  47. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pan/blush.webp +0 -0
  48. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pan/neutral.webp +0 -0
  49. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pan/sad.webp +0 -0
  50. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pan/smile.webp +0 -0
  51. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pan/surprised.webp +0 -0
  52. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pinger/angry.webp +0 -0
  53. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pinger/blush.webp +0 -0
  54. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pinger/neutral.webp +0 -0
  55. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pinger/sad.webp +0 -0
  56. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pinger/smile.webp +0 -0
  57. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pinger/surprised.webp +0 -0
  58. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/xuee/angry.webp +0 -0
  59. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/xuee/blush.webp +0 -0
  60. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/xuee/neutral.webp +0 -0
  61. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/xuee/sad.webp +0 -0
  62. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/xuee/smile.webp +0 -0
  63. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/xuee/surprised.webp +0 -0
  64. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/yue/angry.webp +0 -0
  65. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/yue/blush.webp +0 -0
  66. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/yue/neutral.webp +0 -0
  67. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/yue/sad.webp +0 -0
  68. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/yue/smile.webp +0 -0
  69. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/yue/surprised.webp +0 -0
  70. package/lib/novel-to-game/examples/jin-ping-mei/build/app/css/style.css +326 -2503
  71. package/lib/novel-to-game/examples/jin-ping-mei/build/app/index.html +71 -4
  72. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/adv.js +221 -0
  73. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/audio.js +113 -257
  74. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/main.js +511 -3026
  75. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/menus.js +277 -0
  76. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/petals.js +67 -0
  77. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/stage.js +180 -0
  78. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/store.js +70 -0
  79. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/common.js +198 -0
  80. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/common2.js +204 -0
  81. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/common3.js +198 -0
  82. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/dates.js +186 -0
  83. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/index.js +122 -0
  84. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/meng.js +190 -0
  85. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/pan.js +212 -0
  86. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/pinger.js +198 -0
  87. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/xuee.js +199 -0
  88. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/yue.js +214 -0
  89. package/lib/novel-to-game/examples/jin-ping-mei/build/app/package.json +2 -2
  90. package/lib/novel-to-game/examples/jin-ping-mei/build/art/generated-art.json +182 -45
  91. package/lib/novel-to-game/examples/jin-ping-mei/qa/README.md +7 -17
  92. package/lib/novel-to-game/examples/jin-ping-mei/qa/verification.json +9 -9
  93. package/lib/novel-to-game/manifest.json +303 -78
  94. package/lib/novel-to-game/skills/game-art-direction/references/art-direction-method.md +7 -2
  95. package/lib/novel-to-game/skills/game-concept/references/concept-method.md +2 -0
  96. package/lib/novel-to-game/skills/game-world-design/references/narrative-design-method.md +2 -0
  97. package/lib/novel-to-game/skills/game-world-design/references/world-design-method.md +9 -0
  98. package/lib/types/client/drama-production-view.d.ts +11 -0
  99. package/lib/types/client/drama-production-view.d.ts.map +1 -1
  100. package/lib/types/client/file-activity.d.ts +1 -1
  101. package/lib/types/client/file-activity.d.ts.map +1 -1
  102. package/lib/types/client/production-prompts.d.ts +7 -1
  103. package/lib/types/client/production-prompts.d.ts.map +1 -1
  104. package/lib/types/client/production-runtime.d.ts +7 -2
  105. package/lib/types/client/production-runtime.d.ts.map +1 -1
  106. package/lib/types/drama-adapters.d.ts.map +1 -1
  107. package/lib/types/skill-provider.d.ts.map +1 -1
  108. package/lib/types/video-project.d.ts.map +1 -1
  109. package/lib/video-recap/CHANGELOG.md +108 -1
  110. package/lib/video-recap/README.en.md +18 -14
  111. package/lib/video-recap/README.md +18 -14
  112. package/lib/video-recap/manifest.json +297 -321
  113. package/lib/video-recap/skills/video-assemble/SKILL.md +18 -16
  114. package/lib/video-recap/skills/video-assemble/references/explicit-audio-mix.md +3 -1
  115. package/lib/video-recap/skills/video-assemble/references/jianying/SOURCE.md +5 -5
  116. package/lib/video-recap/skills/video-assemble/references/packaging.md +4 -4
  117. package/lib/video-recap/skills/video-assemble/references/subtitle-track.md +10 -10
  118. package/lib/video-recap/skills/video-assemble/scripts/adoption/audio_mix_binding.py +13 -2
  119. package/lib/video-recap/skills/video-assemble/scripts/adoption/av_clock.py +109 -0
  120. package/lib/video-recap/skills/video-assemble/scripts/adoption/strict_publish.py +4 -1
  121. package/lib/video-recap/skills/video-assemble/scripts/artifacts.py +2 -9
  122. package/lib/video-recap/skills/video-assemble/scripts/assemble.py +188 -51
  123. package/lib/video-recap/skills/video-assemble/scripts/assemble_constants.py +0 -1
  124. package/lib/video-recap/skills/video-assemble/scripts/assembly_contract.py +32 -75
  125. package/lib/video-recap/skills/video-assemble/scripts/assembly_settings.py +8 -15
  126. package/lib/video-recap/skills/video-assemble/scripts/audio_mix.py +202 -161
  127. package/lib/video-recap/skills/video-assemble/scripts/codec_peak.py +112 -0
  128. package/lib/video-recap/skills/video-assemble/scripts/export_jianying.py +10 -101
  129. package/lib/video-recap/skills/video-assemble/scripts/jianying/builders.py +44 -475
  130. package/lib/video-recap/skills/video-assemble/scripts/jianying/model.py +1 -22
  131. package/lib/video-recap/skills/video-assemble/scripts/jianying/templates.py +0 -3
  132. package/lib/video-recap/skills/video-assemble/scripts/jianying/timeline_contract.py +36 -103
  133. package/lib/video-recap/skills/video-assemble/scripts/jianying/tracks.py +0 -8
  134. package/lib/video-recap/skills/video-assemble/scripts/jianying/writer.py +28 -203
  135. package/lib/video-recap/skills/video-assemble/scripts/lib.py +20 -34
  136. package/lib/video-recap/skills/video-assemble/scripts/loudness.py +332 -0
  137. package/lib/video-recap/skills/video-assemble/scripts/media.py +158 -38
  138. package/lib/video-recap/skills/video-assemble/scripts/narration_audio.py +30 -16
  139. package/lib/video-recap/skills/video-assemble/scripts/render_preflight.py +49 -8
  140. package/lib/video-recap/skills/video-assemble/scripts/source_subtitles.py +17 -6
  141. package/lib/video-recap/skills/video-assemble/scripts/subtitles/core.py +24 -2
  142. package/lib/video-recap/skills/video-assemble/scripts/subtitles/track.py +2 -5
  143. package/lib/video-recap/skills/video-assemble/scripts/subtitles/track_binding.py +2 -9
  144. package/lib/video-recap/skills/video-assemble/scripts/timeline.py +12 -34
  145. package/lib/video-recap/skills/video-assemble/scripts/timeline_emit.py +3 -4
  146. package/lib/video-recap/skills/video-assemble/scripts/visual_render.py +28 -2
  147. package/lib/video-recap/skills/video-cut/SKILL.md +37 -11
  148. package/lib/video-recap/skills/video-cut/references/shot-review.md +1 -1
  149. package/lib/video-recap/skills/video-cut/scripts/cut.py +2 -34
  150. package/lib/video-recap/skills/video-cut/scripts/cut_cli.py +96 -124
  151. package/lib/video-recap/skills/video-cut/scripts/cut_contract.py +97 -182
  152. package/lib/video-recap/skills/video-cut/scripts/cut_render.py +177 -166
  153. package/lib/video-recap/skills/video-cut/scripts/frame_grid.py +249 -0
  154. package/lib/video-recap/skills/video-cut/scripts/lib.py +0 -3
  155. package/lib/video-recap/skills/video-cut/scripts/media_geometry.py +173 -7
  156. package/lib/video-recap/skills/video-cut/scripts/sentence_boundaries.py +234 -151
  157. package/lib/video-recap/skills/video-cut/scripts/sentence_gate.py +189 -0
  158. package/lib/video-recap/skills/video-cut/scripts/shot_review.py +2 -6
  159. package/lib/video-recap/skills/video-recap/SKILL.md +24 -27
  160. package/lib/video-recap/skills/video-recap/references/audio-routing.md +8 -6
  161. package/lib/video-recap/skills/video-recap/references/config-playbook.md +8 -11
  162. package/lib/video-recap/skills/video-recap/references/data-schema.md +131 -74
  163. package/lib/video-recap/skills/video-recap/references/resource-library.md +17 -1
  164. package/lib/video-recap/skills/video-recap/scripts/doctor.py +51 -268
  165. package/lib/video-recap/skills/video-recap/scripts/final_qc.py +89 -254
  166. package/lib/video-recap/skills/video-recap/scripts/lib.py +81 -70
  167. package/lib/video-recap/skills/video-recap/scripts/library.py +40 -4
  168. package/lib/video-recap/skills/video-recap/scripts/materials.py +13 -80
  169. package/lib/video-recap/skills/video-recap/scripts/recap_cli.py +49 -17
  170. package/lib/video-recap/skills/video-recap/scripts/recap_inspect.py +1 -3
  171. package/lib/video-recap/skills/video-recap/scripts/recap_runner.py +86 -116
  172. package/lib/video-recap/skills/video-recap/scripts/recap_runtime.py +87 -23
  173. package/lib/video-recap/skills/video-recap/scripts/recap_source.py +0 -39
  174. package/lib/video-recap/skills/video-recap/scripts/recap_stage_qc.py +37 -135
  175. package/lib/video-recap/skills/video-recap/scripts/recap_timeline.py +118 -127
  176. package/lib/video-recap/skills/video-recap/scripts/resources/__init__.py +4 -0
  177. package/lib/video-recap/skills/video-recap/scripts/{resource_lock.py → resources/lock.py} +1 -1
  178. package/lib/video-recap/skills/video-recap/scripts/{project_binding.py → resources/project_binding.py} +78 -17
  179. package/lib/video-recap/skills/video-reference/SKILL.md +108 -0
  180. package/lib/video-recap/skills/video-reference/references/reference-schema.md +139 -0
  181. package/lib/video-recap/skills/video-reference/scripts/lib.py +85 -0
  182. package/lib/video-recap/skills/video-reference/scripts/reference.py +96 -0
  183. package/lib/video-recap/skills/video-reference/scripts/reference_check.py +553 -0
  184. package/lib/video-recap/skills/video-reference/scripts/reference_frames.py +122 -0
  185. package/lib/video-recap/skills/video-reference/scripts/reference_measure.py +253 -0
  186. package/lib/video-recap/skills/video-reference/scripts/reference_profile.py +271 -0
  187. package/lib/video-recap/skills/video-script/SKILL.md +9 -7
  188. package/lib/video-recap/skills/video-script/scripts/agent_text.py +18 -267
  189. package/lib/video-recap/skills/video-script/scripts/deslop_qc.py +12 -30
  190. package/lib/video-recap/skills/video-script/scripts/entry_suggestion.py +125 -0
  191. package/lib/video-recap/skills/video-script/scripts/evidence_bundle.py +2 -26
  192. package/lib/video-recap/skills/video-script/scripts/lib.py +5 -15
  193. package/lib/video-recap/skills/video-script/scripts/lint_summary.py +184 -0
  194. package/lib/video-recap/skills/video-script/scripts/narration_lint.py +120 -100
  195. package/lib/video-recap/skills/video-script/scripts/review.py +3 -34
  196. package/lib/video-recap/skills/video-script/scripts/review_grounding.py +20 -46
  197. package/lib/video-recap/skills/video-script/scripts/review_response.py +120 -258
  198. package/lib/video-recap/skills/video-script/scripts/review_runner.py +2 -10
  199. package/lib/video-recap/skills/video-script/scripts/speech_ownership.py +89 -5
  200. package/lib/video-recap/skills/video-script/scripts/validate.py +26 -34
  201. package/lib/video-recap/skills/video-understanding/SKILL.md +29 -4
  202. package/lib/video-recap/skills/video-understanding/references/data-schema.md +5 -22
  203. package/lib/video-recap/skills/video-understanding/scripts/agent_text.py +24 -121
  204. package/lib/video-recap/skills/video-understanding/scripts/asr.py +11 -5
  205. package/lib/video-recap/skills/video-understanding/scripts/asr_timing_evidence.py +15 -24
  206. package/lib/video-recap/skills/video-understanding/scripts/briefing/builder.py +59 -25
  207. package/lib/video-recap/skills/video-understanding/scripts/briefing/context.py +39 -3
  208. package/lib/video-recap/skills/video-understanding/scripts/briefing/inputs.py +15 -27
  209. package/lib/video-recap/skills/video-understanding/scripts/briefing/timeline.py +136 -37
  210. package/lib/video-recap/skills/video-understanding/scripts/consolidate.py +121 -37
  211. package/lib/video-recap/skills/video-understanding/scripts/detect.py +118 -16
  212. package/lib/video-recap/skills/video-understanding/scripts/index_normalize.py +359 -0
  213. package/lib/video-recap/skills/video-understanding/scripts/lib.py +62 -21
  214. package/lib/video-recap/skills/video-understanding/scripts/storyboard.py +181 -51
  215. package/lib/video-recap/skills/video-understanding/scripts/timeline_fusion.py +0 -26
  216. package/lib/video-recap/skills/video-understanding/scripts/understanding_brief.py +37 -14
  217. package/lib/video-recap/skills/video-understanding/scripts/understanding_cache.py +40 -32
  218. package/lib/video-recap/skills/video-understanding/scripts/understanding_runner.py +100 -127
  219. package/lib/video-recap/skills/video-understanding/scripts/understanding_storyboard.py +182 -30
  220. package/lib/video-recap/skills/video-understanding/scripts/vlm.py +30 -27
  221. package/lib/video-recap/skills/video-voiceover/SKILL.md +19 -12
  222. package/lib/video-recap/skills/video-voiceover/references/index-tts.md +3 -3
  223. package/lib/video-recap/skills/video-voiceover/scripts/approved_text_policy.py +3 -1
  224. package/lib/video-recap/skills/video-voiceover/scripts/dub.py +60 -135
  225. package/lib/video-recap/skills/video-voiceover/scripts/lib.py +9 -34
  226. package/lib/video-recap/skills/video-voiceover/scripts/providers/fish_audio.py +6 -1
  227. package/lib/video-recap/skills/video-voiceover/scripts/tts_audio.py +64 -1
  228. package/lib/video-recap/skills/video-voiceover/scripts/tts_cache.py +99 -0
  229. package/lib/video-recap/skills/video-voiceover/scripts/voiceover.py +177 -200
  230. package/package.json +45 -45
  231. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/group/inner_court_accord_five.webp +0 -0
  232. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/group/public_day15.webp +0 -0
  233. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/household/li_jiaoer.webp +0 -0
  234. package/lib/novel-to-game/examples/jin-ping-mei/build/app/css/new-guofeng.css +0 -1494
  235. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/assets.js +0 -147
  236. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/data.js +0 -7470
  237. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/engine.js +0 -13066
  238. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/text.js +0 -32
  239. package/lib/novel-to-game/examples/jin-ping-mei/qa/playable-model.json +0 -99
  240. package/lib/novel-to-game/examples/jin-ping-mei/qa/verify_playable_model.mjs +0 -152
  241. package/lib/video-recap/skills/video-assemble/references/foreground-compose.md +0 -118
  242. package/lib/video-recap/skills/video-assemble/references/jianying/empty_jy_combination_segment.json +0 -84
  243. package/lib/video-recap/skills/video-assemble/references/jianying/empty_jy_combination_video_material.json +0 -98
  244. package/lib/video-recap/skills/video-assemble/references/jianying/empty_jy_draft.json +0 -204
  245. package/lib/video-recap/skills/video-assemble/references/pair-media.md +0 -74
  246. package/lib/video-recap/skills/video-assemble/scripts/compose_foreground.py +0 -293
  247. package/lib/video-recap/skills/video-assemble/scripts/pair_media.py +0 -216
  248. package/lib/video-recap/skills/video-recap/references/shift-left-qc-schema.md +0 -23
  249. package/lib/video-recap/skills/video-recap/scripts/mimo_qc.py +0 -33
  250. package/lib/video-recap/skills/video-recap/scripts/qc/__init__.py +0 -1
  251. package/lib/video-recap/skills/video-recap/scripts/qc/mimo_client.py +0 -13
  252. package/lib/video-recap/skills/video-recap/scripts/qc/mimo_contract.py +0 -9
  253. package/lib/video-recap/skills/video-recap/scripts/qc/mimo_evidence.py +0 -287
  254. package/lib/video-recap/skills/video-recap/scripts/qc/mimo_observations.py +0 -175
  255. package/lib/video-recap/skills/video-recap/scripts/qc/mimo_payload.py +0 -206
  256. package/lib/video-recap/skills/video-recap/scripts/qc/mimo_report.py +0 -318
  257. package/lib/video-recap/skills/video-recap/scripts/qc/mimo_runner.py +0 -130
  258. package/lib/video-recap/skills/video-recap/scripts/qc_contract.py +0 -320
  259. package/lib/video-recap/skills/video-script/scripts/timeline_fusion.py +0 -108
  260. package/lib/video-recap/skills/video-understanding/scripts/brief.py +0 -9
  261. package/lib/video-recap/skills/video-understanding/scripts/deslop_qc.py +0 -211
  262. package/lib/video-recap/skills/video-understanding/scripts/narration_lint.py +0 -707
  263. package/lib/video-recap/skills/video-understanding/scripts/speech_ownership.py +0 -143
  264. /package/lib/video-recap/skills/video-cut/scripts/{narration_mapping.py → cut_qc.py} +0 -0
@@ -39,33 +39,39 @@ Each game links to the adaptation workspace behind it: source provenance, the co
39
39
 
40
40
  ### Journey to the West · Three Borrowings of the Banana Fan
41
41
 
42
- [![Wukong's party and the Bull Demon King's formation remain fully visible above a separate light-silk command tray on the Jilei Mountain stage](examples/journey-to-the-west/screenshots/hero.jpg)](https://xiyouji.vibecoco.ai)
42
+ <p>
43
+ <a href="https://xiyouji.vibecoco.ai"><img src="examples/journey-to-the-west/screenshots/hero.jpg" alt="Wukong's party in the painted Flame Mountain village, with minimap, quest tracker, chat log and function buttons in the corners" width="49%"></a>
44
+ <a href="https://xiyouji.vibecoco.ai"><img src="examples/journey-to-the-west/screenshots/battle.jpg" alt="Jilei Mountain battle: the Bull Demon King's side on the left, Wukong's party on the right, action-order bar above and command panel below" width="49%"></a>
45
+ </p>
43
46
 
44
- **One wave of a fan blew you fifty thousand li. Take the mountain back one turn at a time.**
47
+ **One wave of a fan blew you fifty thousand li. Walk back, take the quest, and win the mountain one turn at a time.**
45
48
 
46
- Command Wukong's party through the three borrowings of the Banana-Leaf Fan: read the five-element wheel, follow a fire-vein treasure map, decide when to press deeper or bank the haul, set your formation, transform your way in where force will not work, and turn a demon king who outclasses you into a rainstorm over the Mountain of Flames.
49
+ A Fantasy Westward Journey-style turn-based RPG built on chapters 59–61. Click to walk four painted scene maps, find the NPCs marked "!", let the quest tracker auto-path you there, and take the repeatable demon-bounty daily between story fights. Earn experience and silver, shop, swap gear, study skills and field a pet; then win command-turn battles with the five-element wheel, rage stunts and Wukong's seventy-two transformations, until a demon king who outclasses you ends as rain over the Mountain of Flames.
47
50
 
48
51
  **[Play in browser](https://xiyouji.vibecoco.ai)** · [Adaptation workspace](examples/journey-to-the-west/) · design estimate: 45–90 min · all ages · playable prototype
49
52
 
50
53
  ### Jin Ping Mei · Ledger of Desire
51
54
 
52
- [![Five women of the Ximen household face the player across the household ledger](examples/jin-ping-mei/screenshots/title.jpg)](https://jinpingmei.vibecoco.ai)
55
+ <p>
56
+ <a href="https://jinpingmei.vibecoco.ai"><img src="examples/jin-ping-mei/screenshots/title.jpg" alt="Animated title screen: the five women of the Ximen household in a spring courtyard beside the title and menu" width="49%"></a>
57
+ <a href="https://jinpingmei.vibecoco.ai"><img src="examples/jin-ping-mei/screenshots/adv.jpg" alt="Dinner scene: three heroines standing in the hall while Meng Yulou speaks in a name-plated text box above the ADV control bar" width="49%"></a>
58
+ </p>
53
59
 
54
- **Choose whose door you enter tonight. Find out whose door knocks in the morning.**
60
+ **That spring, five doors kept a lamp lit for you. Whatever you say, they remember.**
55
61
 
56
- Twenty days, five courtyards. Keep silver, influence, reputation, exposure, and household strain in balance; respect each woman's terms; build trust through shared crises; and face a final ledger shaped by what everyone chose and remembers.
62
+ A galgame-style romance ADV set in the Ximen household the spring after Li Ping'er marries in. A common route puts all five women at one table, in one night of rain and at one Qingming feast; what your choices build with each of them decides which courtyard doors are still lit on the night the routes split. Each of the five heroine routes has a good, an ordinary and a missed ending (16 endings, counting the one where no lamp is left), and every heroine ending turns to a fixed page of what the novel does to her (the no-lamp ending turns to Ximen Qing's death and the household scattering). Auto, read-only skip, backlog, hide, quick save, thumbnail saves and rollback are there, with a CG gallery, scene replay, music room and ending flowchart.
57
63
 
58
- **[Play in browser](https://jinpingmei.vibecoco.ai)** · [Adaptation workspace](examples/jin-ping-mei/) · design estimate: 60–90 min · 18+ · playable prototype
64
+ **[Play in browser](https://jinpingmei.vibecoco.ai)** · [Adaptation workspace](examples/jin-ping-mei/) · design estimate: 20–30 min per route, 1–1.5 h for all five · 18+ · playable prototype
59
65
 
60
66
  ### Project Plateau · The Lost World · 3D
61
67
 
62
- A real-time **first-person 3D field-photography game** adapted from Arthur Conan Doyle's *The Lost World*. Cross a connected plateau, observe a living Iguanodon family, expose four glass plates under aerial pressure, and return with the views that survived.
68
+ A real-time **first-person 3D field-photography game** adapted from Arthur Conan Doyle's *The Lost World*. Under a low western sun, walk out from Fort Challenger through knee-high grass, keep to a band of thorn arches for cover, and expose four glass plates through a long lens. Each plate is graded on the spot from what the live camera actually framed, with stamps and a line from the sceptical Summerlee. A pterodactyl circles before it dives, a stegosaurus may come down to drink at the brook, and you have 300 seconds of light to bring the plates back.
63
69
 
64
- Play the full expedition on desktop, or watch the 15-second gameplay preview on other devices.
70
+ Play the full expedition on desktop, or watch the 15-second gameplay preview on other devices. It is a real capture of the current build.
65
71
 
66
- https://github.com/user-attachments/assets/27819247-4e4d-4bf0-8f0f-43d4125c4d45
72
+ https://github.com/user-attachments/assets/5ad62a58-1abe-4d73-b86e-1c8c6563fdb2
67
73
 
68
- **[Play in your browser — no install](https://plateau.vibecoco.ai)** · [Adaptation workspace](examples/project-plateau/) · [Share feedback](https://github.com/zenstory-ai/novel-to-game/discussions/7) · design estimate: 1–3 min · desktop WebGL2 · playable prototype
74
+ **[Play in your browser — no install](https://plateau.vibecoco.ai)** · [Adaptation workspace](examples/project-plateau/) · [Share feedback](https://github.com/zenstory-ai/novel-to-game/discussions/7) · design estimate: 5–10 min (300 s of light per run) · desktop WebGL2 · playable prototype
69
75
 
70
76
  ## What it is
71
77
 
@@ -73,14 +79,20 @@ There is no GPU, no hosted service, and no bundled engine: the skills run on the
73
79
 
74
80
  - **Every design decision cites the novel.** Analysis reads the whole book and writes a `SOURCE_BIBLE` where every hard rule, key character goal, turning point and ending, and signature anchor carries its chapter or file location, and every adaptation-boundary row cites its evidence. Source facts are labelled `immutable`, `adaptable`, `open`, or `conflicted`; anything the novel does not define is marked a design invention, never smuggled in as fact.
75
81
  - **The game shape is a documented decision, not a default.** The concept stage compares real alternatives and kills directions with named hard vetoes (the core loop ignores the novel's central tension; strip the proper nouns and a generic template remains; the player only spends resources to release a fixed plot). Concept, world design, and art direction are written by different stages into different documents, and the build may not quietly redesign them.
82
+ - **A borrowed genre comes with its shell.** Players recognise a genre by more than its core mechanic, so a systems game lists which parts of the genre's shell (entering the world, objective guidance, progression and reasons to return) it implements, degrades, or drops and why, and what the first minute shows. A Fantasy Westward Journey-style RPG is not shipped as a bare chain of fights.
76
83
  - **Built for the runtime the brief locks.** The product brief, the one-page requirements sheet the agent drafts first (in `quick` it stops for your decision only on blocking items such as platform, rights, or adult content), locks platform, engine, target runtime, and the runtime actually available for testing. A missing toolchain may not silently become a web build. The design documents are engine-independent Markdown you own.
77
84
  - **QA is one real run, six checks, and honest limitations.** The build is launched on the tested runtime and one complete execution proves `launch`, `render`, `input`, `coreLoop`, `outcome`, and `restart`. Fun, balance, other browsers, and rights are written as limitations, never as PASS.
78
85
  - **Voice is opt-in and generated at build time by default.** No line goes to a text-to-speech provider unless art direction chooses voice; runtime synthesis needs the product brief's explicit approval, and the novel and design documents are never uploaded.
79
86
 
80
- Interactive fiction is a first-class track: continuous scenes, dialogue, testimony, and key choices can carry the whole game, held to the same agency and evidence requirements as a systems game.
87
+ Interactive fiction is a first-class track: continuous scenes, dialogue, testimony, and key choices can carry the whole game, held to the same agency and evidence requirements as a systems game. On a character route, a key choice targets that character's own wound or agenda, and the relationship shows in reactions, forms of address, the places that open to you and what you are trusted with, not in an on-screen number.
81
88
 
82
89
  ## Install
83
90
 
91
+ ### ClawHub
92
+
93
+ ClawHub distribution is governed by the repository's [explicit publish inventory](.clawhub/publish.json), with discovery through [ClawHub](https://clawhub.ai/). A skill-specific link is added here only after its publisher, version, and anonymous accessibility are verified, so this README never presents a nonexistent listing as live.
94
+
95
+
84
96
  Prerequisite: you already use Claude Code, Codex, or Kimi Code, and `npx` (Node.js) runs in your terminal.
85
97
 
86
98
  | Agent CLI | Install | Invoke |
@@ -132,7 +144,7 @@ codex plugin add novel-to-game@novel-to-game-skills
132
144
 
133
145
  ## See what it produces
134
146
 
135
- Every excerpt below is copied from a file in this repository; the two Chinese examples keep their documents in Simplified Chinese, so those excerpts are translated here and marked as such, with the originals linked. Cuts are marked with "…".
147
+ Every excerpt below is copied from a file in this repository; the two Chinese examples keep their documents in Simplified Chinese, so their Markdown excerpts are translated here and marked as such, while JSON records are quoted as they are and glossed in the surrounding text. The originals are linked. Cuts are marked with "…".
136
148
 
137
149
  ### What the design documents look like
138
150
 
@@ -171,14 +183,28 @@ taking down the White Bull's true form with your companion beast and transformat
171
183
  and dragging it out means you will be killed in turn, so "when to open the third wave" is the core decision of the finale.
172
184
  ```
173
185
 
174
- [`design/ART_DIRECTION.md`](examples/journey-to-the-west/design/ART_DIRECTION.md) makes each wave rewrite the backdrop rather than flash an icon (translated):
186
+ The same document lists the genre's shell around those battles, and what was implemented, degraded, or dropped (translated; 4 of the table's 8 rows):
175
187
 
176
188
  ```markdown
177
- - **Three waves of the true fan · reprinting the world**: the true fan is the turnaround of the boss fight, and each wave rewrites the Flame Mountain landscape —
178
- first wave, quell fire: enemy buffs cleared, enemy attack reduced, the vermilion fire layer sinks to bone-white afterglow;
179
- second wave, raise wind: whole party faster, blue-white wind lines sweep across and clear the floating ash;
180
- third wave, bring rain: party heals over time, enemy guard broken and exposed, deep-blue raindrops fall on the embers.
181
- …
189
+ | Genre shell | State | How / why |
190
+ |---|---|---|
191
+ | Entering the world and moving | Implemented | Four walkable 3/4 scenes (Flame Mountain village, Cuiyun Mountain, the fire mouth, Jilei Mountain); click-to-walk, arrow-key walking, teal teleport circles (click the circle or its name) |
192
+ | Objective guidance / tracking | Implemented | "!" above main-quest NPCs; one click on the quest tracker on the right auto-paths, across maps too; minimap at top left |
193
+ …
194
+ | Pets | Degraded | Two fixed pets (the Water-Repelling Golden-Eyed Beast and a catchable fire demon), one in battle; no collection pool, breeding, or rerolling — a 45–90 minute campaign has no use for them |
195
+ …
196
+ | Parties / trading / PVP | Not done | A single-player offline game with no second player; master and three disciples are the fixed party |
197
+ ```
198
+
199
+ [`design/ART_DIRECTION.md`](examples/journey-to-the-west/design/ART_DIRECTION.md) sets the bar as the genre's own screenshots, then gives each wave of the fan its own effect and saves the lasting change to the world for the ending (translated):
200
+
201
+ ```markdown
202
+ **Any in-game screenshot, taken at random, should look like a game screen from a turn-based Journey to the West online game such as Fantasy Westward Journey or Wen Dao**: painted 3/4 top-down walking scenes,
203
+ small HUD cards pinned to the four corners, names and quest markers over heads; battles with two rows of standing figures, enemy left and party right, an action-order bar along the top and a command panel at the bottom.
204
+ What is borrowed is the genre's form and readability, not their chibi big heads, outlines, or specific character designs.
205
+ …
206
+ 5. **The true fan's three waves**: each wave gets a teal-outlined banner, followed by two or three seconds of full-screen tint and particles — ash settling as the fire is quelled, wind streaks, rain lines.
207
+ The lasting change to the world belongs to the ending: the Mountain of Flames becomes a new rain-soaked landscape with no open flame (`huoyan-rain`), with the restart button always visible.
182
208
  ```
183
209
 
184
210
  And [`qa/verification.json`](examples/journey-to-the-west/qa/verification.json) records the real browser run that reached that ending and started over:
@@ -203,36 +229,50 @@ And [`qa/verification.json`](examples/journey-to-the-west/qa/verification.json)
203
229
 
204
230
  ### How a choice is written so the game remembers it
205
231
 
206
- [Jin Ping Mei](examples/jin-ping-mei/) is the relationship-and-household example. Its [`concepts/CONCEPT.md`](examples/jin-ping-mei/concepts/CONCEPT.md) states the promise in one sentence and, for each experience pillar, the observable evidence and the symptom that would kill it (translated; 3 of 5 pillar rows):
232
+ [Jin Ping Mei](examples/jin-ping-mei/) is the romance-ADV example. It was rebuilt from a 20-day household-ledger simulation into a galgame, and [`concepts/CONCEPT.md`](examples/jin-ping-mei/concepts/CONCEPT.md) now gives each heroine something she wants and a wound only the player gets to see, each pinned to chapters (translated; 3 of the table's 5 rows):
207
233
 
208
234
  ```markdown
209
- Core sentence: **Whose door you enter tonight, and who comes to you in the morning holding last night's evidence.**
235
+ Core sentence: **Whatever you said, they remember.**
210
236
  …
211
- | Pillar | Observable evidence | Veto symptom |
212
- | --- | --- | --- |
213
- | All five women can change the situation on their own | Each has eight route segments, her own refusals and an outside capability | Only names, portraits or affection numbers are swapped |
214
- …
215
- | Adult content is earned through consent and relationship | Invitation, continue / stop, re-confirmation, next-morning echo | Intimacy bought with silver, status or immunity from punishment |
216
- | Management and relationships supply each other's actions | Each of the five women's abilities handles one thing: accounts, lies, goods, connections, or physical evidence | The optimal play is to skip the character content |
237
+ | Character | What she wants | Her wound | Source basis |
238
+ |---|---|---|---|
239
+ | Wu Yueniang | To be asked first about what matters | She is the principal wife only in front of others | Chapters 1, 21 |
240
+ | Pan Jinlian | To be seen, to be chosen first | Apart from the way you look at her, she has nothing | Chapters 8, 9, 38 |
241
+ | Li Ping'er | Safety and certainty | Seen first as a trunk of valuables, only later as a person | Chapters 14, 16, 19 |
217
242
  ```
218
243
 
219
- [`design/GAME_DESIGN.md`](examples/jin-ping-mei/design/GAME_DESIGN.md) then forbids the "pick an option, get a line, scene over" pattern (translated):
244
+ [`design/GAME_DESIGN.md`](examples/jin-ping-mei/design/GAME_DESIGN.md) keeps affection off the screen, aims each route's key choice at her wound, and says what decides the ending (translated; 2 of the route table's 5 rows):
220
245
 
221
246
  ```markdown
222
- - A route choice must produce her own reply, a reply from a neighbouring courtyard, the player's handling of it, and, at least two days later, the old words coming back to be settled. When they come back, four beats play in order — she repeats them word for word → the neighbouring courtyard names the cost that spilled over → the player honours, rewrites, or denies them → the outcome in both courtyards — and each beat can be opened and read in full. A mature relationship also triggers one dusk invitation that she initiates.
223
- - The next morning's first scene belongs to whoever was neglected or holds concrete evidence; no jealousy appears without a source.
247
+ Choices show no numbers. Affection has only three outlets: her expression and lines; whether her courtyard door is "lit" on the night the routes split; and an optional "feelings" glance in the system menu
248
+ (only her look and "the lamp is lit / the lamp is going out", no tiers and no numbers). Yueniang states the rule in the first chapter: on the night the Qingming feast breaks up, only a door still lit can be entered.
249
+ …
250
+ | Character | Source basis | Key choice (the right move) | Good | Ordinary | Missed |
251
+ |---|---|---|---|---|---|
252
+ …
253
+ | Pan Jinlian | Chapters 8, 38: sends verses longing for him; plays the pipa on a snowy night | Do not open Ping'er's trunks for her, but stay with her tonight | The pipa is not cold | The side gate left ajar | The fan falls |
254
+ | Li Ping'er | Chapters 14, 19: entrusts herself over the garden wall; met coldly when she marries in | Do not take her keys; say in front of everyone that her silver is hers | The keys in her hand | Tea under the window | The trunks |
255
+ …
256
+ Ending rule: get the key choice wrong → Missed; get it right, with her affection ≥7 and the truth told at the last question → Good; otherwise → Ordinary.
224
257
  ```
225
258
 
226
- The QA record for this game is candid about how it was played. In [`qa/verification.json`](examples/jin-ping-mei/qa/verification.json), all six checks pass and the first limitation reads:
259
+ Every heroine ending then turns to a page of what the novel does to her, and the same document is plain about it: the ending decides only what the two of you made of this one spring, and the page footer says it cannot change where she goes in the book.
260
+
261
+ The QA record is candid about how much of that was played. In [`qa/verification.json`](examples/jin-ping-mei/qa/verification.json), the complete browser run ends at `yue_good` and all six checks pass; the first and last limitations read:
227
262
 
228
263
  ```json
229
264
  {
230
265
  "scope": "路径覆盖",
231
- "reason": "快速路径在每屏选择第一项可行主动作,只到达一个失稳结局;没有穷举其他选项或结局。"
266
+ "reason": "浏览器只走月娘良缘一条完整路径;其余 15 个结局由 test/lint_script.mjs 穷举选择证明可达,未逐一在浏览器渲染。"
267
+ },
268
+ …
269
+ {
270
+ "scope": "体验判断",
271
+ "reason": "自动化只证明能启动、渲染、输入、走到结局并重开,不判断剧情是否动人或节奏是否合适。"
232
272
  }
233
273
  ```
234
274
 
235
- That is: the fast path picked the first feasible main action on every screen and reached one unstable ending; other options and endings were not exhausted. The design document itself draws the same line: the machine only proves that content exists, is reachable and readable, and that state consequences are real; subjective appeal, pacing, and balance are not settled by automation.
275
+ That is: the browser walked only Wu Yueniang's good-ending route, and the other 15 endings were shown reachable by exhausting the choices in `test/lint_script.mjs`, not rendered one by one. Automation proves the game launches, renders, takes input, reaches an ending and restarts; it does not judge whether the story moves anyone or whether the pacing is right.
236
276
 
237
277
  ### What the QA record admits it did not test
238
278
 
@@ -249,7 +289,7 @@ plate, or if recording never changes a later route or defense decision. `GAME_DE
249
289
  must define that causal chain and preserve the non-lethal scout fantasy.
250
290
  ```
251
291
 
252
- `npm run verify` drives the real build with keyboard and mouse events and writes the input trace and `qa/verification.json` in the same run. The trace in [`build/evidence/current-run/report.json`](examples/project-plateau/build/evidence/current-run/report.json) is the whole expedition:
292
+ `npm run verify` drives the real build with keyboard and mouse events and writes the input trace and `qa/verification.json` in the same run. The trace in [`build/evidence/current-run/report.json`](examples/project-plateau/build/evidence/current-run/report.json) is the whole expedition, out along the thorn band to the blind and back:
253
293
 
254
294
  ```json
255
295
  "inputTrace": [
@@ -257,16 +297,17 @@ must define that causal chain and preserve the non-lethal scout fantasy.
257
297
  "Right Mouse + Left Mouse: record the brook",
258
298
  "KeyW: reach the basalt shelf",
259
299
  "Right Mouse + Left Mouse: record basalt scale",
260
- "KeyA: enter canopy cover",
261
- "hold KeyC under cover: let the attack widen",
262
- "KeyW: reach the glade",
263
- "Right Mouse + Left Mouse: record young at play",
300
+ "KeyA: step under the thorn arches",
264
301
  …
265
- "KeyS: return to Fort"
266
- ],
302
+ "KeyW: settle in the glade-edge blind",
303
+ "Right Mouse + Left Mouse: record young at play from the blind",
304
+ "hold KeyC under cover: crouch until the wings lose interest",
305
+ …
306
+ "KeyS: back up the thorn band to Fort"
307
+ ]
267
308
  ```
268
309
 
269
- And [`build/BUILD_BRIEF.md`](examples/project-plateau/build/BUILD_BRIEF.md) says exactly what that PASS means:
310
+ [`build/BUILD_BRIEF.md`](examples/project-plateau/build/BUILD_BRIEF.md) says exactly what that PASS means:
270
311
 
271
312
  ```markdown
272
313
  …
@@ -275,7 +316,20 @@ desktop browser. It does not prove subjective visual quality, comfort, fun, bala
275
316
  rights clearance, public hosting or other browsers, GPUs and devices.
276
317
  ```
277
318
 
278
- Evidence also cuts the other way. The product brief records that the first measured run crossed the whole route in 55.2 seconds, which falsified the planned 5–8 minute session, so the product boundary was cut to a 1–3 minute run instead of padding the route with waits ([`PRODUCT_BRIEF.md`](examples/project-plateau/PRODUCT_BRIEF.md)).
319
+ And [`qa/verification.json`](examples/project-plateau/qa/verification.json) names what this run left out, including the new stegosaurus beat:
320
+
321
+ ```json
322
+ {
323
+ "scope": "optional stegosaurus beat",
324
+ "reason": "The complete run does not photograph the stegosaurus; its framing rule is covered by one unit test only."
325
+ },
326
+ {
327
+ "scope": "look, sound and hitches",
328
+ "reason": "Visual quality is a reviewed judgment; the sound beds were not heard on laptop speakers and frame hitches were not measured on an unloaded or low-end machine."
329
+ }
330
+ ```
331
+
332
+ The session length moved twice, once on evidence and once on an owner decision, and [`PRODUCT_BRIEF.md`](examples/project-plateau/PRODUCT_BRIEF.md) keeps both steps. The first measured run crossed the whole route in 55.2 seconds, which falsified the planned 5–8 minute session, so the boundary was cut to a 1–3 minute run with 180 seconds of light instead of padding the route with waits. When the owner later asked for a longer 5–10 minute visit, the light budget went to 300 seconds and was filled with new decisions (the optional Chapter XII stegosaurus beat and plate-by-plate grading) rather than more walking; a learned Strong path still finishes in about 90 seconds.
279
333
 
280
334
  ## Your first request
281
335
 
@@ -355,7 +409,7 @@ Say so in the request, as the second example above does. That locks `experienceP
355
409
 
356
410
  ### How long does a full run take, and what does it cost?
357
411
 
358
- Longer than one prompt. The agent reads the whole novel, writes five design documents, builds, and runs QA, and each stage is a separate skill call, so a full run is long and may span more than one session (the Jin Ping Mei example's progress file carries entries from two different days). Token spend is whatever your coding agent bills; nothing else is paid unless art direction opts into image or voice generation (see the GPU question below). The public examples' progress files do not record wall-clock time or token counts, so this README does not quote a number.
412
+ Longer than one prompt. The agent reads the whole novel, writes five design documents, builds, and runs QA, and each stage is a separate skill call, so a full run is long and may span more than one session. Token spend is whatever your coding agent bills; nothing else is paid unless art direction opts into image or voice generation (see the GPU question below). The public examples' progress files do not record wall-clock time or token counts, so this README does not quote a number.
359
413
 
360
414
  ### The session ended halfway. Can it continue?
361
415
 
@@ -367,7 +421,7 @@ You choose, and the product brief locks it: platform, production engine, target
367
421
 
368
422
  ### Do I need a GPU or my own model? Who pays for images and voice?
369
423
 
370
- No GPU and no separate model: analysis, design, and code are written by the model of the coding agent you already use. External services are opt-in. Generated images are used only when art direction selects them, with the tool chosen in your environment after checking capability, licence, and cost (the Jin Ping Mei example records all 41 of its images as generated with Codex's built-in image tool, in `build/art/generated-art.json`). Voice is off unless art direction chooses it; the default is build-time generation into local assets, only the per-line dialogue and any pronunciation notes are sent, and the novel and design documents are never uploaded. Paid services are one of the things the agent stops to ask about before it starts. See the [TTS production contract](skills/game-build/references/tts-production-contract.md) (Chinese).
424
+ No GPU and no separate model: analysis, design, and code are written by the model of the coding agent you already use. External services are opt-in. Generated images are used only when art direction selects them, with the tool chosen in your environment after checking capability, licence, and cost (the Jin Ping Mei example records most of its images, generated with Codex's built-in image tool, batch by batch in `build/art/generated-art.json`). Voice is off unless art direction chooses it; the default is build-time generation into local assets, only the per-line dialogue and any pronunciation notes are sent, and the novel and design documents are never uploaded. Paid services are one of the things the agent stops to ask about before it starts. See the [TTS production contract](skills/game-build/references/tts-production-contract.md) (Chinese).
371
425
 
372
426
  ### How do I know the game it built actually runs? What does the QA PASS mean?
373
427
 
@@ -1,4 +1,4 @@
1
- <!-- Last synced with README.md: 2026-09-18 -->
1
+ <!-- Last synced with README.md: 2026-10-02 -->
2
2
 
3
3
  <p align="center">
4
4
  <img src="https://zenstory.ai/brand/zenstory-ai-mark.svg" alt="" width="76" height="76">
@@ -41,33 +41,39 @@ NovelToGame 是装进你已在用的编码 Agent(Claude Code、Codex、Kimi Co
41
41
 
42
42
  ### 西游记 · 三借芭蕉扇
43
43
 
44
- [![积雷山决战中敌我阵列完整留在木刻舞台,下方轻绢指令台与人物画面彼此分离](examples/journey-to-the-west/screenshots/hero.jpg)](https://xiyouji.vibecoco.ai)
44
+ <p>
45
+ <a href="https://xiyouji.vibecoco.ai"><img src="examples/journey-to-the-west/screenshots/hero.jpg" alt="师徒一行站在彩绘的火焰山庄里,四角是小地图、任务追踪、聊天栏与功能按钮" width="49%"></a>
46
+ <a href="https://xiyouji.vibecoco.ai"><img src="examples/journey-to-the-west/screenshots/battle.jpg" alt="积雷山之战:牛魔王一方在左、悟空一行在右,上缘行动顺序条,下方指令面板" width="49%"></a>
47
+ </p>
45
48
 
46
- **一扇吹出五万里。这口气,一回合一回合打回来。**
49
+ **一扇吹出五万里。走回去,接任务,一回合一回合把火焰山打回来。**
47
50
 
48
- 你指挥孙悟空一行三借芭蕉扇:算五行、循火脉残图寻宝、在收手与深入之间下注、排阵型、变形取巧硬闯不进的地方,把一个正面打不过的牛魔王,打成落在火焰山上的一场雨。
51
+ 一款以第五十九至六十一回为本的《梦幻西游》式回合制 RPG。在四张彩绘场景里点地行走,找头顶「!」的 NPC,点任务追踪自动寻路过去,主线之间还能领可重复的封妖令日常。攒历练与银两,逛商店、换装备、研习法术、带召唤兽上阵;再用五行相克、愤怒特技和悟空的七十二变打指令回合制战斗,把一个正面打不过的牛魔王,打成落在火焰山上的一场雨。
49
52
 
50
53
  **[浏览器试玩](https://xiyouji.vibecoco.ai)** · [改编工作区](examples/journey-to-the-west/) · 设计估时 45–90 分钟 · 全年龄 · 可玩原型
51
54
 
52
55
  ### 金瓶梅 · 风月总账
53
56
 
54
- [![西门宅中五人隔着总账看向玩家](examples/jin-ping-mei/screenshots/title.jpg)](https://jinpingmei.vibecoco.ai)
57
+ <p>
58
+ <a href="https://jinpingmei.vibecoco.ai"><img src="examples/jin-ping-mei/screenshots/title.jpg" alt="动画标题:西门宅五人站在春日庭院里,旁边是书名与菜单" width="49%"></a>
59
+ <a href="https://jinpingmei.vibecoco.ai"><img src="examples/jin-ping-mei/screenshots/adv.jpg" alt="晚饭戏:三位女主站在堂中,孟玉楼在带名牌的文本框里说话,下方是 ADV 功能栏" width="49%"></a>
60
+ </p>
55
61
 
56
- **今夜进谁的门,明早谁来敲你的门。**
62
+ **那年春天,五扇门都为你留过灯。你说过的话,她们都记得。**
57
63
 
58
- 二十日,五处院门。平衡银钱、官势、声名、见光与宅门损耗,守住每个人亲口说出的规矩,让不同院门在真实危局中建立互信,最后面对一笔由所有选择和记忆共同写成的总账。
64
+ 一款 galgame 式古风恋爱 ADV,时间是李瓶儿刚过门的那个春天。共通线把五个女人放到同一张饭桌、同一场夜雨、同一席清明宴上;你的选择在每个人那里攒下的心意,决定分岔那夜哪扇院门还亮着灯。五条个人线各有良缘、寻常、错过三种结局(连同无人留灯共十六个),每个个人结局之后都翻开一页原著里她的命数(无人留灯则翻到西门庆之死与宅门散去)。自动、只跳已读的快进、回看、隐藏、快存、缩略图存档和回到上一选项一应俱全,另有 CG 鉴赏、回想、音乐室和结局流程图。
59
65
 
60
- **[浏览器试玩](https://jinpingmei.vibecoco.ai)** · [改编工作区](examples/jin-ping-mei/) · 设计估时 60–90 分钟 · 18+ · 可玩原型
66
+ **[浏览器试玩](https://jinpingmei.vibecoco.ai)** · [改编工作区](examples/jin-ping-mei/) · 设计估时单周目 20–30 分钟,五线全收 1–1.5 小时 · 18+ · 可玩原型
61
67
 
62
68
  ### Project Plateau · 失落的世界 · 3D
63
69
 
64
- 这是一款由柯南·道尔《失落的世界》改编而来的实时**第一人称 3D 野外摄影游戏**。玩家穿过连通的高原,观察共同生活的禽龙家庭,在空中威胁下拍完四张玻璃底片,再带着幸存的影像返回。
70
+ 这是一款由柯南·道尔《失落的世界》改编而来的实时**第一人称 3D 野外摄影游戏**。西斜的低太阳下,从挑战者堡出发,穿过齐膝的草,沿一条荆棘拱廊找掩护,用长焦镜头曝光四张玻璃底片。每张底片当场按实时取景里真正框住的东西评定,盖上评语印章,再配一句多疑的萨默利教授的话。翼手龙先盘旋再俯冲,一头剑龙可能走下溪边饮水,你只有 300 秒天光把底片带回去。
65
71
 
66
- 桌面浏览器可完整试玩,其他设备可直接观看 15 秒实机预览。
72
+ 桌面浏览器可完整试玩,其他设备可直接观看 15 秒实机预览,它录自当前构建。
67
73
 
68
- https://github.com/user-attachments/assets/27819247-4e4d-4bf0-8f0f-43d4125c4d45
74
+ https://github.com/user-attachments/assets/5ad62a58-1abe-4d73-b86e-1c8c6563fdb2
69
75
 
70
- **[浏览器直接试玩,无需安装](https://plateau.vibecoco.ai)** · [改编工作区](examples/project-plateau/) · [反馈体验](https://github.com/zenstory-ai/novel-to-game/discussions/7) · 设计估时 1–3 分钟一局 · 桌面 WebGL2 · 可玩原型
76
+ **[浏览器直接试玩,无需安装](https://plateau.vibecoco.ai)** · [改编工作区](examples/project-plateau/) · [反馈体验](https://github.com/zenstory-ai/novel-to-game/discussions/7) · 设计估时 5–10 分钟(每局 300 秒天光) · 桌面 WebGL2 · 可玩原型
71
77
 
72
78
  ## 这是什么
73
79
 
@@ -75,14 +81,20 @@ https://github.com/user-attachments/assets/27819247-4e4d-4bf0-8f0f-43d4125c4d45
75
81
 
76
82
  - **每个设计决定都引用原著。** 拆解阶段读完全书,写出 `SOURCE_BIBLE`:硬规则、关键角色目标、转折结局和标志性锚点都标注章回或文件位置,改编边界表每行带证据位置。原作事实分为 `immutable`、`adaptable`、`open`、`conflicted` 四种边界;原著没有定义的部分标为设计发明,不会被悄悄写成事实。
77
83
  - **游戏形态是一个有记录的决定,不是默认值。** 概念阶段比较真实的替代方向,用具名的硬否决淘汰不合格方向(核心循环与原作中心张力无关;删掉专有名词后只剩通用模板;玩家只是花资源放行既定剧情)。概念、世界设计与美术方向分别由不同阶段写进各自的文档,构建阶段不得静默重做。
84
+ - **借成熟品类,就连同它的外壳一起借。** 玩家认出一类游戏,靠的不只是核心玩法;系统玩法项目要用一张短表写清该品类的外壳(进入世界、目标指引、成长与回访理由)哪些实现、哪些降级、哪些不做以及为什么,并写清第一分钟玩家看到什么。《梦幻西游》式的 RPG 不会只交出一串战斗关卡。
78
85
  - **面向简报锁定的运行环境构建。** 产品简报(Agent 最先起草的一页需求单;`quick` 模式下只在平台、权利、尺度等阻断项上停下等你裁决)锁定平台、引擎、目标运行时和实际可用的测试运行时。工具链缺失时不得悄悄改做网页。设计文档是不绑定引擎的 Markdown,归你所有。
79
86
  - **QA 是一次真实运行、六项检查和如实写下的限制。** 构建在测试运行时里真正启动,一次完整运行证明 `launch`、`render`、`input`、`coreLoop`、`outcome`、`restart` 六项。趣味、平衡、其他浏览器和权利只写成限制项(limitation),不写成 PASS。
80
87
  - **语音默认关闭,默认在构建期生成。** 除非美术方向选用语音,没有任何台词会发给语音合成服务;运行时合成须经产品简报明确批准;小说和设计文档从不上传。
81
88
 
82
- 互动叙事是一等赛道:连续场景、对白、证词与关键选择可以承载整个游戏,但要满足与系统玩法同样的能动性和证据要求。
89
+ 互动叙事是一等赛道:连续场景、对白、证词与关键选择可以承载整个游戏,但要满足与系统玩法同样的能动性和证据要求。人物路线的关键选择针对该人物自己的心结或议程,关系进展由人物反应、称呼、可进入的场所与可托付的事呈现,而不是屏幕上的数值。
83
90
 
84
91
  ## 安装
85
92
 
93
+ ### ClawHub
94
+
95
+ ClawHub 分发由仓库中的 [显式发布清单](.clawhub/publish.json) 管理,并通过 [ClawHub](https://clawhub.ai/) 提供发现入口。具体 skill 链接只有在发布者、版本和匿名访问均验证后才会写入本文档,避免把尚不存在的条目当成已上架。
96
+
97
+
86
98
  前提:你已经在用 Claude Code、Codex 或 Kimi Code,终端能运行 `npx`(Node.js)。
87
99
 
88
100
  | Agent CLI | 安装命令 | 调用方式 |
@@ -134,7 +146,7 @@ codex plugin add novel-to-game@novel-to-game-skills
134
146
 
135
147
  ## 看看它的输出
136
148
 
137
- 下面每段节选都摘自本仓库的文件;两个中文示例的文档是简体中文,原样引用,Project Plateau 的文档是英文,此处译成中文并标注(译),原文均有链接。省略处以“…”标出。
149
+ 下面每段节选都摘自本仓库的文件;两个中文示例的文档是简体中文,原样引用;Project Plateau 的文档是英文,其中 Markdown 节选译成中文并标注(译),JSON 记录保留英文原样,在前后正文里说明。原文均有链接。省略处以“…”标出。
138
150
 
139
151
  ### 设计文档长什么样
140
152
 
@@ -175,14 +187,28 @@ codex plugin add novel-to-game@novel-to-game-skills
175
187
  拖下去必被反杀,所以「三扇何时开」是决战的核心决策。
176
188
  ```
177
189
 
178
- [`design/ART_DIRECTION.md`](examples/journey-to-the-west/design/ART_DIRECTION.md) 让每一扇改写整张背景,而不是闪一个图标:
190
+ 同一份文档还列出了战斗之外的品类外壳,写明哪些实现、降级或不做(原表 8 行,节选 4 行):
179
191
 
180
192
  ```markdown
181
- - **真扇三段 · 世界重印**:真扇是 BOSS 战翻盘关键,逐段改写火焰山这张风景——
182
- 一息火:清敌增益、敌军减攻,朱红火层落为骨白余热;
183
- 二生风:全队加速,青白风纹扫过、清去浮灰;
184
- 三落雨:全队持续回血、敌军破防并显露破绽,深蓝雨点落在余火之上。
185
- …
193
+ | 品类外壳 | 状态 | 做法 / 理由 |
194
+ |---|---|---|
195
+ | 进入世界与移动 | 实现 | 四张可走 3/4 场景(火焰山庄、翠云山、火口、积雷山),点地行走、方向键行走,青色传送阵(点阵或点阵名) |
196
+ | 目标指引 / 追踪 | 实现 | 主线 NPC 头顶「!」,右侧任务追踪点一下自动寻路、可跨图;左上小地图 |
197
+ …
198
+ | 召唤兽 | 降级 | 两只固定宠(辟水金睛兽、可捕的火妖)选一上阵;无收集池、繁殖、洗练——一段 45-90 分钟战役用不上 |
199
+ …
200
+ | 组队 / 交易 / PVP | 不做 | 单机离线作品,没有第二位玩家;师徒四人就是固定队伍 |
201
+ ```
202
+
203
+ [`design/ART_DIRECTION.md`](examples/journey-to-the-west/design/ART_DIRECTION.md) 以同品类的实机截图为成色标尺,再给真扇每一扇各自的演出,把对世界的持久改变留给结局:
204
+
205
+ ```markdown
206
+ **随手一张实机截图,应像《梦幻西游》《问道》这类回合制西游网游里的一张游戏画面**:3/4 俯视的
207
+ 彩绘行走场景、四角压着 HUD 小卡、头顶名字与任务标记;战斗是敌左我右两排立绘、上缘行动顺序条、
208
+ 底部指令面板。借的是品类的形制与可读性,不借它们的 Q 版大头、描边和具体角色设计。
209
+ …
210
+ 5. **真扇三段**:每段一条青绿描边横幅,接一段两三秒的全屏着色与粒子——息火落灰、生风风痕、
211
+ 落雨雨线。持久的世界改变放在结局:火焰山换成雨后无明火的新地景(`huoyan-rain`),重开按钮常驻。
186
212
  ```
187
213
 
188
214
  而 [`qa/verification.json`](examples/journey-to-the-west/qa/verification.json) 记录了真实浏览器跑到这个结局并重开的那次运行:
@@ -207,37 +233,49 @@ codex plugin add novel-to-game@novel-to-game-skills
207
233
 
208
234
  ### 一个选择怎样被后文记住
209
235
 
210
- [《金瓶梅》](examples/jin-ping-mei/)是关系与宅门经营的示例。它的 [`concepts/CONCEPT.md`](examples/jin-ping-mei/concepts/CONCEPT.md) 用一句话写下承诺,并为每根体验支柱写明可观察证据和会否决它的现象(原表 5 行,节选 3 行):
236
+ [《金瓶梅》](examples/jin-ping-mei/)是恋爱 ADV 的示例。它从二十日宅门账务模拟重做成了 galgame,[`concepts/CONCEPT.md`](examples/jin-ping-mei/concepts/CONCEPT.md) 现在给每位女主写下她要什么、一道只有玩家看得到的伤口,各自钉到回目(原表 5 行,节选 3 行):
211
237
 
212
238
  ```markdown
213
- 核心句:**今夜进谁的门,明早谁拿着昨夜的证据来找你。**
214
- …
215
- | 支柱 | 可观察证据 | 否决现象 |
216
- | --- | --- | --- |
217
- | 五人都能主动改变局面 | 五名女主各有八段路线、独立拒绝和外部能力 | 只换名字、立绘或好感数 |
239
+ 核心句:**你说过的话,她们都记得。**
218
240
  …
219
- | 成人内容由同意与关系赢得 | 邀请、继续/停止、再次确认、次晨回响 | 用银钱、名分、免罚换亲密 |
220
- | 经营与关系互相提供动作 | 五人的能力分别解决账、谎、货、门路和实物证据 | 最优玩法是避开人物内容 |
241
+ | 人物 | 她要什么 | 她的伤口 | 原作依据 |
242
+ |---|---|---|---|
243
+ | 吴月娘 | 重要的事先问她 | 只在人前是正头娘子 | 第1、21回 |
244
+ | 潘金莲 | 被看见、被优先选择 | 除了你看她那一眼,什么都没有 | 第8、9、38回 |
245
+ | 李瓶儿 | 安全与确定 | 先被看成箱子,后被看成人 | 第14、16、19回 |
221
246
  ```
222
247
 
223
- [`design/GAME_DESIGN.md`](examples/jin-ping-mei/design/GAME_DESIGN.md) 随后禁止“按完选项只回一句话就散场”:
248
+ [`design/GAME_DESIGN.md`](examples/jin-ping-mei/design/GAME_DESIGN.md) 让好感不上屏,让每条路线的关键抉择对准她的伤口,并写明结局怎么判(路线表原 5 行,节选 2 行):
224
249
 
225
250
  ```markdown
226
- - 路线选择必须产生本人回应、旁院回应、玩家处置与至少两日后的旧话追账;旧话回来时连续演出“本人逐字复述→旁院说明外溢代价→玩家兑现/重写/否认→双院结果”四拍,每拍可续读。成熟关系还会触发一次由女主发起的黄昏邀约。
227
- - 次晨优先由被冷落或掌握具体证据的人发起,不生成无来源妒意。
251
+ 选择不显示数值。好感只有三种出口:她的表情与台词;分岔夜院门是否「亮着灯」;系统菜单里可选的「心意」一瞥
252
+ (只有她的神色和「灯亮着/灯将熄」,不给档位与数字)。规则在第一章由月娘说出:清明席散那夜,还亮着灯的门才进得去。
253
+ …
254
+ | 人物 | 原作依据 | 关键抉择(正确做法) | 良缘 | 寻常 | 错过 |
255
+ |---|---|---|---|---|---|
256
+ …
257
+ | 潘金莲 | 第8、38回:寄词盼人、雪夜弄琵琶 | 不替她开瓶儿的箱子,但今夜陪她 | 琵琶不冷 | 半掩的角门 | 扇子落地 |
258
+ | 李瓶儿 | 第14、19回:过墙托付、入门受冷 | 不收她的钥匙;当众说她的银子是她的 | 钥匙在她手里 | 窗下的茶 | 箱笼 |
259
+ …
260
+ 结局判定:关键抉择做错 → 错过;做对且该人心意 ≥7 并在最后一问说真话 → 良缘;其余 → 寻常。
228
261
  ```
229
262
 
230
- 这款游戏的 QA 记录对“怎么玩的”写得很坦白。[`qa/verification.json`](examples/jin-ping-mei/qa/verification.json) 六项全部 PASS,第一条限制项是:
263
+ 每个个人结局之后都翻开一页原著里她的命数,同一份文档写得很直白:结局只决定这一春你们说成了什么,页脚明写改不了她在书里的去处。
264
+
265
+ 这款游戏的 QA 记录对“玩到了多少”写得很坦白。[`qa/verification.json`](examples/jin-ping-mei/qa/verification.json) 里完整浏览器运行停在 `yue_good`,六项全部 PASS,第一条和最后一条限制项是:
231
266
 
232
267
  ```json
233
268
  {
234
269
  "scope": "路径覆盖",
235
- "reason": "快速路径在每屏选择第一项可行主动作,只到达一个失稳结局;没有穷举其他选项或结局。"
270
+ "reason": "浏览器只走月娘良缘一条完整路径;其余 15 个结局由 test/lint_script.mjs 穷举选择证明可达,未逐一在浏览器渲染。"
271
+ },
272
+ …
273
+ {
274
+ "scope": "体验判断",
275
+ "reason": "自动化只证明能启动、渲染、输入、走到结局并重开,不判断剧情是否动人或节奏是否合适。"
236
276
  }
237
277
  ```
238
278
 
239
- 设计文档自己也划了同一条线:自动化只证明内容存在、可达、可读且状态后果真实;主观吸引力、节奏与平衡不由机器下结论。
240
-
241
279
  ### QA 记录承认自己没测什么
242
280
 
243
281
  [Project Plateau](examples/project-plateau/) 是 3D 示例,文档为英文。它的概念比较了三个各自锚定章节的方向——A · Proof Before Dark(野外观察与带着受损证据返回)、B · Fire Across the Lake(沿溪到湖、逃离追踪的猎食者)、C · The Eighteenth Cave(背着证据的洞穴下降)——并写下胜出方向应被放弃的条件,见 [`concepts/CONCEPT.md`](examples/project-plateau/concepts/CONCEPT.md)(译):
@@ -251,7 +289,7 @@ codex plugin add novel-to-game@novel-to-game-skills
251
289
  则选定方向被证伪。`GAME_DESIGN.md` 必须定义这条因果链,并保住不致命的侦察幻想。
252
290
  ```
253
291
 
254
- `npm run verify` 用键鼠事件驱动真实构建,在同一次运行里写出输入轨迹和 `qa/verification.json`。[`build/evidence/current-run/report.json`](examples/project-plateau/build/evidence/current-run/report.json) 里的输入轨迹就是整次远征:
292
+ `npm run verify` 用键鼠事件驱动真实构建,在同一次运行里写出输入轨迹和 `qa/verification.json`。[`build/evidence/current-run/report.json`](examples/project-plateau/build/evidence/current-run/report.json) 里的输入轨迹就是整次远征——沿荆棘带走到观察掩体,再原路退回:
255
293
 
256
294
  ```json
257
295
  "inputTrace": [
@@ -259,16 +297,17 @@ codex plugin add novel-to-game@novel-to-game-skills
259
297
  "Right Mouse + Left Mouse: record the brook",
260
298
  "KeyW: reach the basalt shelf",
261
299
  "Right Mouse + Left Mouse: record basalt scale",
262
- "KeyA: enter canopy cover",
263
- "hold KeyC under cover: let the attack widen",
264
- "KeyW: reach the glade",
265
- "Right Mouse + Left Mouse: record young at play",
300
+ "KeyA: step under the thorn arches",
266
301
  …
267
- "KeyS: return to Fort"
268
- ],
302
+ "KeyW: settle in the glade-edge blind",
303
+ "Right Mouse + Left Mouse: record young at play from the blind",
304
+ "hold KeyC under cover: crouch until the wings lose interest",
305
+ …
306
+ "KeyS: back up the thorn band to Fort"
307
+ ]
269
308
  ```
270
309
 
271
- [`build/BUILD_BRIEF.md`](examples/project-plateau/build/BUILD_BRIEF.md) 则写明这个 PASS 到底意味着什么(译):
310
+ [`build/BUILD_BRIEF.md`](examples/project-plateau/build/BUILD_BRIEF.md) 写明这个 PASS 到底意味着什么(译):
272
311
 
273
312
  ```markdown
274
313
  …
@@ -277,7 +316,22 @@ PASS 只在记录下来的本地桌面浏览器里证明这六项效果。
277
316
  已清权、公网托管,也不证明其他浏览器、GPU 和设备。
278
317
  ```
279
318
 
280
- 证据也会反过来砍产品。产品简报记录了第一次实测跑完整条路线只用了 55.2 秒,推翻了原计划的 5–8 分钟单局,于是产品边界被压到 1–3 分钟一局,而不是往路线里塞等待(见 [`PRODUCT_BRIEF.md`](examples/project-plateau/PRODUCT_BRIEF.md))。
319
+ [`qa/verification.json`](examples/project-plateau/qa/verification.json) 则点名这次运行漏掉了什么,包括新加的剑龙段落:
320
+
321
+ ```json
322
+ {
323
+ "scope": "optional stegosaurus beat",
324
+ "reason": "The complete run does not photograph the stegosaurus; its framing rule is covered by one unit test only."
325
+ },
326
+ {
327
+ "scope": "look, sound and hitches",
328
+ "reason": "Visual quality is a reviewed judgment; the sound beds were not heard on laptop speakers and frame hitches were not measured on an unloaded or low-end machine."
329
+ }
330
+ ```
331
+
332
+ 也就是:完整运行没有拍剑龙,它的取景规则只有一个单元测试覆盖;画面质量是人工评审的判断,环境声没在笔记本扬声器上听过,卡顿也没在空载或低端机器上测过。
333
+
334
+ 单局时长改过两次,一次因为实测证据,一次出于负责人的决定,[`PRODUCT_BRIEF.md`](examples/project-plateau/PRODUCT_BRIEF.md) 把两步都留着。第一次实测跑完整条路线只用了 55.2 秒,推翻了原计划的 5–8 分钟单局,于是边界被压到 1–3 分钟一局、180 秒天光,而不是往路线里塞等待。后来负责人要求一次 5–10 分钟的到访,天光预算提到 300 秒,填进去的是新的决策(可选的第十二章剑龙段落和逐张底片评定),而不是更长的路;熟练的 Strong 路线仍约 90 秒跑完。
281
335
 
282
336
  ## 第一条请求
283
337
 
@@ -356,7 +410,7 @@ game-adaptations/<project>/
356
410
 
357
411
  ### 完整跑一次要多久、花多少钱?
358
412
 
359
- 不止一句提示词的事。Agent 要读完整本小说、写五份设计文档、构建并跑 QA,每个阶段都是一次独立的 skill 调用,所以一次完整运行很长,可能跨多次会话(金瓶梅示例的进度文件里有两个不同日期的条目)。token 费用按你所用编码 Agent 的计费;除非美术方向选用图片或语音生成(见下面 GPU 一条),不产生其他费用。公开示例的进度文件没有记录耗时和 token 数,所以这里不给具体数字。
413
+ 不止一句提示词的事。Agent 要读完整本小说、写五份设计文档、构建并跑 QA,每个阶段都是一次独立的 skill 调用,所以一次完整运行很长,可能跨多次会话。token 费用按你所用编码 Agent 的计费;除非美术方向选用图片或语音生成(见下面 GPU 一条),不产生其他费用。公开示例的进度文件没有记录耗时和 token 数,所以这里不给具体数字。
360
414
 
361
415
  ### 会话中途断了,能接着做吗?
362
416
 
@@ -368,7 +422,7 @@ game-adaptations/<project>/
368
422
 
369
423
  ### 需要 GPU 或自己的模型吗?图片和语音的钱谁出?
370
424
 
371
- 不需要 GPU,也不需要单独的模型:拆解、设计和代码都由你已在用的编码 Agent 的模型完成。外部服务是可选项。生成图片只在美术方向选择它时使用,工具在你的环境里按能力、许可与费用核实后选择(金瓶梅示例在 `build/art/generated-art.json` 里记录了全部 41 张图由 Codex 内置的图像工具生成)。语音默认关闭,除非美术方向选用;默认在构建期生成为本地资产,只发送逐句台词与必要读音,从不上传小说和设计文档。付费服务是 Agent 开始前会停下来问你的问题之一。见[语音资产生产合同](skills/game-build/references/tts-production-contract.md)。
425
+ 不需要 GPU,也不需要单独的模型:拆解、设计和代码都由你已在用的编码 Agent 的模型完成。外部服务是可选项。生成图片只在美术方向选择它时使用,工具在你的环境里按能力、许可与费用核实后选择(金瓶梅示例的图由 Codex 内置的图像工具生成,大部分在 `build/art/generated-art.json` 里按批次记录)。语音默认关闭,除非美术方向选用;默认在构建期生成为本地资产,只发送逐句台词与必要读音,从不上传小说和设计文档。付费服务是 Agent 开始前会停下来问你的问题之一。见[语音资产生产合同](skills/game-build/references/tts-production-contract.md)。
372
426
 
373
427
  ### 怎么知道它做出来的游戏真的能跑?QA 里的 PASS 是什么意思?
374
428
 
@@ -1 +1 @@
1
- 0.4.0
1
+ 0.5.0