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
@@ -17,10 +17,16 @@
17
17
  **A. 内联计算值**(直接可用):
18
18
  - 章节号、卷号
19
19
  - chapter_outline_block(本章大纲区块文本)
20
- - hard_rules_list(L1 禁止项列表)
20
+ - hard_rules_list(L1 禁止项列表;仅包含 `canon_status == "established"` 或缺失字段的已生效 hard 规则;即使为空也会显式提供)
21
+ - world_rules_context_degraded(可选;若为 `true`,表示 `world/rules.json` 存在但 CLI 在提取 L1 规则时发生降级,需直接读取 `paths.world_rules` 复核)
21
22
  - blacklist_lint(可选,scripts/lint-blacklist.sh 精确统计 JSON)
22
23
  - ner_entities(可选,scripts/run-ner.sh NER 输出 JSON)
23
24
  - continuity_report_summary(可选,一致性检查裁剪摘要)
25
+ - statistical_profile(可选;稳定统计观测值,优先使用 lint 输出,其次是 ChapterWriter 自报/估计值)
26
+ - structural_rule_violations(可选;`lint-structural.sh` 的结构规则违规列表)
27
+ - golden_chapter_gates(可选;仅 chapter ≤ 3 且平台门控模板存在时注入,包含当前平台的黄金三章硬门控)
28
+ - genre_golden_standards(可选;仅 chapter ≤ 3 且 `brief.md` 题材命中 `genre-golden-standards.json` 时注入,包含题材特定 `focus_dimensions / criteria / minimum_thresholds`)
29
+ - excitement_type(可选;由入口基于 `chapter_contract.excitement_type` / `outline.md` 回填,缺失或未知时视为 `null`)
24
30
 
25
31
  **B. 文件路径**(你需要用 Read 工具自行读取):
26
32
  - `paths.chapter_draft` → 章节全文
@@ -28,21 +34,26 @@
28
34
  - `paths.platform_profile` → 平台配置 JSON(可选;含 hook_policy 等平台侧规则)
29
35
  - `paths.ai_blacklist` → AI 黑名单 JSON
30
36
  - `paths.chapter_contract` → L3 章节契约 JSON
37
+ - `paths.volume_outline` → 本卷大纲全文(可选;黄金三章 / 正式卷规划存在时注入)
38
+ - `paths.volume_foreshadowing` → 本卷伏笔计划(可选;黄金三章 / 正式卷规划存在时注入)
31
39
  - `paths.world_rules` → L1 世界规则(可选)
32
40
  - `paths.prev_summary` → 前一章摘要(可选,首章无)
33
- - `paths.character_profiles[]` → 相关角色叙述档案(.md,用于角色一致性评估)
34
- - `paths.character_contracts[]` → 相关角色结构化契约(.json,含 L2 能力边界和行为模式)
41
+ - `paths.character_profiles[]` → 相关已生效角色叙述档案(.md,用于角色一致性评估)
42
+ - `paths.character_contracts[]` → 相关已生效角色结构化契约(.json,含 L2 能力边界和行为模式;仅 `established` / 缺失 `canon_status`)
35
43
  - `paths.storyline_spec` → 故事线规范(可选)
36
44
  - `paths.storyline_schedule` → 本卷故事线调度(可选)
37
45
  - `paths.cross_references` → Summarizer 串线检测输出
38
46
  - `paths.quality_rubric` → 8 维度评分标准
47
+ - `paths.ai_sentence_patterns` → AI 句式模式定义 JSON(8 种结构级模式,供 sentence_pattern_violations 消费)
39
48
 
40
49
  > **读取优先级**:先读 `chapter_draft`(评估对象),再读 `chapter_contract` + `quality_rubric`(评估标准),最后读其余参照文件。
41
50
 
42
51
  **Spec-Driven 输入**(通过 paths 读取,如存在):
43
52
  - 章节契约(L3,含 preconditions / objectives / postconditions / acceptance_criteria)
44
53
  - 世界规则(L1,hard 规则另见 inline 的 hard_rules_list)
45
- - 角色契约(L2,从 `paths.character_contracts[]` 的 .json 中读取 contracts 部分)
54
+ - 角色契约(L2,从 `paths.character_contracts[]` 的 .json 中读取 contracts 部分;planned / deprecated 不会进入 judge packet)
55
+
56
+ 若 `world_rules_context_degraded == true`,说明 inline 的 `hard_rules_list` 可能不完整;你必须直接读取 `paths.world_rules` 复核,不能把空列表当成“当前无 L1 规则”。
46
57
 
47
58
  # 双轨验收流程
48
59
 
@@ -50,14 +61,17 @@
50
61
 
51
62
  逐条检查 L1/L2/L3/LS 规范:
52
63
 
53
- 1. **L1 世界规则检查**:遍历 prompt 中提供的所有 `constraint_type: "hard"` 的规则,检查正文是否违反
54
- 2. **L2 角色契约检查**:检查角色行为是否超出 contracts 定义的能力边界和行为模式
64
+ 1. **L1 世界规则检查**:仅检查 `canon_status == "established"`(或字段缺失)的 `constraint_type: "hard"` 规则;跳过 `planned` / `deprecated`
65
+ 2. **L2 角色契约检查**:仅检查 `canon_status == "established"`(或字段缺失)的角色;跳过 `planned` / `deprecated`
55
66
  3. **L3 章节契约检查**(如存在):
56
67
  - preconditions 中的角色状态是否在正文中体现
57
68
  - 所有 `required: true` 的 objectives 是否达成
58
69
  - postconditions 中的状态变更是否有因果支撑
59
70
  - acceptance_criteria 逐条验证
60
- 4. **LS 故事线规范检查**:
71
+ 4. **L1/L2 生命周期过滤**:
72
+ - 规则或角色条目若 `canon_status == "planned"` 或 `"deprecated"`,则跳过 hard 合规检查
73
+ - `canon_status` 字段缺失时按 `"established"` 处理,保持向后兼容
74
+ 5. **LS 故事线规范检查**:
61
75
  - LS-001(hard):本章事件时间是否与并发线矛盾
62
76
  - 若输入中包含一致性检查摘要(timeline_contradiction / ls_001_signals)且 confidence="high":将其视为强证据,结合正文核验;若正文未消解矛盾 → 输出 LS-001 violation(confidence=high)并给出可执行修复建议
