@oh-story/dsh 0.1.18 → 0.1.19

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 (125) hide show
  1. package/README.md +12 -12
  2. package/lib/drama/manifest.json +77 -247
  3. package/lib/drama/skills/short-drama/SKILL.md +9 -1
  4. package/lib/drama/skills/short-drama/references/creator-documents.md +51 -23
  5. package/lib/drama/skills/short-drama/references/reference-roles.md +1 -1
  6. package/lib/drama/skills/short-drama/scripts/creator_markdown_check.py +442 -129
  7. package/lib/drama/skills/short-drama/scripts/project_tool.py +54 -1
  8. package/lib/drama/skills/short-drama-assets/SKILL.md +2 -6
  9. package/lib/drama/skills/short-drama-assets/references/continuity-lock.md +9 -3
  10. package/lib/drama/skills/short-drama-assets/references/era-anchors.md +3 -3
  11. package/lib/drama/skills/short-drama-assets/references/location-and-view.md +4 -0
  12. package/lib/drama/skills/short-drama-develop/references/adaptation-craft.md +2 -2
  13. package/lib/drama/skills/short-drama-develop/references/episode-design.md +19 -4
  14. package/lib/drama/skills/short-drama-develop/references/genre-cards//347/263/273/347/273/237/346/265/201.md +1 -1
  15. package/lib/drama/skills/short-drama-edit/SKILL.md +1 -1
  16. package/lib/drama/skills/short-drama-edit/scripts/edit_tool.py +28 -6
  17. package/lib/drama/skills/short-drama-edit/scripts/selftest.py +1 -1
  18. package/lib/drama/skills/short-drama-image-prompts/SKILL.md +1 -5
  19. package/lib/drama/skills/short-drama-novel-analyze/references/aggregation-and-entities.md +2 -2
  20. package/lib/drama/skills/short-drama-produce/SKILL.md +2 -0
  21. package/lib/drama/skills/short-drama-review/SKILL.md +0 -4
  22. package/lib/drama/skills/short-drama-review/references/production-quality-gates.md +1 -1
  23. package/lib/drama/skills/short-drama-storyboard/SKILL.md +9 -9
  24. package/lib/drama/skills/short-drama-storyboard/references/blocking-playbooks.md +43 -13
  25. package/lib/drama/skills/short-drama-storyboard/references/keyframe-craft.md +5 -5
  26. package/lib/drama/skills/short-drama-storyboard/references/production-shot-grammar.md +5 -5
  27. package/lib/drama/skills/short-drama-storyboard/references/shot-craft.md +27 -3
  28. package/lib/drama/skills/short-drama-storyboard/references/stage-contract.md +2 -1
  29. package/lib/drama/skills/short-drama-video-prompts/SKILL.md +6 -8
  30. package/lib/drama/skills/short-drama-video-prompts/references/camera-audio-continuity.md +16 -1
  31. package/lib/drama/skills/short-drama-video-prompts/references/delivery-profile.md +23 -6
  32. package/lib/drama/skills/short-drama-video-prompts/references/motion-recipe.md +2 -2
  33. package/lib/drama/skills/short-drama-video-prompts/references/production-prompt-grammar.md +8 -1
  34. package/lib/drama/skills/short-drama-video-prompts/references/seedance-2.0.md +41 -2
  35. package/lib/drama/skills/short-drama-video-prompts/references/seedance-2.5.md +1 -1
  36. package/lib/drama/skills/short-drama-video-prompts/references/target-model-profile.md +5 -1
  37. package/lib/drama/skills/short-drama-write/SKILL.md +7 -3
  38. package/lib/drama/skills/short-drama-write/references/screenplay-format.md +1 -1
  39. package/lib/drama/skills/short-drama-write/scripts/duration_estimate.py +94 -1
  40. package/lib/drama/skills/short-drama-write/scripts/screenplay_index.py +13 -4
  41. package/lib/drama/skills/short-drama-write/scripts/selftest.py +3 -77
  42. package/lib/index.js +2 -2
  43. package/lib/index.js.map +1 -1
  44. package/lib/novel-to-game/README.md +20 -34
  45. package/lib/novel-to-game/README_ZH.md +20 -34
  46. package/lib/novel-to-game/VERSION +1 -1
  47. package/lib/novel-to-game/examples/jin-ping-mei/build/BUILD_BRIEF.md +2 -6
  48. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/audio.js +33 -39
  49. package/lib/novel-to-game/examples/jin-ping-mei/qa/README.md +2 -2
  50. package/lib/novel-to-game/manifest.json +46 -46
  51. package/lib/novel-to-game/skills/game-art-direction/SKILL.md +1 -1
  52. package/lib/novel-to-game/skills/game-build/references/baked-sprite-workflow.md +2 -3
  53. package/lib/novel-to-game/skills/game-build/references/blender-asset-workflow.md +6 -7
  54. package/lib/novel-to-game/skills/game-build/references/build-brief-contract.md +2 -2
  55. package/lib/novel-to-game/skills/game-build/references/generative-media-pipeline.md +1 -4
  56. package/lib/novel-to-game/skills/game-build/references/playable-model-contract.md +1 -3
  57. package/lib/novel-to-game/skills/game-build/references/tts-production-contract.md +1 -3
  58. package/lib/novel-to-game/skills/game-concept/SKILL.md +1 -1
  59. package/lib/novel-to-game/skills/game-qa/SKILL.md +3 -4
  60. package/lib/novel-to-game/skills/game-qa/references/qa-contract.md +1 -1
  61. package/lib/novel-to-game/skills/game-qa/references/test-design-method.md +3 -2
  62. package/lib/novel-to-game/skills/novel-game-analyze/SKILL.md +13 -14
  63. package/lib/novel-to-game/skills/novel-game-analyze/references/gameability-protocol.md +1 -2
  64. package/lib/novel-to-game/skills/novel-to-game/SKILL.md +4 -4
  65. package/lib/novel-to-game/skills/novel-to-game/references/intake-method.md +2 -3
  66. package/lib/novel-to-game/skills/novel-to-game/references/pipeline-contract.md +0 -8
  67. package/lib/oh-story/manifest.json +49 -49
  68. package/lib/oh-story/skills/story/SKILL.md +2 -2
  69. package/lib/oh-story/skills/story/VERSION +1 -1
  70. package/lib/oh-story/skills/story-deslop/SKILL.md +2 -2
  71. package/lib/oh-story/skills/story-import/SKILL.md +5 -5
  72. package/lib/oh-story/skills/story-import/references/deep-analysis.md +1 -1
  73. package/lib/oh-story/skills/story-import/references/import-report.md +1 -1
  74. package/lib/oh-story/skills/story-import/references/import-tracking.md +1 -1
  75. package/lib/oh-story/skills/story-import/references/outline-reverse.md +1 -1
  76. package/lib/oh-story/skills/story-import/scripts/tracking_commit.py +6 -1
  77. package/lib/oh-story/skills/story-long-analyze/SKILL.md +2 -2
  78. package/lib/oh-story/skills/story-long-write/SKILL.md +2 -2
  79. package/lib/oh-story/skills/story-long-write/references/agent-calls.md +3 -3
  80. package/lib/oh-story/skills/story-long-write/references/tracking-transaction.md +2 -2
  81. package/lib/oh-story/skills/story-long-write/scripts/tracking_commit.py +6 -1
  82. package/lib/oh-story/skills/story-review/SKILL.md +8 -7
  83. package/lib/oh-story/skills/story-review/references/agent-prompts.md +7 -7
  84. package/lib/oh-story/skills/story-review/references/tracking-transaction.md +2 -2
  85. package/lib/oh-story/skills/story-review/scripts/tracking_commit.py +6 -1
  86. package/lib/oh-story/skills/story-setup/SKILL.md +6 -6
  87. package/lib/oh-story/skills/story-short-write/SKILL.md +2 -2
  88. package/lib/oh-story/skills/story-short-write/references/agent-calls.md +3 -3
  89. package/lib/oh-story/skills/story-short-write/references/workflow-design.md +2 -2
  90. package/lib/oh-story/skills/story-short-write/references/workflow-revision.md +1 -1
  91. package/package.json +21 -21
  92. package/lib/drama/skills/short-drama-assets/assets/character-look.example.jsonl +0 -3
  93. package/lib/drama/skills/short-drama-assets/assets/continuity.example.jsonl +0 -4
  94. package/lib/drama/skills/short-drama-assets/assets/decisions.example.jsonl +0 -5
  95. package/lib/drama/skills/short-drama-assets/assets/location-view.example.jsonl +0 -3
  96. package/lib/drama/skills/short-drama-assets/assets/occurrences.example.jsonl +0 -5
  97. package/lib/drama/skills/short-drama-assets/assets/prop-state.example.jsonl +0 -3
  98. package/lib/drama/skills/short-drama-assets/examples/minimal/characters.jsonl +0 -2
  99. package/lib/drama/skills/short-drama-assets/examples/minimal/looks.jsonl +0 -2
  100. package/lib/drama/skills/short-drama-assets/scripts/asset_check.py +0 -267
  101. package/lib/drama/skills/short-drama-assets/scripts/selftest.py +0 -89
  102. package/lib/drama/skills/short-drama-image-prompts/examples/minimal-image-prompt-specs.jsonl +0 -2
  103. package/lib/drama/skills/short-drama-image-prompts/scripts/image_prompt_check.py +0 -443
  104. package/lib/drama/skills/short-drama-image-prompts/scripts/selftest.py +0 -95
  105. package/lib/drama/skills/short-drama-review/assets/finding-template.jsonl +0 -2
  106. package/lib/drama/skills/short-drama-review/assets/supersession-decision.example.json +0 -42
  107. package/lib/drama/skills/short-drama-review/assets/verdict-template.json +0 -32
  108. package/lib/drama/skills/short-drama-review/examples/minimal-findings.jsonl +0 -2
  109. package/lib/drama/skills/short-drama-review/examples/minimal-verdict.json +0 -34
  110. package/lib/drama/skills/short-drama-review/scripts/review_check.py +0 -325
  111. package/lib/drama/skills/short-drama-review/scripts/selftest.py +0 -87
  112. package/lib/drama/skills/short-drama-storyboard/assets/coverage-audition.example.jsonl +0 -2
  113. package/lib/drama/skills/short-drama-storyboard/assets/revision-lineage.fragment.json +0 -12
  114. package/lib/drama/skills/short-drama-storyboard/assets/scene-visual-plan.example.jsonl +0 -2
  115. package/lib/drama/skills/short-drama-storyboard/scripts/selftest.py +0 -191
  116. package/lib/drama/skills/short-drama-storyboard/scripts/storyboard_check.py +0 -824
  117. package/lib/drama/skills/short-drama-video-prompts/assets/coverage-scope.fragment.json +0 -21
  118. package/lib/drama/skills/short-drama-video-prompts/assets/motion-terminal.example.jsonl +0 -2
  119. package/lib/drama/skills/short-drama-video-prompts/assets/performance.fragment.json +0 -38
  120. package/lib/drama/skills/short-drama-video-prompts/examples/minimal-music-specs.jsonl +0 -2
  121. package/lib/drama/skills/short-drama-video-prompts/scripts/container_check.py +0 -329
  122. package/lib/drama/skills/short-drama-video-prompts/scripts/motion_timing_check.py +0 -451
  123. package/lib/drama/skills/short-drama-video-prompts/scripts/music_spec_check.py +0 -327
  124. package/lib/drama/skills/short-drama-video-prompts/scripts/selftest.py +0 -82
  125. package/lib/drama/skills/short-drama-write/scripts/voice_sheet_check.py +0 -416
