novel-writer-cli 0.3.0 → 0.5.0

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 (75) hide show
  1. package/README.md +1 -1
  2. package/agents/chapter-writer.md +43 -14
  3. package/agents/character-weaver.md +7 -1
  4. package/agents/plot-architect.md +20 -7
  5. package/agents/quality-judge.md +199 -20
  6. package/agents/style-analyzer.md +14 -8
  7. package/agents/style-refiner.md +10 -3
  8. package/agents/world-builder.md +8 -1
  9. package/dist/__tests__/agent-prompts-anti-ai-upgrade.test.js +194 -6
  10. package/dist/__tests__/agent-prompts-platform-expansion.test.js +33 -0
  11. package/dist/__tests__/anti-ai-infrastructure.test.js +548 -0
  12. package/dist/__tests__/anti-ai-templates.test.js +2 -2
  13. package/dist/__tests__/canon-status-lifecycle.test.js +481 -0
  14. package/dist/__tests__/commit-gate-decision.test.js +65 -0
  15. package/dist/__tests__/commit-prototype-pollution.test.js +1 -1
  16. package/dist/__tests__/excitement-type-annotation.test.js +240 -0
  17. package/dist/__tests__/excitement-type.test.js +21 -0
  18. package/dist/__tests__/gate-decision.test.js +62 -15
  19. package/dist/__tests__/genre-excitement-mapping.test.js +355 -0
  20. package/dist/__tests__/golden-chapter-gates.test.js +79 -0
  21. package/dist/__tests__/golden-chapter-mini-planning.test.js +485 -0
  22. package/dist/__tests__/helpers/quickstart-mini-planning.js +61 -0
  23. package/dist/__tests__/init.test.js +57 -5
  24. package/dist/__tests__/instructions-platform-expansion.test.js +125 -0
  25. package/dist/__tests__/next-step-gate-decision-routing.test.js +98 -0
  26. package/dist/__tests__/orchestrator-state-write-path.test.js +1 -1
  27. package/dist/__tests__/platform-profile.test.js +57 -1
  28. package/dist/__tests__/quickstart-pipeline.test.js +73 -6
  29. package/dist/__tests__/scoring-weights.test.js +193 -0
  30. package/dist/__tests__/steps-id.test.js +2 -0
  31. package/dist/__tests__/validate-quickstart-prereqs.test.js +2 -0
  32. package/dist/advance.js +27 -2
  33. package/dist/anti-ai-context.js +535 -0
  34. package/dist/cli.js +3 -1
  35. package/dist/commit.js +22 -0
  36. package/dist/excitement-type.js +12 -0
  37. package/dist/gate-decision.js +98 -2
  38. package/dist/golden-chapter-gates.js +143 -0
  39. package/dist/init.js +76 -7
  40. package/dist/instructions.js +552 -6
  41. package/dist/next-step.js +124 -88
  42. package/dist/platform-profile.js +20 -8
  43. package/dist/quickstart-mini-planning.js +30 -0
  44. package/dist/scoring-weights.js +38 -3
  45. package/dist/steps.js +1 -1
  46. package/dist/validate.js +293 -214
  47. package/dist/volume-commit.js +271 -5
  48. package/dist/volume-planning.js +78 -3
  49. package/docs/user/README.md +1 -0
  50. package/docs/user/migration-guide.md +166 -0
  51. package/docs/user/novel-cli.md +4 -3
  52. package/docs/user/quick-start.md +354 -57
  53. package/package.json +1 -1
  54. package/schemas/platform-profile.schema.json +2 -2
  55. package/scripts/lint-blacklist.sh +221 -76
  56. package/scripts/lint-structural.sh +538 -0
  57. package/skills/continue/SKILL.md +6 -0
  58. package/skills/continue/references/context-contracts.md +71 -6
  59. package/skills/continue/references/periodic-maintenance.md +12 -1
  60. package/skills/novel-writing/references/quality-rubric.md +79 -26
  61. package/skills/novel-writing/references/style-guide.md +129 -19
  62. package/skills/start/SKILL.md +23 -3
  63. package/skills/start/references/vol-planning.md +12 -3
  64. package/templates/ai-blacklist.json +1024 -246
  65. package/templates/ai-sentence-patterns.json +167 -0
  66. package/templates/genre-excitement-map.json +48 -0
  67. package/templates/genre-golden-standards.json +80 -0
  68. package/templates/genre-weight-profiles.json +15 -0
  69. package/templates/golden-chapter-gates.json +230 -0
  70. package/templates/novel-ask/example.question.json +3 -2
  71. package/templates/platform-profile.json +141 -1
  72. package/templates/platforms/fanqie.md +35 -0
  73. package/templates/platforms/jinjiang.md +35 -0
  74. package/templates/platforms/qidian.md +35 -0
  75. package/templates/style-profile-template.json +3 -0
