@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
@@ -8,9 +8,9 @@ metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudec
8
8
 
9
9
  你是小说项目逆向工程师,把作者已有的书整理成**可续写的写作工程**,包含设定、大纲、正文及所需追踪。`拆文库/{导入书名}/` 保留为分析数据源;向作者汇报工程整理结果和续写入口。
10
10
 
11
- > Agent 兼容性:只检查当前运行时的 canonical 目录:Claude `.claude/agents/{agent}.md`、OpenCode `.opencode/agents/{agent}.md`、Codex `.codex/agents/{agent}.toml`、Antigravity `.agents/agents/agent-name/agent.md`(`agent-name` 为目标 agent 名),不得因其他端文件存在而误判。Claude 用 `subagent_type`,OpenCode 用 `subagent` 工具的 `agent` 参数,Codex 用同名 `agent_type`,Antigravity 用 `invoke_subagent` + `TypeName`。运行时不暴露 custom agent、返回未知 agent,或项目有 `.zcode/`(ZCode 3.3.4 不执行项目 custom agents)时,降级 solo/direct,由主会话串行处理。
11
+ > Agent 兼容性:只检查当前宿主:Claude `.claude/agents/{agent}.md`(`subagent_type`)、OpenCode `.opencode/agents/{agent}.md`(`subagent` 的 `agent`)、Codex `.codex/agents/{agent}.toml`(`agent_type`)、Antigravity `.agents/agents/agent-name/agent.md`(`invoke_subagent` + `TypeName`)。ZCode 查插件注册的同名角色,用 `Agent` 按实际 schema 派发,不要求 `.zcode/agents`。仅角色/工具不可用或返回未知 agent 时降级 solo/direct,不因其他端目录存在或宿主名固定串行。
12
12
  >
13
- > Spawn 版本提示(不阻断 spawn):先读取项目根 `.story-deployed` 的 `agents_version`。与本版 `agents_version: 36` 不一致时(标记缺失、字段缺失/非整数、小于或大于 36)**照常按文件存在性检查并 spawn**,同时用一句白话提示作者「分析助手是旧版,运行 /story-setup 后新开会话」,`Notice: agents bundle 版本不匹配(项目 {N},本版 36)` 原文写进汇报最后一行「技术备注:」;大于 36 时额外提示先更新 oh-story-claudecode,不要用本地旧版 setup 降级覆盖。只有 agent 文件缺失、或运行时不暴露 custom agent 时才降级 solo/direct,`Fallback: project custom agents unavailable -> solo` 同样只进技术备注行。
13
+ > Spawn 版本提示(不阻断 spawn):先读取项目根 `.story-deployed` 的 `agents_version`。与本版 `agents_version: 37` 不一致时(标记缺失、字段缺失/非整数、小于或大于 37)**照常按当前宿主角色来源检查并 spawn**,同时用一句白话提示作者「分析助手是旧版,运行 /story-setup(ZCode 先更新插件)后新开会话」,`Notice: agents bundle 版本不匹配(项目 {N},本版 37)` 原文写进汇报最后一行「技术备注:」;大于 37 时额外提示先更新 oh-story-claudecode,不要用本地旧版 setup 降级覆盖。只有当前宿主角色缺失或不暴露调用能力时才降级 solo/direct,`Fallback: project custom agents unavailable -> solo` 同样只进技术备注行。
14
14
 
15
15
  ## 名词与目录边界(全流程硬约束)
16
16
 
@@ -60,9 +60,9 @@ metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudec
60
60
 
61
61
  ### Step 4:写作环境检测
62
62
 
63
- 先读取 `.story-deployed`,按顶部说明检查版本,版本不匹配不阻断调用。再在当前运行时的 canonical 目录(见顶部)检查 `chapter-extractor`,记下 `story-architect` 是否可用,供逐批细纲使用。`.story-deployed` 的 `target_cli` 含 `zcode` 时按顶部说明串行处理,不提示重复部署。
63
+ 先读取 `.story-deployed`,按顶部说明检查版本,版本不匹配不阻断调用。再按顶部的当前宿主来源检查 `chapter-extractor`,记下 `story-architect` 是否可用,供逐批细纲使用。ZCode 缺角色时提示启用或更新 oh-story 插件并新开会话;作者也可选择主会话串行,不重复部署 workspace。
64
64
 
65
- 当前端 agent 不可用且不是已部署 ZCode 项目时这样问:
65
+ 其他宿主 agent 不可用时这样问:
66
66
 
67
67
  > 「这个项目还没装好写作环境。装好后由专门的分析助手逐段拆书,主对话不会被整本书塞满;不装也能导,只是全部在主对话里做,慢一些,结果一样完整。你想:1. 先装环境(推荐):运行 `/story-setup`,装完再说"导入" 2. 直接导入,慢一点也行」
68
68
 
@@ -80,7 +80,7 @@ metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudec
80
80
  - 最后一章:{完整 | 残稿:第 {N+1} 章写了一半,作者决定{接着残章写 | 先补完再导入}}
81
81
  - 题材:{题材类型};目标平台:{平台}
82
82
  - 外部对标:{对标书名 | 未绑定}
83
- - 写作环境:{已装,分析助手可用{,story-architect 可用} | 待装(继续时重新检测) | 未装,作者选直接导入(主会话串行) | ZCode 串行}
83
+ - 写作环境:{已装,分析助手可用{,story-architect 可用} | 待装(继续时重新检测) | 助手不可用,作者选主会话串行}
84
84
  - 卷划分:{待 Phase 3 | 按原文卷界 | 作者已确认:1–40 / 41–95 / …}
85
85
  - 作者交代:{偏好、红线、否掉的方案,逐条;没有写「无」}
86
86
 
@@ -23,7 +23,7 @@ Phase 2 先读本文件,再进入对应 analyze skill,由其负责拆文、
23
23
  - 措辞示例(全新):启动深度分析时声明「以『完整拆解、一次跑完、不要停下询问』模式拆解本书,确保 Stage 2-6 全部产出」。
24
24
  - 措辞示例(旧成果):声明「先复用并校验现有成果,只补当前导入缺失的章节或分析,不覆盖用户原成果」。
25
25
  - **兜底**:若全新导入实际仍停在 Stage 1,自动选择继续;若旧成果任务停靠,则按已登记的缺失范围继续,不能扩大成全书重跑。
26
- - 派发:导入记录写着分析助手可用时,属自动续跑,按 story-long-analyze 的「有限并行」档派 `chapter-extractor`(每轮 3 批),每个连续章节批次只调用一次,同次生成逐章事实与跨章观察;作者明确要求时改用串行或不限批次顺序。无论章数多少都整本拆完。作者选了直接导入(或 ZCode)时,Stage 2 由主会话按相同连续章节块契约串行处理,不能退回每章一次独立调用;产物仍完整,仅速度变慢。
26
+ - 派发:导入记录写着分析助手可用时,属自动续跑,按 story-long-analyze 的「有限并行」档派 `chapter-extractor`(每轮 3 批),每个连续章节批次只调用一次,同次生成逐章事实与跨章观察;作者明确要求时改用串行或不限批次顺序。无论章数多少都整本拆完。助手不可用且作者选主会话串行时,Stage 2 按相同连续章节块契约处理,不能退回每章一次独立调用;产物仍完整,仅速度变慢。
27
27
 
28
28
  ## 短篇:单一全量管道
29
29
 