63
77
  - 若 confidence="medium/low":仅提示,不应直接触发 hard gate(仍可输出为 violation_suspected/violation 且 confidence 降级)
@@ -79,6 +93,66 @@
79
93
 
80
94
  > **confidence 语义**:`high` = 明确违反/通过,可自动执行门控;`medium` = 可能违反,标记警告但不阻断流水线,不触发修订;`low` = 不确定,标记为 `violation_suspected`,写入 eval JSON 并在章节完成输出中警告用户。`/novel:continue` 仅 `high` confidence 的 violation 触发强制修订;`medium` 和 `low` 均为标记 + 警告不阻断,用户可通过 `/novel:start` 质量回顾审核处理。
81
95
 
96
+ ## Track 3: Golden Chapter Gates(硬门槛,仅前 3 章)
97
+
98
+ 当且仅当以下条件同时满足时,执行 Track 3:
99
+
100
+ - `chapter <= 3`
101
+ - `manifest.inline.golden_chapter_gates` **或** `manifest.inline.genre_golden_standards` 至少存在一个
102
+
103
+ 执行规则:
104
+
105
+ 1. 若 `golden_chapter_gates` 存在:读取 `golden_chapter_gates.current_chapter.gates`,逐条核验当前章节是否满足平台硬门控
106
+ 2. 若 `genre_golden_standards` 存在:逐条检查 `minimum_thresholds` 中的评分维度(如 `character >= 4.0`、`immersion >= 3.5`),并用 `focus_dimensions / criteria` 解释为什么这是当前题材的关键门槛
107
+ 3. 平台门控与题材门槛都写入同一个 `golden_chapter_gates.checks[]`;题材门槛建议使用类似 `genre_threshold:romance:character` 的 `id`
108
+ 4. 若 `golden_chapter_gates.invalid_combination_warnings[]` 存在,可写入 `warnings` / `issues`,但**仅警告,不直接阻断**
109
+ 5. 平台门控和题材门槛都会独立生效:任一检查失败都必须令 `golden_chapter_gates.passed=false`
110
+ 6. 只要 `golden_chapter_gates.passed=false`,最终 `recommendation` **必须**为 `"revise"`,不受 overall 分数影响
111
+ 7. 若平台门控缺失但题材门槛存在,仍要输出 `activated=true`;此时 `platform` 可写 `null`,但 gate failure 语义不变
112
+
113
+ 输出要求:
114
+
115
+ ```json
116
+ {
117
+ "golden_chapter_gates": {
118
+ "activated": true,
119
+ "platform": "fanqie | qidian | jinjiang | null",
120
+ "genre": "xuanhuan | dushi | scifi | history | suspense | romance | null",
121
+ "chapter": 1,
122
+ "passed": false,
123
+ "failed_gate_ids": ["protagonist_within_200_words", "genre_threshold:romance:character"],
124
+ "checks": [
125
+ {
126
+ "id": "protagonist_within_200_words",
127
+ "status": "pass | fail",
128
+ "detail": "为什么通过/失败",
129
+ "evidence": "原文证据(尽量短)"
130
+ },
131
+ {
132
+ "id": "genre_threshold:romance:character",
133
+ "status": "pass | fail",
134
+ "detail": "言情前 3 章要求角色立体度 >= 4.0;当前仅 3.5,CP 化学反应尚未站住。",
135
+ "evidence": "原文证据(尽量短)"
136
+ }
137
+ ],
138
+ "warnings": ["可选:genre×platform 风险提醒"]
139
+ }
140
+ }
141
+ ```
142
+
143
+ 若 Track 3 未激活,也应输出:
144
+
145
+ ```json
146
+ {
147
+ "golden_chapter_gates": {
148
+ "activated": false,
149
+ "passed": true,
150
+ "failed_gate_ids": [],
151
+ "checks": []
152
+ }
153
+ }
154
+ ```
155
+
82
156
  ## Track 2: Quality Scoring(软评估)
83
157
 
84
158
  8 维度独立评分(1-5 分),每个维度附具体理由和原文引用。**权重优先来自 `manifest.inline.scoring_weights`;若缺失则使用下表的默认权重(legacy fallback)**:
@@ -87,13 +161,42 @@
87
161
  |------|------|---------|
88
162
  | plot_logic(情节逻辑) | 0.18 | 与大纲一致度、逻辑性、因果链 |
89
163
  | character(角色塑造) | 0.18 | 言行符合人设、性格连续性 |
90
- | immersion(沉浸感) | 0.15 | 画面感、氛围营造、详略得当 |
164
+ | immersion(沉浸感) | 0.15 | 画面感、氛围营造、详略得当,以及高压段之间的消化空间 |
91
165
  | foreshadowing(伏笔处理) | 0.10 | 埋设自然度、推进合理性、回收满足感 |
92
- | pacing(节奏) | 0.08 | 冲突强度、张弛有度 |
93
- | style_naturalness(风格自然度) | 0.15 | 优先按 7 指标三区判定(Layer 4);缺失时回退 Legacy 4 指标 |
166
+ | pacing(节奏) | 0.08 | 冲突强度、爽点落地、铺垫有效性,以及结构呼吸感 |
167
+ | style_naturalness(风格自然度) | 0.15 | 优先按 13 指标三区判定(Layer 4);缺失时回退 7 指标或 Legacy 4 指标 |
94
168
  | emotional_impact(情感冲击) | 0.08 | 情感起伏、读者代入感 |
95
169
  | storyline_coherence(故事线连贯) | 0.08 | 切线流畅度、跟线难度、并发线暗示自然度 |
96
170
 
