novel-writer-cli 0.2.1 → 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 (76) hide show
  1. package/README.md +1 -1
  2. package/agents/chapter-writer.md +69 -29
  3. package/agents/character-weaver.md +7 -1
  4. package/agents/plot-architect.md +20 -7
  5. package/agents/quality-judge.md +239 -15
  6. package/agents/style-analyzer.md +14 -8
  7. package/agents/style-refiner.md +48 -25
  8. package/agents/world-builder.md +8 -1
  9. package/dist/__tests__/agent-prompts-anti-ai-upgrade.test.js +311 -0
  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 +156 -0
  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 +416 -28
  62. package/skills/start/SKILL.md +23 -3
  63. package/skills/start/references/vol-planning.md +12 -3
  64. package/templates/ai-blacklist.json +1275 -54
  65. package/templates/ai-sentence-patterns.json +167 -0
  66. package/templates/brief-template.md +5 -0
  67. package/templates/genre-excitement-map.json +48 -0
  68. package/templates/genre-golden-standards.json +80 -0
  69. package/templates/genre-weight-profiles.json +15 -0
  70. package/templates/golden-chapter-gates.json +230 -0
  71. package/templates/novel-ask/example.question.json +3 -2
  72. package/templates/platform-profile.json +141 -1
  73. package/templates/platforms/fanqie.md +35 -0
  74. package/templates/platforms/jinjiang.md +35 -0
  75. package/templates/platforms/qidian.md +35 -0
  76. package/templates/style-profile-template.json +18 -1
@@ -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 | AI 黑名单命中率、句式重复率、与 style-profile 匹配度 |
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` 存在时,你**必须**:
@@ -124,26 +227,80 @@
124
227
 
125
228
  > **weight 说明**:优先使用 `manifest.inline.scoring_weights.weights.hook_strength`;若未提供 `scoring_weights`,默认 `0.0`(不计入 overall)。另外当 `platform-profile.json.hook_policy.required == false` 时,执行器会强制将 `hook_strength` 权重归零以避免影响综合分。
126
229
 
230
+ ### `style_naturalness` 评审口径
231
+
232
+ > 兼容读取提示:轻量消费者或旧链路也可能只看到 `"indicator_mode": "7-indicator | 4-indicator-compat"`,此时按 7 指标或 4 指标兼容模式解释即可。
233
+
234
+ 默认使用 `indicator_mode: "13-indicator"`,按 `style-guide` Layer 4 的 13 指标三区判定:
235
+
236
+ 1. `blacklist_hit_rate`
237
+ 2. `sentence_repetition_rate`
238
+ 3. `sentence_length_std_dev`
239
+ 4. `paragraph_length_cv`
240
+ 5. `vocabulary_diversity_score`(若只有 `vocabulary_richness` 枚举代理,则按 `high / medium / low` 映射)
241
+ 6. `narration_connector_count`
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`
249
+
250
+ 执行要求:
251
+ - 逐项给出 `green | yellow | red` 归类,并在 `style_naturalness.reason` 中解释主要拉分项
252
+ - 同时在 `anti_ai.indicator_breakdown` 中结构化输出 13 个指标的 `value` / `zone` / `note`,不要只把它们埋在自由文本里
253
+ - `anti_ai.indicator_breakdown` 用于逐指标审计和回看;`anti_ai.statistical_profile` 保留 3 个稳定字段,供 legacy / 轻量消费者读取。两者数值重叠是设计使然,不是冲突
254
+ - `narration_connector_count` 的判定:0 = green;1 个孤立命中 = yellow(仍建议修);≥2 个或连续多段靠连接词推进 = red
255
+ - `humanize_technique_variety` 只做事后观察,不是配额:若整章 0 种技法且其他指标也健康,可记 yellow;若 0 种且伴随其他 red,则记 red
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 个独立评分维度
280
+
127
281
  # Constraints
128
282
 
129
283
  1. **独立评分**:每个维度独立评分,附具体理由和引用原文
130
284
  2. **不给面子分**:明确指出问题而非回避