@@ -80,17 +80,15 @@ The skills run on your coding agent's model and organize adaptation into stages.
80
80
  - **Key source facts carry citations.** 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.
81
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
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.
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.
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`. Untested environments are listed as limitations; this PASS does not establish fun, balance or rights clearance.
83
+ - **Built for the runtime the brief locks.** The product brief, the one-page requirements sheet the agent drafts first, 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.
84
+ - **QA is one real run, six checks, and written limitations.** The build is launched on the tested runtime and one complete execution proves `launch`, `render`, `input`, `coreLoop`, `outcome`, and `restart`. Untested environments are listed as limitations.
85
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.
86
86
 
87
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.
88
88
 
89
89
  ## Install
90
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/).
91
+ ### One command per agent
94
92
 
95
93
  Prerequisite: you already use Claude Code, Codex, or Kimi Code, and `npx` (Node.js) runs in your terminal.
96
94
 
@@ -102,6 +100,8 @@ Prerequisite: you already use Claude Code, Codex, or Kimi Code, and `npx` (Node.
102
100
 
103
101
  `-g` installs globally for every directory; drop it to install into the current directory only. **To update, run the same command again, or `npx skills update`.**
104
102
 
103
+ The skills are also listed on [ClawHub](https://clawhub.ai/), published from the repository's [publish inventory](.clawhub/publish.json).
104
+
105
105
  <details>
106
106
  <summary><strong>All three CLIs at once, or native plugin installation</strong></summary>
107
107
 
@@ -228,7 +228,7 @@ And [`qa/verification.json`](examples/journey-to-the-west/qa/verification.json)
228
228
 
229
229
  ### How a choice is written so the game remembers it
230
230
 
231
- [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):
231
+ [Jin Ping Mei](examples/jin-ping-mei/) is the romance-ADV example. Its [`concepts/CONCEPT.md`](examples/jin-ping-mei/concepts/CONCEPT.md) 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):
232
232
 
233
233
  ```markdown
234
234
  Core sentence: **Whatever you said, they remember.**
@@ -255,25 +255,20 @@ Choices show no numbers. Affection has only three outlets: her expression and li
255
255
  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.