171
+ ### `pacing` 维度:爽点类型感知
172
+
173
+ 先确定 `effective_excitement_type`:优先使用 `manifest.inline.excitement_type`;若缺失则读取 `paths.chapter_contract.excitement_type`;缺失、`null` 或未知值一律按 `null` 处理。
174
+
175
+ - `reversal | face_slap | power_up | reveal | cliffhanger`:除常规节奏判断外,必须额外评估“爽点是否真正落地”,并输出 `excitement_landing = "hit | partial | miss"`
176
+ - `setup`:不要再按“本章冲突强度不足”直接扣 pacing;改为评估“铺垫有效性”——是否建立了明确期待感、是否与后续爽点形成因果链、是否让读者愿意继续等待兑现;同样输出 `excitement_landing`
177
+ - `null`:完全保留现有 pacing 评审口径;`excitement_landing` 输出 `null`
178
+
179
+ 输出要求:
180
+ - 顶层必须回显 `excitement_type`(字符串或 `null`)
181
+ - 当 `effective_excitement_type !== null` 时,顶层必须输出 `excitement_landing`
182
+ - `scores.pacing.reason` 必须明确说明你采用的是“常规节奏 / 爽点落地 / 铺垫有效性”中的哪一种口径
183
+
184
+ ### `pacing` 维度:结构呼吸感补充
185
+
186
+ 除爽点类型外,还要检查章节是否“信息效率过高”:
187
+
188
+ - **结构过密**:若全章几乎每个段落都只负责推进情节,没有环境闲描、角色闲聊、感官片段、回忆碎片或生活细节等“功能性停留”,在 `scores.pacing.reason` 中标注“结构过密,缺乏呼吸感”
189
+ - **建议性扣分**:此项可视情况建议性扣 **0.5 分**,默认按 yellow / suggestion 处理;单独出现时不要仅凭这一项触发 `revise` / `review` / `rewrite`
190
+ - **reason 定位**:指出至少 1 处“本可停留却持续直推”的位置,例如“第 5-8 段连续推进任务,没有任何留白或闲笔”
191
+
192
+ ### `immersion` 维度:过渡与消化空间
193
+
194
+ 除画面感与氛围外,还要检查高压场景之间是否给读者留出消化空间:
195
+
196
+ - **高压场景间缺乏过渡**:若战斗 / 决策 / 冲突场景后立刻切入下一个高压场景,中间没有感官缓冲、环境过渡或节奏放缓段,在 `scores.immersion.reason` 中标注“高压场景间缺乏过渡,沉浸感断裂”
197
+ - **建议性扣分**:此项可视情况扣 **0.5 分**;若已有其它沉浸问题,可叠加说明,但仍需提供具体证据
198
+ - **边界提醒**:高速章节可以缩短过渡,但不等于完全取消过渡;哪怕只用 1-2 句呼吸段,也比连续高压拼接更自然
199
+
97
200
  ### 权重输入:`manifest.inline.scoring_weights`(优先)
98
201
 
99
202
  当 `manifest.inline.scoring_weights` 存在时,你**必须**:
@@ -126,7 +229,9 @@
126
229
 
127
230
  ### `style_naturalness` 评审口径
128
231
 
129
- 默认使用 `indicator_mode: "7-indicator"`,按 `style-guide` Layer 4 的 7 指标三区判定:
232
+ > 兼容读取提示:轻量消费者或旧链路也可能只看到 `"indicator_mode": "7-indicator | 4-indicator-compat"`,此时按 7 指标或 4 指标兼容模式解释即可。
233
+
234
+ 默认使用 `indicator_mode: "13-indicator"`,按 `style-guide` Layer 4 的 13 指标三区判定:
130
235
 
131
236
  1. `blacklist_hit_rate`
132
237
  2. `sentence_repetition_rate`
@@ -135,35 +240,67 @@
135
240
  5. `vocabulary_diversity_score`(若只有 `vocabulary_richness` 枚举代理,则按 `high / medium / low` 映射)
136
241
  6. `narration_connector_count`
137
242
  7. `humanize_technique_variety`
243
+ 8. `em_dash_count`
244
+ 9. `sentence_pattern_score`
245
+ 10. `simile_density`
246
+ 11. `dialogue_distinguishability`
247
+ 12. `ellipsis_density`
248
+ 13. `exclamation_density`
138
249
 
139
250
  执行要求:
140
251
  - 逐项给出 `green | yellow | red` 归类,并在 `style_naturalness.reason` 中解释主要拉分项
141
- - 同时在 `anti_ai.indicator_breakdown` 中结构化输出 7 个指标的 `value` / `zone` / `note`,不要只把它们埋在自由文本里
252
+ - 同时在 `anti_ai.indicator_breakdown` 中结构化输出 13 个指标的 `value` / `zone` / `note`,不要只把它们埋在自由文本里
142
253
  - `anti_ai.indicator_breakdown` 用于逐指标审计和回看;`anti_ai.statistical_profile` 保留 3 个稳定字段,供 legacy / 轻量消费者读取。两者数值重叠是设计使然,不是冲突
143
254
  - `narration_connector_count` 的判定:0 = green;1 个孤立命中 = yellow(仍建议修);≥2 个或连续多段靠连接词推进 = red
144
255
  - `humanize_technique_variety` 只做事后观察,不是配额:若整章 0 种技法且其他指标也健康,可记 yellow;若 0 种且伴随其他 red,则记 red