@@ -62,4 +62,4 @@ Phase 5 只读本文件和导入记录(`{书目录}/.story/work/导入记录.m
62
62
 
63
63
  - 设置 `.active-book` 指向导入的书名/标题目录,在导入记录勾「汇报与激活」。
64
64
  - 确认目录符合对应写作 skill 的识别规则:长篇为 `正文/` 与 `大纲/`,短篇为 `正文.md`、`设定.md` 与 `小节大纲.md`。
65
- - 可选验证:如果当前运行时的 canonical 目录已部署 story-explorer agent,可 spawn 交叉验证迁移数据完整性;Antigravity 检查 `.agents/agents/story-explorer/agent.md` 并用 `invoke_subagent` + `TypeName: "story-explorer"`。Prompt:`项目目录:{dir}\n查询类型:progress\n查询参数:导入验证`
65
+ - 可选验证:按 SKILL.md 顶部的当前宿主角色来源确认 story-explorer 可用时(ZCode 查插件注册角色),可 spawn 交叉验证迁移数据完整性;Antigravity 检查 `.agents/agents/story-explorer/agent.md` 并用 `invoke_subagent` + `TypeName: "story-explorer"`。Prompt:`项目目录:{dir}\n查询类型:progress\n查询参数:导入验证`
@@ -48,7 +48,7 @@ Phase 4 完整读取本文件、[tracking-initialization.md](tracking-initializa
48
48
 
49
49
  - 伏笔 `id` 形如 `F001`,`status` 取 已埋/已回收/已过期/放弃,`importance` 取 高/中/低;`planted_chapter` 不晚于 N。事件 `id` 形如 `E001`,`reveal_status` 取 未揭示/部分揭示/已揭示:`未揭示` 的 `reveal_chapter` 必须为 `null`,部分/完全揭示只能填已经发生的实际章节。
50
50
  - `context` 在 init 时收六项:`position`、`long_term_constraints`、`active_character_names`、`continuity_risks`、`recent_chapters`(最多 3 章,按章号升序)、`next_chapter_commitments`。
51
- - `character_snapshots` 里的角色就是核心角色;四个列表不限条数,单角色文件目标 ≤4096 字节,硬上限 8192 字节,超过在任何写入前拒绝。`active_character_names` 最多 6 人且必须已有快照;`long_term_constraints` 最多 6 条。
51
+ - `character_snapshots` 里的角色就是核心角色;四个列表不限条数,单角色文件目标 ≤4096 字节,硬上限 8192 字节,超过在任何写入前拒绝。`active_character_names` 是导入截止章之后下一章的活跃角色,不是核心角色总数:最多 20 人且必须已有快照;`long_term_constraints` 最多 6 条。
52
52
  - `上下文.md` ≤12288 字节,只含 7 个顶层区块:当前位置、长期约束、核心角色状态、活跃伏笔(最多 8 条)、近三章速记、下一章承诺、连贯性风险。
53
53
  - 报错按提示改事务本身再跑,字段形状以 tracking-initialization.md 的骨架和本节为准。
54
54
 
@@ -16,7 +16,7 @@
16
16
 
17
17
  ## Step 2:写本批细纲
18
18
 
19
- - **有 story-architect**(导入记录写着可用,按 SKILL.md 顶部的 Agent 兼容性检查 canonical 目录):主会话只取任务包路径,不读包的内容。Prompt:`项目目录:{dir}\n任务包:{任务包路径}\n先完整读取任务包,按包里的规则与模板完成;作者已定的事在 .story/work/导入记录.md,对话内容不会传给你\n交付后只回任务包开头要求的几项`。Antigravity 用 `invoke_subagent` + `TypeName: "story-architect"`。
19
+ - **有 story-architect**(导入记录写着可用,按 SKILL.md 顶部的当前宿主角色来源检查,ZCode 查插件注册角色):主会话只取任务包路径,不读包的内容。Prompt:`项目目录:{dir}\n任务包:{任务包路径}\n先完整读取任务包,按包里的规则与模板完成;作者已定的事在 .story/work/导入记录.md,对话内容不会传给你\n交付后只回任务包开头要求的几项`。Antigravity 用 `invoke_subagent` + `TypeName: "story-architect"`。
20
20
  - **没有**:主会话完整读取任务包,按包内规则写本批;不另读包外写作技法,也不整读拆文库摘要。
21
21
 
22
22
  ## Step 3:验收与交接
@@ -45,6 +45,8 @@ CONTEXT_TARGET_BYTES = 8192
45
45
  CONTEXT_MAX_BYTES = 12288
46
46
  SNAPSHOT_TARGET_BYTES = 4096
47
47
  SNAPSHOT_MAX_BYTES = 8192
48
+ # 下一章热上下文里列出的活跃角色,不是核心角色总数;体积仍由 CONTEXT_MAX_BYTES 兜底。
49
+ ACTIVE_CHARACTER_MAX = 20
48
50
 
49
51
  CONTEXT_HEADINGS = (
50
52
  "## 当前位置",
@@ -663,7 +665,10 @@ def validate_context_input(value: object, *, include_initial_fields: bool) -> di
663
665
  context.get("continuity_risks", []), "context.continuity_risks", maximum=5
664
666
  ),
665
667
  }
666
- require(len(normalized["active_character_names"]) <= 6, "context.active_character_names may contain at most 6 names")
668
+ require(
669
+ len(normalized["active_character_names"]) <= ACTIVE_CHARACTER_MAX,
670
+ f"context.active_character_names may contain at most {ACTIVE_CHARACTER_MAX} names",
671
+ )
667
672
  require(
668
673
  len({portable_name_key(name) for name in normalized["active_character_names"]})
669
674
  == len(normalized["active_character_names"]),
@@ -10,9 +10,9 @@ metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudec
10
10
 
11
11
  **核心原则:机械索引建立后复用;正常提取时每个原文块只读一次,同次产生逐章事实和跨章观察;失败重试按计划回看,聚合阶段复用落盘结果。**
12
12
 
13
- > Agent 兼容性:只检查当前运行时自己的 agent 目录。运行时不支持项目 agent 或找不到文件时降级 solo/direct,并报告 `Fallback: project custom agents unavailable -> solo`。ZCode 3.3.4 不提供项目 custom agents,直接按此规则降级,不扫描其他 CLI 的 agent 目录。
13
+ > Agent 兼容性:只检查当前宿主的 agent;ZCode 查插件注册的同名角色,用 `Agent` 按实际 schema 派发,不要求 `.zcode/agents`。仅角色/工具缺失或调用失败时降级 solo/direct,报告 `Fallback: project custom agents unavailable -> solo`,不扫描其他 CLI 的目录或按宿主名固定降级。
14
14
  >
15
- > Spawn 版本提示(不阻断 spawn):先读取项目根 `.story-deployed` 的 `agents_version`。与本版 `agents_version: 36` 不一致时(标记缺失、字段缺失/非整数、小于或大于 36)照常按文件存在性检查并 spawn,同时报告 `Notice: agents bundle 版本不匹配(项目 {N},本版 36)` 并提示重新运行 `/story-setup` 后新开会话;大于 36 时额外提示先更新 oh-story-claudecode,不要用本地旧版 setup 降级覆盖。只有 agent 文件缺失、或运行时不暴露 custom agent 时才降级 solo/direct。
15
+ > Spawn 版本提示(不阻断 spawn):先读取项目根 `.story-deployed` 的 `agents_version`。与本版 `agents_version: 37` 不一致时(标记缺失、字段缺失/非整数、小于或大于 37)照常按当前宿主角色来源检查并 spawn,同时报告 `Notice: agents bundle 版本不匹配(项目 {N},本版 37)` 并提示重新运行 `/story-setup` 后新开会话;大于 37 时额外提示先更新 oh-story-claudecode,不要用本地旧版 setup 降级覆盖。只有当前宿主角色缺失或不暴露调用能力时才降级 solo/direct。
16
16
 
17
17
  ## 分析边界
18
18
 
@@ -23,9 +23,9 @@ metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudec
23
23
 
24
24
  ---
25
25
 
26
- > 内置适配 Claude Code / OpenCode / Codex / Antigravity / ZCode / OpenClaw / Reasonix。专业 agent 只查当前端 canonical 目录(`.claude/agents`、`.opencode/agents`、`.codex/agents` TOML、`.agents/agents`);Antigravity 用 `invoke_subagent` + 同名 `TypeName`。文件或运行时能力缺失、返回 unknown agent,或当前为不执行 custom agents 的 ZCode 3.3.4 时,报告 fallback 并 solo/direct 执行。
26
+ > 专业 agent 只查当前宿主:Claude `.claude/agents`、OpenCode `.opencode/agents`、Codex `.codex/agents` TOML、Antigravity `.agents/agents`(`invoke_subagent` + 同名 `TypeName`);ZCode 查已启用插件注册的同名角色,用 `Agent` 工具按实际 schema 派发,不要求 `.zcode/agents`。仅角色或调用能力缺失、返回 unknown agent 时报告 fallback 并 solo/direct,不因宿主名或其他端目录存在而降级。
27
27
  >
28
- > Spawn 版本提示(不阻断 spawn):先读取项目根 `.story-deployed` 的 `agents_version`。与本版 `agents_version: 36` 不一致时(标记缺失、字段缺失/非整数、小于或大于 36)**照常按文件存在性检查并 spawn**,但只检查当前运行时的 canonical 目录;同时用一句白话提示作者「写作助手是旧版,运行 /story-setup 后新开会话」,`Notice: agents bundle 版本不匹配(项目 {N},本版 36)` 原文写进技术备注行;大于 36 时额外提示先更新 oh-story-claudecode,不要用本地旧版 setup 降级覆盖。只有 agent 文件缺失、或运行时不暴露 custom agent 时才降级 solo/direct,`Fallback: ... -> solo` 同样只进技术备注行。
28
+ > Spawn 版本提示(不阻断 spawn):先读取项目根 `.story-deployed` 的 `agents_version`。与本版 `agents_version: 37` 不一致时(标记缺失、字段缺失/非整数、小于或大于 37)**照常按当前宿主角色来源检查并 spawn**;同时用一句白话提示作者「写作助手是旧版,运行 /story-setup(ZCode 先更新插件)后新开会话」,`Notice: agents bundle 版本不匹配(项目 {N},本版 37)` 原文写进技术备注行;大于 37 时额外提示先更新 oh-story-claudecode,不要用本地旧版 setup 降级覆盖。只有当前宿主角色缺失或不暴露调用能力时才降级 solo/direct,`Fallback: ... -> solo` 同样只进技术备注行。
29
29
 
30
30
  **文风裁决**:正文写作、改写或审稿前先读 [references/style-resolution.md](references/style-resolution.md),加载本书文风并形成 `style_resolution`;无作者记忆也执行。当前请求、本书文风和 active 偏好按维度覆盖通用 references;同一裁决交给后续执行者。
31
31
 
@@ -1,6 +1,6 @@
1
1
  # agent-calls.md:spawn 子代理的调用方式
2
2
 
3
- 只在要 spawn 对应 agent 时读;主会话自己写正文、自己排纲时不读。调用时机见各流程;下列 prompt 列明必传内容。Antigravity 用 `invoke_subagent` + 同名 `TypeName`。
3
+ 派出 agent 时才读。下文只给目标角色与 prompt;调用参数按 SKILL 顶部的当前宿主映射,不照搬其他宿主工具字段。
4
4
 
5
5
  ## narrative-writer:写一章
6
6
 
@@ -19,8 +19,8 @@ Prompt:`项目目录:{dir}\n任务包:{任务包路径}\n先完整读取
19
19
  ## story-architect、character-designer:题材定位与角色细化(可选)
20
20
 
21
21
  定方向以和作者来回讨论为主,默认主会话自己做;复杂世界观、多线结构、强反转工程或作者明确要求时才派:
22
- - `Agent(subagent_type: "story-architect", prompt: "项目目录:{dir}\n任务类型:题材定位\n查询参数:{作者选定的方向与对标信息}")`
23
- - `Agent(subagent_type: "character-designer", prompt: "项目目录:{dir}\n任务类型:角色设定\n查询参数:{主角设定信息}")` — 辅助角色设定和语言风格档案
22
+ - `story-architect`,Prompt:`项目目录:{dir}\n任务类型:题材定位\n查询参数:{作者选定的方向与对标信息}`
23
+ - `character-designer`,Prompt:`项目目录:{dir}\n任务类型:角色设定\n查询参数:{主角设定信息}` — 辅助角色设定和语言风格档案
24
24
 
25
25
  ## consistency-checker:写正文后的事实核对
26
26
 
@@ -121,7 +121,7 @@ Markdown 只负责给作者和 Agent 阅读,工具不再反向解析 Markdown
121
121
  - `context` 的允许字段随子命令不同:`init` 收 `position`、`long_term_constraints`、`active_character_names`、`continuity_risks`、`recent_chapters`、`next_chapter_commitments` 六项;`commit` 只收前四项。`recent_chapters` 与 `next_chapter_commitments` 在 commit 时由工具从当前视图和本章 `delta` 派生,手填会在任何写入前被拒(`context contains unsupported fields: ...`,exit 2)。commit 事务须使用自身允许字段,不能照搬 init 示例。
122
122
  - `character_snapshots` 中出现的角色视为核心复用角色,必须同时出现在 `character_changes`;已经建立快照的核心角色再次变化时必须提交新快照。
123
123
  - 角色快照的四个列表不限制条数,只限制单项长度和最终文件总字节:目标 ≤4096 字节,超过警告;硬上限 8192 字节,超过则在任何写入前拒绝。
124
- - 没有快照的角色变化视为临时角色,不建立状态文件;`context.active_character_names` 最多 6 人且必须已有当前快照。
124
+ - 没有快照的角色变化视为临时角色,不建立状态文件;`context.active_character_names` 是下一章的活跃角色,不是核心角色总数或主角数:最多 20 人且必须已有当前快照,只列下一章出场或被直接牵动的核心角色,其余核心角色保留快照,需要时读 `追踪/角色状态/{名}.md`。
125
125
  - `context.long_term_constraints` 最多 6 条:要加第 7 条先合并语义重叠项或请作者取舍,不自动删旧约束;永久生效的设定裁定进它,短期强承诺进 `next_chapter_commitments`,过程决策不进续写状态卡。
126
126
  - `context.long_term_constraints` 和 `context.continuity_risks` 是整份提交的当前值。凡是上一版有、本次没有的条目,必须逐条列进 `delta.retired_context_items`,否则工具在任何写入前拒绝——漏写不会被当成删除。实际退役的条目由工具写进本章逐章记录的 `## 本章退役登记`,随后仍可回查。
127
127
  - 不再复用的核心角色写进 `delta.retired_characters`:工具删除其当前快照与 `角色状态/{角色名}.md`,并在逐章记录留档。同一事务里不能既退役又提交快照,也不能退役仍列在 `context.active_character_names` 的角色。角色阵亡/退场这一章,把变化照写进 `character_changes` 即可,本章退役的角色不必再交一份马上要删的快照,逐章记录仍按核心角色标注。退役只表示不再进入热上下文,正文与逐章记录不受影响。
@@ -143,4 +143,4 @@ Markdown 只负责给作者和 Agent 阅读,工具不再反向解析 Markdown
143
143
  6. `## 下一章承诺`
144
144
  7. `## 连贯性风险`
145
145
 
146
- 其中活跃角色最多 6 人、活跃伏笔确定性选取最多 8 条、近章只保留 3 章。这些是下一章热上下文容量,不是完整角色状态的容量限制。
146
+ 其中活跃角色最多 20 人、活跃伏笔确定性选取最多 8 条、近章只保留 3 章。这些是下一章热上下文容量,不是完整角色状态的容量限制;人多且各角色状态行写得长时可能先撞字节上限,超了先压短状态行,再减人数。
@@ -45,6 +45,8 @@ CONTEXT_TARGET_BYTES = 8192
45
45
  CONTEXT_MAX_BYTES = 12288
46
46
  SNAPSHOT_TARGET_BYTES = 4096
47
47
  SNAPSHOT_MAX_BYTES = 8192
48
+ # 下一章热上下文里列出的活跃角色,不是核心角色总数;体积仍由 CONTEXT_MAX_BYTES 兜底。
49
+ ACTIVE_CHARACTER_MAX = 20
48
50
 
49
51
  CONTEXT_HEADINGS = (
50
52
  "## 当前位置",
@@ -663,7 +665,10 @@ def validate_context_input(value: object, *, include_initial_fields: bool) -> di
663
665
  context.get("continuity_risks", []), "context.continuity_risks", maximum=5
664
666
  ),
665
667
  }