256
256
  ```
257
257
 
258
- 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.
258
+ Every heroine ending then turns to a page of what the novel does to her: 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.
259
259
 
260
- 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:
260
+ 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 limitation records how much of the story that run covered:
261
261
 
262
262
  ```json
263
263
  {
264
264
  "scope": "路径覆盖",
265
265
  "reason": "浏览器只走月娘良缘一条完整路径;其余 15 个结局由 test/lint_script.mjs 穷举选择证明可达,未逐一在浏览器渲染。"
266
- },
267
- …
268
- {
269
- "scope": "体验判断",
270
- "reason": "自动化只证明能启动、渲染、输入、走到结局并重开,不判断剧情是否动人或节奏是否合适。"
271
266
  }
272
267
  ```
273
268
 
274
- 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.
269
+ 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.
275
270
 
276
- ### What the QA record admits it did not test
271
+ ### What one recorded run leaves out
277
272
 
278
273
  [Project Plateau](examples/project-plateau/) is the 3D example, and its documents are in English. Its concept compared three directions, each anchored to a chapter slice: A · Proof Before Dark (field observation and returning with damaged proof), B · Fire Across the Lake (following the brook to the lake and escaping a tracking predator), and C · The Eighteenth Cave (a proof-carrying descent). It also wrote down the condition under which the winner should be abandoned, in [`concepts/CONCEPT.md`](examples/project-plateau/concepts/CONCEPT.md):
279
274
 
@@ -306,25 +301,16 @@ must define that causal chain and preserve the non-lethal scout fantasy.
306
301
  ]
307
302
  ```
308
303
 
309
- [`build/BUILD_BRIEF.md`](examples/project-plateau/build/BUILD_BRIEF.md) says exactly what that PASS means:
310
-
311
- ```markdown
312
- …
313
- PASS proves the six effects only in the recorded local
314
- desktop browser. It does not prove subjective visual quality, comfort, fun, balance,
315
- rights clearance, public hosting or other browsers, GPUs and devices.
316
- ```
317
-
318
- And [`qa/verification.json`](examples/project-plateau/qa/verification.json) names what this run left out, including the new stegosaurus beat:
304
+ [`qa/verification.json`](examples/project-plateau/qa/verification.json) names what that run left out, including the new stegosaurus beat:
319
305
 
320
306
  ```json
321
307
  {
322
- "scope": "optional stegosaurus beat",
323
- "reason": "The complete run does not photograph the stegosaurus; its framing rule is covered by one unit test only."
308
+ "scope": "tested runtime",
309
+ "reason": "The run used local desktop Chromium on one Apple M1 Pro; other browsers, GPUs and devices were not exercised."
324
310
  },
325
311
  {
326
- "scope": "look, sound and hitches",
327
- "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."
312
+ "scope": "optional stegosaurus beat",
313
+ "reason": "The complete run does not photograph the stegosaurus; its framing rule is covered by one unit test only."
328
314
  }
329
315
  ```
330
316
 
@@ -359,7 +345,7 @@ Keep the choices and outcomes bounded; show each option's evidence, cost, visibl
359
345
  Label allowed additions and unresolved questions. Deliver design notes only—do not build, run QA, or claim a finished runtime.
360
346
  ```
361
347
 
362
- `quick` is the default: the agent drafts a product brief with sensible defaults, asks only about choices that materially change direction or touch safety, compares meaningful alternatives, and continues through design, build, and QA. Choose `director` when you want to make the key calls yourself: the agent stops with candidates and a recommendation at three points (the concept, what to cut after the whitebox playtest, and the visual target images) unless you have already decided.
348
+ `quick` is the default: the agent drafts a product brief with sensible defaults and stops for your decision only where a real fork in platform, core gameplay or fantasy, adult content, real persons, copyright or asset licences, paid services, or irreversible production spend would change the direction. Everything else is recorded in the brief as an unconfirmed assumption, and the agent compares meaningful alternatives and continues through design, build, and QA. Choose `director` when you want to make the key calls yourself: the agent stops with candidates and a recommendation at the concept, at what to cut after the whitebox playtest (where you can bring in a target player), and at the visual target images when a target pack is made, unless you have already decided.
363
349
 
364
350
  ## Workflow
365
351
 
@@ -379,7 +365,7 @@ After world design, a whitebox (a rough build without final art) tests only the
379
365
  | [`game-world-design`](skills/game-world-design/) | Define the player promise, core loop, world response, systems, levels, failure, and outcomes |
380
366
  | [`game-art-direction`](skills/game-art-direction/) | Define camera, composition, visual grammar, colour, light, materials, HUD, motion, and sound |
381
367
  | [`game-build`](skills/game-build/) | Build a risk-matched whitebox, then implement the approved production candidate without redesigning it |
382
- | [`game-qa`](skills/game-qa/) | Verify commands, states, screenshots, and real play paths without overstating subjective results |
368
+ | [`game-qa`](skills/game-qa/) | Verify commands, states, screenshots, and real play paths, and record what was not tested |
383
369
 
384
370
  ## Artifacts
385
371
 
@@ -416,11 +402,11 @@ Yes. Start with `novel-to-game resume`, the third mode beside `quick` and `direc
416
402
 
417
403
  ### Which engine or platform does it build for? Will it fall back to a web page if my toolchain is missing?
418
404
 
419
- You choose, and the product brief locks it: platform, production engine, target runtime, and the runtime actually available for testing. The build may not switch to a web page when the target toolchain is unavailable; only a substitute runtime already approved in the brief may be used, and then `targetRuntime`, `testedRuntime`, and the uncovered items are recorded separately. QA treats a substitute run as never proving the target platform. The three public examples are all browser games (two dependency-free static apps and one Three.js + Vite build) because that is what their briefs locked, not because it is the default. No public example yet targets a native engine or console; a Godot, Unity, or mobile build depends on the toolchain present in your environment and is recorded the same way, with anything untested written as a limitation. See [`game-build`](skills/game-build/SKILL.md) and the [QA contract](skills/game-qa/references/qa-contract.md) (both in Chinese).
405
+ You choose, and the product brief locks it: platform, production engine, target runtime, and the runtime actually available for testing. The build may not switch to a web page when the target toolchain is unavailable; only a substitute runtime already approved in the brief may be used, and then `targetRuntime`, `testedRuntime`, and the uncovered items are recorded separately. QA on a substitute run covers only the environment actually tested. The three public examples are all browser games (two dependency-free static apps and one Three.js + Vite build) because their briefs chose the browser as the target runtime. No public example yet targets a native engine or console; a Godot, Unity, or mobile build depends on the toolchain present in your environment and is recorded the same way, with anything untested written as a limitation. See [`game-build`](skills/game-build/SKILL.md) and the [QA contract](skills/game-qa/references/qa-contract.md) (both in Chinese).
420
406
 
421
407
  ### Do I need a GPU or my own model? Who pays for images and voice?
422
408
 