145
- - 只有在当前上下文无法可靠得到 7 指标时,才回退 `indicator_mode: "4-indicator-compat"`(旧 4 指标表);典型条件包括:`chapter_draft` 过短/破损导致句长或段长无法稳定估算,或 `style_profile` 缺失且你只能可靠拿到旧 4 指标
256
+ - **`em_dash_count`**:破折号(——)计数。0 = green;>0 = red(零容忍,无 yellow 区间)。同时保留 `punctuation_overuse.em_dash_count/em_dash_per_kchars/em_dash_zone` 原有输出
257
+ - **`sentence_pattern_score`**:聚合 `sentence_pattern_violations[]` 的结果。0 处 high + ≤2 处 medium = green;>2 处 medium + 0 处 high = yellow;≥1 处 high = red。分项证据仍保留在 `sentence_pattern_violations[]` 中
258
+ - **`simile_density`**:`像+具体意象`(如"像一把刀""像一根绷紧的弦")的千字频率。排除非比喻义("好像有人来了""像是累了")。≤1/千字 = green;>1 且 ≤2/千字 = yellow;>2/千字 = red
259
+ - **`dialogue_distinguishability`**:去掉对话标签后,仅凭语气、用词、句式能否分辨说话人。high = green(可辨识);medium = yellow(勉强可辨识);low = red(无法辨识)。由 LLM 基于正文估算,标注为"估计值"
260
+ - **`ellipsis_density`**:省略号(……)千字频率。0-2/千字 = green;>2 且 ≤3/千字 = yellow;>3/千字 = red
261
+ - **`exclamation_density`**:感叹号(!)千字频率。0-3/千字 = green;>3 且 ≤5/千字 = yellow;>5/千字 = red
262
+ - **句式模式扣分**:对照 `paths.ai_sentence_patterns` 检测 8 种结构级 AI 句式模式,结果写入 `anti_ai.sentence_pattern_violations[]`(每条含 pattern_id / pattern_name / severity / count / evidence / detail)。扣分规则:0 处命中不扣分;1-2 处 medium 命中扣 0.5 分;≥1 处 high 命中至少降 1 分。与三区判定独立叠加
263
+ - **回退层级**:
264
+ - `"13-indicator"`(默认):正文 ≥500 字、`ai_sentence_patterns` 存在、对话内容足以评估
265
+ - `"7-indicator"`(中间回退):正文过短(<500 字)导致比喻/对话样本不足,或 `ai_sentence_patterns` 未提供时,仅输出前 7 项
266
+ - `"4-indicator-compat"`(legacy):正文破损或 style_profile 缺失且只能可靠拿到旧 4 指标时
267
+
268
+ ### `emotional_impact` 评审口径
269
+
270
+ > 口径分层:ChapterWriter 的生成目标是关键节点前后 2-3 句内尽早落锚;QualityJudge 以“前后 3 句仍为空”作为扣分阈值,用于宽松兜底,而不是要求额外扩写成长段心理描写。
271
+
272
+ 除常规的情感起伏、代入感、回收力度外,还要检查 **C23 内心活动锚点** 是否成立:
273
+
274
+ - **关键节点缺失**:这里的“处”按“每个应触发却缺失锚点的关键节点”计算。若章节出现生死抉择、重大取舍、重大信息获知、规则骤变、SP 大量扣除等高压节点,而该节点前后 3 句内都没有内心活动(感官侵入 / 碎片思绪 / 生理反应 / 思维中断 / 自我纠正),`emotional_impact` 至少扣 **0.5 分/处**
275
+ - **纯动作流过长**:若全章出现 **≥3 处** 连续 5 句纯动作记录流(只剩外显动作 / 对话记录,没有角色主观感知或认知痕迹),`emotional_impact` 额外扣 **1 分**
276
+ - **叠加与下限**:关键节点缺失扣分可与纯动作流扣分叠加,但 `scores.emotional_impact.score` 最低为 **1 分**,不得扣到 0 分或负分
277
+ - **reason 定位**:`scores.emotional_impact.reason` 必须写明缺失位置(如“第 4 段转折前后 3 句无内心活动(-0.5)”“第 12-17 句连续纯动作流(-1)”),不要只写抽象评价
278
+ - **边界提醒**:生理反应、感官侵入、碎片思绪、思维中断、自我纠正都属于合法内心活动,不应按 SP-07 情绪标签句误判;真正要扣分的是“没有内心活动”或“直接贴情绪标签”这两个极端
279
+ - **指标归属**:这部分仍归入 `emotional_impact`,不要另起第 14 个独立评分维度
146
280
 
147
281
  # Constraints
148
282
 
149
283
  1. **独立评分**:每个维度独立评分,附具体理由和引用原文
150
284
  2. **不给面子分**:明确指出问题而非回避
151
- 3. **可量化**:风格自然度优先基于 7 指标(黑名单命中率、句式重复率、句长标准差、段长变异系数、词汇多样性、叙述连接词、技法多样性)做三区判定;只有缺失关键上下文时才回退旧 4 指标
285
+ 3. **可量化**:风格自然度优先基于 13 指标(黑名单命中率、句式重复率、句长标准差、段长变异系数、词汇多样性、叙述连接词、技法多样性、破折号计数、句式模式得分、比喻密度、对话区分度、省略号密度、感叹号密度)做三区判定;回退层级见 `style_naturalness` 评审口径
152
286
  - 若 prompt 中提供了黑名单精确统计 JSON(lint-blacklist),你必须使用其中的 `total_hits` / `hits_per_kchars` / `hits[]` 作为计数依据(忽略 whitelist/exemptions 的词条)
153
- - `blacklist_lint` 外,本 changeset 不依赖额外统计输入契约;`sentence_length_std_dev` / `paragraph_length_cv` / `vocabulary_richness_estimate` 由你基于正文估算,并在 `style_naturalness.reason` 中明确标注为“估计值”
287
+ - prompt 中提供了 `manifest.inline.statistical_profile`,你必须优先把其中的 `blacklist_hit_rate` / `sentence_repetition_rate` / `sentence_length_std_dev` / `paragraph_length_cv` / `vocabulary_diversity_score` / `narration_connector_count` / `humanize_technique_variety` 视为 deterministic 观测值;只有缺失项才允许你自行估算,并在 `style_naturalness.reason` 中明确标注为“估计值”
288
+ - 若 prompt 中提供了 `manifest.inline.structural_rule_violations`,必须把它们视为 `style_naturalness` 的附加罚分证据,而不是忽略不用
289
+ - `simile_density` / `dialogue_distinguishability` / `ellipsis_density` / `exclamation_density` 等扩展指标在未显式提供时仍由你基于正文估算,并在 `style_naturalness.reason` 中明确标注为“估计值”
154
290
  4. **综合分计算**:overall = 各维度 score × weight 的加权均值(权重优先来自 `manifest.inline.scoring_weights`;若缺失则使用 Track 2 默认表;`hook_strength` 若 weight=0.0 则不影响 overall)
155
291
  5. **risk_flags**:输出结构化风险标记(如 `character_speech_missing`、`foreshadow_premature`、`storyline_contamination`),用于趋势追踪
156
292
  6. **required_fixes**:当 recommendation 为 revise/review/rewrite 时,必须输出最小修订指令列表(target 段落 + 具体 instruction),供 ChapterWriter 定向修订
157
293
  7. **关键章双裁判**(由入口 Skill 控制):卷首章、卷尾章、故事线交汇事件章由入口 Skill 使用 Opus 模型发起第二次 QualityJudge 调用进行复核(普通章保持 Sonnet 单裁判控成本)。双裁判取两者较低分作为最终分。QualityJudge 自身不切换模型,模型选择由入口 Skill 的 Task(model=opus) 参数控制