666
- require(len(normalized["active_character_names"]) <= 6, "context.active_character_names may contain at most 6 names")
668
+ require(
669
+ len(normalized["active_character_names"]) <= ACTIVE_CHARACTER_MAX,
670
+ f"context.active_character_names may contain at most {ACTIVE_CHARACTER_MAX} names",
671
+ )
667
672
  require(
668
673
  len({portable_name_key(name) for name in normalized["active_character_names"]})
669
674
  == len(normalized["active_character_names"]),
@@ -6,7 +6,7 @@ metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudec
6
6
  ---
7
7
  # story-review:多视角对抗式审查
8
8
 
9
- > Spawn 版本提示(不阻断 spawn):先读取项目根 `.story-deployed` 的 `agents_version`。与本版 `agents_version: 36` 不一致时(标记缺失、字段缺失/非整数、小于或大于 36)**照常按文件存在性检查并 spawn**,但只检查当前运行时的 canonical 目录;同时在「这次怎么审的」里用一句白话提示作者「审稿助手是旧版,运行 /story-setup 后新开会话」,`Notice: agents bundle 版本不匹配(项目 {N},本版 36)` 原文写进技术备注行;大于 36 时额外提示先更新 oh-story-claudecode,不要用本地旧版 setup 降级覆盖。版本提示本身不触发降级;文件缺失或异常、工具不可用、递归限制或调用失败按 Phase 0 处理,技术备注写 `Fallback: ... -> solo`。
9
+ > Spawn 版本提示(不阻断 spawn):先读取项目根 `.story-deployed` 的 `agents_version`。与本版 `agents_version: 37` 不一致时(标记缺失、字段缺失/非整数、小于或大于 37)**照常按当前宿主角色来源检查并 spawn**;同时在「这次怎么审的」里用一句白话提示作者「审稿助手是旧版,运行 /story-setup(ZCode 先更新插件)后新开会话」,`Notice: agents bundle 版本不匹配(项目 {N},本版 37)` 原文写进技术备注行;大于 37 时额外提示先更新 oh-story-claudecode,不要用本地旧版 setup 降级覆盖。版本提示本身不触发降级;文件缺失或异常、工具不可用、递归限制或调用失败按 Phase 0 处理,技术备注写 `Fallback: ... -> solo`。
10
10
 
11
11
  你负责协调审查,找出小说的结构、角色、文字与设定问题,给出有原文依据的修改建议。
12
12
 
@@ -32,18 +32,19 @@ metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudec
32
32
 
33
33
  1. **确定请求模式**:解析用户输入中的 `full`、`lean`、`solo`;未指定时目标模式为 `full`。
34
34
  2. **确认是否允许 spawn**:如果当前已经在子代理/Agent 内执行,不再递归 spawn,直接降级为 `solo`。
35
- 3. **识别 ZCode 能力边界**:如果当前运行于 ZCode 且项目使用 `.zcode/`,ZCode 3.3.4 不执行项目/plugin custom agents;不要因为磁盘上存在其他端的 agent 文件就尝试同名 spawn,直接降级 `solo`,技术备注写 `Fallback: project custom agents unavailable -> solo`。
36
- 4. **检查核心 Agent 部署状态**(只检查当前运行时的 canonical 目录,不因其他端文件存在而误判):
37
- - Claude Code 检查 `.claude/agents/`,OpenCode 检查 `.opencode/agents/`,Codex 检查 `.codex/agents/`,Antigravity 检查 `.agents/agents/`
35
+ 3. **识别当前宿主的角色来源**:ZCode 支持插件子代理,检查当前已启用插件注册的同名角色,不要求 `.zcode/agents/`。其他宿主按下一步查本端目录;不因宿主名、部署标记包含 zcode 或其他端目录存在而降级。
36
+ 4. **检查核心 Agent 可用状态**(仅查当前宿主来源):
37
+ - Claude Code `.claude/agents/`、OpenCode `.opencode/agents/`、Codex `.codex/agents/`、Antigravity `.agents/agents/`;ZCode 查注册角色的定义,不拿项目文件存在性代替运行时注册
38
38
  - full 必需 agent:`story-architect`、`character-designer`、`narrative-writer`、`consistency-checker`
39
39
  - lean 必需 agent:`story-architect`、`consistency-checker`
40
- - 对每个必需 Agent 文件:
40
+ - 对每个必需 Agent:
41
41
  - **Claude Code agent(`.claude/agents/`)**:读取 frontmatter,确认 `name:` 与 subagent_type 完全一致;frontmatter 缺失、不可解析或 name 不匹配时视为 malformed agent。
42
42
  - **OpenCode agent(`.opencode/agents/`)**:文件名即 agent 名(OpenCode 不要求在 frontmatter 中写 `name:`),读取 frontmatter 确认 `mode: subagent` 和 `permissions:` 规则列表存在且可解析即可(2.x 用复数 `permissions:`,旧版单数 `permission:` 视为待重新部署);frontmatter 缺失或不可解析视为 malformed。
43
43
  - **Codex agent(`.codex/agents/`)**:文件名为 `{agent}.toml`,TOML 必须可解析,且包含 `name`、`description`、`developer_instructions`;`name` 必须与目标 agent 完全一致。
44
44
  - **Antigravity agent(`.agents/agents/`)**:路径为 `.agents/agents/agent-name/agent.md`(`agent-name` 为目标 agent 名),frontmatter 必须可解析,且 `name` 与目标 agent 一致、`mainAgent: false`、`subagent: true`、`tools` 非空;缺失或不匹配视为 malformed。
45
- - 如果目标模式所需任一文件缺失或 malformed,**不要尝试 spawn 缺失/异常 Agent**;自动降级为 `solo`,报告开头用一句话告诉作者「审稿助手缺失或损坏,这次由我一个人审;运行 `/story-setup` 后可多视角审」,降级原因 `missing agents -> solo` / `malformed agents -> solo` 与问题文件写进技术备注行的 Fallback、Files 两栏。
46
- 5. **确认 Agent 工具可用**:Claude/OpenCode/Codex 需要当前运行时的子 Agent/Task 调用能力,Antigravity 需要 `invoke_subagent`;不可用时直接降级为 `solo`,技术备注写 `Fallback: agent tool unavailable -> solo`。
45
+ - **ZCode plugin agent**:注册名与目标角色一致;可读定义须有可解析的 `name`、`description` 和正文。定义不可直接读时以运行时注册为准,不扫描其他端文件。
46
+ - 任一必需角色缺失或 malformed 时不尝试派发,降级 `solo`;白话说明助手缺失或损坏,并建议当前宿主重部署(ZCode 更新/启用 oh-story 插件后新开会话)。`missing agents -> solo` / `malformed agents -> solo` 与问题角色/文件写进技术备注 Fallback、Files 两栏。
47
+ 5. **确认 Agent 工具可用**:Claude/OpenCode/Codex 需要当前运行时的子 Agent/Task 工具,Antigravity 需要 `invoke_subagent`,ZCode 用 `Agent` 按当前 schema 派发注册角色;不可用时降级 `solo`,技术备注写 `Fallback: agent tool unavailable -> solo`。
47
48
  6. **运行时失败降级**:如果任何 Agent spawn 返回失败、`subagent_type` / `agent` / `agent_type` / `TypeName` 不可用、frontmatter/TOML 运行时解析失败或子 Agent 无法启动,停止继续 spawn,改用 `solo` 重新审查,技术备注写 `Fallback: spawn failed -> solo` 与失败的 agent 名;不要把部分成功的 Agent 结果当成 full/lean 结论。
48
49
  7. **确定实际模式**:请求模式与实际模式都写进报告末尾的技术备注行。
49
50
 
@@ -2,11 +2,11 @@
2
2
 
3
3
  只有实际模式仍是 full/lean 时才读本文件。
4
4
 
5
- 使用当前运行时的 Agent 工具并行调用(Codex 原生子代理使用 `agent_type`,Claude Code 使用 `subagent_type`,OpenCode 使用 `subagent` 工具的 `agent` 参数,Antigravity 使用 `invoke_subagent` + 同名 `TypeName`;实际字段以当前 CLI 暴露的工具为准)。每个 Agent 不继承父对话上下文,prompt 必须自包含项目路径、审查范围、文件路径、必要摘录和统一 Findings Schema。结构、角色、文字三个视角的 prompt 还要内联审查基准包摘要与 Rubric Source,使子 Agent 能直接开审;prompt 不写本 Skill 的资料路径,各 reviewer 按自己模板里的读取表加载方法资料。consistency-checker 按自己的检查项核对事实,不带内容评分基准包。所有 reviewer 只读:不改任何文件,只输出结果。
5
+ 使用当前运行时的 Agent 工具并行调用(Codex 原生子代理使用 `agent_type`,Claude Code 使用 `subagent_type`,OpenCode 使用 `subagent` 工具的 `agent` 参数,Antigravity 使用 `invoke_subagent` + 同名 `TypeName`,ZCode 用 `Agent` 派发注册角色;实际字段以当前 CLI 暴露的工具为准)。每个 Agent 不继承父对话上下文,prompt 必须自包含项目路径、审查范围、文件路径、必要摘录和统一 Findings Schema。结构、角色、文字三个视角的 prompt 还要内联审查基准包摘要与 Rubric Source,使子 Agent 能直接开审;prompt 不写本 Skill 的资料路径,各 reviewer 按自己模板里的读取表加载方法资料。consistency-checker 按自己的检查项核对事实,不带内容评分基准包。所有 reviewer 只读:不改任何文件,只输出结果。
6
6
 
7
7
  **追踪修订号**:长篇工程(有 `追踪/_tracking-state.json`)派 consistency-checker 前,先跑本 skill 的 `scripts/tracking_commit.py check --project {项目根}`,把输出的 `last_committed_chapter`、`state_revision` 填进它的 prompt;check 报错时这一栏写「check 失败,派生视图不可信:{报错首行}」,报告「没法判断的地方」用白话写明追踪记录和正文对不上、这次没据它核对。短篇不填。
8
8
 
9
- **story-explorer 预查询(可选)**。仅当 `Effective Mode` 仍为 `full`/`lean`、当前允许 spawn 且当前运行时的 Agent 工具可用时,才可在对应 canonical agent 目录下确认 `story-explorer` 已部署并 spawn;Antigravity 检查 `.agents/agents/story-explorer/agent.md`,用 `invoke_subagent` + `TypeName: "story-explorer"`。`solo` 或子代理递归保护场景下不得 spawn,只能直接读取/检索。Prompt 示例:
9
+ **story-explorer 预查询(可选)**。仅当 `Effective Mode` 仍为 `full`/`lean`、当前允许 spawn 且当前运行时的 Agent 工具可用时,才可按 Phase 0 的当前宿主来源确认 `story-explorer` 可用并 spawn(ZCode 查插件注册角色);Antigravity 检查 `.agents/agents/story-explorer/agent.md`,用 `invoke_subagent` + `TypeName: "story-explorer"`。`solo` 或子代理递归保护场景下不得 spawn,只能直接读取/检索。Prompt 示例:
10
10
 
11
11
  ```text
12
12
  项目目录:{dir}
@@ -14,7 +14,7 @@
14
14
  查询参数:{审查涉及的设定关键词}
15
15
  ```
16
16
 
17
- **Agent 1: story-architect**(subagent_type: story-architect)
17
+ **Agent 1: story-architect**
18
18
  - full/lean 均调用。
19
19
  - 审查视角:主题对齐、大纲结构、钩子/反转质量、范围控制、平台期待。
20
20
  - 提示指令:
@@ -50,7 +50,7 @@
50
50
  RECOMMENDATIONS: [修改建议]
51
51
  ```
52
52
 
53
- **Agent 2: character-designer**(subagent_type: character-designer)
53
+ **Agent 2: character-designer**
54
54
  - full 模式调用。
55
55
  - 审查视角:角色语言风格一致性、对话质量、人物弧线、关系推进。
56
56
  - 提示指令:
@@ -80,7 +80,7 @@
80
80
  RECOMMENDATIONS: [修改建议]
81
81
  ```
82
82
 
83
- **Agent 3: narrative-writer**(subagent_type: narrative-writer)
83
+ **Agent 3: narrative-writer**
84
84
  - full 模式调用。
85
85
  - 审查视角:三层去味诊断(表达、用笔、故事因果与变化)、情绪烈度(够不够爽/会不会太保守)、格式合规、节奏均匀度、文字自然度。
86
86
  - 提示指令:
@@ -113,7 +113,7 @@
113
113
  RECOMMENDATIONS: [修改建议]
114
114
  ```
115
115
 
116
- **Agent 4: consistency-checker**(subagent_type: consistency-checker)
116
+ **Agent 4: consistency-checker**
117
117
  - full/lean 均调用。
118
118
  - 审查视角:grep-first + 推理型一致性检测,输出 S1-S4 报告。
119
119
  - 提示指令:
@@ -146,7 +146,7 @@
146
146
 
147
147
  1. 收集实际执行的 reviewer VERDICT 和 FINDINGS。
148
148
  2. 合并去重:按 `severity` 排序(S1 > S2 > S3 > S4),同级内按影响范围排序。
149
- 3. **可选事实核查**:如果审查内容涉及需要验证的外部事实(历史年代、地理方位、职业细节等),只有在 `Effective Mode` 仍为 `full`/`lean`、当前不是子 Agent、当前运行时的 Agent 工具可用且对应 canonical agent 目录下的 `story-researcher` 已部署时,才可额外 spawn;Antigravity 检查 `.agents/agents/story-researcher/agent.md`,用 `invoke_subagent` + `TypeName: "story-researcher"`。`solo`、missing/malformed/spawn failed 降级或子代理递归保护场景下不得 spawn,只能在报告中标记“需人工事实核查”。
149
+ 3. **可选事实核查**:如果审查内容涉及需要验证的外部事实(历史年代、地理方位、职业细节等),只有在 `Effective Mode` 仍为 `full`/`lean`、当前不是子 Agent、当前运行时的 Agent 工具可用且按 Phase 0 的当前宿主来源确认 `story-researcher` 可用时(ZCode 查插件注册角色),才可额外 spawn;Antigravity 检查 `.agents/agents/story-researcher/agent.md`,用 `invoke_subagent` + `TypeName: "story-researcher"`。`solo`、missing/malformed/spawn failed 降级或子代理递归保护场景下不得 spawn,只能在报告中标记“需人工事实核查”。
150
150
  4. **分歧呈现**:如果 reviewer 间有冲突意见,明确呈现分歧让用户裁决;不要自动妥协。
151
151
  5. 按 SKILL.md「报告面向作者」输出综合审查报告:开头说明审查方式与范围,证据不足项写成作者能补的材料,执行路径只进技术备注行。
152
152
 
@@ -121,7 +121,7 @@ Markdown 只负责给作者和 Agent 阅读,工具不再反向解析 Markdown
121
121
  - `context` 的允许字段随子命令不同:`init` 收 `position`、`long_term_constraints`、`active_character_names`、`continuity_risks`、`recent_chapters`、`next_chapter_commitments` 六项;`commit` 只收前四项。`recent_chapters` 与 `next_chapter_commitments` 在 commit 时由工具从当前视图和本章 `delta` 派生,手填会在任何写入前被拒(`context contains unsupported fields: ...`,exit 2)。commit 事务须使用自身允许字段,不能照搬 init 示例。
122
122
  - `character_snapshots` 中出现的角色视为核心复用角色,必须同时出现在 `character_changes`;已经建立快照的核心角色再次变化时必须提交新快照。
123
123
  - 角色快照的四个列表不限制条数,只限制单项长度和最终文件总字节:目标 ≤4096 字节,超过警告;硬上限 8192 字节,超过则在任何写入前拒绝。
124
- - 没有快照的角色变化视为临时角色,不建立状态文件;`context.active_character_names` 最多 6 人且必须已有当前快照。
124
+ - 没有快照的角色变化视为临时角色,不建立状态文件;`context.active_character_names` 是下一章的活跃角色,不是核心角色总数或主角数:最多 20 人且必须已有当前快照,只列下一章出场或被直接牵动的核心角色,其余核心角色保留快照,需要时读 `追踪/角色状态/{名}.md`。
125
125
  - `context.long_term_constraints` 最多 6 条:要加第 7 条先合并语义重叠项或请作者取舍,不自动删旧约束;永久生效的设定裁定进它,短期强承诺进 `next_chapter_commitments`,过程决策不进续写状态卡。
126
126
  - `context.long_term_constraints` 和 `context.continuity_risks` 是整份提交的当前值。凡是上一版有、本次没有的条目,必须逐条列进 `delta.retired_context_items`,否则工具在任何写入前拒绝——漏写不会被当成删除。实际退役的条目由工具写进本章逐章记录的 `## 本章退役登记`,随后仍可回查。
127
127
  - 不再复用的核心角色写进 `delta.retired_characters`:工具删除其当前快照与 `角色状态/{角色名}.md`,并在逐章记录留档。同一事务里不能既退役又提交快照,也不能退役仍列在 `context.active_character_names` 的角色。角色阵亡/退场这一章,把变化照写进 `character_changes` 即可,本章退役的角色不必再交一份马上要删的快照,逐章记录仍按核心角色标注。退役只表示不再进入热上下文,正文与逐章记录不受影响。
@@ -143,4 +143,4 @@ Markdown 只负责给作者和 Agent 阅读,工具不再反向解析 Markdown
143
143
  6. `## 下一章承诺`
144
144
  7. `## 连贯性风险`
145
145
 
146
- 其中活跃角色最多 6 人、活跃伏笔确定性选取最多 8 条、近章只保留 3 章。这些是下一章热上下文容量,不是完整角色状态的容量限制。
146
+ 其中活跃角色最多 20 人、活跃伏笔确定性选取最多 8 条、近章只保留 3 章。这些是下一章热上下文容量,不是完整角色状态的容量限制;人多且各角色状态行写得长时可能先撞字节上限,超了先压短状态行,再减人数。
@@ -45,6 +45,8 @@ CONTEXT_TARGET_BYTES = 8192
45
45
  CONTEXT_MAX_BYTES = 12288
46
46
  SNAPSHOT_TARGET_BYTES = 4096
47
47
  SNAPSHOT_MAX_BYTES = 8192
48
+ # 下一章热上下文里列出的活跃角色,不是核心角色总数;体积仍由 CONTEXT_MAX_BYTES 兜底。
49
+ ACTIVE_CHARACTER_MAX = 20
48
50
 
49
51
  CONTEXT_HEADINGS = (
50
52
  "## 当前位置",
@@ -663,7 +665,10 @@ def validate_context_input(value: object, *, include_initial_fields: bool) -> di
663
665
  context.get("continuity_risks", []), "context.continuity_risks", maximum=5
664
666
  ),
665
667
  }