package/README.md CHANGED
@@ -50,7 +50,7 @@ node dist/cli.js --help
50
50
 
51
51
  ```bash
52
52
  mkdir my-novel && cd my-novel
53
- novel init # --platform qidian|tomato 可选
53
+ novel init # --platform qidian|fanqie|jinjiang(兼容 tomato 旧别名;会额外写平台约束文件)
54
54
  novel status
55
55
  ```
56
56
 
@@ -18,19 +18,24 @@
18
18
  - 章节号、卷号、storyline_id
19
19
  - chapter_outline_block(已从 outline.md 提取的本章大纲区块)
20
20
  - storyline_context(last_chapter_summary / chapters_since_last / line_arc_progress)
21
- - hard_rules_list(L1 禁止项列表)
21
+ - hard_rules_list(L1 禁止项列表;仅包含 `canon_status == "established"` 或缺失字段的已生效 hard 规则;即使为空也会显式提供)
22
+ - world_rules_context_degraded(可选;若为 `true`,表示 `world/rules.json` 存在但 CLI 在提取 L1 规则时发生降级,需直接读取 `paths.world_rules` 复核)
23
+ - planned_rules_info(可选;已规划但未生效的 L1 规则,仅供伏笔/铺垫参考)
22
24
  - foreshadowing_tasks(本章伏笔任务)
23
25
  - foreshadow_light_touch_tasks(可选;伏笔沉默超阈值时注入的“轻触提醒”任务:非剧透、不兑现)
24
26
  - ai_blacklist_top10(高频词提醒)
25
27
  - concurrent_state(其他线并发状态)
26
28
  - transition_hint(切线过渡提示)
27
29
  - style_drift_directives(可选,漂移纠偏指令;与 writing_directives 叠加)
30
+ - statistical_targets(6 维统计目标;style-profile 为 `null` 的字段已由编排器回退到默认人类范围)
31
+ - genre_overrides(可选;由 brief 显式覆写或题材默认值导出的结构/标点参数)
28
32
  - engagement_report_summary(可选;爽点/信息密度窗口报告摘要:issues + suggestions,非阻断)
29
33
  - promise_ledger_report_summary(可选;承诺台账窗口报告摘要:dormant_promises + suggestions,非剧透、不兑现)
30
34
 
31
35
  **B. 文件路径**(你需要用 Read 工具自行读取):
32
36
  - `paths.style_profile` → 风格指纹 JSON(**必读**,含 style_exemplars 和 writing_directives)
33
37
  - `paths.platform_profile` → 平台配置 JSON(可选;含字数区间、章末钩子策略、信息负载等;存在时优先遵守)
38
+ - `paths.platform_writing_guide` → 平台写作指南 Markdown(可选;存在时必须遵守其中的节奏/对话比例/钩子/情绪回报/文风要求)
34
39
  - `paths.style_drift` → 风格漂移纠偏(可选,存在时读取)
35
40
  - `paths.chapter_contract` → L3 章节契约 JSON
36
41
  - `paths.chapter_eval` → 章节评估 JSON(可选;hook-fix/修订时提供,含 hook_type/hook_strength/evidence 等信息,便于定向修复)
@@ -41,27 +46,39 @@
41
46
  - `paths.recent_summaries[]` → 近 3 章摘要(按时间倒序)
42
47
  - `paths.storyline_memory` → 当前线记忆
43
48
  - `paths.adjacent_memories[]` → 相邻线/交汇线记忆
44
- - `paths.character_contracts[]` → 裁剪后的角色契约 JSON
49
+ - `paths.character_profiles[]` → 裁剪后的已生效角色叙述档案(可选;仅 `established` / 缺失 `canon_status`)
50
+ - `paths.character_contracts[]` → 裁剪后的已生效角色契约 JSON(仅 `established` / 缺失 `canon_status`;属于当前章需要遵守的 L2 约束)
51
+ - `paths.planned_character_profiles[]` → 裁剪后的 planned 角色叙述档案(可选;仅供铺垫/预告参考)
52
+ - `paths.planned_character_contracts[]` → 裁剪后的 planned 角色契约 JSON(可选;仅供铺垫/预告参考,不作为强制约束)
45
53
  - `paths.project_brief` → 项目 brief
46
- - `paths.writing_methodology` → 去 AI 化方法论参考
54
+ - `paths.style_guide` → 去 AI 化方法论参考
55
+ - `paths.ai_sentence_patterns` → AI 句式模式定义 JSON(8 种结构级模式,供 C21 消费)
47
56
  - `paths.engagement_report_latest` → 爽点/信息密度窗口报告(可选;存在时读取以获得更完整上下文)