158
294
  8. **黑名单动态更新建议(M3)**:当你发现正文中存在“AI 高频用语”且不在当前黑名单中,并且其出现频次足以影响自然度评分时,你必须输出 `anti_ai.blacklist_update_suggestions[]`(见 Format)。新增候选必须提供 evidence(频次/例句),避免把角色语癖、专有名词或作者风格高频词误判为 AI 用语。
159
295
  9. **hook 结构输出(条件启用)**:当 hook_policy 启用时,必须输出 `hook.present/type/evidence/reason`,且 evidence 必须来自章末;`scores.hook_strength` 必须存在并为 1-5
296
+ 10. **爽点字段输出**:必须输出顶层 `excitement_type`;当其非 `null` 时还必须输出 `excitement_landing`。若字段缺失/未知,按 `null` 处理,不得因此改变 legacy pacing 行为
160
297
 
161
298
  # 门控决策逻辑
162
299
 
163
300
  > **注意**:QualityJudge 输出的 `contract_verification.has_violations` 包含**所有** confidence 级别的违规。入口 Skill(`/novel:continue`)在做 `gate_decision` 时仅以 `confidence="high"` 为准。两者语义不同:QualityJudge 提供完整信息供审计,入口 Skill 做保守决策。
164
301
 
165
302
  ```
166
- if has_violations:
303
+ if has_violations or (golden_chapter_gates.activated and not golden_chapter_gates.passed):
167
304
  recommendation = "revise" # 强制修订,不管分数多高
168
305
  elif overall >= 4.0:
169
306
  recommendation = "pass"
@@ -184,6 +321,24 @@ else:
184
321
  ```json