423
- For analysis, design and coding, the skills use your coding agent's model. If that model is hosted, these steps require no extra local model or GPU. Running the resulting game follows its target runtime's hardware requirements. 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).
409
+ For analysis, design and coding, the skills use your coding agent's model. If that model is hosted, these steps require no extra local model or GPU. Running the resulting game follows its target runtime's hardware requirements. 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. See the [TTS production contract](skills/game-build/references/tts-production-contract.md) (Chinese).
424
410
 
425
411
  ### How do I know the game it built actually runs? What does the QA PASS mean?
426
412
 
@@ -432,7 +418,7 @@ Yes. Novels in any language are accepted; artifacts use the language you ask for
432
418
 
433
419
  ### Can I adapt a novel I do not own the rights to?
434
420
 
435
- The skills do not clear rights for you, and QA does not certify them. Copyright, asset licensing, and real persons are among the questions the agent must stop and ask about before it starts; the brief records the compliance boundary and `SOURCE_BIBLE` records the edition, coverage, and authorisation boundary; a concept that depends on another game's protected characters, maps, interface, or text is a hard veto. The public examples use Project Gutenberg texts and record the rights status in each `source/SOURCE.md`, including why the Jin Ping Mei example ships an expurgated text.
421
+ The skills do not clear rights for you, and QA does not certify them. Copyright, asset licensing, and real persons are among the decisions `quick` stops for; the brief records the compliance boundary and `SOURCE_BIBLE` records the edition, coverage, and authorisation boundary; a concept that depends on another game's protected characters, maps, interface, or text is a hard veto. The public examples use Project Gutenberg texts and record the rights status in each `source/SOURCE.md`, including why the Jin Ping Mei example ships an expurgated text.
436
422
 
437
423
  ### Can I get design documents without a build?
438
424
 
@@ -1,4 +1,4 @@
1
- <!-- Last synced with README.md: 2026-10-19 -->
1
+ <!-- Last synced with README.md: 2026-10-20 -->
2
2
 
3
3
  <p align="center">
4
4
  <img src="https://zenstory.ai/brand/zenstory-ai-mark.svg" alt="" width="76" height="76">
@@ -82,17 +82,15 @@ https://github.com/user-attachments/assets/5ad62a58-1abe-4d73-b86e-1c8c6563fdb2
82
82
  - **关键原作事实都有引证。** 拆解阶段读完全书,写出 `SOURCE_BIBLE`:硬规则、关键角色目标、转折结局和标志性锚点都标注章回或文件位置,改编边界表每行带证据位置。原作事实分为 `immutable`、`adaptable`、`open`、`conflicted` 四种边界;原著没有定义的部分标为设计发明,不会被悄悄写成事实。
83
83
  - **游戏形态是一个有记录的决定,不是默认值。** 概念阶段比较真实的替代方向,用具名的硬否决淘汰不合格方向(核心循环与原作中心张力无关;删掉专有名词后只剩通用模板;玩家只是花资源放行既定剧情)。概念、世界设计与美术方向分别由不同阶段写进各自的文档,构建阶段不得静默重做。
84
84
  - **借成熟品类,就连同它的外壳一起借。** 玩家认出一类游戏,靠的不只是核心玩法;系统玩法项目要用一张短表写清该品类的外壳(进入世界、目标指引、成长与回访理由)哪些实现、哪些降级、哪些不做以及为什么,并写清第一分钟玩家看到什么。《梦幻西游》式的 RPG 不会只交出一串战斗关卡。
85
- - **面向简报锁定的运行环境构建。** 产品简报(Agent 最先起草的一页需求单;`quick` 模式下只在平台、权利、尺度等阻断项上停下等你裁决)锁定平台、引擎、目标运行时和实际可用的测试运行时。工具链缺失时不得悄悄改做网页。设计文档是不绑定引擎的 Markdown,归你所有。
86
- - **QA 是一次真实运行、六项检查和如实写下的限制。** 构建在测试运行时里真正启动,一次完整运行证明 `launch`、`render`、`input`、`coreLoop`、`outcome`、`restart` 六项。未测试的环境写入限制项(limitation);这个 PASS 不证明趣味、平衡或已经清权。
85
+ - **面向简报锁定的运行环境构建。** 产品简报(Agent 最先起草的一页需求单)锁定平台、引擎、目标运行时和实际可用的测试运行时。工具链缺失时不得悄悄改做网页。设计文档是不绑定引擎的 Markdown,归你所有。
86
+ - **QA 是一次真实运行、六项检查和写明的限制。** 构建在测试运行时里真正启动,一次完整运行证明 `launch`、`render`、`input`、`coreLoop`、`outcome`、`restart` 六项。未测试的环境写入限制项(limitation)。
87
87
  - **语音默认关闭,默认在构建期生成。** 除非美术方向选用语音,没有任何台词会发给语音合成服务;运行时合成须经产品简报明确批准;小说和设计文档从不上传。
88
88
 
89
89
  这套 skills 完整支持互动叙事:连续场景、对白、证词与关键选择可以承载整个游戏,但要满足与系统玩法同样的能动性和证据要求。人物路线的关键选择针对该人物自己的心结或议程,关系进展由人物反应、称呼、可进入的场所与可托付的事呈现,而不是屏幕上的数值。
90
90
 
91
91
  ## 安装
92
92
 