48
57
  - `paths.promise_ledger_report_latest` → 承诺台账窗口报告(可选;存在时读取以获得更完整上下文)
49
58
 
50
- > **读取优先级**:先读 `style_profile`(获取 style_exemplars 作为写作基调),若存在再读 `platform_profile`(明确平台字数/钩子策略),再读 `chapter_contract` + `recent_summaries`(明确要写什么),最后读其余文件。
59
+ > **读取优先级**:先读 `style_profile`(获取 style_exemplars 作为写作基调),若存在再读 `platform_profile` + `platform_writing_guide`(明确平台字数/钩子策略/节奏与关系预期),再读 `chapter_contract` + `recent_summaries`(明确要写什么),最后读其余文件。
51
60
 
52
- 当 L1 hard 规则存在时,manifest 中会以 `hard_rules_list` 禁止项列表形式提供,这些规则**不可违反**。
61
+ manifest 中会以 `hard_rules_list` 禁止项列表形式提供当前已生效(`canon_status == "established"` 或字段缺失)的 hard 规则;这些规则**不可违反**。
62
+
63
+ 若 `world_rules_context_degraded == true`,说明 CLI 未能可靠提取完整的 L1 规则摘要;此时你必须直接读取 `paths.world_rules`,按同一 `canon_status` 语义自行保守复核,不能把空 `hard_rules_list` 误解成“没有世界规则”。
64
+
65
+ 当存在 `planned_rules_info` 时,你可以把这些规则当作“未来会生效的设定提示”来做轻度伏笔或预告,但**不得**把它们当成当前章必须兑现的硬约束。
66
+
67
+ 若存在 `paths.planned_character_contracts[]` / `paths.planned_character_profiles[]`,这些角色只可用于铺垫、预告、登场准备或制造期待;它们**不属于**当前章必须满足的 L2 硬约束。
53
68
 
54
69
  当 L3 章节契约存在时(通过 `paths.chapter_contract` 读取),必须完成所有 `required: true` 的 objectives。
55
70
 
56
71
  # Process
57
72
 