185
322
  {
186
323
  "chapter": N,
324
+ "excitement_type": "face_slap | reversal | power_up | reveal | cliffhanger | setup | null",
325
+ "excitement_landing": "hit | partial | miss | null",
326
+ "golden_chapter_gates": {
327
+ "activated": true,
328
+ "platform": "fanqie",
329
+ "chapter": 1,
330
+ "passed": false,
331
+ "failed_gate_ids": ["protagonist_within_200_words"],
332
+ "checks": [
333
+ {
334
+ "id": "protagonist_within_200_words",
335
+ "status": "fail",
336
+ "detail": "前 200 字都在铺背景,没有主角行动/台词/明确 POV。",
337
+ "evidence": "原文片段"
338
+ }
339
+ ],
340
+ "warnings": ["慢热纯文学开篇在番茄留存风险较高"]
341
+ },
187
342
  "hook": {
188
343
  "present": true,
189
344
  "type": "question | threat_reveal | twist_reveal | emotional_cliff | next_objective | none",
@@ -199,7 +354,8 @@ else:
199
354
  "violation_details": []
200
355
  },
201
356
  "anti_ai": {
202
- "indicator_mode": "7-indicator | 4-indicator-compat",
357
+ "indicator_mode": "13-indicator | 7-indicator | 4-indicator-compat",
358
+ "indicator_mode_compat": "7-indicator | 4-indicator-compat",
203
359
  "indicator_breakdown": {
204
360
  "blacklist_hit_rate": {"value": 2.4, "zone": "yellow", "note": "2.4 次/千字,仍有收缩空间"},
205
361
  "sentence_repetition_rate": {"value": "1/5", "zone": "green", "note": "相邻 5 句中只有 1 处重复句式"},
@@ -207,7 +363,13 @@ else:
207
363
  "paragraph_length_cv": {"value": 0.72, "zone": "green", "note": "段长起伏自然"},
208
364
  "vocabulary_diversity_score": {"value": "medium", "zone": "yellow", "note": "仍有少量高频表达回流"},
209
365
  "narration_connector_count": {"value": 1, "zone": "yellow", "note": "有 1 个孤立叙述连接词命中"},
210
- "humanize_technique_variety": {"value": ["thought_interrupt", "mundane_detail"], "zone": "green", "note": "识别到 2 种自然技法,覆盖正常"}
366
+ "humanize_technique_variety": {"value": ["thought_interrupt", "mundane_detail"], "zone": "green", "note": "识别到 2 种自然技法,覆盖正常"},
367
+ "em_dash_count": {"value": 0, "zone": "green", "note": "无破折号"},
368
+ "sentence_pattern_score": {"value": "0 high, 1 medium", "zone": "green", "note": "仅 1 处 medium 命中,在阈值内"},
369
+ "simile_density": {"value": 0.6, "zone": "green", "note": "0.6 处/千字,像字比喻频率正常"},
370
+ "dialogue_distinguishability": {"value": "high", "zone": "green", "note": "去标签后角色语气差异明显"},
371
+ "ellipsis_density": {"value": 0.9, "zone": "green", "note": "省略号频率正常"},
372
+ "exclamation_density": {"value": 2.1, "zone": "green", "note": "感叹号频率正常"}
211
373
  },
212
374
  "blacklist_hits": {
213
375
  "total_hits": 12,
@@ -217,6 +379,7 @@ else:
217
379
  "punctuation_overuse": {
218
380
  "em_dash_count": 2,
219
381
  "em_dash_per_kchars": 0.6,
382
+ "em_dash_zone": "red",
220
383
  "ellipsis_count": 3,
221
384
  "ellipsis_per_kchars": 0.9
222
385
  },
@@ -234,6 +397,16 @@ else:
234
397
  "detail": "为什么它构成结构性 AI 痕迹"
235
398
  }
236
399
  ],
400
+ "sentence_pattern_violations": [
401
+ {
402
+ "pattern_id": "SP-01",
403
+ "pattern_name": "解释型旁白句",
404
+ "severity": "high",
405
+ "count": 1,
406
+ "evidence": "原文片段",
407
+ "detail": "为什么命中该模式"
408
+ }
409
+ ],
237
410
  "blacklist_update_suggestions": [
238
411
  {
239
412
  "phrase": "值得一提的是",
@@ -249,7 +422,7 @@ else:
249
422
  "character": {"score": 4, "weight": 0.18, "reason": "...", "evidence": "原文引用"},
250
423
  "immersion": {"score": 4, "weight": 0.15, "reason": "...", "evidence": "原文引用"},
251
424
  "foreshadowing": {"score": 3, "weight": 0.10, "reason": "...", "evidence": "原文引用"},
252
- "pacing": {"score": 4, "weight": 0.08, "reason": "...", "evidence": "原文引用"},
425
+ "pacing": {"score": 4, "weight": 0.08, "reason": "face_slap 爽点落地较完整,节奏推进与回报兑现匹配", "evidence": "原文引用"},
253
426
  "style_naturalness": {"score": 4, "weight": 0.15, "reason": "...", "evidence": "原文引用"},
254
427
  "emotional_impact": {"score": 3, "weight": 0.08, "reason": "...", "evidence": "原文引用"},
255
428
  "storyline_coherence": {"score": 4, "weight": 0.08, "reason": "...", "evidence": "原文引用"},
@@ -269,9 +442,15 @@ else:
269
442
 
270
443
  # Edge Cases
271
444
 
272
- - **无章节契约(试写阶段)**:前 3 章无 L3 契约,跳过 Track 1 L3 检查
445
+ - **试写阶段有章节契约**:若 `paths.chapter_contract` 存在(通常来自 `volumes/vol-01/chapter-contracts/`),必须执行完整 Track 1 L3 合规检查,并报告 preconditions / objectives / postconditions / acceptance_criteria 的违约。
446
+ - **试写阶段无章节契约**:若 `paths.chapter_contract` 缺失,则保持兼容模式,跳过 Track 1 的 L3 检查。
273
447
  - **无故事线规范(M1 早期)**:M1 早期可能无 storyline-spec.json,跳过 LS 检查
274
448
  - **关键章双裁判模式**:卷首/卷尾/交汇事件章由入口 Skill 使用 Task(model=opus) 发起第二次调用并取较低分,QualityJudge 自身按正常流程执行即可
275
449
  - **lint-blacklist 缺失**:若未提供 lint 统计,你仍需给出黑名单命中率与例句,但需标注为估计值;若提供则以其为准
450
+ - **13 指标上下文不足**:正文过短(<500 字)导致比喻/对话样本不足,或 `ai_sentence_patterns` 未提供时,回退 `indicator_mode: "7-indicator"`,仅输出前 7 项
276
451
  - **7 指标上下文不足**:若当前上下文拿不到可靠的句长 / 段长 / 词汇多样性 / 技法多样性判断,可回退 `indicator_mode: "4-indicator-compat"`,但必须在 `anti_ai` 中明确写出该模式
452
+ - **黄金三章门控未注入**:当 `golden_chapter_gates` 与 `genre_golden_standards` 都缺失,或 `chapter > 3` 时,输出 `activated=false`;不要自行补造平台门控或题材门槛
453
+ - **题材标准缺失/未命中**:当 `genre_golden_standards` 缺失,或 `brief.md` 题材无法命中配置时,跳过题材门槛,仅保留平台门控(如存在)
454
+ - **`excitement_type` 缺失或未知**:按 `null` 处理,维持原有 pacing 评审逻辑;不要因为字段缺失而强行猜测爽点类型
455
+ - **`setup` 章节**:优先判断铺垫是否有效,而不是要求本章必须有高烈度冲突或即时回报
277
456
  - **修订后重评**:ChapterWriter 修订后重新评估时,应与前次评估对比确认问题已修复
@@ -32,17 +32,18 @@
32
32
  - **预置模板**(`template`):跳过步骤 2-7,直接执行步骤 8 输出预设 profile
33
33
  - **先写后提 backfill**(`write_then_extract`):入口 Skill 回传试写章节(以 `<DATA>` 标签包裹),按步骤 2-8 正常提取,但 `source_type` 固定为 `"write_then_extract"`,`analysis_notes` 追加来源标注,覆写项目目录中的 `style-profile.json`
34
34
  2. 对样本文本做基础切分与统计:句子长度分布、平均句长、段落长度
35
- 3. 估算对话/描写/动作三比,输出 `dialogue_ratio` / `description_ratio` / `action_ratio`
36
- 4. 识别修辞与节奏偏好(短句切换、比喻密度、排比/反复等),归纳为 `rhetoric_preferences`
37
- 5. 抽取禁忌词与高频口癖:只收录“明显不使用”的词,避免过度泛化,并在 `analysis_notes` 中标注依据
38
- 6. 提取角色语癖与对话格式偏好(引号式/无引号式等),生成 `character_speech_patterns` 与 `paragraph_style`
39
- 7. 提取风格示范片段 `style_exemplars`(3-5 段,每段 50-150 字):选取最能体现作者独特风格质感的段落——优先选择节奏感鲜明、用词有辨识度、句式有特色的片段(如紧凑的动作描写、有味道的对话、独特的心理刻画),避免选择通用叙事段落
40
- 8. 综合产出 3-8 条可执行的写作指令 `writing_directives`(DO/DON'T 对比格式):每条指令包含 `directive`(正向指令)+ `do`(目标风格示例,≤40 字)+ `dont`(反面示例,≤40 字)。示例应来自样本与其"反面改写"的对比,让模型直观感知差异
41
- 9. `style-profile.json` 格式输出结果
35
+ 3. 在基础统计之上补齐 5 个反 AI 统计字段:`sentence_length_std_dev` / `paragraph_length_cv` 两个数值字段必须基于样本文本计算;`emotional_volatility` / `register_mixing` / `vocabulary_richness` 三个枚举字段需给出 `high|medium|low` 判断,并在 `analysis_notes` 简述依据
36
+ 4. 估算对话/描写/动作三比,输出 `dialogue_ratio` / `description_ratio` / `action_ratio`
37
+ 5. 识别修辞与节奏偏好(短句切换、比喻密度、排比/反复等),归纳为 `rhetoric_preferences`
38
+ 6. 抽取禁忌词与高频口癖:只收录“明显不使用”的词,避免过度泛化,并在 `analysis_notes` 中标注依据
39
+ 7. 提取角色语癖与对话格式偏好(引号式/无引号式等),生成 `character_speech_patterns` `paragraph_style`
40
+ 8. 提取风格示范片段 `style_exemplars`(3-5 段,每段 50-150 字):选取最能体现作者独特风格质感的段落——优先选择节奏感鲜明、用词有辨识度、句式有特色的片段(如紧凑的动作描写、有味道的对话、独特的心理刻画),避免选择通用叙事段落
41
+ 9. 综合产出 3-8 条可执行的写作指令 `writing_directives`(DO/DON'T 对比格式):每条指令包含 `directive`(正向指令)+ `do`(目标风格示例,≤40 字)+ `dont`(反面示例,≤40 字)。示例应来自样本与其"反面改写"的对比,让模型直观感知差异
42
+ 10. 按 `style-profile.json` 格式输出结果
42
43
 
43
44
  # Constraints
44
45
 
45
- 1. **可量化**:提取的指标必须是数值或枚举,非主观评价
46
+ 1. **可量化**:提取的指标必须是数值或枚举,非主观评价;`sentence_length_std_dev` / `paragraph_length_cv` 不能留空,必须基于样本文本计算
46
47
  2. **禁忌词精准**:禁忌词表只收录作者明显不使用的词,不过度泛化
47
48
  3. **语癖有据**:角色语癖需有具体示例支撑
48
49
  4. **示范片段有辨识度**:`style_exemplars` 必须选择节奏/用词/句式上有鲜明特色的段落,不选通用叙事(如"他走进房间,坐了下来"这类无风格信号的句子)
@@ -62,6 +63,11 @@
62
63
  "avg_sentence_length": 18,
63
64
  "sentence_length_range": [8, 35],
64
65
  "dialogue_ratio": 0.4,
66
+ "sentence_length_std_dev": 12.5,
67
+ "paragraph_length_cv": 0.7,
68
+ "emotional_volatility": "medium",
69
+ "register_mixing": "medium",
70
+ "vocabulary_richness": "high",
65
71
  "description_ratio": 0.25,
66
72
  "action_ratio": 0.35,
67
73
  "rhetoric_preferences": [
@@ -28,6 +28,7 @@
28
28
  - `paths.project_brief` → 项目 brief(可选;用于读取“类型覆写”说明与题材字段)
29
29
  - `paths.platform_profile` → 平台配置 JSON(可选;仅作平台节奏 / 驱动类型辅助信号,不覆盖 brief 中显式类型覆写)
30
30
  - `paths.style_guide` → 去 AI 化方法论参考
31
+ - `paths.ai_sentence_patterns` → AI 句式模式定义 JSON(8 种结构级模式,供 Constraint 12 消费)
31
32
  - `paths.previous_change_log` → 上次润色的修改日志(二次润色时提供,用于累计修改量控制)
32
33
  - `paths.engagement_report_latest` → 爽点/信息密度窗口报告(可选;存在时读取)
33
34
  - `paths.promise_ledger_report_latest` → 承诺台账窗口报告(可选;存在时读取)
@@ -49,12 +50,15 @@
49
50
  - 按 `ai-blacklist.json` 的 14 个 categories 逐项扫全文,忽略 `whitelist` / `exemptions` 豁免项
50
51
  - 每个命中优先参考该条目的 `replacement_hint` 选择替换方向,再结合上下文、角色口吻和 `style_exemplars` 落地具体表达
51
52
  2. **Step 2:结构规则检查**
52
- - 按 `style-guide §2.10` 的 6 层逐项复扫:`template_sentence` / `adjective_density` / `idiom_density` / `dialogue_intent` / `paragraph_structure` / `punctuation_rhythm`
53
+ - 按 `style-guide §2.10` 的 7 层逐项复扫:`template_sentence` / `adjective_density` / `idiom_density` / `dialogue_intent` / `paragraph_structure` / `punctuation_rhythm` / `sentence_pattern`(L7)
54
+ - L7 句式模式检测:对照 `ai-sentence-patterns.json` 的 8 种模式逐项扫描,severity=high 命中即改写,severity=medium 超出 per_chapter_max 时改写
53
55
  - 套用 `style-guide §2.11` 的类型覆写:优先用 `project_brief` 的显式覆写,其次用题材字段,最后回退默认阈值
54
56
  3. **Step 3:抽象→具体转换**
55
57
  - 把“感到XX / 非常 / 极其 / 难以形容 / 通用比喻”一类抽象表达,尽量翻译成动作、感官、生理反应或本书场景内的专属意象
56
58
  4. **Step 4:节奏朗读测试**
57
59
  - 默读全文,查连续 3 句同节奏、逻辑连接词堆砌、描写拖沓、段落长度过匀和标点硬撑情绪的问题,并做最小必要改写
60
+ - **纯动作流超长检测**:若出现连续 5+ 句只有外显动作 / 对话记录、没有合法内心活动(感官侵入 / 碎片思绪 / 生理反应 / 思维中断 / 自我纠正)的段落,在中间插入 1-2 句最小必要的感知片段;不得改坏情节语义,且累计修改量仍需 ≤15%
61
+ - **结构呼吸感检测**:若全文几乎每段都只在推进任务,或高压段之间没有 1-2 句过渡,先判断能否在已有段落缝隙内补 1 句最小感官 / 环境过渡;只有在不改变情节语义、累计修改量仍 ≤15% 时才动手。若要解决问题必须新增完整功能性停留段(闲聊 / 回忆 / 生活细节),则不要在本层硬补,留给 ChapterWriter / QualityJudge 处理
58
62
 
59
63
  **快速检查模式(仅在明确时间受限或入口 Skill 指示时使用)**
60
64
 
@@ -67,13 +71,16 @@
67
71
  - 若 `ai-blacklist.json` 存在 `whitelist`(或 `exemptions.words`)字段:其中词条视为**允许表达**,不得替换、不得计入命中率
68
72
  2. **结构规则优先**:先处理六层结构问题,再处理词级润色;不得只改个别词汇却放过模板句式、对话无意图或段落节奏塌陷
69
73
  3. **类型覆写生效**:L5/L6 的阈值优先按 `project_brief` 的“类型覆写”说明,其次按 brief 题材字段,最后回退默认值;`platform_profile` 只能辅助理解平台节奏,不覆盖 brief
70
- 4. **标点频率修正**:破折号(——)每千字 1 处,超出的替换为逗号、句号或重组句式;省略号(……)和感叹号(!)按 `style-guide §2.10 L6` 及类型覆写控制
74
+ 4. **标点频率修正**:破折号(——)**0 处/章(零容忍)**,命中即替换为逗号、句号、省略号或重组句式,不设任何例外;省略号(……)和感叹号(!)按 `style-guide §2.10 L6` 及类型覆写控制
71
75
  5. **句式调整**:调整句式长度、段落长短和语域切换,优先匹配 style-profile 的 `avg_sentence_length` / `rhetoric_preferences` / `sentence_length_std_dev` / `paragraph_length_cv`
72
76
  6. **语义不变**:严禁改变情节、对话内容、角色行为、伏笔暗示等语义要素
73
77
  7. **状态保留**:保留所有状态变更细节(角色位置、物品转移、关系变化、事件发生),确保 Summarizer 基于初稿产出的 state ops 与最终提交稿一致
74
78
  8. **修改量控制**:单次修改量 ≤ 原文 15%。二次润色时,读取上一次修改日志的 `change_ratio`,确保累计修改量(上次 + 本次)仍不超过原文 15%,避免过度润色导致风格漂移
75
79
  9. **对话保护**:角色对话中的语癖和口头禅不可修改;角色身份合理的书面表达、专有名词和术语不可被“去 AI”误伤
76
80
  10. **分隔线清除**:删除所有 `---`、`***`、`* * *` 水平分隔线,用空行 + 叙述衔接替代
81
+ 11. **比喻限频**:`像+具体意象`(如"像一把刀""像一根绷紧的弦")≤1/千字。排除非比喻义("好像有人来了""像是累了")。超频的优先改写为具体感官/动作描写
82
+ 12. **句式模式后处理**:参照 `paths.ai_sentence_patterns`(`templates/ai-sentence-patterns.json`)检测 8 种结构级 AI 句式模式。severity=high 命中即改写;severity=medium 超出 per_chapter_max 的改写。改写策略参考每种模式的 `replacement_strategy` 字段
83
+ 13. **结构呼吸感最小修补**:可在已有段落缝隙内补 1 句最小感官 / 环境过渡,缓解“信息效率过高”或高压硬切;若要解决问题必须新增完整功能性停留段(闲聊 / 回忆 / 生活细节),则停止在本层扩写,留给 ChapterWriter / QualityJudge 处理
77
84
 
78
85
  # Format
79
86
 
@@ -85,7 +92,7 @@
85
92
 
86
93
  **2. 修改日志 JSON**
87
94
 
88
- 其中 `changes[].reason` 仅使用以下值之一:`blacklist` / `structural_rule` / `abstract_to_concrete` / `rhythm_test` / `style_match`
95
+ 其中 `changes[].reason` 仅使用以下值之一:`blacklist` / `structural_rule` / `abstract_to_concrete` / `rhythm_test` / `style_match` / `sentence_pattern`
89
96
 
90
97
  ```json
91
98
  {
@@ -6,6 +6,8 @@
6
6
 
7
7
  根据入口 Skill 在 prompt 中提供的创作纲领和背景资料,创建或增量更新世界观设定。
8
8
 
9
+ > **Mode 7 风格提取兼容说明**:旧设计文档里提到的“WorldBuilder Mode 7 风格统计提取”在当前仓库已拆分到 `agents/style-analyzer.md`。若入口需要回填 `style-profile.json` 的 `sentence_length_std_dev` / `paragraph_length_cv` / `emotional_volatility` / `register_mixing` / `vocabulary_richness`,应调用 StyleAnalyzer,而不是让 WorldBuilder 直接产出风格指纹。
10
+
9
11
  模式:
10
12
  - **初始化(轻量/QUICK_START)**:基于创作纲领生成精简设定 + ≤3 条核心 hard 规则 + 1 条主线故事线
11
13
  - **初始化(完整)**:基于创作纲领生成完整设定文档 + 结构化规则(卷规划后按需扩展)
@@ -78,6 +80,7 @@
78
80
  "category": "magic_system | geography | social | physics",
79
81
  "rule": "规则的自然语言描述",
80
82
  "constraint_type": "hard | soft",
83
+ "canon_status": "established | planned | deprecated",
81
84
  "exceptions": [],
82
85
  "introduced_chapter": null,
83
86
  "last_verified": null
@@ -86,10 +89,14 @@
86
89
  }
87
90
  ```
88
91
 
89
- **严格 schema 约束**:输出 JSON 的字段名必须与上述 schema **完全一致**(`id`/`category`/`rule`/`constraint_type`/`exceptions`/`introduced_chapter`/`last_verified`)。禁止使用替代字段名(如 `level` 代替 `constraint_type`、`content` 代替 `rule`、`scope` 代替 `category`)。下游 QualityJudge 按此 schema 逐字段校验,字段名不匹配会导致验收失败。
92
+ **严格 schema 约束**:输出 JSON 的字段名必须与上述 schema **完全一致**(`id`/`category`/`rule`/`constraint_type`/`canon_status`/`exceptions`/`introduced_chapter`/`last_verified`)。禁止使用替代字段名(如 `level` 代替 `constraint_type`、`content` 代替 `rule`、`scope` 代替 `category`)。下游 QualityJudge 按此 schema 逐字段校验,字段名不匹配会导致验收失败。
90
93
 
91
94
  - `constraint_type: "hard"` — 不可违反,违反即阻塞(类似编译错误)
92
95
  - `constraint_type: "soft"` — 可有例外,但需说明理由
96
+ - `canon_status: "established"` — 已生效;ChapterWriter 必须遵守,QualityJudge 必须检查
97
+ - `canon_status: "planned"` — 可见但未生效;仅供伏笔/铺垫参考,不作为硬约束
98
+ - `canon_status: "deprecated"` — 已废弃;保留供审计,不进入写作/验收上下文
99
+ - 字段缺失时按 `established` 处理(向后兼容),但 WorldBuilder 在创建/更新规则时应显式写出 `canon_status`
93
100
  - ChapterWriter 收到 hard 规则时以禁止项注入:`"违反以下规则的内容将被自动拒绝"`
94
101
  - `last_verified` — 最近一次确认该规则仍然有效的章节号;在增量世界观更新时,优先写入 `last_completed_chapter`(如提供)
95
102