93
- ### ClawHub
94
-
95
- ClawHub 分发由仓库中的 [显式发布清单](.clawhub/publish.json) 管理,并通过 [ClawHub](https://clawhub.ai/) 提供发现入口。
93
+ ### 每个 Agent 一条命令
96
94
 
97
95
  前提:你已经在用 Claude Code、Codex 或 Kimi Code,终端能运行 `npx`(Node.js)。
98
96
 
@@ -104,6 +102,8 @@ ClawHub 分发由仓库中的 [显式发布清单](.clawhub/publish.json) 管理
104
102
 
105
103
  `-g` 表示全局安装,对所有目录生效;去掉它则只装进当前目录。**升级时再跑一遍同一条命令,或运行 `npx skills update`。**
106
104
 
105
+ 这些 skills 也上架了 [ClawHub](https://clawhub.ai/),按仓库的[发布清单](.clawhub/publish.json)发布。
106
+
107
107
  <details>
108
108
  <summary><strong>三个 CLI 一次装齐,或使用原生插件安装</strong></summary>
109
109
 
@@ -232,7 +232,7 @@ codex plugin add novel-to-game@novel-to-game-skills
232
232
 
233
233
  ### 一个选择怎样被后文记住
234
234
 
235
- [《金瓶梅》](examples/jin-ping-mei/)是恋爱 ADV 的示例。它从二十日宅门账务模拟重做成了 galgame,[`concepts/CONCEPT.md`](examples/jin-ping-mei/concepts/CONCEPT.md) 现在给每位女主写下她要什么、一道只有玩家看得到的伤口,各自钉到回目(原表 5 行,节选 3 行):
235
+ [《金瓶梅》](examples/jin-ping-mei/)是恋爱 ADV 的示例。它的 [`concepts/CONCEPT.md`](examples/jin-ping-mei/concepts/CONCEPT.md) 给每位女主写下她要什么、一道只有玩家看得到的伤口,各自钉到回目(原表 5 行,节选 3 行):
236
236
 
237
237
  ```markdown
238
238
  核心句:**你说过的话,她们都记得。**
@@ -259,23 +259,18 @@ codex plugin add novel-to-game@novel-to-game-skills
259
259
  结局判定:关键抉择做错 → 错过;做对且该人心意 ≥7 并在最后一问说真话 → 良缘;其余 → 寻常。
260
260
  ```
261
261
 
262
- 每个个人结局之后都翻开一页原著里她的命数,同一份文档写得很直白:结局只决定这一春你们说成了什么,页脚明写改不了她在书里的去处。
262
+ 每个个人结局之后都翻开一页原著里她的命数:结局只决定这一春你们说成了什么,页脚明写改不了她在书里的去处。
263
263
 
264
- 这款游戏的 QA 记录对“玩到了多少”写得很坦白。[`qa/verification.json`](examples/jin-ping-mei/qa/verification.json) 里完整浏览器运行停在 `yue_good`,六项全部 PASS,第一条和最后一条限制项是:
264
+ [`qa/verification.json`](examples/jin-ping-mei/qa/verification.json) 里完整浏览器运行停在 `yue_good`,六项全部 PASS;第一条限制项记下这次运行覆盖了多少剧情:
265
265
 
266
266
  ```json
267
267
  {
268
268
  "scope": "路径覆盖",
269
269
  "reason": "浏览器只走月娘良缘一条完整路径;其余 15 个结局由 test/lint_script.mjs 穷举选择证明可达,未逐一在浏览器渲染。"
270
- },
271
- …
272
- {
273
- "scope": "体验判断",
274
- "reason": "自动化只证明能启动、渲染、输入、走到结局并重开,不判断剧情是否动人或节奏是否合适。"
275
270
  }
276
271
  ```
277
272
 
278
- ### QA 记录承认自己没测什么
273
+ ### 一次记录在案的运行漏掉了什么
279
274
 
280
275
  [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)(译):
281
276
 
@@ -306,29 +301,20 @@ codex plugin add novel-to-game@novel-to-game-skills
306
301
  ]
307
302
  ```
308
303
 
309
- [`build/BUILD_BRIEF.md`](examples/project-plateau/build/BUILD_BRIEF.md) 写明这个 PASS 到底意味着什么(译):
310
-
311
- ```markdown
312
- …
313
- PASS 只在记录下来的本地桌面浏览器里证明这六项效果。
314
- 它不证明主观画面质量、舒适度、趣味、平衡、
315
- 已清权、公网托管,也不证明其他浏览器、GPU 和设备。
316
- ```
317
-
318
- [`qa/verification.json`](examples/project-plateau/qa/verification.json) 则点名这次运行漏掉了什么,包括新加的剑龙段落:
304
+ [`qa/verification.json`](examples/project-plateau/qa/verification.json) 点名这次运行漏掉了什么,包括新加的剑龙段落:
319
305
 
320
306
  ```json
321
307
  {
322
- "scope": "optional stegosaurus beat",
323
- "reason": "The complete run does not photograph the stegosaurus; its framing rule is covered by one unit test only."
308
+ "scope": "tested runtime",
309
+ "reason": "The run used local desktop Chromium on one Apple M1 Pro; other browsers, GPUs and devices were not exercised."
324
310
  },
325
311
  {
326
- "scope": "look, sound and hitches",
327
- "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."
312
+ "scope": "optional stegosaurus beat",
313
+ "reason": "The complete run does not photograph the stegosaurus; its framing rule is covered by one unit test only."
328
314
  }
329
315
  ```
330
316
 
331
- 也就是:完整运行没有拍剑龙,它的取景规则只有一个单元测试覆盖;画面质量是人工评审的判断,环境声没在笔记本扬声器上听过,卡顿也没在空载或低端机器上测过。
317
+ 也就是:只在一台 Apple M1 Pro 的本地桌面 Chromium 上跑过,其他浏览器、GPU 和设备没有测;完整运行没有拍剑龙,它的取景规则只有一个单元测试覆盖。
332
318
 
333
319
  单局时长改过两次,一次因为实测证据,一次出于负责人的决定,[`PRODUCT_BRIEF.md`](examples/project-plateau/PRODUCT_BRIEF.md) 把两步都留着。第一次实测跑完整条路线只用了 55.2 秒,推翻了原计划的 5–8 分钟单局,于是边界被压到 1–3 分钟一局、180 秒天光,而不是往路线里塞等待。后来负责人要求一次 5–10 分钟的到访,天光预算提到 300 秒,填进去的是新的决策(可选的第十二章剑龙段落和逐张底片评定),而不是更长的路;熟练的 Strong 路线仍约 90 秒跑完。
334
320
 
@@ -360,7 +346,7 @@ PASS 只在记录下来的本地桌面浏览器里证明这六项效果。
360
346
  标明允许新增的设定与待决问题。只交付设计说明,不构建、不运行 QA,也不声称运行成品已经完成。
361
347
  ```
362
348
 
363
- `quick` 是默认模式:Agent 先用合理默认值起草产品简报,只追问会改变方向或涉及安全的选择,比较有效替代后继续设计、构建和 QA。想自己做关键决定时用 `director`:Agent 会在概念方向、白盒试玩后的内容取舍和视觉目标图三处停下,给出候选和推荐;你已经做出决定的地方不再停靠。
349
+ `quick` 是默认模式:Agent 先用合理默认值起草产品简报,只在平台、核心玩法或核心幻想、成人内容、真实人物、版权或资产授权、付费服务、不可逆制作投入出现会改变方向的实质分支时停下等你裁决;其余未定项写进简报的未确认假设,比较有效替代后继续设计、构建和 QA。想自己做关键决定时用 `director`:Agent 会在概念方向、白盒试玩后的内容取舍(可以在这里请目标玩家试玩)和视觉目标图(仅在制作视觉目标包时)停下,给出候选和推荐;你已经做出决定的地方不再停靠。
364
350
 
365
351
  ## 工作流
366
352
 
@@ -380,7 +366,7 @@ PASS 只在记录下来的本地桌面浏览器里证明这六项效果。
380
366
  | [`game-world-design`](skills/game-world-design/) | 定义玩家承诺、核心循环、世界响应、系统、关卡、失败与结果 |
381
367
  | [`game-art-direction`](skills/game-art-direction/) | 定义镜头、构图、视觉语法、色光材质、HUD、动效与声音 |
382
368
  | [`game-build`](skills/game-build/) | 先做与风险匹配的白盒,再在不重做策划的前提下实现正式候选 |
383
- | [`game-qa`](skills/game-qa/) | 用命令、状态、截图和实际游玩路径验证构建,不夸大主观结论 |
369
+ | [`game-qa`](skills/game-qa/) | 用命令、状态、截图和实际游玩路径验证构建,并写明哪些没测 |
384
370
 
385
371
  ## 产物
386
372
 
@@ -421,7 +407,7 @@ Agent 要通过不同的 skill 调用读完整本小说、写改编文档、构
421
407
 
422
408
  ### 需要 GPU 或自己的模型吗?图片和语音的钱谁出?
423
409
 
424
- 拆解、设计和代码都由你已在用的编码 Agent 的模型完成。使用托管模型时,这些步骤不需要额外的本地模型或 GPU;运行生成的游戏仍需满足目标运行环境的硬件要求。外部服务是可选项。生成图片只在美术方向选择它时使用,工具在你的环境里按能力、许可与费用核实后选择(金瓶梅示例的图由 Codex 内置的图像工具生成,大部分在 `build/art/generated-art.json` 里按批次记录)。语音默认关闭,除非美术方向选用;默认在构建期生成为本地资产,只发送逐句台词与必要读音,从不上传小说和设计文档。付费服务是 Agent 开始前会停下来问你的问题之一。见[语音资产生产合同](skills/game-build/references/tts-production-contract.md)。
410
+ 拆解、设计和代码都由你已在用的编码 Agent 的模型完成。使用托管模型时,这些步骤不需要额外的本地模型或 GPU;运行生成的游戏仍需满足目标运行环境的硬件要求。外部服务是可选项。生成图片只在美术方向选择它时使用,工具在你的环境里按能力、许可与费用核实后选择(金瓶梅示例的图由 Codex 内置的图像工具生成,大部分在 `build/art/generated-art.json` 里按批次记录)。语音默认关闭,除非美术方向选用;默认在构建期生成为本地资产,只发送逐句台词与必要读音,从不上传小说和设计文档。见[语音资产生产合同](skills/game-build/references/tts-production-contract.md)。
425
411
 
426
412
  ### 怎么知道它做出来的游戏真的能跑?QA 里的 PASS 是什么意思?
427
413
 
@@ -433,7 +419,7 @@ Agent 要通过不同的 skill 调用读完整本小说、写改编文档、构
433
419
 
434
420
  ### 我没有版权的小说能改编吗?
435
421
 
436
- 这套 skills 不替你清权,QA 也不认证权利。版权、资产授权和真实人物属于 Agent 开始前必须停下来问的问题;简报记录合规边界,`SOURCE_BIBLE` 记录版本、覆盖范围和授权边界;依赖复制其他游戏受保护的角色、地图、界面或文本的概念会被硬否决。公开示例使用 Project Gutenberg 文本,并在各自的 `source/SOURCE.md` 里记录权利状态,包括金瓶梅示例为什么只收录删节本。
422
+ 这套 skills 不替你清权,QA 也不认证权利。版权、资产授权和真实人物属于 `quick` 会停下来问的决定;简报记录合规边界,`SOURCE_BIBLE` 记录版本、覆盖范围和授权边界;依赖复制其他游戏受保护的角色、地图、界面或文本的概念会被硬否决。公开示例使用 Project Gutenberg 文本,并在各自的 `source/SOURCE.md` 里记录权利状态,包括金瓶梅示例为什么只收录删节本。
437
423
 
438
424
  ### 能只要设计文档、不构建吗?
439
425
 
@@ -1 +1 @@
1
- 0.6.0
1
+ 0.6.1
@@ -1,4 +1,4 @@
1
- # BUILD_BRIEF · 金瓶梅·风月总账(galgame 版)
1
+ # BUILD_BRIEF · 金瓶梅·风月总账
2
2
 
3
3
  `targetFinish: playable-prototype`
4
4
 
@@ -37,8 +37,4 @@ python3 test/verify_visual.py --write-evidence # 唯一权威完整路径
37
37
  npm run verify:model # CI 无浏览器检查:剧本连通、资源登记、16 个结局穷举可达
38
38
  ```
39
39
 
40
- ## 限制
41
-
42
- - 浏览器完整路径只走月娘良缘一条;其余结局只由剧本穷举证明可达。
43
- - 只在 1440×900 Chromium 验证;窄屏有响应式样式但未纳入权威运行。
44
- - 无配音;音乐为程序化合成。
40
+ 已知限制见 `qa/verification.json` 的 `limitations`。
@@ -124,52 +124,46 @@ class AudioEngine {
124
124
  }
125
125
 
126
126
  di(f, t, dur, vol, dest = this.bgmGain) {
127
- try {
128
- const o = this.ctx.createOscillator();
129
- const g = this.ctx.createGain();
130
- const lfo = this.ctx.createOscillator();
131
- const lg = this.ctx.createGain();
132
- o.type = 'sine';
133
- o.frequency.value = f;
134
- lfo.frequency.value = 5;
135
- lg.gain.value = f * 0.005;
136
- lfo.connect(lg).connect(o.frequency);
137
- const atk = Math.min(0.15, dur * 0.3);
138
- g.gain.setValueAtTime(0, t);
139
- g.gain.linearRampToValueAtTime(vol, t + atk);
140
- g.gain.setValueAtTime(vol * 0.8, t + Math.max(atk, dur - 0.2));
141
- g.gain.linearRampToValueAtTime(0.0001, t + dur);
142
- o.connect(g).connect(dest);
143
- o.start(t); o.stop(t + dur + 0.05);
144
- lfo.start(t); lfo.stop(t + dur + 0.05);
145
- } catch { /* ignore */ }
127
+ const o = this.ctx.createOscillator();
128
+ const g = this.ctx.createGain();
129
+ const lfo = this.ctx.createOscillator();
130
+ const lg = this.ctx.createGain();
131
+ o.type = 'sine';
132
+ o.frequency.value = f;
133
+ lfo.frequency.value = 5;
134
+ lg.gain.value = f * 0.005;
135
+ lfo.connect(lg).connect(o.frequency);
136
+ const atk = Math.min(0.15, dur * 0.3);
137
+ g.gain.setValueAtTime(0, t);
138
+ g.gain.linearRampToValueAtTime(vol, t + atk);
139
+ g.gain.setValueAtTime(vol * 0.8, t + Math.max(atk, dur - 0.2));
140
+ g.gain.linearRampToValueAtTime(0.0001, t + dur);
141
+ o.connect(g).connect(dest);
142
+ o.start(t); o.stop(t + dur + 0.05);
143
+ lfo.start(t); lfo.stop(t + dur + 0.05);
146
144
  }
147
145
 
148
146
  pluck(f, t, dur, vol, dest) {
149
- try {
150
- for (const [mult, v] of [[1, 1], [2, 0.35], [3, 0.12]]) {
151
- const o = this.ctx.createOscillator();
152
- const g = this.ctx.createGain();
153
- o.type = 'triangle';
154
- o.frequency.value = f * mult;
155
- g.gain.setValueAtTime(vol * v, t);
156
- g.gain.exponentialRampToValueAtTime(0.0001, t + dur);
157
- o.connect(g).connect(dest);
158
- o.start(t); o.stop(t + dur + 0.05);
159
- }
160
- } catch { /* ignore */ }
161
- }
162
-
163
- block(t, f, dur, vol, dest) {
164
- try {
147
+ for (const [mult, v] of [[1, 1], [2, 0.35], [3, 0.12]]) {
165
148
  const o = this.ctx.createOscillator();
166
149
  const g = this.ctx.createGain();
167
- o.frequency.value = f;
168
- g.gain.setValueAtTime(vol, t);
150
+ o.type = 'triangle';
151
+ o.frequency.value = f * mult;
152
+ g.gain.setValueAtTime(vol * v, t);
169
153
  g.gain.exponentialRampToValueAtTime(0.0001, t + dur);
170
154
  o.connect(g).connect(dest);
171
- o.start(t); o.stop(t + dur + 0.02);
172
- } catch { /* ignore */ }
155
+ o.start(t); o.stop(t + dur + 0.05);
156
+ }
157
+ }
158
+
159
+ block(t, f, dur, vol, dest) {
160
+ const o = this.ctx.createOscillator();
161
+ const g = this.ctx.createGain();
162
+ o.frequency.value = f;
163
+ g.gain.setValueAtTime(vol, t);
164
+ g.gain.exponentialRampToValueAtTime(0.0001, t + dur);
165
+ o.connect(g).connect(dest);
166
+ o.start(t); o.stop(t + dur + 0.02);
173
167
  }
174
168
 
175
169
  se(name) {
@@ -12,5 +12,5 @@ python3 test/verify_visual.py --write-evidence
12
12
  月娘线 → 良缘结局卡 → 原著命数页 → 回标题 → 重新开始回到序章第一句。成功后写 `verification.json`、
13
13
  `evidence/run.json`、`evidence/ending.jpg` 与 `../screenshots/title.jpg`、`../screenshots/adv.jpg`。
14
14
 
15
- CI 另跑 `npm run verify:model`(`test/lint_script.mjs`,无浏览器):剧本跳转与资源登记完整,穷举全部选择后十六个结局都可达。
16
- 它不证明渲染或输入,只防止剧本改动造成死路。
15
+ CI 另跑 `npm run verify:model`(`test/lint_script.mjs`,无浏览器):剧本跳转与资源登记完整,穷举全部选择后十六个结局都可达,
16
+ 防止剧本改动造成死路。
@@ -2,10 +2,10 @@
2
2
  "schemaVersion": 1,
3
3
  "upstream": {
4
4
  "repository": "https://github.com/zenstory-ai/novel-to-game.git",
5
- "commit": "7758caa8d9578f19780349e7b4e4115ef831fd7a",
6
- "releaseVersion": "0.6.0"
5
+ "commit": "c3075f35cc14d4bc94e2829df2bfcc0d9971229e",
6
+ "releaseVersion": "0.6.1"
7
7
  },
8
- "generatedAt": "2026-10-19T08:12:54.284Z",
8
+ "generatedAt": "2026-10-27T08:36:13.586Z",
9
9
  "skills": [
10
10
  "game-art-direction",
11
11
  "game-build",
@@ -26,23 +26,23 @@
26
26
  },
27
27
  {
28
28
  "path": "README.md",
29
- "sha256": "dc046f8d7f8cee9af8cc3882b51b274ba04b51d04ff3b3eafaf555b1cc10f1e0",
30
- "bytes": 38777
29
+ "sha256": "e3db2db40799e4460f6ebee77794cb0ae43ee28a3a01069e9f54155133af49b1",
30
+ "bytes": 37861
31
31
  },
32
32
  {
33
33
  "path": "README_ZH.md",
34
- "sha256": "5332bdb07c7744e8b556d253d28d1c3edd8e7feb04990d8a109fe19a643ff6ca",
35
- "bytes": 34810
34
+ "sha256": "088e801663994bcd3b60b58b33b8e99345ccc3470afbb1d0aeb561cea3ca768d",
35
+ "bytes": 34100
36
36
  },
37
37
  {
38
38
  "path": "VERSION",
39
- "sha256": "97a5d6e540a6120d09c39ddb667e0e8e2bac7fcc2ffef813b82e08fd60365bce",
39
+ "sha256": "87b241b275c591694846560e9879f50c9da3150f854efdabd782c539772f3033",
40
40
  "bytes": 6
41
41
  },
42
42
  {
43
43
  "path": "examples/jin-ping-mei/build/BUILD_BRIEF.md",
44
- "sha256": "ae93c757143d37375018ae2ab5d437fd431c7eb23a1f4626a2814b96bbc2e339",
45
- "bytes": 2403
44
+ "sha256": "b6dbed37f9faac97dcfb0f125471a5eee703789b26371af64dcac7dbb58da3ab",
45
+ "bytes": 2208
46
46
  },
47
47
  {
48
48
  "path": "examples/jin-ping-mei/build/app/.gitignore",
@@ -466,8 +466,8 @@
466
466
  },
467
467
  {
468
468
  "path": "examples/jin-ping-mei/build/app/js/audio.js",
469
- "sha256": "80be0ddde3e810c25bbfb6b418cdf8dc84c1d558c355b10d92d235e3753253b6",
470
- "bytes": 8930
469
+ "sha256": "bc55efbca94be03723911ea61e34459f2f0344b55f4c995b84d18340af8967e8",
470
+ "bytes": 8745
471
471
  },
472
472
  {
473
473
  "path": "examples/jin-ping-mei/build/app/js/main.js",
@@ -566,8 +566,8 @@
566
566
  },
567
567
  {
568
568
  "path": "examples/jin-ping-mei/qa/README.md",
569
- "sha256": "866e798b79f05bf3eee81fc96e5fe9723e548b139494a4f7d08adb81abe04694",
570
- "bytes": 956
569
+ "sha256": "0091b4301d58ca7633f8db0a51dbb1ad7551303d0494044fabd1caeb4d7c2b3c",
570
+ "bytes": 923
571
571
  },
572
572
  {
573
573
  "path": "examples/jin-ping-mei/qa/verification.json",
@@ -576,8 +576,8 @@
576
576
  },
577
577
  {
578
578
  "path": "skills/game-art-direction/SKILL.md",
579
- "sha256": "73f95a5e747709a4f35b2703fabc2f00f48fb63b93a1aff002251e9af06dff6a",
580
- "bytes": 3245
579
+ "sha256": "6c4a04515e0df31c60e8288d97e024a0b0dd93312df2ec5640b1e067923dee6e",
580
+ "bytes": 3218
581
581
  },
582
582
  {
583
583
  "path": "skills/game-art-direction/agents/openai.yaml",
@@ -601,38 +601,38 @@
601
601
  },
602
602
  {
603
603
  "path": "skills/game-build/references/baked-sprite-workflow.md",
604
- "sha256": "aa7cbf2c255bae747a65b4d8eaef060ec77a4e3da137636d090e1b4583e390a5",
605
- "bytes": 1671
604
+ "sha256": "13652d58eab4e15693839cb6ef9c4bf4a878a1b55a29e4f9452cc9f14a1283f6",
605
+ "bytes": 1490
606
606
  },
607
607
  {
608
608
  "path": "skills/game-build/references/blender-asset-workflow.md",
609
- "sha256": "6fbf2e11f74ca2be1d2e3d3644dfc9ed82f04a6f0d92b67b2267894a710a4a42",
610
- "bytes": 1834
609
+ "sha256": "51cf1851709fb22b31c56a31a6d61f8160b060fc28e66f88209a1c526108732d",
610
+ "bytes": 1559
611
611
  },
612
612
  {
613
613
  "path": "skills/game-build/references/build-brief-contract.md",
614
- "sha256": "574c8178a126480aba77ff019ceef8b630937a2be36ab0f2215e143986d20f1f",
615
- "bytes": 3618
614
+ "sha256": "ccc9f1a953c041f6e3075fd131088ba3d5ae13170e0a438edd83f622bc052efe",
615
+ "bytes": 3564
616
616
  },
617
617
  {
618
618
  "path": "skills/game-build/references/generative-media-pipeline.md",
619
- "sha256": "afcc211cde3fcadd42125d4fa45540765abb7279a52d69e0e5cdbe4500e6cd09",
620
- "bytes": 1507
619
+ "sha256": "f3051882b7c874d0e74ec4aa585a091323eb5d610ab4cbbf286b924858b5152a",
620
+ "bytes": 1231
621
621
  },
622
622
  {
623
623
  "path": "skills/game-build/references/playable-model-contract.md",
624
- "sha256": "ae50db8faf6713d5df5fabf875d4b17e1d38dbd442262ffb5a4dcf0495822f25",
625
- "bytes": 2711
624
+ "sha256": "a0321d605c18388b5805de033d1b2e621c11d09af223d6c1e1dd3975f88a9297",
625
+ "bytes": 2556
626
626
  },
627
627
  {
628
628
  "path": "skills/game-build/references/tts-production-contract.md",
629
- "sha256": "ceb860341a91d27781ce3a2f0ed54dae887e4f3b15e50db1e1b0efd81b8f442e",
630
- "bytes": 1426
629
+ "sha256": "8962b0d6a08c61ebf0936b4a97e4e91a55c6333f5b122e510d3769925f0aa1f0",
630
+ "bytes": 1249
631
631
  },
632
632
  {
633
633
  "path": "skills/game-concept/SKILL.md",
634
- "sha256": "bce6fadcf21c57ce279dcb90af6f3d15ea9328410f291977a1c9cae4d3d6de20",
635
- "bytes": 3436
634
+ "sha256": "d5cadc51bee106ca94a521e928595eababadbb676e39925a0b6966cd5de63425",
635
+ "bytes": 3403
636
636
  },
637
637
  {
638
638
  "path": "skills/game-concept/agents/openai.yaml",
@@ -646,8 +646,8 @@
646
646
  },
647
647
  {
648
648
  "path": "skills/game-qa/SKILL.md",
649
- "sha256": "03bebbe8f6179a40ef2eb08f9840e01b188668894811389a353d8657bc8a4200",
650
- "bytes": 2655
649
+ "sha256": "1e6d00e38abd689fe2f94cc426abc13e5d9df5c979fe60fcfd0dfa4e0d10bcbc",
650
+ "bytes": 2521
651
651
  },
652
652
  {
653
653
  "path": "skills/game-qa/agents/openai.yaml",
@@ -656,13 +656,13 @@
656
656
  },
657
657
  {
658
658
  "path": "skills/game-qa/references/qa-contract.md",
659
- "sha256": "996387404cad4a22555c9e752cb7ccfa8a4e5a40550942fc53893b45c6109e45",
660
- "bytes": 3067
659
+ "sha256": "6f00ec2e380094f5fad017281e018ae524196e3ad612bd016ddaa97c63b215c9",
660
+ "bytes": 3039
661
661
  },
662
662
  {
663
663
  "path": "skills/game-qa/references/test-design-method.md",
664
- "sha256": "fa6597233fed41464bec16b9253c54357d2391a1ca5791b223049a7e2a3dad9c",
665
- "bytes": 3771
664
+ "sha256": "2b9c4a7331c8302f1d0894178eb9cf1bd39633a69512bfd2481006db786693b4",
665
+ "bytes": 3635
666
666
  },
667
667
  {
668
668
  "path": "skills/game-world-design/SKILL.md",
@@ -691,8 +691,8 @@
691
691
  },
692
692
  {
693
693
  "path": "skills/novel-game-analyze/SKILL.md",
694
- "sha256": "193253249ebcf75e065837565e96dec13808aba0fbf77e1e61d55163817a05e3",
695
- "bytes": 5096
694
+ "sha256": "4595ec966ee2cbcf46ca75daa534a790beb29c669d348b09e16254e30893894a",
695
+ "bytes": 4879
696
696
  },
697
697
  {
698
698
  "path": "skills/novel-game-analyze/agents/openai.yaml",
@@ -701,13 +701,13 @@
701
701
  },
702
702
  {
703
703
  "path": "skills/novel-game-analyze/references/gameability-protocol.md",
704
- "sha256": "6954dbe3421f3e6aae27e181097cd8a16a9ecde382a344b44ba10c20c896ec5a",
705
- "bytes": 4175
704
+ "sha256": "dd1a2bfd560e21af69bcd9f3783db64295f4bffb1a05a872024d60f6e8f78b39",
705
+ "bytes": 4087
706
706
  },
707
707
  {
708
708
  "path": "skills/novel-to-game/SKILL.md",
709
- "sha256": "b8ed42dd6d6e2d0a38f8f4014948b3d5a35f95199e364054878a256413105258",
710
- "bytes": 4485
709
+ "sha256": "62b35309ba32c01f006deb4a7156e304839f57d77cc5264d3a7b9a697588dd61",
710
+ "bytes": 4470
711
711
  },
712
712
  {
713
713
  "path": "skills/novel-to-game/agents/openai.yaml",
@@ -716,13 +716,13 @@
716
716
  },
717
717
  {
718
718
  "path": "skills/novel-to-game/references/intake-method.md",
719
- "sha256": "6ded64de535ed03f996e336fcc413adf358b454cc2b3e04331d83400b7daffae",
720
- "bytes": 3112
719
+ "sha256": "f1081101aa21f0ec8ad61fbb4ad1cb1d2531bb4158bbe4889a65b6ef54ea7e37",
720
+ "bytes": 2902
721
721
  },
722
722
  {
723
723
  "path": "skills/novel-to-game/references/pipeline-contract.md",
724
- "sha256": "ce943fec9b9de37914b4ae949b76ce82e774f154ec0ac5a63e6fae6b2044962d",
725
- "bytes": 3998
724
+ "sha256": "60c90580a613e9a8dbd0a87f2c87476061e43551842f25168e0ce09ee1113f2a",
725
+ "bytes": 3278
726
726
  }
727
727
  ]
728
728
  }