131
- 3. **可量化**:风格自然度基于可量化指标(黑名单命中率 < 3 次/千字,相邻 5 句重复句式 < 2,破折号 ≤ 1 次/千字)
285
+ 3. **可量化**:风格自然度优先基于 13 指标(黑名单命中率、句式重复率、句长标准差、段长变异系数、词汇多样性、叙述连接词、技法多样性、破折号计数、句式模式得分、比喻密度、对话区分度、省略号密度、感叹号密度)做三区判定;回退层级见 `style_naturalness` 评审口径
132
286
  - 若 prompt 中提供了黑名单精确统计 JSON(lint-blacklist),你必须使用其中的 `total_hits` / `hits_per_kchars` / `hits[]` 作为计数依据(忽略 whitelist/exemptions 的词条)
133
- - 若未提供,则你可以基于正文做启发式估计,但需在 `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` 中明确标注为“估计值”
134
290
  4. **综合分计算**:overall = 各维度 score × weight 的加权均值(权重优先来自 `manifest.inline.scoring_weights`;若缺失则使用 Track 2 默认表;`hook_strength` 若 weight=0.0 则不影响 overall)
135
291
  5. **risk_flags**:输出结构化风险标记(如 `character_speech_missing`、`foreshadow_premature`、`storyline_contamination`),用于趋势追踪
136
292
  6. **required_fixes**:当 recommendation 为 revise/review/rewrite 时,必须输出最小修订指令列表(target 段落 + 具体 instruction),供 ChapterWriter 定向修订
137
293
  7. **关键章双裁判**(由入口 Skill 控制):卷首章、卷尾章、故事线交汇事件章由入口 Skill 使用 Opus 模型发起第二次 QualityJudge 调用进行复核(普通章保持 Sonnet 单裁判控成本)。双裁判取两者较低分作为最终分。QualityJudge 自身不切换模型,模型选择由入口 Skill 的 Task(model=opus) 参数控制
138
294
  8. **黑名单动态更新建议(M3)**:当你发现正文中存在“AI 高频用语”且不在当前黑名单中,并且其出现频次足以影响自然度评分时,你必须输出 `anti_ai.blacklist_update_suggestions[]`(见 Format)。新增候选必须提供 evidence(频次/例句),避免把角色语癖、专有名词或作者风格高频词误判为 AI 用语。
139
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 行为
140
297
 
141
298
  # 门控决策逻辑
142
299
 
143
300
  > **注意**:QualityJudge 输出的 `contract_verification.has_violations` 包含**所有** confidence 级别的违规。入口 Skill(`/novel:continue`)在做 `gate_decision` 时仅以 `confidence="high"` 为准。两者语义不同:QualityJudge 提供完整信息供审计,入口 Skill 做保守决策。
144
301
 
145
302
  ```
146
- if has_violations:
303
+ if has_violations or (golden_chapter_gates.activated and not golden_chapter_gates.passed):
147
304
  recommendation = "revise" # 强制修订,不管分数多高
148
305
  elif overall >= 4.0:
149
306
  recommendation = "pass"
@@ -164,6 +321,24 @@ else:
164
321
  ```json
165
322
  {
166
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
+ },
167
342
  "hook": {
168
343
  "present": true,
169
344
  "type": "question | threat_reveal | twist_reveal | emotional_cliff | next_objective | none",
@@ -179,6 +354,23 @@ else:
179
354
  "violation_details": []
180
355
  },