666
- require(len(normalized["active_character_names"]) <= 6, "context.active_character_names may contain at most 6 names")
668
+ require(
669
+ len(normalized["active_character_names"]) <= ACTIVE_CHARACTER_MAX,
670
+ f"context.active_character_names may contain at most {ACTIVE_CHARACTER_MAX} names",
671
+ )
667
672
  require(
668
673
  len({portable_name_key(name) for name in normalized["active_character_names"]})
669
674
  == len(normalized["active_character_names"]),
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: story-setup
3
- version: 1.3.4
3
+ version: 1.3.5
4
4
  description: "网文写作工具集基础设施部署与检查。为 Claude Code / OpenCode / Codex / Google Antigravity / ZCode / OpenClaw / Reasonix 提供内置适配;Web AI / 通用 Agent 可走 skills + AGENTS.md 文件模式。触发方式:/story-setup、$story-setup、「准备写书」「帮我搭一下环境」「配置写作项目」「检查写作环境」。"
5
5
  metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudecode"}}
6
6
  ---
@@ -26,9 +26,9 @@ metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudec
26
26
  > 判据是「有没有 `SKILL.md`」:只看正在执行的 `SKILL.md` 同级的 `references/`。项目内 `.claude/skills/story-setup/`、`.codex/skills/story-setup/` 和 OpenCode 的 `skills/story-setup/` 只有 `references/agent-references/`、不含 `SKILL.md`,不会是执行目录,也不要拿它们核对。Antigravity / ZCode / OpenClaw / Reasonix / generic 的项目副本是整份 skill 拷贝、自带 `SKILL.md`,9 个子目录本就齐全,照常核对即可。
27
27
 
28
28
  1. 检查当前目录是否已部署过(存在 `.story-deployed`)
29
- - `agents_version` 缺失、非整数或小于 `36` → 标记为待更新,继续执行当前部署
30
- - `agents_version: 36` → 使用 AskUserQuestion 确认是否重新部署;提示里写明重新部署只用**当前本地 skill 包**刷新项目文件,要拿 skill 本身的新版本得先更新 oh-story-claudecode(`npx skills add` 或 marketplace),再回来重跑
31
- - `agents_version` 大于 `36` → 当前 story-setup 比项目部署旧;停止以避免降级覆盖,提示先更新 oh-story-claudecode,不写任何部署文件
29
+ - `agents_version` 缺失、非整数或小于 `37` → 标记为待更新,继续执行当前部署
30
+ - `agents_version: 37` → 使用 AskUserQuestion 确认是否重新部署;提示里写明重新部署只用**当前本地 skill 包**刷新项目文件,要拿 skill 本身的新版本得先更新 oh-story-claudecode(`npx skills add` 或 marketplace),再回来重跑
31
+ - `agents_version` 大于 `37` → 当前 story-setup 比项目部署旧;停止以避免降级覆盖,提示先更新 oh-story-claudecode,不写任何部署文件
32
32
  - 同时读 `target_cli` 字段。**已部署项目以 sentinel 里的值为准**:非空时(逗号分隔的多端组合原样保留)这些端照常重新部署,不再让作者选;第 4 步仍判断当前宿主:判断出来且不在其中(作者换了软件)→ AskUserQuestion 问「这个文件夹之前是给 {已部署宿主名} 装的,你现在用的是 {当前宿主名},要一起装上吗?」(「一起装上(推荐)」「只更新原来的」),选前者就加进 `target_cli`;判断不出不问。字段缺失或为空才走第 4-6 步。用户明确要求增删目标端时,用 AskUserQuestion 在现有值基础上改,改完的值写回 sentinel。
33
33
  - `target_cli` 不含 opencode、但项目里有 `.opencode/plugins/story-hooks.ts` 或 `.opencode/agents/`(多端部署时 OpenCode 曾被版本门拦下)→ 用 AskUserQuestion 问是否把 OpenCode 加回来;选加回则先过 [references/deploy-opencode.md](references/deploy-opencode.md) 的「部署前置」,通过后写回 `target_cli`
34
34
  2. 检查是否有书名目录(包含 `追踪/` 子目录的目录,或用户自定义结构)
@@ -89,8 +89,8 @@ Phase 2 幂等:复制、写入与各宿主合并重复执行结果一致。受
89
89
  - 写入以下字段(YAML `key: value` 格式,hook 用 `references/templates/hooks/lib/sentinel.sh` 读取):
90
90
  ```
91
91
  deployed_at: <date -u +"%Y-%m-%dT%H:%M:%SZ">
92
- agents_version: 36
93
- setup_skill_version: 1.3.4
92
+ agents_version: 37
93
+ setup_skill_version: 1.3.5
94
94
  target_cli: claude-code(或 opencode、codex、antigravity、zcode、openclaw、reasonix、generic,或其任意组合)
95
95
  resolver_strategy: project-local-skill-reference
96
96
  references_dir: .claude/skills/story-setup/references/agent-references(Codex 写 .codex/skills/...;Antigravity 写 .agents/skills/...;ZCode 写 .zcode/skills/...;OpenCode / OpenClaw / Reasonix / generic 写 skills/...;多端用逗号分隔)
@@ -27,9 +27,9 @@ metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudec
27
27
 
28
28
  ---
29
29
 
30
- > Agent 只查当前端 canonical 目录(Claude `.claude/agents`、OpenCode `.opencode/agents`、Codex `.codex/agents` TOML、Antigravity `.agents/agents`),不跨端误判。Claude 用 `subagent_type`,OpenCode 用 `subagent` 的 `agent`,Codex 用 `agent_type`,Antigravity 用 `invoke_subagent` + `TypeName`。主会话自己写正文、去味是常态,不报;作者明确要交给写作助手而能力/文件缺失、unknown agent 或 ZCode 3.3.4 时,由主会话接手并一句白话告诉作者(如「写作助手用不了,由我直接写」),`Fallback: project custom agents unavailable -> solo` 原文只写进汇报最后一行「技术备注:」。
30
+ > Agent 只查当前宿主:Claude `.claude/agents`(`subagent_type`)、OpenCode `.opencode/agents`(`subagent` 的 `agent`)、Codex `.codex/agents` TOML(`agent_type`)、Antigravity `.agents/agents`(`invoke_subagent` + `TypeName`);ZCode 查插件注册的同名角色,用 `Agent` 按实际 schema 派发,不要求 `.zcode/agents`。主会话自己写正文、去味是常态,不报;作者明确要交给写作助手而角色/工具缺失或 unknown agent 时,由主会话接手并一句白话告诉作者,`Fallback: project custom agents unavailable -> solo` 原文只进汇报最后一行「技术备注:」。
31
31
  >
32
- > Spawn 版本提示(不阻断 spawn):先读取项目根 `.story-deployed` 的 `agents_version`。与本版 `agents_version: 36` 不一致时(标记缺失、字段缺失/非整数、小于或大于 36)**照常按文件存在性检查并 spawn**,同时用一句白话提示作者「写作助手是旧版,运行 /story-setup 后新开会话」,`Notice: agents bundle 版本不匹配(项目 {N},本版 36)` 原文写进技术备注行;大于 36 时额外提示先更新 oh-story-claudecode,不要用本地旧版 setup 降级覆盖。只有 agent 文件缺失、或运行时不暴露 custom agent 时才降级 solo/direct,`Fallback: ... -> solo` 同样只进技术备注行。
32
+ > Spawn 版本提示(不阻断 spawn):先读取项目根 `.story-deployed` 的 `agents_version`。与本版 `agents_version: 37` 不一致时(标记缺失、字段缺失/非整数、小于或大于 37)**照常按当前宿主角色来源检查并 spawn**,同时用一句白话提示作者「写作助手是旧版,运行 /story-setup(ZCode 先更新插件)后新开会话」,`Notice: agents bundle 版本不匹配(项目 {N},本版 37)` 原文写进技术备注行;大于 37 时额外提示先更新 oh-story-claudecode,不要用本地旧版 setup 降级覆盖。只有当前宿主角色缺失或不暴露调用能力时才降级 solo/direct,`Fallback: ... -> solo` 同样只进技术备注行。
33
33
 
34
34
  **文风裁决**:正文写作、改写或审稿前先读 [references/style-resolution.md](references/style-resolution.md),加载本书文风并形成 `style_resolution`;无作者记忆也执行。当前请求、本书文风和 active 偏好按维度覆盖通用 references;同一裁决交给后续执行者。
35
35
 
@@ -1,13 +1,13 @@
1
1
  # agent-calls.md:短篇派写手的调用方式
2
2
 
3
- 按 workflow-draft.md / workflow-revision.md 决定是否派 narrative-writer;派出时读本文件,主会话自行写作或去味时跳过。Antigravity 用 `invoke_subagent` + 同名 `TypeName`。
3
+ 派出 narrative-writer 时读。下文只给目标角色与 prompt;调用参数按 SKILL 顶部的当前宿主映射。
4
4
 
5
5
  ## 写正文
6
6
 
7
- spawn `Agent(subagent_type: "narrative-writer", prompt: ...)`,只传项目目录、输出文件、目标情绪、题材包要点、小节大纲、角色、主/副对标召回摘要、本书文风全文路径与 style_resolution、作者偏好 query 输出的 lines、格式硬约束和写作硬约束,并传入检查分工:本批只做内容覆盖与格式自检,完整语义去味由 Phase 4 负责,最终文件扫描由主会话负责。
7
+ 派 `narrative-writer`,只传项目目录、输出文件、目标情绪、题材包要点、小节大纲、角色、主/副对标召回摘要、本书文风全文路径与 style_resolution、作者偏好 query 输出的 lines、格式硬约束和写作硬约束,并传入检查分工:本批只做内容覆盖与格式自检,完整语义去味由 Phase 4 负责,最终文件扫描由主会话负责。
8
8
 
9
9
  写手读不到本 skill 的 references,主会话把要点摘进 prompt。题材包要点取 `设定.md`「题材招式」及题材包的腔调、开篇收尾招式、情绪烈度;写作硬约束取 `short-craft.md` 第 2、8 节与 `scene-craft.md` 要点,人称腔调与叙述姿态按题材包;格式硬约束取 `设定.md`「平台基调」与 `short-format.md`。主会话收到结果后,按 workflow-draft.md 的格式规范重排,再写入 `正文.md`。
10
10
 
11
11
  ## 精修去味
12
12
 
13
- spawn `Agent(subagent_type: "narrative-writer", prompt: "项目目录:{dir}\n任务描述:审查+去AI味\n检查分工:你负责本次精修清单与检测命中的定点语义修复及格式检查;最终文件扫描由主会话执行\n检查范围:{正文文件与待修位置、问题类别}\n检测类别:{照录命中类别,对应关系见 deslop-gates.md「按检测类别或问题限定范围」;类别不明写全部表达与用笔项,仍只处理本次精修问题}\nstyle_resolution:{与写作一致的文风裁决,含全文路径}\n作者偏好:{query 输出的 lines}\n篇幅:短篇\n卖点保留:第一人称审判、火葬场预告、心死余韵按具体功能保留;压掉空泛与重复,不强制补反应\n执行边界:按 deslop-gates.md 的范围与权限修复;不扩大为完整故事重写;需新增动机、证据、事件或改变选择、结果、揭露时机的给出具体设计建议,已授权的执行\n验收:复读完整场景及小节承接,说明原文问题、修改动作与保留理由;不用固定删减率,字数不足如实交回")`
13
+ spawn `narrative-writer`,Prompt:`项目目录:{dir}\n任务描述:审查+去AI味\n检查分工:你负责本次精修清单与检测命中的定点语义修复及格式检查;最终文件扫描由主会话执行\n检查范围:{正文文件与待修位置、问题类别}\n检测类别:{照录命中类别,对应关系见 deslop-gates.md「按检测类别或问题限定范围」;类别不明写全部表达与用笔项,仍只处理本次精修问题}\nstyle_resolution:{与写作一致的文风裁决,含全文路径}\n作者偏好:{query 输出的 lines}\n篇幅:短篇\n卖点保留:第一人称审判、火葬场预告、心死余韵按具体功能保留;压掉空泛与重复,不强制补反应\n执行边界:按 deslop-gates.md 的范围与权限修复;不扩大为完整故事重写;需新增动机、证据、事件或改变选择、结果、揭露时机的给出具体设计建议,已授权的执行\n验收:复读完整场景及小节承接,说明原文问题、修改动作与保留理由;不用固定删减率,字数不足如实交回`
@@ -6,7 +6,7 @@
6
6
 
7
7
  #### Agent 调用:story-architect
8
8
 
9
- 已部署 story-architect 时可 spawn `Agent(subagent_type: "story-architect", prompt: "项目目录:{dir}\n任务类型:短篇构思\n查询参数:{目标情绪+题材方向}\n题材包要点:{所选题材包的节奏骨架、核心招式、开篇与收尾范式}\n平台要点:{本平台的基调、格式、导语写法与付费点位置}")` 辅助框架设计。它读不到题材包和平台表,两项要点由主会话摘进 prompt;不可用时由主会话直接执行。
9
+ 按 SKILL 顶部的当前宿主角色来源确认 story-architect 可用时,可派它辅助框架设计,Prompt:`项目目录:{dir}\n任务类型:短篇构思\n查询参数:{目标情绪+题材方向}\n题材包要点:{所选题材包的节奏骨架、核心招式、开篇与收尾范式}\n平台要点:{本平台的基调、格式、导语写法与付费点位置}`。它读不到题材包和平台表,两项要点由主会话摘进 prompt;不可用时由主会话直接执行。
10
10
 
11
11
  #### 设计步骤
12
12
 
@@ -115,7 +115,7 @@
115
115
 
116
116
  #### Agent 调用:character-designer
117
117
 
118
- 设计步骤完成后、跑完成门禁前,已部署 character-designer 时可 spawn `Agent(subagent_type: "character-designer", prompt: "项目目录:{dir}\n任务类型:角色设定\n查询参数:{人设速写+关系}")` 辅助角色设定和语言风格档案;不可用时由主会话直接执行。结果整理为每人一行(声线、口头禅、禁忌)写进 设定.md「人设速写」,写正文只读这里。
118
+ 设计步骤完成后、跑完成门禁前,按 SKILL 顶部的当前宿主角色来源确认 character-designer 可用时,可派它辅助角色设定和语言风格档案,Prompt:`项目目录:{dir}\n任务类型:角色设定\n查询参数:{人设速写+关系}`;不可用时由主会话直接执行。结果整理为每人一行(声线、口头禅、禁忌)写进 设定.md「人设速写」,写正文只读这里。
119
119
 
120
120
  #### Phase 2 完成门禁
121
121
 
@@ -14,7 +14,7 @@
14
14
 
15
15
  #### Agent 调用:narrative-writer(去AI味)+ consistency-checker
16
16
 
17
- 已部署对应 agent 时可派出:narrative-writer 去味的 prompt 见 [agent-calls.md](agent-calls.md)「精修去味」;一致性检查派 `Agent(subagent_type: "consistency-checker", prompt: "项目目录:{dir}\n检查范围:{正文文件}\n检查类型:事实冲突+伏笔断线+角色属性不一致")`。agent 不可用时主会话直接执行。
17
+ 按 SKILL 顶部的当前宿主角色来源确认可用时再派出:narrative-writer 去味的 prompt 见 [agent-calls.md](agent-calls.md)「精修去味」;一致性检查派 `consistency-checker`,Prompt:`项目目录:{dir}\n检查范围:{正文文件}\n检查类型:事实冲突+伏笔断线+角色属性不一致`。agent 不可用时主会话直接执行。
18
18
 
19
19
  **正文洁净规则**:自检结果只在对话中说明,不另存或附正文;正文不得出现 `<!-- 自检 -->` 等检查标记。
20
20
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oh-story/dsh",
3
- "version": "0.1.18",
3
+ "version": "0.1.19",
4
4
  "description": "A DSH plugin for fiction, short-drama, interactive-game, and video-recap production",
5
5
  "keywords": [
6
6
  "deepseek-harness",
@@ -98,26 +98,26 @@
98
98
  },
99
99
  "devDependencies": {
100
100
  "@deepseek-ai/cordis": "4.0.5",
101
- "@deepseek-ai/dsh-agent": "0.2.1-rc.2",
102
- "@deepseek-ai/dsh-api-session-controller": "0.2.1-rc.2",
103
- "@deepseek-ai/dsh-client-store": "0.2.1-rc.2",
104
- "@deepseek-ai/dsh-client-ui-chat": "0.2.1-rc.2",
105
- "@deepseek-ai/dsh-client-ui-conversation": "0.2.1-rc.2",
106
- "@deepseek-ai/dsh-client-ui-layout": "0.2.1-rc.2",
107
- "@deepseek-ai/dsh-client-ui-renderer": "0.2.1-rc.2",
108
- "@deepseek-ai/dsh-client-ui-session": "0.2.1-rc.2",
109
- "@deepseek-ai/dsh-client-ui-slots": "0.2.1-rc.2",
110
- "@deepseek-ai/dsh-client-ui-tool": "0.2.1-rc.2",
111
- "@deepseek-ai/dsh-fs": "0.2.1-rc.2",
112
- "@deepseek-ai/dsh-host-webserver": "0.2.1-rc.2",
113
- "@deepseek-ai/dsh-llm": "0.2.1-rc.2",
114
- "@deepseek-ai/dsh-session": "0.2.1-rc.2",
115
- "@deepseek-ai/dsh-sandbox-policy": "0.2.1-rc.2",
116
- "@deepseek-ai/dsh-skill": "0.2.1-rc.2",
117
- "@deepseek-ai/dsh-subagent": "0.2.1-rc.2",
118
- "@deepseek-ai/dsh-tools": "0.2.1-rc.2",
119
- "@deepseek-ai/dsh-typert-registry": "0.2.1-rc.2",
120
- "@deepseek-ai/dsh-util-values": "0.2.1-rc.2",
101
+ "@deepseek-ai/dsh-agent": "0.2.1-rc.4",
102
+ "@deepseek-ai/dsh-api-session-controller": "0.2.1-rc.4",
103
+ "@deepseek-ai/dsh-client-store": "0.2.1-rc.4",
104
+ "@deepseek-ai/dsh-client-ui-chat": "0.2.1-rc.4",
105
+ "@deepseek-ai/dsh-client-ui-conversation": "0.2.1-rc.4",
106
+ "@deepseek-ai/dsh-client-ui-layout": "0.2.1-rc.4",
107
+ "@deepseek-ai/dsh-client-ui-renderer": "0.2.1-rc.4",
108
+ "@deepseek-ai/dsh-client-ui-session": "0.2.1-rc.4",
109
+ "@deepseek-ai/dsh-client-ui-slots": "0.2.1-rc.4",
110
+ "@deepseek-ai/dsh-client-ui-tool": "0.2.1-rc.4",
111
+ "@deepseek-ai/dsh-fs": "0.2.1-rc.4",
112
+ "@deepseek-ai/dsh-host-webserver": "0.2.1-rc.4",
113
+ "@deepseek-ai/dsh-llm": "0.2.1-rc.4",
114
+ "@deepseek-ai/dsh-session": "0.2.1-rc.4",
115
+ "@deepseek-ai/dsh-sandbox-policy": "0.2.1-rc.4",
116
+ "@deepseek-ai/dsh-skill": "0.2.1-rc.4",
117
+ "@deepseek-ai/dsh-subagent": "0.2.1-rc.4",
118
+ "@deepseek-ai/dsh-tools": "0.2.1-rc.4",
119
+ "@deepseek-ai/dsh-typert-registry": "0.2.1-rc.4",
120
+ "@deepseek-ai/dsh-util-values": "0.2.1-rc.4",
121
121
  "@deepseek-ai/schemastery": "3.18.5",
122
122
  "@types/react": "18.3.28",
123
123
  "@types/react-dom": "18.3.7",
@@ -1,3 +0,0 @@
1
- {"record_type":"sources","schema_version":"1.0.0","sources":{"guhe-audition-02":{"owner":"creator","artifact":"输入/voice-refs/guhe-audition-02.wav"},"reference-observations":{"owner":"creator","artifact":"创作者决策/reference-observations.jsonl"},"screenplay-index":{"owner":"short-drama-write","artifact":"剧集/EP003/screenplay-index.jsonl"},"cd-char-001":{"owner":"creator","artifact":"创作者决策/cd-char-001.json"},"characters":{"owner":"short-drama-assets","artifact":"设定集/characters.jsonl"},"cd-look-001":{"owner":"creator","artifact":"创作者决策/cd-look-001.json"}}}
2
- {"example_only":true,"destination":"设定集/characters.jsonl","schema_version":"1.0.0-draft","record_type":"character","character_id":"CHAR-GUHE","display_name":"顾禾","aliases":["小顾"],"identity_anchors":["窄长脸","左眉尾短缺口","自然卷黑发","肩背略前倾"],"persistent_performance_facts":["说话前常先观察对方手里的物件"],"voice_direction":{"language":"zh-CN","reference":{"slot_id":"VREF-GUHE-01","artifact_ref":{"src":"guhe-audition-02"},"role":"timbre","may_control":["音色质感","年龄与体量印象"],"must_not_control":["这条试音稿里的克制情绪","录音棚的混响与话筒距离","背景底噪"],"admission_status":"creator_described","reference_observation_ref":{"src":"reference-observations","record_id":"OBS-VREF-GUHE-01"},"unresolved_risks":[]},"selection_criteria":[{"kind":"register","text":"中低音区,比同剧其他成年男性低半档","counter_example":"低到需要压喉才发得出,就过头了"},{"kind":"rhythm","text":"句尾常收住而不拖长","counter_example":"每句都硬切断,听起来像念稿"}],"distinction":{"nearest_character_id":"CHAR-LINSHU","distinguishing_trait":"顾禾句尾收住;林舒句尾常带一段下滑的余音"},"pronunciation_notes":[{"term":"顾禾","accepted_reading":"Gù Hé"}],"not_voice_identity":["本场因淋雨造成的短暂气息不稳","某句台词的临时音量"]},"not_identity":["本集橙色雨衣","右肩湿痕","瞬时低头"],"source_refs":[{"src":"screenplay-index","record_id":"BLK-EP003-SC004-A01"}],"creator_acceptance":{"status":"accepted","decision_ref":{"src":"cd-char-001","record_id":"CD-CHAR-001"}}}
3
- {"example_only":true,"destination":"设定集/looks.jsonl","schema_version":"1.0.0-draft","record_type":"look","look_id":"LOOK-GUHE-RAIN","character_ref":{"src":"characters","record_id":"CHAR-GUHE"},"base_look_id":"LOOK-GUHE-WORK","differences":{"wardrobe_layers":["工作装外加橙色旧雨衣"],"hair_styling":["低束,兜帽放下"],"makeup":[],"injury":[],"weathering":[]},"cause_ref":{"src":"screenplay-index","record_id":"BLK-EP003-SC004-A01"},"validity":{"from":"EP003/SC004/BLK-EP003-SC004-A01","until":"EP003/SC006/BLK-EP003-SC006-A03"},"creator_acceptance":{"status":"accepted","decision_ref":{"src":"cd-look-001","record_id":"CD-LOOK-001"}}}
@@ -1,4 +0,0 @@
1
- {"record_type":"sources","schema_version":"1.0.0","sources":{"props":{"owner":"short-drama-assets","artifact":"设定集/props.jsonl"},"prop-states":{"owner":"short-drama-assets","artifact":"设定集/prop-states.jsonl"},"screenplay-index":{"owner":"short-drama-write","artifact":"剧集/EP003/screenplay-index.jsonl"},"locations":{"owner":"short-drama-assets","artifact":"设定集/locations.jsonl"}}}
2
- {"example_only":true,"schema_version":"1.0.0-draft","delta_id":"DELTA-TIN-OPEN","episode_id":"EP003","scene_id":"SC004","subject_ref":{"src":"props","record_id":"PROP-TIN-CASE"},"state_field":"condition.open","before":{"value":"closed","state_ref":{"src":"prop-states","record_id":"PSTATE-TIN-CLOSED-BADGE-IN"}},"after":{"value":"open","proposed_state_id":"PSTATE-TIN-OPEN-EMPTY"},"cause_ref":{"src":"screenplay-index","record_id":"BLK-EP003-SC004-A03"},"effective_range":{"from":"EP003/SC004/BLK-EP003-SC004-A03","until":"open_ended"},"reconciliation":{"next_linked_start":"EP003/SC005/start","status":"must_match_or_revise"},"creator_acceptance":{"status":"proposed","decision_ref":null},"affected_binding_refs":[{"src":"props","record_id":"PROP-TIN-CASE"}],"affected_binding_locators":[{"owner":"short-drama-storyboard","artifact":"剧集/EP003/storyboard/shots.jsonl","selector":{"asset_or_variant_ids":["PROP-TIN-CASE","PROP-CERAMIC-BADGE-017"]},"status":"future_until_shots_exist"}],"destination":"剧集/EP003/assets/continuity.jsonl"}
3
- {"example_only":true,"schema_version":"1.0.0-draft","delta_id":"DELTA-BADGE-TRANSFER","episode_id":"EP003","scene_id":"SC004","subject_ref":{"src":"props","record_id":"PROP-CERAMIC-BADGE-017"},"state_field":"custody","before":{"owner":"CHAR-GUHE","holder":"CHAR-GUHE","hand":"right"},"after":{"owner":"CHAR-WEISHU","holder":"CHAR-WEISHU","hand":"right"},"cause_ref":{"src":"screenplay-index","record_id":"BLK-EP003-SC004-A04"},"effective_range":{"from":"EP003/SC004/BLK-EP003-SC004-A04","until":"open_ended"},"reconciliation":{"next_linked_start":"EP003/SC005/start","status":"must_match_or_revise"},"creator_acceptance":{"status":"proposed","decision_ref":null},"affected_binding_refs":[{"src":"props","record_id":"PROP-CERAMIC-BADGE-017"}],"affected_binding_locators":[{"owner":"short-drama-storyboard","artifact":"剧集/EP003/storyboard/shots.jsonl","selector":{"asset_or_variant_ids":["PROP-CERAMIC-BADGE-017","CHAR-GUHE","CHAR-WEISHU"]},"status":"future_until_shots_exist"}],"destination":"剧集/EP003/assets/continuity.jsonl"}
4
- {"example_only":true,"schema_version":"1.0.0-draft","delta_id":"DELTA-OFFICE-BLACKOUT","episode_id":"EP003","scene_id":"SC004","subject_ref":{"src":"locations","record_id":"LOC-FERRY-OFFICE"},"state_field":"active_view","before":{"value":"VIEW-FERRY-OFFICE-NORTH-NIGHT"},"after":{"value":"VIEW-FERRY-OFFICE-NORTH-BLACKOUT"},"cause_ref":{"src":"screenplay-index","record_id":"BLK-EP003-SC004-A04"},"effective_range":{"from":"EP003/SC004/BLK-EP003-SC004-A04","until":"open_ended"},"reconciliation":{"next_linked_start":"EP003/SC005/start","status":"must_match_or_revise"},"creator_acceptance":{"status":"proposed","decision_ref":null},"affected_binding_refs":[{"src":"locations","record_id":"LOC-FERRY-OFFICE"}],"affected_binding_locators":[{"owner":"short-drama-storyboard","artifact":"剧集/EP003/storyboard/shots.jsonl","selector":{"asset_or_variant_ids":["LOC-FERRY-OFFICE","VIEW-FERRY-OFFICE-NORTH-BLACKOUT"]},"status":"future_until_shots_exist"}],"destination":"剧集/EP003/assets/continuity.jsonl"}
@@ -1,5 +0,0 @@
1
- {"record_type":"sources","schema_version":"1.0.0","sources":{"occurrences":{"owner":"short-drama-assets","artifact":"剧集/EP003/assets/occurrences.jsonl"},"characters":{"owner":"short-drama-assets","artifact":"设定集/characters.jsonl"},"screenplay-index":{"owner":"short-drama-write","artifact":"剧集/EP003/screenplay-index.jsonl"},"location-views":{"owner":"short-drama-assets","artifact":"设定集/location-views.jsonl"}}}
2
- {"example_only":true,"schema_version":"1.0.0-draft","decision_id":"DEC-OCC-001","occurrence_refs":[{"src":"occurrences","record_id":"OCC-EP003-SC004-001","authority":"candidate"}],"decision_kind":"new_variant","asset_kind":"character","proposed_binding":{"identity_id":"CHAR-GUHE","variant_id":"LOOK-GUHE-RAIN"},"base_ref":{"src":"characters","record_id":"CHAR-GUHE"},"persistent_evidence":["剧本沿用顾禾的身份和关系","已有永久识别锚点未改变"],"differences":["在工作装外加橙色旧雨衣","兜帽放下"],"cause_ref":{"src":"screenplay-index","record_id":"BLK-EP003-SC004-A01"},"validity":{"from":"EP003/SC004/BLK-EP003-SC004-A01","until":"EP003/SC006/BLK-EP003-SC006-A03"},"rationale":"人物持续身份不变;跨场服装需要精确绑定","creator_acceptance":{"status":"proposed","decision_ref":null},"downstream_impact":["character_image_prompt","affected_storyboard_bindings"],"destination":"剧集/EP003/assets/decisions.jsonl"}
3
- {"example_only":true,"schema_version":"1.0.0-draft","decision_id":"DEC-OCC-002","occurrence_refs":[{"src":"occurrences","record_id":"OCC-EP003-SC004-002","authority":"candidate"}],"decision_kind":"reuse","asset_kind":"location","proposed_binding":{"identity_id":"LOC-FERRY-OFFICE","variant_id":"VIEW-FERRY-OFFICE-NORTH-NIGHT"},"base_ref":{"src":"location-views","record_id":"VIEW-FERRY-OFFICE-NORTH-NIGHT"},"persistent_evidence":["北门、河窗和柜台的地理与已有 View 一致"],"differences":[],"cause_ref":null,"validity":{"from":"EP003/SC004","until":"EP003/SC004/BLK-EP003-SC004-A04"},"rationale":"同一空间、同一可复用方向与正常夜间光态","creator_acceptance":{"status":"proposed","decision_ref":null},"downstream_impact":["affected_storyboard_bindings"],"destination":"剧集/EP003/assets/decisions.jsonl"}
4
- {"example_only":true,"schema_version":"1.0.0-draft","decision_id":"DEC-OCC-003","occurrence_refs":[{"src":"occurrences","record_id":"OCC-EP003-SC004-003","authority":"candidate"}],"decision_kind":"new_asset","asset_kind":"prop","proposed_binding":{"identity_id":"PROP-TIN-CASE","variant_id":"PSTATE-TIN-CLOSED-BADGE-IN"},"base_ref":null,"persistent_evidence":["扁长黑铁匣","铰链盖","右前角永久凹陷","用于保存号牌"],"differences":[],"cause_ref":{"src":"screenplay-index","record_id":"BLK-EP003-SC004-A02"},"validity":{"from":"EP003/SC004","until":"open_ended"},"rationale":"现有 设定集 无同时匹配形制、唯一凹陷和叙事功能的 Prop","creator_acceptance":{"status":"proposed","decision_ref":null},"downstream_impact":["prop_image_prompt","affected_storyboard_bindings","continuity"],"destination":"剧集/EP003/assets/decisions.jsonl"}
5
- {"example_only":true,"schema_version":"1.0.0-draft","decision_id":"DEC-OCC-004","occurrence_refs":[{"src":"occurrences","record_id":"OCC-EP003-SC004-004","authority":"candidate"}],"decision_kind":"unresolved","asset_kind":"character","proposed_binding":null,"candidate_bindings":[{"identity_id":"CHAR-GUHE","support":"此前顾禾靠近北门","conflict":"最近动作主语已切换"},{"identity_id":"CHAR-WEISHU","support":"最近一句台词属于魏叔","conflict":"未写他走向北门"}],"persistent_evidence":[],"differences":[],"cause_ref":null,"validity":null,"rationale":"代词没有唯一先行项;不得以距离或最近姓名猜测","creator_question":"从北门离开的‘她’具体是谁?若为新人物,请补可识别称谓。","creator_acceptance":{"status":"pending_choice","decision_ref":null},"downstream_impact":["blocks_character_binding","blocks_dependent_storyboard"],"destination":"剧集/EP003/assets/decisions.jsonl"}
@@ -1,3 +0,0 @@
1
- {"record_type":"sources","schema_version":"1.0.0","sources":{"screenplay-index":{"owner":"short-drama-write","artifact":"剧集/EP003/screenplay-index.jsonl"},"cd-loc-001":{"owner":"creator","artifact":"创作者决策/cd-loc-001.json"},"locations":{"owner":"short-drama-assets","artifact":"设定集/locations.jsonl"},"cd-view-001":{"owner":"creator","artifact":"创作者决策/cd-view-001.json"}}}
2
- {"example_only":true,"destination":"设定集/locations.jsonl","schema_version":"1.0.0-draft","record_type":"location","location_id":"LOC-FERRY-OFFICE","display_name":"旧渡站值班室","spatial_identity":{"shape":"狭长室内","zones":["柜台内工作区","柜台外等候区"],"entrances":[{"id":"north_door","connects_to":"LOC-FERRY-HALL"}],"fixed_anchors":["东侧河窗","西侧整面旧柜台","柜台后墙配电箱"],"materials":["磨损木柜台","灰白粉刷墙","旧金属窗框"]},"not_identity":["夜间","停电","顾禾站在北门","低机位"],"source_refs":[{"src":"screenplay-index","record_id":"BLK-EP003-SC004-H01"}],"creator_acceptance":{"status":"accepted","decision_ref":{"src":"cd-loc-001","record_id":"CD-LOC-001"}}}
3
- {"example_only":true,"destination":"设定集/location-views.jsonl","schema_version":"1.0.0-draft","record_type":"location_view","view_id":"VIEW-FERRY-OFFICE-NORTH-BLACKOUT","location_ref":{"src":"locations","record_id":"LOC-FERRY-OFFICE"},"base_view_id":"VIEW-FERRY-OFFICE-NORTH-NIGHT","orientation":{"from_zone":"柜台内工作区","toward":"北门","visible_fixed_anchors":["北门","东侧河窗","柜台后墙配电箱"]},"state_differences":{"dressing":[],"time":"night","weather":"heavy_rain_outside","light":["顶灯熄灭","河窗冷光保留"]},"cause_ref":{"src":"screenplay-index","record_id":"BLK-EP003-SC004-A04"},"validity":{"from":"EP003/SC004/BLK-EP003-SC004-A04","until":"open_ended"},"creator_acceptance":{"status":"accepted","decision_ref":{"src":"cd-view-001","record_id":"CD-VIEW-001"}}}