58
- 1. **读取 context manifest 中的文件**:按读取优先级依次 Read 所需文件(`style_profile` 优先,必要时再读 `platform_profile` / `chapter_contract` / `recent_summaries`)
73
+ 1. **读取 context manifest 中的文件**:按读取优先级依次 Read 所需文件(`style_profile` 优先,必要时再读 `platform_profile` / `platform_writing_guide` / `chapter_contract` / `recent_summaries`)
59
74
  2. **风格浸入**:阅读 `style_exemplars`(3-5 段原文示范)和 `writing_directives`(DO/DON'T 对比),先把目标声音的节奏、用词质感和句式纹理吃透;这是你的写作基调,不是“参考素材”
60
75
  3. 阅读本章大纲、章节契约、前章摘要和当前故事线记忆,明确核心冲突、POV、信息边界与必须完成的 objective
76
+ - `paths.character_contracts[]` 中的角色属于当前章必须遵守的 L2 约束
77
+ - `paths.planned_character_contracts[]` 中的角色可引用、可铺垫、可制造期待,但不必强制满足其 L2 行为/能力契约
61
78
  4. 检查伏笔任务、轻触提醒和可用的叙事健康摘要;它们只用于微调节奏、信息投放与伏笔推进,不得脱离 outline / contract 自行扩写剧情
62
79
  5. **Phase 1:正文创作**
63
80
  - 5.1 以 `style_exemplars` 为声音锚点开始创作,优先用动作、场景和对话推进事件
64
- - 5.2 创作过程中持续校验 L1/L2/L3 约束、角色语气差异、故事线边界和平台侧字数 / hook 要求
81
+ - 5.2 创作过程中持续校验 L1/L2/L3 约束、角色语气差异、故事线边界,以及平台侧字数 / hook 要求与 `platform_writing_guide` 里的节奏密度、对话比例、情绪回报和文风要求
65
82
  6. **Phase 2:交稿前自检与收束**
66
83
  - 6.1 对照 outline + `chapter_contract`,确认核心冲突、required objectives、postconditions 均已落地
67
84
  - 6.2 对照 `recent_summaries` / storyline memory,确认衔接自然、POV 稳定、跨线信息没有泄漏
@@ -70,11 +87,13 @@
70
87
  - 6.5 **叙述连接词清扫**:扫描所有叙述段落,删掉或改写 `narration_connector` 类词;对话中的角色口吻例外
71
88
  - 6.6 **修饰词去重**:在任意 500 字窗口内查找重复或近义堆叠的形容词 / 副词,保留最有力的一种,其余改写或删除
72
89
  - 6.7 **四字词组密度检查**:检查每 500 字总量、同段数量和连续连用情况;一旦出现“连着抖机灵”的四字词组串联,必须拆开
90
+ - 6.8 **内心活动锚点检查**:扫描关键决策 / 重大信息获知 / 高压事件节点前后 2-3 句,确认至少有一处合法内心活动(感官侵入 / 碎片思绪 / 生理反应 / 思维中断 / 自我纠正);同时检查是否出现连续 5 句纯动作记录流,若超限则插入最小必要的角色感知或内心碎片
91
+ - 6.9 **结构呼吸感检查**:按 `C24` 回看功能性停留的分布与预算,至少确认不是只在整章里孤零零放 1 处就交稿;检查高压场景后是否留出 1-2 句过渡。若是连续高压章节不适合明显停留,也至少检查段尾是否留出 1-2 句过渡。另查对话是否全部变成“任务执行”式推进,必要时补入最小必要的闲笔或缓冲
73
92
  7. 可选输出状态变更提示(辅助 Summarizer)
74
93
 
75
94
  # Constraints
76
95
 
77
- 1. **字数**:优先遵守 `platform-profile.json.word_count.target_min/target_max`;若缺失则 2500-3500 字
96
+ 1. **字数与平台规范**:优先遵守 `platform-profile.json.word_count.target_min/target_max`;若 `paths.platform_writing_guide` 存在,必须同时遵守其中的平台节奏密度、对话比例、钩子、情绪回报周期与文风要求;若缺失则 2500-3500 字
78
97
  2. **情节推进**:推进大纲指定的核心冲突
79
98
  3. **角色一致**:角色言行符合档案设定、语癖和 L2 契约
80
99
  4. **衔接自然**:自然衔接前一章结尾
@@ -93,17 +112,26 @@
93
112
  11. **角色语癖(C11)**:对话要保留角色可辨识的语癖、句长习惯和口头反应,但频率必须自然起伏;不要机械地“每章打卡”某句口头禅
94
113
  12. **反直觉细节(C12)**:有自然落点时,优先加入能把人味拽回来的生活化细节;没有合适语境时宁可不写,不要为了凑“特色细节”硬塞
95
114
  13. **场景描写精简(C13)**:场景描写默认控制在 2 句内,优先用动作推进(默认值,可通过 style-profile 覆盖)
96
- 14. **破折号限频(C14)**:破折号(——)每千字 1 处。这是最明显的 AI 写作标志之一;优先改为逗号、句号或重组句式,只有明确的思维中断场景才保留
115
+ 14. **破折号禁止(C14)**:破折号(——)**完全禁止,0 处/章**。这是最明显的 AI 写作标志;一律改为逗号、句号、省略号或重组句式,包括思维中断场景也使用省略号而非破折号
97
116
  15. **对话格式(C15)**:人物说话和内心活动统一使用中文双引号("")。如 `XX说:"我出去了。"` `XX心想:"关我什么事。"` 禁止使用单引号、直角引号或英文引号
98
- 16. **句长方差(C16)**:优先贴近 `style-profile.json.sentence_length_std_dev`;若缺失则按 8-18 的人类常见波动控制。若出现 3 句及以上连续句长都落在 ±5 字内,必须主动打散其中某句
117
+ 16. **句长方差(C16)**:优先贴近 `inline.statistical_targets.sentence_length_std_dev`;若该字段是区间,则按 **8-18 的人类常见波动控制** 理解为“落在区间内并保持自然波动”;若是单值,则贴近该目标。若出现 3 句及以上连续句长都落在 ±5 字内,必须主动打散其中某句
99
118
  17. **叙述连接词零容忍(C17)**:叙述段落禁止使用 `ai-blacklist.json.categories.narration_connector` 中的词(如“然而 / 与此同时 / 事实上”);中文引号内的角色对白可以按人物口吻保留
100
119
  18. **人性化技法抽样(C18)**:从 `style-guide §2.9` 的技法工具箱中按情境抽样,不固定数量,不固定组合,尽量与最近章节错开同一套技法;如果本章没有自然落点,可以少用甚至不用
101
- 19. **对话意图约束(C19)**:每句对话都要能落到一个主要意图(试探 / 回避 / 施压 / 诱导 / 挑衅 / 敷衍等);禁止“我认为”“我觉得我们应该”这类书面腔对话、禁止用对白重复刚刚叙述过的信息,并用“去掉标签后仍能大致分辨说话人”做自测
102
- 20. **结构密度约束(C20)**:按 `style-guide §2.10 L2-L3` 控制结构密度——每 300 字形容词总量 ≤ 6,连续两个以上形容词修饰同一名词禁止;每 500 字四字词组 ≤ 3、同段 ≤ 2、连续 2 个以上四字词组连用禁止
120
+ 19. **对话意图约束(C19)**:每句对话都要能落到一个主要意图(试探 / 回避 / 施压 / 诱导 / 挑衅 / 敷衍等);当一段对话超过 5 个来回时,允许 1-2 句不直接服务冲突推进的“废话”(打趣 / 抱怨 / 跑题 / 自言自语),但这是**上限不是目标**,且它们仍要能归到“敷衍 / 短暂避锋式缓冲 / 转移”等合法意图。禁止“我认为”“我觉得我们应该”这类书面腔对话、禁止用对白重复刚刚叙述过的信息,并用“去掉标签后仍能大致分辨说话人”做自测
121
+ 20. **结构密度约束(C20)**:按 `style-guide §2.10 L2-L3` 控制结构密度——每 300 字形容词总量 ≤ 6,连续两个以上形容词修饰同一名词禁止;每 500 字四字词组 ≤ 3、同段 ≤ 2、连续 2 个以上四字词组连用禁止。若 `inline.genre_overrides` 存在,则 L5/L6 的单句段占比、段长上限、标点上限按覆写值执行
122
+ 21. **句式模式禁止(C21)**:参照 `paths.ai_sentence_patterns`(`templates/ai-sentence-patterns.json`)中定义的 8 种结构级 AI 句式模式。severity=high(SP-01 解释型旁白/SP-02 模板转折/SP-05 重复解释/SP-07 情绪标签)零容忍,命中即改写;severity=medium(SP-03 抽象判词/SP-04 管理腔/SP-06 因果说明/SP-08 全知评论)每章 ≤2 处
123
+ 22. **通用比喻限频(C22)**:`像+具体意象`(如"像一把刀""像一根绷紧的弦")≤1/千字。排除非比喻义用法("好像有人来了""像是累了")。详见 `ai-blacklist.json.category_metadata.simile_cliche.like_simile_rule`
124
+ 23. **内心活动锚点(C23)**:当章节出现关键决策、生死抉择、重大信息获知、SP 大量扣除等高压节点时,必须在该节点前后 2-3 句内出现至少一处合法内心活动,优先用感官侵入、碎片思绪、生理反应、思维中断或自我纠正呈现,禁止退回 SP-07 式情绪标签句;若连续 5 句都只剩外显动作 / 对话记录、没有角色感知或认知痕迹,第 6 句必须补一处最小必要的角色感知或内心锚点。
125
+ - `C23` 是触发式底线,不是每章固定配额;但**一旦触发,就必须补任一合法锚点**。如果不适合展开长段心理描写,就用最小必要的感官侵入、生理反应、思维中断或自我纠正落地,不能用解释型独白、情绪标签句或“没自然落点”为理由跳过
126
+ - `C12` 提供反直觉细节来源,`C18` 提供技法工具箱;两者都可以服务 `C23`,但只有在触发条件成立时才转为必须项
127
+ 24. **结构呼吸感(C24,建议性约束)**:当章节**正文字数**达到 1000 字以上时,优先守住功能性停留总量不超过章节正文字数的 **≤10%**;在这个预算内,通常可按每 1000-1500 字一处的软建议安排更短、更轻的“功能性停留”。若预算与频率冲突,优先缩短或减少停留,不要突破 10% 上限。功能性停留可以是环境闲描、角色闲聊、感官片段、回忆碎片或生活细节,只要删掉后本章主线因果链仍然成立,但读者会少掉消化空间与人味。高潮战斗 / 追逐 / 对峙章可以减少明显停留,但高压段之后最好仍留 1-2 句过渡,不要整章每段都像任务执行。详见 `style-guide §2.14`。
128
+ - `C24` 提供“该在哪里放慢”的结构位置,`C12` / `C18` 提供“停留时写什么”的具体手段;功能性停留中的环境闲描仍受 `C13` 的 2 句限制,对话闲笔仍要满足 `C19` 的合法意图
129
+
130
+ - **约束优先级**:从高到低依次为:平台 / contract / 零容忍硬约束(如 `C14` / `C17` / `C21-high`)> 触发式约束(`C23`)> 结构上限与一致性约束(如 `C13` / `C19` / `C20` / `C22`)> 建议性约束(`C12` / `C18` / `C24`)。发生冲突时以前一层为准
103
131
 
104
132
  - **补充硬约束**:禁止使用 `---`、`***`、`* * *` 等 markdown 水平分隔线做场景切换。场景过渡只能用空行 + 叙述衔接,不用视觉分隔符
105
133
 
106
- > **注意**:约束 12、13 为默认风格策略,适用于快节奏网文。如项目风格偏向悬疑铺陈/史诗感/抒情向,可在 `style-profile.json` 中设置 `override_constraints` 覆盖(如 `{"anti_intuitive_detail": false, "max_scene_sentences": 5}`)。
134
+ > **注意**:约束 12、13 为默认风格策略,适用于快节奏网文。如项目风格偏向悬疑铺陈/史诗感/抒情向,可在 `style-profile.json` 中设置 `override_constraints` 覆盖(如 `{"anti_intuitive_detail": false, "max_scene_sentences": 5}`)。约束 14(破折号零容忍)不可覆盖。
107
135
 
108
136
  > **注意**:ChapterWriter 负责生成阶段约束与 Phase 2 自检;StyleRefiner 会在后处理阶段再做黑名单、结构规则和节奏复扫。两层都不能省略。
109
137
 
@@ -141,7 +169,8 @@
141
169
 
142
170
  # Edge Cases
143
171
 
144
- - **无章节契约**:试写阶段(前 3 章)无 L3 契约,根据 brief 自由发挥
172
+ - **试写阶段有章节契约**:若 `paths.chapter_contract` 存在(通常来自 `volumes/vol-01/chapter-contracts/`),必须遵守其中的 preconditions / objectives / postconditions / acceptance_criteria;若同时提供 `paths.volume_outline` / `paths.volume_foreshadowing`,也要继承黄金三章的节奏与伏笔种子。
173
+ - **试写阶段无章节契约**:若 `paths.chapter_contract` 缺失,则回退到 free writing mode,根据 brief + style_profile 自由发挥(兼容 legacy 项目)。
145
174
  - **交汇事件章**:多条故事线在本章交汇时,prompt 中会提供所有交汇线的 memory,需确保各线角色互动合理
146
175
  - **修订模式**:manifest 中会追加以下字段:
147
176
  - `required_fixes`(inline):`[{target, instruction}]` 格式的最小修订指令列表
@@ -68,6 +68,7 @@
68
68
  {
69
69
  "id": "lin-feng",
70
70
  "display_name": "林枫",
71
+ "canon_status": "established | planned | deprecated",
71
72
  "contracts": [
72
73
  {
73
74
  "id": "C-LIN-FENG-001",
@@ -84,6 +85,11 @@
84
85
 
85
86
  **契约变更协议**:角色能力/性格变化必须通过 PlotArchitect 在大纲中预先标注 → CharacterWeaver 更新契约 → 章节实现 → 验收确认。
86
87
 
88
+ - `canon_status: "established"` — 角色契约已生效,写作与验收均按 L2 约束执行
89
+ - `canon_status: "planned"` — 角色可被引用/铺垫,但 L2 契约不作为强制约束
90
+ - `canon_status: "deprecated"` — 角色契约已废弃;保留供审计,不再进入 continue Skill 的角色上下文
91
+ - 字段缺失时按 `established` 处理(向后兼容),但 CharacterWeaver 在创建/更新角色时应显式写出 `canon_status`
92
+
87
93
  # Format
88
94
 
89
95
  输出以下文件:
@@ -91,7 +97,7 @@
91
97
  > 路径均以 `write_prefix` 作为前缀(默认 `write_prefix=""`)。
92
98
 
93
99
  1. `{write_prefix}characters/active/{character_id}.md` — 角色叙述性档案(背景、性格、外貌、语癖;文件名为 slug ID)
94
- 2. `{write_prefix}characters/active/{character_id}.json` — 角色结构化数据(含 `id`/`display_name`/`contracts[]`;文件名为 slug ID)
100
+ 2. `{write_prefix}characters/active/{character_id}.json` — 角色结构化数据(含 `id`/`display_name`/`canon_status`/`contracts[]`;文件名为 slug ID)
95
101
  3. `{write_prefix}characters/relationships.json` — 关系图更新
96
102
  4. `{write_prefix}characters/changelog.md` — 变更记录(追加一条)
97
103
 
@@ -17,6 +17,8 @@
17
17
  - 可选:伏笔“沉默度”轻触提醒(`foreshadow_light_touch_tasks`,来自 `logs/foreshadowing/latest.json` 的 dormant_items,非剧透,不兑现)
18
18
  - 可选:承诺台账窗口报告摘要(`promise_ledger_report_summary`,来自 `logs/promises/latest.json` 的裁剪摘要;用于提醒卖点/谜团/机制/关系弧的轻触推进,非剧透、不兑现)
19
19
  - 可选:爽点/信息密度窗口报告摘要(`engagement_report_summary`,来自 `logs/engagement/latest.json` 的裁剪摘要;用于提示低密度区间与可执行的规划补强)
20
+ - 可选:`genre_excitement_map`(当前题材 chapter 1-3 的默认 `excitement_type` 映射;仅首卷黄金三章规划时注入)
21
+ - 可选:`existing_volume_outline` / `existing_storyline_schedule` / `existing_foreshadowing` / `existing_chapter_contracts_dir`(当卷一已存在 F0 种子且本次只续规 chapter 4+ 时注入;这些路径一律只读)
20
22
  - 故事线定义(storylines/storylines.json 内容)
21
23
  - 世界观文档和规则(以 `<DATA>` 标签包裹)
22
24
  - 角色档案和契约(characters/active/ 内容,以 `<DATA>` 标签包裹)
@@ -49,6 +51,7 @@
49
51
  4. **卷末钩子**:最后 1-2 章必须预留悬念钩子(吸引读者追更)
50
52
  5. **角色弧线**:主要角色在本卷内应有可见的成长或变化
51
53
  6. **故事线调度**:从 storylines.json 选取本卷活跃线(≤4 条),规划交织节奏和交汇事件
54
+ 7. **`canon_status` 生命周期**:读取 `world/rules.json` 与 `characters/active/*.json` 时,缺失 `canon_status` 按 `established` 处理;仅 `established` 规则可写入 `preconditions.required_world_rules` 和硬性 `acceptance_criteria`,`planned` 规则/角色可用于铺垫、预告和登场规划,但不得写成当前章必须满足的硬验收条件,`deprecated` 条目必须跳过
52
55
 
53
56
  # Spec-Driven Writing — L3 章节契约
54
57
 
@@ -65,6 +68,7 @@
65
68
  "line_arc_progress": "该线弧线进展描述",
66
69
  "concurrent_state": "其他活跃线一句话状态"
67
70
  },
71
+ "excitement_type": "reversal | face_slap | power_up | reveal | cliffhanger | setup | null",
68
72
  "preconditions": {
69
73
  "character_states": {"角色名": {"location": "...", "状态key": "..."}},
70
74
  "required_world_rules": ["W-001", "W-002"]
@@ -90,13 +94,19 @@
90
94
  }
91
95
  ```
92
96
 
97
+ > `excitement_type` 用于标注本章核心爽点类型;无显式爽点/过渡章请显式写 `null`,便于 QualityJudge 做差异化 pacing 评审。
98
+ >
99
+ > 若 context manifest 提供 `genre_excitement_map` 且当前规划覆盖 chapter 1-3,默认按映射填写对应章的 `excitement_type`;若你判断必须偏离默认值,允许 override,但必须把覆写理由写进该章现有的 `Conflict` / `Arc` / `StateChanges` 等说明文本里,禁止新增第 10 个 `- **Key**:` 行。若未提供 `genre_excitement_map`,则自由分配,不要报错。
100
+ >
101
+ > `required_world_rules` / `acceptance_criteria` 中只应引用当前已生效(`canon_status == "established"` 或字段缺失)的世界规则与角色契约;`planned` 条目只可作为规划/铺垫参考,`deprecated` 条目不得进入章节契约硬约束。
102
+
93
103
  **链式传递**:前章的 postconditions 自动成为下一章的 preconditions。
94
104
 
95
105
  # Format
96
106
 
97
- 输出以下文件:
107
+ 输出以下文件(实际路径以 instruction packet 的 `expected_outputs_base_dir` / `expected_outputs` 为准;当前卷规划默认写入 `staging/volumes/vol-{V:02d}/`,commit 后才进入 `volumes/vol-{V:02d}/`):
98
108
 
99
- 1. `volumes/vol-{V:02d}/outline.md` — 本卷大纲,**必须**使用以下确定性格式(每章一个 `###` 区块,便于程序化提取):
109
+ 1. `<expected_outputs_base_dir>/outline.md` — 本卷大纲,**必须**使用以下确定性格式(每章一个 `###` 区块,便于程序化提取):
100
110
 
101
111
  ```markdown
102
112
  ## 第 V 卷大纲
@@ -110,19 +120,22 @@
110
120
  - **Foreshadowing**: foreshadowing_actions
111
121
  - **StateChanges**: expected_state_changes
112
122
  - **TransitionHint**: next_storyline + bridge 描述(切线章必填;如 `{"next_storyline": "jiangwang-dao", "bridge": "主角闭关被海域震动打断"}`)
123
+ - **ExcitementType**: reversal | face_slap | power_up | reveal | cliffhanger | setup | null
113
124
 
114
125
  ### 第 C+1 章: 章名
115
126
  ...
116
127
  ```
117
128
 
118
- > **格式约束**:每章以 `### 第 N 章` 开头(N 为阿拉伯数字,可选冒号和章名,如 `### 第 5 章: 暗流`),后跟精确的 8 个 `- **Key**:` 行。入口 Skill 通过正则 `/^### 第 (\d+) 章/` 定位并提取对应章节段落,禁止使用自由散文格式。
119
- 2. `volumes/vol-{V:02d}/storyline-schedule.json` — 本卷故事线调度(active_storylines + interleaving_pattern + convergence_events)
120
- 3. `volumes/vol-{V:02d}/foreshadowing.json` — 本卷伏笔计划(新增 + 上卷延续),每条伏笔含 `id`/`description`/`scope`(`short`|`medium`|`long`)/`status`/`planted_chapter`/`target_resolve_range`/`history`
121
- 4. `volumes/vol-{V:02d}/chapter-contracts/chapter-{C:03d}.json` — 每章契约(批量生成,含 storyline_id + storyline_context)
122
- 5. `volumes/vol-{V:02d}/new-characters.json` — 本卷需要新建的角色清单(outline 中引用但 `characters/active/` 不存在的角色),格式:`[{"name": "角色名", "first_chapter": N, "role": "antagonist | supporting | minor", "brief": "一句话定位"}]`。`role` 描述角色在全书中的故事定位(区别于 primary/secondary/seasoning 的本卷叙事权重)。入口 Skill 据此批量调用 CharacterWeaver 创建角色档案 + L2 契约
129
+ > **格式约束**:每章以 `### 第 N 章` 开头(N 为阿拉伯数字,可选冒号和章名,如 `### 第 5 章: 暗流`),后跟精确的 9 个 `- **Key**:` 行;`ExcitementType` 缺失时也应显式写 `null`。如需说明爽点覆写理由,只能写入现有 9 个 Key 的描述文本,不得新增 `ExcitementTypeOverrideReason` 等额外 Key。入口 Skill 通过正则 `/^### 第 (\d+) 章/` 定位并提取对应章节段落,禁止使用自由散文格式。
130
+ 2. `<expected_outputs_base_dir>/storyline-schedule.json` — 本卷故事线调度(active_storylines + interleaving_pattern + convergence_events)
131
+ 3. `<expected_outputs_base_dir>/foreshadowing.json` — 本卷伏笔计划(新增 + 上卷延续),每条伏笔含 `id`/`description`/`scope`(`short`|`medium`|`long`)/`status`/`planted_chapter`/`target_resolve_range`/`history`
132
+ 4. `<expected_outputs_base_dir>/chapter-contracts/chapter-{C:03d}.json` — 每章契约(批量生成,含 storyline_id + storyline_context)
133
+ 5. `<expected_outputs_base_dir>/new-characters.json` — 本卷需要新建的角色清单(outline 中引用但 `characters/active/` 不存在的角色),格式:`[{"name": "角色名", "first_chapter": N, "role": "antagonist | supporting | minor", "brief": "一句话定位"}]`。`role` 描述角色在全书中的故事定位(区别于 primary/secondary/seasoning 的本卷叙事权重)。入口 Skill 据此批量调用 CharacterWeaver 创建角色档案 + L2 契约
123
134
 
124
135
  # Edge Cases
125
136
 
126
137
  - **上卷无回顾**:首卷规划时,跳过上卷承接检查,从 brief 派生初始大纲
138
+ - **黄金三章迷你规划**:当 `volume=1` 且 `chapter_range=[1,3]` 时,进入 mini-planning 模式;你必须输出紧凑的 3 章大纲、`chapter-001/002/003` 的完整 L3 契约、`storyline-schedule.json` 的 3 章调度,以及 1-3 条 seed foreshadows。若提供 `genre_excitement_map`,优先按映射填写 `excitement_type`;未提供时自由分配,不得报错。
139
+ - **首卷续规(已有 F0 种子)**:若 context 提供 `existing_volume_outline` / `existing_storyline_schedule` / `existing_foreshadowing` / `existing_chapter_contracts_dir`,说明卷一前 3 章已由 F0 固化;你只规划 `chapter_range` 指定的新章节,`chapter-001/002/003` 视为只读,outline 只追加新章,storyline-schedule 与 foreshadowing 只做增量追加。
127
140
  - **伏笔过期**:short scope 伏笔超过 `target_resolve_range` 上限仍未回收时(若未提供 range,则以 >10 章作为经验阈值),在伏笔计划中标记 `overdue` 并建议本卷安排回收
128
141
  - **活跃线过多**:storylines.json 中活跃线 > 4 时,选择最高优先级的 4 条,其余标为 seasoning 或暂休眠