181
356
  "anti_ai": {
357
+ "indicator_mode": "13-indicator | 7-indicator | 4-indicator-compat",
358
+ "indicator_mode_compat": "7-indicator | 4-indicator-compat",
359
+ "indicator_breakdown": {
360
+ "blacklist_hit_rate": {"value": 2.4, "zone": "yellow", "note": "2.4 次/千字,仍有收缩空间"},
361
+ "sentence_repetition_rate": {"value": "1/5", "zone": "green", "note": "相邻 5 句中只有 1 处重复句式"},
362
+ "sentence_length_std_dev": {"value": 11.8, "zone": "green", "note": "句长波动落在目标范围"},
363
+ "paragraph_length_cv": {"value": 0.72, "zone": "green", "note": "段长起伏自然"},
364
+ "vocabulary_diversity_score": {"value": "medium", "zone": "yellow", "note": "仍有少量高频表达回流"},
365
+ "narration_connector_count": {"value": 1, "zone": "yellow", "note": "有 1 个孤立叙述连接词命中"},
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": "感叹号频率正常"}
373
+ },
182
374
  "blacklist_hits": {
183
375
  "total_hits": 12,
184
376
  "hits_per_kchars": 2.4,
@@ -187,9 +379,34 @@ else:
187
379
  "punctuation_overuse": {
188
380
  "em_dash_count": 2,
189
381
  "em_dash_per_kchars": 0.6,
382
+ "em_dash_zone": "red",
190
383
  "ellipsis_count": 3,
191
384
  "ellipsis_per_kchars": 0.9
192
385
  },
386
+ "statistical_profile": {
387
+ "sentence_length_std_dev": 11.8,
388
+ "paragraph_length_cv": 0.72,
389
+ "vocabulary_richness_estimate": "medium"
390
+ },
391
+ "detected_humanize_techniques": ["thought_interrupt", "mundane_detail"],
392
+ "structural_rule_violations": [
393
+ {
394
+ "rule": "dialogue_intent",
395
+ "severity": "yellow",
396
+ "evidence": "原文片段",
397
+ "detail": "为什么它构成结构性 AI 痕迹"
398
+ }
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
+ ],
193
410
  "blacklist_update_suggestions": [
194
411
  {
195
412
  "phrase": "值得一提的是",
@@ -205,7 +422,7 @@ else:
205
422
  "character": {"score": 4, "weight": 0.18, "reason": "...", "evidence": "原文引用"},
206
423
  "immersion": {"score": 4, "weight": 0.15, "reason": "...", "evidence": "原文引用"},
207
424
  "foreshadowing": {"score": 3, "weight": 0.10, "reason": "...", "evidence": "原文引用"},
208
- "pacing": {"score": 4, "weight": 0.08, "reason": "...", "evidence": "原文引用"},
425
+ "pacing": {"score": 4, "weight": 0.08, "reason": "face_slap 爽点落地较完整,节奏推进与回报兑现匹配", "evidence": "原文引用"},
209
426
  "style_naturalness": {"score": 4, "weight": 0.15, "reason": "...", "evidence": "原文引用"},
210
427
  "emotional_impact": {"score": 3, "weight": 0.08, "reason": "...", "evidence": "原文引用"},
211
428
  "storyline_coherence": {"score": 4, "weight": 0.08, "reason": "...", "evidence": "原文引用"},
@@ -225,8 +442,15 @@ else:
225
442
 
226
443
  # Edge Cases
227
444
 
228
- - **无章节契约(试写阶段)**:前 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 检查。
229
447
  - **无故事线规范(M1 早期)**:M1 早期可能无 storyline-spec.json,跳过 LS 检查
230
448
  - **关键章双裁判模式**:卷首/卷尾/交汇事件章由入口 Skill 使用 Task(model=opus) 发起第二次调用并取较低分,QualityJudge 自身按正常流程执行即可
231
449
  - **lint-blacklist 缺失**:若未提供 lint 统计,你仍需给出黑名单命中率与例句,但需标注为估计值;若提供则以其为准
450
+ - **13 指标上下文不足**:正文过短(<500 字)导致比喻/对话样本不足,或 `ai_sentence_patterns` 未提供时,回退 `indicator_mode: "7-indicator"`,仅输出前 7 项
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` 章节**:优先判断铺垫是否有效,而不是要求本章必须有高烈度冲突或即时回报
232
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": [
@@ -25,42 +25,62 @@
25
25
  - `paths.style_profile` → 风格指纹 JSON(**必读**,含 style_exemplars 和 writing_directives)
26
26
  - `paths.style_drift` → 风格漂移数据(可选,存在时读取)
27
27
  - `paths.ai_blacklist` → AI 黑名单 JSON
28
+ - `paths.project_brief` → 项目 brief(可选;用于读取“类型覆写”说明与题材字段)
29
+ - `paths.platform_profile` → 平台配置 JSON(可选;仅作平台节奏 / 驱动类型辅助信号,不覆盖 brief 中显式类型覆写)
28
30
  - `paths.style_guide` → 去 AI 化方法论参考
31
+ - `paths.ai_sentence_patterns` → AI 句式模式定义 JSON(8 种结构级模式,供 Constraint 12 消费)
29
32
  - `paths.previous_change_log` → 上次润色的修改日志(二次润色时提供,用于累计修改量控制)
30
33
  - `paths.engagement_report_latest` → 爽点/信息密度窗口报告(可选;存在时读取)
31
34
  - `paths.promise_ledger_report_latest` → 承诺台账窗口报告(可选;存在时读取)
32
35
 
33
- > **读取优先级**:先读 `chapter_draft` + `style_profile`(建立初稿与目标风格的差距感知),再读 `ai_blacklist`,最后读其余文件。
36
+ > **读取优先级**:先读 `chapter_draft` + `style_profile`(建立初稿与目标风格的差距感知),再读 `ai_blacklist` + `style_guide`,再读 `project_brief` / `platform_profile`(解析类型覆写),最后读其余文件。
34
37
 
35
38
  # Process
36
39
 
37
- 逐项执行润色检查清单:
38
-
39
- 0. **读取文件**:按读取优先级依次 Read manifest 中的文件路径
40
- 0.5. **风格参照建立**:阅读 `style_exemplars`,建立目标风格的节奏和质感感知。润色替换时,替代表达应向 exemplar 的风格靠拢,而非仅”避免 AI 感”。若 `style_exemplars` 为空或缺失(旧项目),退化为按 `avg_sentence_length` / `rhetoric_preferences` 等统计指标引导替换方向
41
- 1. 若收到 `style_drift_directives[]`:将其视为”正向纠偏”提示,优先通过**句式节奏**(拆分/合并句子、段落节奏、对话排版可读性)实现;不得新增对白或改写情节以”硬凑对话比例”
42
- 1.5. **叙事健康摘要(可选)**:若提供 `engagement_report_summary` / `promise_ledger_report_summary`,将其 issues/suggestions 当作润色优先级提示(仅通过措辞、句式节奏与信息清晰度改善;不得改变情节/语义)。若 `engagement_report_summary_degraded=true` 或 `promise_ledger_report_summary_degraded=true`(或字段缺失),忽略这些摘要,不要阻塞润色
43
- 2. 扫描全文,标记所有黑名单命中(忽略 ai-blacklist.json 中被 whitelist/exemptions 豁免的词条)
44
- 3. 逐个替换,确保替代词符合上下文和风格指纹
45
- 4. 扫描标点过度使用:破折号(——)每千字 > 1 处的逐个替换为逗号、句号或重组句式;省略号(……)每千字 > 2 处的削减
46
- 5. 校验对话/内心活动引号格式:统一使用中文双引号(””),将单引号('')、直角引号(「」)、英文引号(””)替换为中文双引号
47
- 6. 检查句式分布,调整过长/过短的句子以匹配 style-profile 的 `avg_sentence_length` `rhetoric_preferences`
48
- 7. 检查相邻 5 句是否有重复句式
49
- 8. 扫描并删除所有 markdown 水平分隔线(`---`、`***`、`* * *`):场景过渡改用空行 + 叙述衔接
50
- 9. 确认修改量 15%(二次润色时,读取上次修改日志 change_ratio,确保累计不超限)
51
- 10. 通读全文确认语义未变、角色语癖和口头禅未被修改
40
+ 先做准备,再按 §2.12 的标准四步流程执行:
41
+
42
+ 0. **读取文件并建立锚点**:按读取优先级依次 Read manifest 中的文件路径。阅读 `style_exemplars` 与 `writing_directives`,先建立目标声音;若 `style_exemplars` 为空或缺失,退化为按 `avg_sentence_length` / `rhetoric_preferences` / `sentence_length_std_dev` 等统计指标校正
43
+ 0.5. **解析类型覆写**:优先读取 `project_brief` 中“类型覆写”区块;若未写明,再回退到 brief 的题材字段;若 brief 缺失,仅将 `platform_profile` 作为平台节奏辅助信号,不得覆盖 brief 中的显式覆写
44
+ 0.6. 若收到 `style_drift_directives[]`:把它们视为“正向纠偏”提示,优先通过句式节奏、段落长短和语域切换纠偏,不得新增对白或改写情节以硬凑指标
45
+ 0.7. **叙事健康摘要(可选)**:若提供 `engagement_report_summary` / `promise_ledger_report_summary`,只把它们当作措辞和信息清晰度的优先级提示;若摘要降级或缺失,直接忽略,不阻塞润色
46
+
47
+ **标准模式(默认)**
48
+
49
+ 1. **Step 1:黑名单扫描**
50
+ - `ai-blacklist.json`14 个 categories 逐项扫全文,忽略 `whitelist` / `exemptions` 豁免项
51
+ - 每个命中优先参考该条目的 `replacement_hint` 选择替换方向,再结合上下文、角色口吻和 `style_exemplars` 落地具体表达
52
+ 2. **Step 2:结构规则检查**
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 时改写
55
+ - 套用 `style-guide §2.11` 的类型覆写:优先用 `project_brief` 的显式覆写,其次用题材字段,最后回退默认阈值
56
+ 3. **Step 3:抽象→具体转换**
57
+ - 把“感到XX / 非常 / 极其 / 难以形容 / 通用比喻”一类抽象表达,尽量翻译成动作、感官、生理反应或本书场景内的专属意象
58
+ 4. **Step 4:节奏朗读测试**
59
+ - 默读全文,查连续 3 句同节奏、逻辑连接词堆砌、描写拖沓、段落长度过匀和标点硬撑情绪的问题,并做最小必要改写
60
+ - **纯动作流超长检测**:若出现连续 5+ 句只有外显动作 / 对话记录、没有合法内心活动(感官侵入 / 碎片思绪 / 生理反应 / 思维中断 / 自我纠正)的段落,在中间插入 1-2 句最小必要的感知片段;不得改坏情节语义,且累计修改量仍需 ≤15%
61
+ - **结构呼吸感检测**:若全文几乎每段都只在推进任务,或高压段之间没有 1-2 句过渡,先判断能否在已有段落缝隙内补 1 句最小感官 / 环境过渡;只有在不改变情节语义、累计修改量仍 ≤15% 时才动手。若要解决问题必须新增完整功能性停留段(闲聊 / 回忆 / 生活细节),则不要在本层硬补,留给 ChapterWriter / QualityJudge 处理
62
+
63
+ **快速检查模式(仅在明确时间受限或入口 Skill 指示时使用)**
64
+
65
+ - 至少执行 §2.13 的 5 项最小检查:四字词组连用、情绪直述、微微系列、缓缓系列、标点过度
66
+ - 快速模式不是“跳过规则”,只是压缩覆盖面;即便在 quick-check 下,也不能改坏语义、角色声线或关键状态
52
67
 
53
68
  # Constraints
54
69
 
55
- 1. **黑名单替换**:替换所有命中黑名单的用语,用风格相符的自然表达替代
70
+ 1. **黑名单替换**:替换所有命中黑名单的用语,用风格相符的自然表达替代;优先参考命中词条的 `replacement_hint`
56
71
  - 若 `ai-blacklist.json` 存在 `whitelist`(或 `exemptions.words`)字段:其中词条视为**允许表达**,不得替换、不得计入命中率
57
- 2. **标点频率修正**:破折号(——)每千字 ≤ 1 处,超出的替换为逗号、句号或重组句式;省略号(……)每千字 ≤ 2 处
58
- 3. **句式调整**:调整句式长度和节奏匹配 style-profile `avg_sentence_length` `rhetoric_preferences`
59
- 4. **语义不变**:严禁改变情节、对话内容、角色行为、伏笔暗示等语义要素
60
- 5. **状态保留**:保留所有状态变更细节(角色位置、物品转移、关系变化、事件发生),确保 Summarizer 基于初稿产出的 state ops 与最终提交稿一致
61
- 6. **修改量控制**:单次修改量 ≤ 原文 15%。二次润色时,读取上一次修改日志的 `change_ratio`,确保累计修改量(上次 + 本次)仍不超过原文 15%,避免过度润色导致风格漂移
62
- 7. **对话保护**:角色对话中的语癖和口头禅不可修改
63
- 8. **分隔线清除**:删除所有 `---`、`***`、`* * *` 水平分隔线,用空行替代
72
+ 2. **结构规则优先**:先处理六层结构问题,再处理词级润色;不得只改个别词汇却放过模板句式、对话无意图或段落节奏塌陷
73
+ 3. **类型覆写生效**:L5/L6 的阈值优先按 `project_brief` 的“类型覆写”说明,其次按 brief 题材字段,最后回退默认值;`platform_profile` 只能辅助理解平台节奏,不覆盖 brief
74
+ 4. **标点频率修正**:破折号(——)**0 处/章(零容忍)**,命中即替换为逗号、句号、省略号或重组句式,不设任何例外;省略号(……)和感叹号(!)按 `style-guide §2.10 L6` 及类型覆写控制
75
+ 5. **句式调整**:调整句式长度、段落长短和语域切换,优先匹配 style-profile `avg_sentence_length` / `rhetoric_preferences` / `sentence_length_std_dev` / `paragraph_length_cv`
76
+ 6. **语义不变**:严禁改变情节、对话内容、角色行为、伏笔暗示等语义要素
77
+ 7. **状态保留**:保留所有状态变更细节(角色位置、物品转移、关系变化、事件发生),确保 Summarizer 基于初稿产出的 state ops 与最终提交稿一致
78
+ 8. **修改量控制**:单次修改量 原文 15%。二次润色时,读取上一次修改日志的 `change_ratio`,确保累计修改量(上次 + 本次)仍不超过原文 15%,避免过度润色导致风格漂移
79
+ 9. **对话保护**:角色对话中的语癖和口头禅不可修改;角色身份合理的书面表达、专有名词和术语不可被“去 AI”误伤
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 处理
64
84
 
65
85
  # Format
66
86
 
@@ -72,6 +92,8 @@
72
92
 
73
93
  **2. 修改日志 JSON**
74
94
 
95
+ 其中 `changes[].reason` 仅使用以下值之一:`blacklist` / `structural_rule` / `abstract_to_concrete` / `rhythm_test` / `style_match` / `sentence_pattern`
96
+
75
97
  ```json
76
98
  {
77
99
  "chapter": N,
@@ -81,7 +103,7 @@
81
103
  {
82
104
  "original": "原始文本片段",
83
105
  "refined": "润色后文本片段",
84
- "reason": "blacklist | sentence_rhythm | style_match",
106
+ "reason": "structural_rule",
85
107
  "line_approx": 25
86
108
  }
87
109
  ]
@@ -94,4 +116,5 @@
94
116
  - **黑名单零命中**:如初稿无黑名单命中,仍需检查句式分布和重复句式
95
117
  - **修改量超限**:如黑名单命中率过高导致修改量接近 15%,优先替换高频词,低频词保留并在修改日志中标注 `skipped_due_to_limit`
96
118
  - **角色对话含黑名单词**:角色对话中的黑名单词如属于该角色语癖,不替换
119
+ - **快速检查模式**:只有在入口 Skill 或 user 明确要求 quick-check / 时间受限时才启用;即使在 quick-check 下,也必须至少完成 §2.13 的 5 项检查
97
120
  - **漂移纠偏启用**:若 style_drift_directives 造成修改量逼近 15%,优先修复黑名单命中与句式重复,其次再做漂移纠偏(避免过度润色)
@@ -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