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.
- package/README.md +1 -1
- package/agents/chapter-writer.md +43 -14
- package/agents/character-weaver.md +7 -1
- package/agents/plot-architect.md +20 -7
- package/agents/quality-judge.md +199 -20
- package/agents/style-analyzer.md +14 -8
- package/agents/style-refiner.md +10 -3
- package/agents/world-builder.md +8 -1
- package/dist/__tests__/agent-prompts-anti-ai-upgrade.test.js +194 -6
- package/dist/__tests__/agent-prompts-platform-expansion.test.js +33 -0
- package/dist/__tests__/anti-ai-infrastructure.test.js +548 -0
- package/dist/__tests__/anti-ai-templates.test.js +2 -2
- package/dist/__tests__/canon-status-lifecycle.test.js +481 -0
- package/dist/__tests__/commit-gate-decision.test.js +65 -0
- package/dist/__tests__/commit-prototype-pollution.test.js +1 -1
- package/dist/__tests__/excitement-type-annotation.test.js +240 -0
- package/dist/__tests__/excitement-type.test.js +21 -0
- package/dist/__tests__/gate-decision.test.js +62 -15
- package/dist/__tests__/genre-excitement-mapping.test.js +355 -0
- package/dist/__tests__/golden-chapter-gates.test.js +79 -0
- package/dist/__tests__/golden-chapter-mini-planning.test.js +485 -0
- package/dist/__tests__/helpers/quickstart-mini-planning.js +61 -0
- package/dist/__tests__/init.test.js +57 -5
- package/dist/__tests__/instructions-platform-expansion.test.js +125 -0
- package/dist/__tests__/next-step-gate-decision-routing.test.js +98 -0
- package/dist/__tests__/orchestrator-state-write-path.test.js +1 -1
- package/dist/__tests__/platform-profile.test.js +57 -1
- package/dist/__tests__/quickstart-pipeline.test.js +73 -6
- package/dist/__tests__/scoring-weights.test.js +193 -0
- package/dist/__tests__/steps-id.test.js +2 -0
- package/dist/__tests__/validate-quickstart-prereqs.test.js +2 -0
- package/dist/advance.js +27 -2
- package/dist/anti-ai-context.js +535 -0
- package/dist/cli.js +3 -1
- package/dist/commit.js +22 -0
- package/dist/excitement-type.js +12 -0
- package/dist/gate-decision.js +98 -2
- package/dist/golden-chapter-gates.js +143 -0
- package/dist/init.js +76 -7
- package/dist/instructions.js +552 -6
- package/dist/next-step.js +124 -88
- package/dist/platform-profile.js +20 -8
- package/dist/quickstart-mini-planning.js +30 -0
- package/dist/scoring-weights.js +38 -3
- package/dist/steps.js +1 -1
- package/dist/validate.js +293 -214
- package/dist/volume-commit.js +271 -5
- package/dist/volume-planning.js +78 -3
- package/docs/user/README.md +1 -0
- package/docs/user/migration-guide.md +166 -0
- package/docs/user/novel-cli.md +4 -3
- package/docs/user/quick-start.md +354 -57
- package/package.json +1 -1
- package/schemas/platform-profile.schema.json +2 -2
- package/scripts/lint-blacklist.sh +221 -76
- package/scripts/lint-structural.sh +538 -0
- package/skills/continue/SKILL.md +6 -0
- package/skills/continue/references/context-contracts.md +71 -6
- package/skills/continue/references/periodic-maintenance.md +12 -1
- package/skills/novel-writing/references/quality-rubric.md +79 -26
- package/skills/novel-writing/references/style-guide.md +129 -19
- package/skills/start/SKILL.md +23 -3
- package/skills/start/references/vol-planning.md +12 -3
- package/templates/ai-blacklist.json +1024 -246
- package/templates/ai-sentence-patterns.json +167 -0
- package/templates/genre-excitement-map.json +48 -0
- package/templates/genre-golden-standards.json +80 -0
- package/templates/genre-weight-profiles.json +15 -0
- package/templates/golden-chapter-gates.json +230 -0
- package/templates/novel-ask/example.question.json +3 -2
- package/templates/platform-profile.json +141 -1
- package/templates/platforms/fanqie.md +35 -0
- package/templates/platforms/jinjiang.md +35 -0
- package/templates/platforms/qidian.md +35 -0
- package/templates/style-profile-template.json +3 -0
|
@@ -31,13 +31,31 @@ chapter_writer_manifest = {
|
|
|
31
31
|
},
|
|
32
32
|
concurrent_state: {str: str}, # 其他活跃线一句话状态
|
|
33
33
|
transition_hint: obj | null, # 切线过渡
|
|
34
|
-
hard_rules_list: [str], # L1
|
|
34
|
+
hard_rules_list: [str], # L1 禁止项列表(仅 established / 缺失 canon_status 的 hard 规则;即使为空也显式提供)
|
|
35
|
+
world_rules_context_degraded?: bool, # 可选:world/rules.json 存在但 CLI 读取/解析降级;此时 hard_rules_list 可能不完整,应直接读取 paths.world_rules 复核
|
|
36
|
+
planned_rules_info?: [obj], # 可选:planned L1 规则(hard/soft 都保留原 constraint_type,仅供伏笔/铺垫参考,不绑定)
|
|
35
37
|
foreshadowing_tasks: [obj], # 本章伏笔任务子集
|
|
36
38
|
foreshadow_light_touch_tasks?: [ # 可选:伏笔沉默超阈值时的“轻触提醒”(非剧透、不兑现);为空则省略该字段
|
|
37
39
|
{id: str, scope: str, status: str, chapters_since_last_update: int, instruction: str}
|
|
38
40
|
],
|
|
39
41
|
foreshadow_light_touch_degraded?: bool, # 可选:若为 true 表示“轻触提醒”注入降级(如伏笔数据不可读),不等同于“没有需要提醒的条目”
|
|
40
42
|
ai_blacklist_top10: [str], # 有效黑名单前 10 词
|
|
43
|
+
statistical_targets?: { # 可选:6 维统计目标(style-profile → CW 的软约束)
|
|
44
|
+
sentence_length_std_dev: {target: number | null, fallback_range: [number, number], fallback_applied: bool},
|
|
45
|
+
paragraph_length_cv: {target: number | null, fallback_range: [number, number], fallback_applied: bool},
|
|
46
|
+
vocabulary_diversity: {target: "high|medium|low", source_field: "vocabulary_richness", fallback_applied: bool},
|
|
47
|
+
narration_connectors: {target: 0, source_field: "ai-blacklist.category_metadata.narration_connector", fallback_applied: false, note: str},
|
|
48
|
+
register_mixing: {target: "high|medium|low", fallback_applied: bool},
|
|
49
|
+
emotional_arc: {target: "high|medium|low", source_field: "emotional_volatility", fallback_applied: bool},
|
|
50
|
+
},
|
|
51
|
+
genre_overrides?: { # 可选:按 brief 显式覆写说明 / 题材字段派生的结构阈值
|
|
52
|
+
genre: str,
|
|
53
|
+
source: {brief: "brief.md", mode: "brief_override_notes" | "brief_genre_fallback"},
|
|
54
|
+
explicit_notes: str | null,
|
|
55
|
+
paragraph_structure: {single_sentence_ratio: {min: number, max: number}, max_paragraph_chars: number},
|
|
56
|
+
punctuation_rhythm: {ellipsis_max_per_chapter: number, exclamation_max_per_chapter: number, em_dash_max_per_chapter: 0},
|
|
57
|
+
notes: [str],
|
|
58
|
+
},
|
|
41
59
|
style_drift_directives: [str] | null, # 漂移纠偏指令(active 时注入)
|
|
42
60
|
engagement_report_summary?: obj, # 可选:爽点/信息密度窗口报告摘要(logs/engagement/latest.json 裁剪)
|
|
43
61
|
promise_ledger_report_summary?: obj, # 可选:承诺台账窗口报告摘要(logs/promises/latest.json 裁剪)
|
|
@@ -48,6 +66,7 @@ chapter_writer_manifest = {
|
|
|
48
66
|
paths: {
|
|
49
67
|
style_profile: "style-profile.json", # 必读(含 style_exemplars + writing_directives)
|
|
50
68
|
platform_profile: "platform-profile.json", # 可选(平台字数/钩子策略/信息负载等)
|
|
69
|
+
platform_writing_guide: "platform-writing-guide.md", # 可选(平台节奏/对话比例/钩子/情绪回报/文风要求)
|
|
51
70
|
style_drift: "style-drift.json", # 可选
|
|
52
71
|
chapter_contract: "volumes/vol-{V:02d}/chapter-contracts/chapter-{C:03d}.json",
|
|
53
72
|
volume_outline: "volumes/vol-{V:02d}/outline.md",
|
|
@@ -56,15 +75,31 @@ chapter_writer_manifest = {
|
|
|
56
75
|
recent_summaries: ["summaries/chapter-{C-1:03d}-summary.md", ...], # 近 3 章
|
|
57
76
|
storyline_memory: "storylines/{storyline_id}/memory.md", # 可选
|
|
58
77
|
adjacent_memories: ["storylines/{adj_id}/memory.md", ...], # 可选
|
|
59
|
-
|
|
78
|
+
character_profiles?: ["characters/active/{slug}.md", ...], # 可选:裁剪后选取(仅 established / 缺失 canon_status)
|
|
79
|
+
character_contracts?: ["characters/active/{slug}.json", ...], # 可选:裁剪后选取(仅 established / 缺失 canon_status;当前章需遵守的 L2 约束)
|
|
80
|
+
planned_character_profiles?: ["characters/active/{slug}.md", ...], # 可选:planned 角色档案(仅供铺垫/预告参考)
|
|
81
|
+
planned_character_contracts?: ["characters/active/{slug}.json", ...], # 可选:planned 角色契约(仅供铺垫/预告参考,不绑定)
|
|
82
|
+
# 若 chapter_contract 显式命中角色,则走 preferred 路径,不受 fallback 的 15 角色上限约束;
|
|
83
|
+
# 15 角色上限仅适用于未命中时的回退裁剪(draft 共享 active/planned 配额)。
|
|
60
84
|
project_brief: "brief.md",
|
|
61
|
-
|
|
85
|
+
style_guide: "skills/novel-writing/references/style-guide.md", # 可选
|
|
62
86
|
engagement_report_latest: "logs/engagement/latest.json", # 可选(如存在;用于读取完整报告)
|
|
63
87
|
promise_ledger_report_latest: "logs/promises/latest.json", # 可选(如存在;用于读取完整报告)
|
|
64
88
|
}
|
|
65
89
|
}
|
|
66
90
|
```
|
|
67
91
|
|
|
92
|
+
**`statistical_targets` 默认值约定:**
|
|
93
|
+
- `sentence_length_std_dev` 缺失 / `null` → `[8, 18]`
|
|
94
|
+
- `paragraph_length_cv` 缺失 / `null` → `[0.4, 1.2]`
|
|
95
|
+
- `vocabulary_diversity` / `register_mixing` / `emotional_arc` 缺失 / `null` → `"medium"`
|
|
96
|
+
- `narration_connectors` 始终为 `0`(叙述连接词目标值)
|
|
97
|
+
|
|
98
|
+
**`genre_overrides` 来源优先级:**
|
|
99
|
+
1. `brief.md` 中显式写出的类型覆写
|
|
100
|
+
2. `brief.md` 的题材字段(命中 style-guide §2.11 的默认覆写)
|
|
101
|
+
3. 未命中时省略该字段,ChapterWriter 回退到通用阈值
|
|
102
|
+
|
|
68
103
|
### 修订模式追加字段
|
|
69
104
|
|
|
70
105
|
```
|
|
@@ -141,10 +176,30 @@ quality_judge_manifest = {
|
|
|
141
176
|
chapter: int,
|
|
142
177
|
volume: int,
|
|
143
178
|
chapter_outline_block: str,
|
|
144
|
-
hard_rules_list: [str],
|
|
179
|
+
hard_rules_list: [str], # 仅 established / 缺失 canon_status 的 hard 规则(即使为空也显式提供)
|
|
180
|
+
world_rules_context_degraded?: bool, # 可选:world/rules.json 存在但 CLI 读取/解析降级;此时需直接读取 paths.world_rules 复核
|
|
145
181
|
blacklist_lint: obj | null, # scripts/lint-blacklist.sh 输出
|
|
146
182
|
ner_entities: obj | null, # scripts/run-ner.sh 输出
|
|
147
183
|
continuity_report_summary: obj | null, # logs/continuity/latest.json 裁剪
|
|
184
|
+
statistical_profile?: { # 可选:deterministic lint + heuristic 聚合的 7 指标 profile
|
|
185
|
+
source: "deterministic_lint+heuristic",
|
|
186
|
+
chapter_path: str,
|
|
187
|
+
blacklist_hit_rate: number | null,
|
|
188
|
+
sentence_repetition_rate: number,
|
|
189
|
+
sentence_length_std_dev: number,
|
|
190
|
+
paragraph_length_cv: number,
|
|
191
|
+
vocabulary_diversity_score: number,
|
|
192
|
+
vocabulary_richness_estimate: "high" | "medium" | "low",
|
|
193
|
+
narration_connector_count: number | null,
|
|
194
|
+
humanize_technique_variety: number,
|
|
195
|
+
},
|
|
196
|
+
structural_rule_violations?: [ # 可选:lint-structural 输出的结构违规
|
|
197
|
+
{rule_id: str, severity: "warning" | "error", location?: obj, description: str, suggestion?: str}
|
|
198
|
+
],
|
|
199
|
+
blacklist_lint_degraded?: bool, # 可选:ai-blacklist 存在但 deterministic lint 运行失败
|
|
200
|
+
structural_rule_violations_degraded?: bool, # 可选:structural lint 脚本存在但运行失败
|
|
201
|
+
golden_chapter_gates?: obj, # 可选:chapter <= 3 时注入的当前平台黄金三章硬门控
|
|
202
|
+
genre_golden_standards?: obj, # 可选:chapter <= 3 且 brief.genre 命中时注入的题材特定 minimum_thresholds/focus_dimensions/criteria
|
|
148
203
|
|
|
149
204
|
# ── paths ──
|
|
150
205
|
paths: {
|
|
@@ -154,8 +209,10 @@ quality_judge_manifest = {
|
|
|
154
209
|
chapter_contract: "volumes/vol-{V:02d}/chapter-contracts/chapter-{C:03d}.json",
|
|
155
210
|
world_rules: "world/rules.json", # 可选
|
|
156
211
|
prev_summary: "summaries/chapter-{C-1:03d}-summary.md", # 可选(首章无)
|
|
157
|
-
character_profiles
|
|
158
|
-
character_contracts
|
|
212
|
+
character_profiles?: ["characters/active/{slug}.md", ...], # 可选:裁剪后选取(叙述档案;仅 established / 缺失 canon_status)
|
|
213
|
+
character_contracts?: ["characters/active/{slug}.json", ...], # 可选:裁剪后选取(L2 结构化契约;仅 established / 缺失 canon_status;planned / deprecated 不进入 judge packet)
|
|
214
|
+
# 若 chapter_contract 显式命中角色,则走 preferred 路径,不受 fallback 的 15 角色上限约束;
|
|
215
|
+
# judge 只有在未命中时才回退到最多 15 个 established 角色。
|
|
159
216
|
storyline_spec: "storylines/storyline-spec.json", # 可选
|
|
160
217
|
storyline_schedule: "volumes/vol-{V:02d}/storyline-schedule.json", # 可选
|
|
161
218
|
cross_references: "staging/state/chapter-{C:03d}-crossref.json",
|
|
@@ -164,6 +221,14 @@ quality_judge_manifest = {
|
|
|
164
221
|
}
|
|
165
222
|
```
|
|
166
223
|
|
|
224
|
+
### fallback 约定
|
|
225
|
+
|
|
226
|
+
- `style-profile.json.sentence_length_std_dev == null` → 使用 fallback range `8-18`
|
|
227
|
+
- `style-profile.json.paragraph_length_cv == null` → 使用 fallback range `0.4-1.2`
|
|
228
|
+
- `style-profile.json.vocabulary_richness / register_mixing / emotional_volatility == null` → 统一回退到 `"medium"`
|
|
229
|
+
- `narration_connectors` 当前没有独立 style-profile 字段,固定按 `0` 命中约束,并由 `ai-blacklist.category_metadata.narration_connector` + `writing_directives` 辅助解释
|
|
230
|
+
- `genre_overrides` 优先读取 `brief.md` 的“覆写说明”;未填写时回退到 `brief.md` 的题材字段默认预设
|
|
231
|
+
|
|
167
232
|
---
|
|
168
233
|
|
|
169
234
|
另见:`continuity-checks.md`(NER schema + 一致性报告 schema + LS-001 结构化输入约定)。
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
## AI 黑名单动态维护(不阻断)
|
|
4
4
|
|
|
5
5
|
- 从 eval_used.anti_ai.blacklist_update_suggestions[] 读取新增候选(必须包含:phrase + count_in_chapter + examples)
|
|
6
|
-
- 增长上限检查:若 `words[]` 长度 >=
|
|
6
|
+
- 增长上限检查:若 `words[]` 长度 >= `max_words=250`,跳过自动追加,仅记录到 `update_log[]`(source="auto_skipped_cap"),并在 `/novel:start` 质量回顾中提示用户审核黑名单规模
|
|
7
7
|
- 自动追加门槛(保守,避免误伤):
|
|
8
8
|
- `confidence in {medium, high}` 且 `count_in_chapter >= 3` -> 才允许自动追加
|
|
9
9
|
- 其余仅记录为"候选建议",不自动写入(可在 `/novel:start` 质量回顾中提示用户手动处理)
|
|
@@ -21,6 +21,17 @@
|
|
|
21
21
|
- 用户可手动编辑 `ai-blacklist.json` 的 `words[]/whitelist[]`
|
|
22
22
|
- 若用户删除某词但不希望未来被自动再加回,请将其加入 `whitelist[]`(系统不得自动加入 whitelist 内词条)
|
|
23
23
|
|
|
24
|
+
|
|
25
|
+
## 人性化技法跨章追踪(不阻断)
|
|
26
|
+
|
|
27
|
+
- 追踪存储:`logs/anti-ai/technique-history.json`
|
|
28
|
+
- 首次运行时若目录或文件不存在,应自动创建目录并以空数组/空记录初始化
|
|
29
|
+
- 单条记录格式:`{"chapter_id": "vol-01/chapter-001", "techniques_used": ["thought_interrupt", "mundane_detail"]}`
|
|
30
|
+
- 写入时机:章节完成后,将本章实际使用的 `humanize_technique` 记录 append 到历史文件
|
|
31
|
+
- 告警规则:若同一技法连续 3 章及以上出现,记为“重复使用告警”,提示 ChapterWriter / StyleRefiner 在后续章节错开该技法
|
|
32
|
+
- 告警级别:仅 warning,不阻断写作;目标是防止“固定技法套餐”被连续刷章
|
|
33
|
+
- 建议保留最近 50 章记录即可,超出可按时间裁剪旧数据
|
|
34
|
+
|
|
24
35
|
## 风格漂移检测与纠偏(每 5 章触发)
|
|
25
36
|
|
|
26
37
|
- 触发条件:last_completed_chapter % 5 == 0
|
|
@@ -42,51 +42,104 @@
|
|
|
42
42
|
|
|
43
43
|
## 4. 沉浸感(immersion)— 权重 0.15
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
评估画面感、氛围营造、文笔与用词是否顺滑、详略是否得当,以及高压段之间是否给读者保留了必要的消化空间。
|
|
46
46
|
|
|
47
47
|
| 分数 | 标准 |
|
|
48
48
|
|------|------|
|
|
49
|
-
| 5 |
|
|
50
|
-
| 4 |
|
|
51
|
-
| 3 |
|
|
52
|
-
| 2 |
|
|
53
|
-
| 1 |
|
|
49
|
+
| 5 | 画面感强,文笔流畅,用词精准,详略拿捏准确;高压段之间有自然过渡,读者能顺畅沉进去 |
|
|
50
|
+
| 4 | 沉浸感良好,文笔顺畅,偶有平淡;大多数高压节点后都有缓冲或呼吸段 |
|
|
51
|
+
| 3 | 画面可读,文笔基本通顺,但部分高压场景切换过急,读者消化空间不足 |
|
|
52
|
+
| 2 | 文笔发涩或表达重复,沉浸感反复被打断;高压场景频繁硬切,明显缺乏过渡 |
|
|
53
|
+
| 1 | 语句不通或场景组织严重影响阅读,沉浸感持续断裂 |
|
|
54
|
+
|
|
55
|
+
补充口径:
|
|
56
|
+
- 若战斗 / 决策 / 冲突场景后立刻切入下一个高压场景,无过渡或消化空间,可视情况扣 **0.5 分**
|
|
57
|
+
- `reason` 中应明确标注“高压场景间缺乏过渡,沉浸感断裂”并指出具体段落
|
|
58
|
+
- 上述问题默认也视作 yellow / suggestion,不单独触发修订
|
|
54
59
|
|
|
55
60
|
## 5. 节奏(pacing)— 权重 0.08
|
|
56
61
|
|
|
57
|
-
|
|
62
|
+
评估冲突强度、情节张弛、阅读节奏,以及是否具备必要的结构呼吸感。
|
|
58
63
|
|
|
59
64
|
| 分数 | 标准 |
|
|
60
65
|
|------|------|
|
|
61
|
-
| 5 |
|
|
62
|
-
| 4 |
|
|
63
|
-
| 3 |
|
|
64
|
-
| 2 |
|
|
65
|
-
| 1 |
|
|
66
|
+
| 5 | 节奏精准,张弛有度,推进与留白恰到好处;功能性停留分布自然 |
|
|
67
|
+
| 4 | 节奏流畅,冲突有吸引力,偶有偏紧、偏松或轻微拖沓,但整体有呼吸空间 |
|
|
68
|
+
| 3 | 节奏尚可,但部分段落过于急促,或功能性停留过多导致拖沓;留白落点略生硬 |
|
|
69
|
+
| 2 | 节奏失衡,明显过密、拖沓或跳跃;整章几乎只剩推进,或停留堆积成灌水 |
|
|
70
|
+
| 1 | 节奏混乱,无法正常推进;要么缺少基本留白,要么留白失控到拖垮推进 |
|
|
71
|
+
|
|
72
|
+
补充口径:
|
|
73
|
+
- 若全章每个段落都直接推进情节、没有任何功能性停留,可在 `reason` 中标注“结构过密,缺乏呼吸感”,建议性扣 **0.5 分**
|
|
74
|
+
- 上述问题默认视作 yellow / suggestion,不单独触发修订
|
|
66
75
|
|
|
67
76
|
## 6. 风格自然度(style_naturalness)— 权重 0.15
|
|
68
77
|
|
|
69
|
-
评估去 AI
|
|
78
|
+
评估去 AI 化效果。**主评分表使用 7 个稳定指标的三区判定(green / yellow / red)**;当上下文额外提供 `em_dash_count` / `sentence_pattern_score` / `simile_density` / `dialogue_distinguishability` / `ellipsis_density` / `exclamation_density` 等扩展信号时,可在 `reason` 中加重说明,但 `score` 仍先按下表与 `structural_rule_violations` 罚分规则落地。若连这 7 项都拿不齐,则回退到 legacy 4 指标兼容表。
|
|
79
|
+
|
|
80
|
+
### 6.1 七指标三区
|
|
81
|
+
|
|
82
|
+
| # | 指标 | green(人类范围) | yellow(边界) | red(AI 特征) |
|
|
83
|
+
|---|------|------------------|----------------|----------------|
|
|
84
|
+
| 1 | `blacklist_hit_rate` | 0-1 次/千字 | 1-3 次/千字 | >3 次/千字 |
|
|
85
|
+
| 2 | `sentence_repetition_rate` | 相邻 5 句中 0-1 个重复句式 | 相邻 5 句中 2 个重复句式 | 相邻 5 句中 ≥3 个重复句式 |
|
|
86
|
+
| 3 | `sentence_length_std_dev` | 8-18,或落在 style-profile 目标附近 | 6-8 或 18-24 | <6(过匀) |
|
|
87
|
+
| 4 | `paragraph_length_cv` | 0.4-1.2,或落在 style-profile 目标附近 | 0.3-0.4 或 1.2-1.5 | <0.3(过匀) |
|
|
88
|
+
| 5 | `vocabulary_diversity_score` | 当前仅有枚举时 `vocabulary_richness=high`;若提供数值则 ≥0.45 | 当前仅有枚举时 `medium`;若提供数值则 0.35-0.45 | 当前仅有枚举时 `low`;若提供数值则 <0.35 |
|
|
89
|
+
| 6 | `narration_connector_count` | 0 | 1 个孤立命中(仍建议改写) | ≥2 个,或连续多段靠连接词推进 |
|
|
90
|
+
| 7 | `humanize_technique_variety` | 单章自然出现 ≥1 种不同技法,且无刷项感 | 0,且其余指标未出现 red | 0,且同时伴随至少 1 项句式 / 连接词等其它 red |
|
|
91
|
+
|
|
92
|
+
### 6.2 zone → score 映射
|
|
93
|
+
|
|
94
|
+
| 区域分布 | 分数 |
|
|
95
|
+
|----------|------|
|
|
96
|
+
| 全部 green | 5 |
|
|
97
|
+
| 1-2 个 yellow,且无 red | 4 |
|
|
98
|
+
| ≥3 个 yellow,或恰有 1 个 red | 3 |
|
|
99
|
+
| 2-3 个 red | 2 |
|
|
100
|
+
| ≥4 个 red | 1 |
|
|
101
|
+
|
|
102
|
+
### 6.3 `structural_rule_violations` 子分数
|
|
103
|
+
|
|
104
|
+
`structural_rule_violations` 来自确定性 lint(L2/L3/L5/L6)。它**不是独立维度**,而是对 `style_naturalness` 的附加罚分锚点:
|
|
105
|
+
|
|
106
|
+
| 违规数 | 区域 | 使用方式 |
|
|
107
|
+
|--------|------|----------|
|
|
108
|
+
| 0 | green | 不额外扣分 |
|
|
109
|
+
| 1-2 | yellow | 按“额外 +1 个 yellow”处理,再回到 zone → score 主映射表 |
|
|
110
|
+
| ≥3 | red | 按“额外 +1 个 red”处理;若违规集中在 `error` 级规则,可进一步降到 2 分 |
|
|
111
|
+
|
|
112
|
+
### 6.4 Legacy Fallback(向后兼容)
|
|
113
|
+
|
|
114
|
+
当正文破损、style-profile 缺失,或当前上下文只能稳定拿到旧 4 指标时,允许退回旧表:
|
|
115
|
+
|
|
116
|
+
| 分数 | AI 黑名单命中率 | 句式重复率(相邻 5 句) | 破折号频率 | style-profile 匹配度 |
|
|
117
|
+
|------|----------------|----------------------|------------|---------------------|
|
|
118
|
+
| 5 | 0 次/千字 | 0 个重复句式 | 0 处 | 句长、对话比、修辞完全匹配 |
|
|
119
|
+
| 4 | 1-2 次/千字 | ≤1 个重复句式 | 0 处 | 大部分匹配,轻微偏差 |
|
|
120
|
+
| 3 | 3-4 次/千字 | 2 个重复句式 | 0 处 | 部分匹配,有偏移 |
|
|
121
|
+
| 2 | 5-7 次/千字 | ≥3 个重复句式 | ≥1 处 | 明显不匹配 |
|
|
122
|
+
| 1 | >7 次/千字 | 频繁重复 | 多处出现 | 完全不匹配 |
|
|
70
123
|
|
|
71
|
-
|
|
72
|
-
|------|----------------|----------------------|---------------------|
|
|
73
|
-
| 5 | 0 次/千字 | 0 个重复句式 | 句长、对话比、修辞完全匹配 |
|
|
74
|
-
| 4 | 1-2 次/千字 | ≤ 1 个重复句式 | 大部分匹配,轻微偏差 |
|
|
75
|
-
| 3 | 3-4 次/千字 | 2 个重复句式 | 部分匹配,有偏移 |
|
|
76
|
-
| 2 | 5-7 次/千字 | ≥ 3 个重复句式 | 明显不匹配 |
|
|
77
|
-
| 1 | > 7 次/千字 | 频繁重复 | 完全不匹配 |
|
|
124
|
+
> 说明:legacy 4 指标只用于兼容旧项目;新项目优先使用七指标三区 + `structural_rule_violations`。
|
|
78
125
|
|
|
79
126
|
## 7. 情感冲击(emotional_impact)— 权重 0.08
|
|
80
127
|
|
|
81
|
-
|
|
128
|
+
评估情感起伏、读者代入感、情绪共鸣,以及关键节点是否提供了足够的**内心活动锚点**。注意:这里要同时防两种极端——一端是 `SP-07` 式情绪标签句,另一端是完全没有内心活动、只剩纯动作记录流。
|
|
82
129
|
|
|
83
130
|
| 分数 | 标准 |
|
|
84
131
|
|------|------|
|
|
85
|
-
| 5 |
|
|
86
|
-
| 4 |
|
|
87
|
-
| 3 |
|
|
88
|
-
| 2 |
|
|
89
|
-
| 1 |
|
|
132
|
+
| 5 | 情感冲击强烈,读者强代入感,情绪共鸣持久;关键决策/重大信息节点前后都能看到自然的感官侵入、碎片思绪或生理反应,不靠情绪标签硬说 |
|
|
133
|
+
| 4 | 情感有起伏,读者能投入,共鸣感良好;大部分关键节点有内心活动锚点,偶有轻微稀薄但不影响整体 |
|
|
134
|
+
| 3 | 情感起伏不明显,代入感一般;存在关键节点前后 3 句缺少内心活动,或偶发连续 5 句纯动作流,但尚未大面积拖垮体验 |
|
|
135
|
+
| 2 | 情感平板,难以产生代入感;多处关键节点缺少内心活动锚点,或全章出现 ≥3 处连续 5 句纯动作流 |
|
|
136
|
+
| 1 | 情感缺失,读者无法投入;高压节点几乎都只有外显动作记录,既无有效内心活动,也常退回情绪标签或解释型旁白 |
|
|
137
|
+
|
|
138
|
+
补充扣分口径:
|
|
139
|
+
- 这里“处”按“每个应触发却缺失锚点的关键节点”计算。关键决策 / 重大信息 / 高压节点前后 3 句无内心活动 → `emotional_impact` 至少扣 **0.5 分/处**
|
|
140
|
+
- 全章出现 **≥3 处** 连续 5 句纯动作流 → 额外扣 **1 分**
|
|
141
|
+
- 上述扣分可以叠加,但 `emotional_impact` 最低只降到 **1 分**
|
|
142
|
+
- `reason` 中必须标出缺失位置;生理反应、感官侵入、碎片思绪、思维中断、自我纠正都属于合法内心活动,不应按 SP-07 误判为情绪标签
|
|
90
143
|
|
|
91
144
|
## 8. 故事线连贯(storyline_coherence)— 权重 0.08
|
|
92
145
|
|
|
@@ -57,6 +57,7 @@ ChapterWriter prompt 中注入以下约束与目标:
|
|
|
57
57
|
- 情感描写类:不禁、莫名、油然而生、心中暗道、嘴角微微上扬
|
|
58
58
|
- 过渡连接类:与此同时、值得一提的是、毫无疑问
|
|
59
59
|
- 形容夸张类:宛如、恍若、仿佛置身于
|
|
60
|
+
- **"像"字比喻限频**:`像+具体意象`(如"像一把刀""像一根绷紧的弦")≤1/千字;排除非比喻义用法("好像有人来了""像是累了")。详见 `ai-blacklist.json.category_metadata.simile_cliche.like_simile_rule`
|
|
60
61
|
- 叙述连接词:在叙述段落中零容忍,优先用动作、场景切换、信息落差推进
|
|
61
62
|
- 详见 `${NOVEL_CLI_ROOT}/templates/ai-blacklist.json`
|
|
62
63
|
|
|
@@ -94,10 +95,11 @@ ChapterWriter prompt 中注入以下约束与目标:
|
|
|
94
95
|
LLM 对特定标点有系统性过度使用倾向,是最容易被读者感知的 AI 痕迹之一。生成阶段先按千字频率把握趋势;进入 §2.10 L6 结构复核时,再用章节/段落上限做硬检查。两套约束发生冲突时,以更严格的一侧为准。
|
|
95
96
|
|
|
96
97
|
- **总体原则**:按千字频率看趋势,不按单章机械卡数。情绪峰值章可以短暂上浮,但不能连续数章都靠同一种标点撑节奏
|
|
97
|
-
-
|
|
98
|
+
- **破折号(——)**:**0 处/千字(零容忍)**。LLM 极度偏好用破折号做解释性插入、情绪停顿和场景切换,是最明显的 AI 写作标志之一。一律改用逗号、句号、省略号或重组句式,不设任何例外
|
|
98
99
|
- ✗ `他看向远方——那是他曾经的家。` → ✓ `他看向远方。那是他曾经的家。`
|
|
99
100
|
- ✗ `门开了——是她。` → ✓ `门开了,是她。`
|
|
100
101
|
- ✗ `一切都结束了——或许吧。` → ✓ `一切都结束了。或许吧。`
|
|
102
|
+
- ✗ `他刚想到"也许还能谈"——窗外那声急刹打断了他。` → ✓ `他刚想到"也许还能谈"……窗外那声急刹把后半句硬生生掐断。`
|
|
101
103
|
- **省略号(……)**:通常保持在 0-2 处/千字,避免连续两句都靠省略号收尾
|
|
102
104
|
- **感叹号(!)**:通常保持在 0-3 处/千字;对话中可以略宽,但叙述文不要连续感叹
|
|
103
105
|
|
|
@@ -174,7 +176,7 @@ LLM 对特定标点有系统性过度使用倾向,是最容易被读者感知
|
|
|
174
176
|
|
|
175
177
|
#### 认知(cognitive)
|
|
176
178
|
|
|
177
|
-
- `thought_interrupt` /
|
|
179
|
+
- `thought_interrupt` / 思维中断:角色的思路被外界刺激突然打断,留下不完整心流。例:`他刚想到”也许还能谈”……窗外那声急刹把后半句硬生生掐断。` 使用省略号表达中断,不使用破折号(§2.6 零容忍)。
|
|
178
180
|
- `self_correction` / 自我纠正:角色先说/先想一个版本,再立刻修正。例:`“我不在乎。”她顿了一下,改口,“不对,我只是现在不想在乎。”`
|
|
179
181
|
|
|
180
182
|
#### 感官(sensory)
|
|
@@ -216,6 +218,40 @@ LLM 对特定标点有系统性过度使用倾向,是最容易被读者感知
|
|
|
216
218
|
| `nested_parenthetical` | 结构 | 嵌套补充 |
|
|
217
219
|
| `abrupt_topic_shift` | 结构 | 突然转题 |
|
|
218
220
|
|
|
221
|
+
#### C23 内心活动锚点(与 SP-07 互补)
|
|
222
|
+
|
|
223
|
+
`SP-07` 防的是“直接把情绪名字告诉读者”,`C23` 防的是“高压节点里完全不写角色怎么感受到这件事”。两者一起工作,才不会把正文压成只有动作记录的空壳:
|
|
224
|
+
|
|
225
|
+
- `SP-07` 防止:`她感到一阵愤怒。` `他心中涌起悲伤。`
|
|
226
|
+
- `C23` 防止:角色连着做选择、挨打、得知真相,却只剩“走 / 看 / 说 / 打”的外显动作,没有任何主观感知
|
|
227
|
+
|
|
228
|
+
**纯动作记录流**:连续句子只描述外在可观察行为(走、跑、抬手、开门、说话、挥刀),没有角色的感官侵入、碎片思绪、生理反应、思维中断或自我纠正。此类段落连续 **≤5 句**;若进入第 6 句,必须补入最小必要的主观感知。
|
|
229
|
+
|
|
230
|
+
**关键节点触发**:当章节出现生死抉择、重大取舍、重大信息获知、规则骤变、SP 大量扣除等高压节点时,节点前后 **2-3 句** 内应至少出现一处内心活动锚点。它不是每章固定配额,而是“该有反应的地方不能空”。
|
|
231
|
+
|
|
232
|
+
**口径说明**:ChapterWriter 写作时以“前后 **2-3 句** 内自然落锚”为目标;QualityJudge 以“前后 3 句仍为空”作为扣分阈值,属于评审兜底,不要求额外扩写成长段心理描写。
|
|
233
|
+
|
|
234
|
+
**边界案例**:
|
|
235
|
+
|
|
236
|
+
- **应触发**:角色主动放弃重要道具、盟友或机会,即使不是立刻生死,也会改变后续局势
|
|
237
|
+
- **应触发**:角色听到半真半假、但足以改变下一步判断的重要消息,即便“重大”程度还在发酵
|
|
238
|
+
- **不应触发**:战斗中的单次战术微调(换步、格挡、侧闪)若尚未改变胜负或关系格局,不必每一下都补内心活动
|
|
239
|
+
- **不应触发**:日常对话里获知不影响目标、关系或风险等级的琐碎信息,不必强行补锚点
|
|
240
|
+
- **高速场景写法**:格斗、追逐、逃亡等高肾上腺素场景也不需要长段内省;锚点可以压缩成 1 句最小必要的生理/感官闪念,但不能连续 6 句都只剩动作记录
|
|
241
|
+
|
|
242
|
+
| 合法内心活动 | 非法情绪标签 / 解释型旁白 |
|
|
243
|
+
|--------------|---------------------------|
|
|
244
|
+
| `铁锈味突然顶上来,她这才发现自己把后槽牙咬得发酸。` | `她感到非常紧张。` |
|
|
245
|
+
| `门闩一响,她脑子里先蹦出来的居然是:灯没关。` | `她知道自己其实是在害怕。` |
|
|
246
|
+
| `他想说“算了”,话到舌尖又缩回去,喉咙像卡了砂。` | `他内心充满挣扎。` |
|
|
247
|
+
| `掌心一层薄汗,刀柄差点滑出去。` | `他此刻十分恐惧。` |
|
|
248
|
+
|
|
249
|
+
**与 C12 / C18 的关系**:
|
|
250
|
+
|
|
251
|
+
- `C12 反直觉细节` 提供“人味来源”,可以拿来给关键节点补真实触感
|
|
252
|
+
- `C18 人性化技法抽样` 提供技法池(`sensory_intrusion` / `stream_of_consciousness` / `thought_interrupt` / `self_correction` 等)
|
|
253
|
+
- `C23` 只是触发式底线:有关键节点或动作流超限时必须补;没有自然落点时,仍然不要为了凑“内心戏”硬塞一段解释
|
|
254
|
+
|
|
219
255
|
### 2.10 六层结构规则
|
|
220
256
|
|
|
221
257
|
#### L1 反模板句式
|
|
@@ -289,10 +325,31 @@ LLM 对特定标点有系统性过度使用倾向,是最容易被读者感知
|
|
|
289
325
|
| 省略号(……)章节总量 | ≤5/章 | 悬疑/恐怖可放宽到 ≤8/章 |
|
|
290
326
|
| 感叹号(!)单段频次 | ≤1/段 | 通用 |
|
|
291
327
|
| 感叹号(!) | ≤8/章 | 科幻收紧到 ≤5/章 |
|
|
292
|
-
| 破折号(——) |
|
|
328
|
+
| 破折号(——) | 0/章(零容忍) | 通用 |
|
|
293
329
|
| 省略号与感叹号同句连用 | 禁止 | 通用 |
|
|
294
330
|
| 问号连用(??)/感叹号连用(!!) | 禁止 | 通用 |
|
|
295
331
|
|
|
332
|
+
#### L7 句式模式检测
|
|
333
|
+
|
|
334
|
+
**检测方式**:LLM 语义理解(非正则),参考 `${NOVEL_CLI_ROOT}/templates/ai-sentence-patterns.json`。
|
|
335
|
+
|
|
336
|
+
8 种结构级 AI 句式模式:
|
|
337
|
+
|
|
338
|
+
| ID | 名称 | severity | per_chapter_max | 核心特征 |
|
|
339
|
+
|----|------|----------|-----------------|----------|
|
|
340
|
+
| SP-01 | 解释型旁白句 | high | 0 | 作者替人物翻译潜台词 |
|
|
341
|
+
| SP-02 | 模板转折句 | high | 0 | 机械先负后正/先正后负平衡句 |
|
|
342
|
+
| SP-03 | 抽象判词句 | medium | 2 | "那股XX劲""一种XX的感觉" |
|
|
343
|
+
| SP-04 | 管理/项目腔 | medium | 2 | PRD 语气入侵小说 |
|
|
344
|
+
| SP-05 | 重复解释 | high | 0 | 前句暗示 X,后句旁白重述 X |
|
|
345
|
+
| SP-06 | 因果说明句 | medium | 2 | "毕竟""之所以……是因为" |
|
|
346
|
+
| SP-07 | 情绪标签句 | high | 0 | "感到一阵愤怒""心中涌起悲伤" |
|
|
347
|
+
| SP-08 | 全知评论句 | medium | 2 | "他不知道的是""注定不会平静" |
|
|
348
|
+
|
|
349
|
+
- severity=high 的模式:零容忍,命中即修改
|
|
350
|
+
- severity=medium 的模式:每章 ≤2 处,超出必须修改
|
|
351
|
+
- 与 L1-L6 互补:L1-L6 抓文本表面特征,L7 抓结构/语义级模式
|
|
352
|
+
|
|
296
353
|
### 2.11 类型覆写机制
|
|
297
354
|
|
|
298
355
|
- 覆写来源优先读取 `brief.md` 中显式写出的“类型覆写”说明;若未提供,再回退到 `brief.md` 的题材字段
|
|
@@ -306,6 +363,8 @@ LLM 对特定标点有系统性过度使用倾向,是最容易被读者感知
|
|
|
306
363
|
| 恐怖 | 单句段 30%-50% | 省略号 ≤8/章 | 允许更碎的呼吸感,但不能靠标点堆恐惧 |
|
|
307
364
|
| 言情 | 使用默认值 | 使用默认值 | 重心放在语气差异和情感回收,不靠模板抒情 |
|
|
308
365
|
|
|
366
|
+
**注**:破折号零容忍(§2.6 / L6)为全局约束,对所有题材生效,不受类型覆写影响。
|
|
367
|
+
|
|
309
368
|
### 2.12 润色执行流程
|
|
310
369
|
|
|
311
370
|
> 默认顺序:黑名单扫描 → 结构规则检查 → 抽象转具体 → 节奏朗读测试。
|
|
@@ -321,13 +380,14 @@ LLM 对特定标点有系统性过度使用倾向,是最容易被读者感知
|
|
|
321
380
|
|
|
322
381
|
#### Step 2:结构规则检查
|
|
323
382
|
|
|
324
|
-
按 §2.10 的
|
|
383
|
+
按 §2.10 的 7 层逐项过一遍:
|
|
325
384
|
1. 有没有模板句式?
|
|
326
385
|
2. 形容词/副词是否超密度?
|
|
327
386
|
3. 四字词组是否连用?
|
|
328
387
|
4. 对话是否有明确意图,去掉标签后能否分辨角色?
|
|
329
388
|
5. 段落长短是否有交错?
|
|
330
389
|
6. 标点频率是否开始撑节奏?
|
|
390
|
+
7. 有没有命中 L7 句式模式(解释型旁白、模板转折、抽象判词、管理腔、重复解释、因果说明、情绪标签、全知评论)?
|
|
331
391
|
|
|
332
392
|
#### Step 3:抽象→具体转换
|
|
333
393
|
|
|
@@ -343,6 +403,8 @@ LLM 对特定标点有系统性过度使用倾向,是最容易被读者感知
|
|
|
343
403
|
- 有没有连续 3 句以上同节奏?
|
|
344
404
|
- 有没有逻辑连接词堆起来的“讲稿味”?
|
|
345
405
|
- 有没有描写过长、读者会滑过去的段落?
|
|
406
|
+
- 有没有整章几乎只在推进任务,或高压段之间硬切到下一个高压段?
|
|
407
|
+
- 若有,优先在已有段落缝隙补 1 句最小感官 / 环境过渡;若要解决问题必须新增完整功能性停留段(闲聊 / 回忆 / 生活细节),则不要在 StyleRefiner 阶段硬补,应回到 ChapterWriter / QualityJudge 处理
|
|
346
408
|
|
|
347
409
|
### 2.13 快速检查清单
|
|
348
410
|
|
|
@@ -352,7 +414,43 @@ LLM 对特定标点有系统性过度使用倾向,是最容易被读者感知
|
|
|
352
414
|
- [ ] 情绪直述:有无“感到XX”“心中涌起XX”?有就改动作或生理反应
|
|
353
415
|
- [ ] 微微系列:有无“微微一笑”“微微皱眉”“微微点头”?有就换具体描写
|
|
354
416
|
- [ ] 缓缓系列:有无“缓缓开口”“缓缓说道”?有就简化或补动作
|
|
355
|
-
- [ ]
|
|
417
|
+
- [ ] 标点过度:有无破折号(零容忍,命中即改)?省略号、感叹号是否频率超限?
|
|
418
|
+
|
|
419
|
+
### 2.14 结构呼吸感
|
|
420
|
+
|
|
421
|
+
**信息效率过高** 是章节级 AI 特征:每个段落都精准服务情节推进,每句对白都像任务分配,没有闲笔、没有喘息、没有让读者消化信息的空白。`C24` 要解决的不是“拖字数”,而是让章节保留必要的停顿与人味。
|
|
422
|
+
|
|
423
|
+
#### 功能性停留
|
|
424
|
+
|
|
425
|
+
功能性停留 = 不直接服务于主线推进,但能提供氛围、角色层次或阅读缓冲的片段。判断标准:删掉该片段后,本章主线因果链仍然成立,只是少了氛围 / 人味 / 消化空间。
|
|
426
|
+
|
|
427
|
+
| 类型 | 示例作用 | 注意事项 |
|
|
428
|
+
|------|----------|----------|
|
|
429
|
+
| 环境闲描 | 雨声、灯影、屋里的味道、街边噪音 | 仍受 `C13` 约束,单次环境闲描 **≤2 句** |
|
|
430
|
+
| 角色闲聊 | 打趣、抱怨、跑题、自言自语 | 仍要能归到 `C19` 的敷衍 / 短暂避锋式缓冲 / 转移等合法意图;1-2 句是上限,不是目标 |
|
|
431
|
+
| 感官片段 | 冷气钻进领口、手心发黏、鼻腔里的铁锈味 | 可与 `C23` 内心锚点共用,但 `C24` 关注的是结构位置 |
|
|
432
|
+
| 回忆碎片 | 与当前场景有关的半句旧事或条件反射 | 只取一闪而过的关联,不展开成长回顾 |
|
|
433
|
+
| 生活细节 | 哭着还捏着两根葱、说狠话前先扶正碗沿 | 优先使用 `C12` 式反直觉细节,避免套模板 |
|
|
434
|
+
|
|
435
|
+
#### 密度建议
|
|
436
|
+
|
|
437
|
+
- 章节**正文字数**达到 **1000 字以上** 时,优先守住功能性停留总量不超过章节正文字数的 **≤10%**
|
|
438
|
+
- 在该预算内,通常每 **1000-1500 字** 安排一处更短、更轻的功能性停留;若预算与频率冲突,以 `≤10%` 上限为准
|
|
439
|
+
- 高潮战斗 / 追逐 / 对峙章可以减少停留,但高压段结束后最好仍给 1-2 句节奏放缓的过渡
|
|
440
|
+
- 过渡章 / 日常章可以略多,但不要把“呼吸感”写成无效灌水
|
|
441
|
+
|
|
442
|
+
#### 好 / 坏对比
|
|
443
|
+
|
|
444
|
+
**坏例子(信息效率过高)**:角色进门、交代任务、发现线索、立刻转场;对白句句只为推进冲突,没有任何闲笔或缓冲。
|
|
445
|
+
|
|
446
|
+
**好例子(有结构呼吸感)**:推进完任务后,先留一小段雨声、饭菜味或角色一句不合时宜的抱怨,让读者消化,再进入下一个动作节点。
|
|
447
|
+
|
|
448
|
+
#### 与其它约束的关系
|
|
449
|
+
|
|
450
|
+
- `C12 反直觉细节`:提供“停留时写什么”的具体手段
|
|
451
|
+
- `C13 场景描写精简`:环境闲描仍受 2 句限制,不能借 `C24` 大段铺景
|
|
452
|
+
- `C18 人性化技法`:提供微观表达工具,`C24` 决定“哪里值得放慢”
|
|
453
|
+
- `C19 对话意图`:废话不是乱写,仍要落在敷衍 / 短暂避锋式缓冲 / 转移 / 打趣等可辨识意图上;1-2 句是上限,不是目标
|
|
356
454
|
|
|
357
455
|
## Layer 3: 后处理(StyleRefiner)
|
|
358
456
|
|
|
@@ -364,6 +462,7 @@ StyleRefiner 默认按 §2.12 的四步流程执行,并额外遵守:
|
|
|
364
462
|
2. **结构问题优先于辞藻问题**:先拆模板句式、重复节奏和标点堆砌,再处理词级替换
|
|
365
463
|
3. **style-profile 对齐**:句长、段长、语域混合、词汇丰富度优先贴近 style-profile;没有字段时退回 §2.8 的通用范围
|
|
366
464
|
4. **修改量控制**:总修改量 ≤ 原文 15%(字数变化比)
|
|
465
|
+
5. **结构呼吸感最小修补**:中层只负责检测“信息效率过高”并补 1 句级过渡,不负责新增完整功能性停留段;需要整段闲笔时回到 ChapterWriter
|
|
367
466
|
|
|
368
467
|
### 不可修改项
|
|
369
468
|
|
|
@@ -374,21 +473,31 @@ StyleRefiner 默认按 §2.12 的四步流程执行,并额外遵守:
|
|
|
374
473
|
|
|
375
474
|
## Layer 4: 检测度量(QualityJudge)
|
|
376
475
|
|
|
377
|
-
### 风格自然度三区判定(
|
|
378
|
-
|
|
379
|
-
| 指标 | green(人类范围) | yellow(边界) | red(AI 特征) |
|
|
380
|
-
|
|
381
|
-
| `blacklist_hit_rate` | 0-1 次/千字 | 1-3 次/千字 | >3 次/千字 |
|
|
382
|
-
| `sentence_repetition_rate` | 相邻 5 句中 0-1 个重复句式 | 相邻 5 句中 2 个重复句式 | 相邻 5 句中 ≥3 个重复句式 |
|
|
383
|
-
| `sentence_length_std_dev` | 8-18,或落在 style-profile 目标附近 | 6-8 或 18-24 | <6(过匀) |
|
|
384
|
-
| `paragraph_length_cv` | 0.4-1.2,或落在 style-profile 目标附近 | 0.3-0.4 或 1.2-1.5 | <0.3(过匀) |
|
|
385
|
-
| `vocabulary_diversity_score` | 当前仅有枚举时 `vocabulary_richness=high`;若未来提供数值字段,则 ≥0.45 | 当前仅有枚举时 `medium`;若未来提供数值字段,则 0.35-0.45 | 当前仅有枚举时 `low`;若未来提供数值字段,则 <0.35 |
|
|
386
|
-
| `narration_connector_count` | 0 | 1 个孤立命中(仍应改写) | ≥2 个,或连续多段靠连接词推进 |
|
|
387
|
-
| `humanize_technique_variety` | 单章自然出现 ≥1 种不同技法,且无刷项感 | 0,且其余指标未出现 red(不阻断,但提示检查是否过匀) | 0,且同时伴随至少 1 项句式/连接词等其它 red |
|
|
476
|
+
### 风格自然度三区判定(13 指标)
|
|
477
|
+
|
|
478
|
+
| # | 指标 | green(人类范围) | yellow(边界) | red(AI 特征) |
|
|
479
|
+
|---|------|------------------|----------------|----------------|
|
|
480
|
+
| 1 | `blacklist_hit_rate` | 0-1 次/千字 | 1-3 次/千字 | >3 次/千字 |
|
|
481
|
+
| 2 | `sentence_repetition_rate` | 相邻 5 句中 0-1 个重复句式 | 相邻 5 句中 2 个重复句式 | 相邻 5 句中 ≥3 个重复句式 |
|
|
482
|
+
| 3 | `sentence_length_std_dev` | 8-18,或落在 style-profile 目标附近 | 6-8 或 18-24 | <6(过匀) |
|
|
483
|
+
| 4 | `paragraph_length_cv` | 0.4-1.2,或落在 style-profile 目标附近 | 0.3-0.4 或 1.2-1.5 | <0.3(过匀) |
|
|
484
|
+
| 5 | `vocabulary_diversity_score` | 当前仅有枚举时 `vocabulary_richness=high`;若未来提供数值字段,则 ≥0.45 | 当前仅有枚举时 `medium`;若未来提供数值字段,则 0.35-0.45 | 当前仅有枚举时 `low`;若未来提供数值字段,则 <0.35 |
|
|
485
|
+
| 6 | `narration_connector_count` | 0 | 1 个孤立命中(仍应改写) | ≥2 个,或连续多段靠连接词推进 |
|
|
486
|
+
| 7 | `humanize_technique_variety` | 单章自然出现 ≥1 种不同技法,且无刷项感 | 0,且其余指标未出现 red(不阻断,但提示检查是否过匀) | 0,且同时伴随至少 1 项句式/连接词等其它 red |
|
|
487
|
+
| 8 | `em_dash_count` | 0 | (无 yellow) | >0(零容忍) |
|
|
488
|
+
| 9 | `sentence_pattern_score` | 0 处 high + ≤2 处 medium | >2 处 medium + 0 处 high | ≥1 处 high 命中 |
|
|
489
|
+
| 10 | `simile_density` | ≤1 处/千字 | >1 且 ≤2 处/千字 | >2 处/千字 |
|
|
490
|
+
| 11 | `dialogue_distinguishability` | high(去标签后可辨识) | medium(勉强可辨识) | low(无法辨识) |
|
|
491
|
+
| 12 | `ellipsis_density` | 0-2 处/千字 | >2 且 ≤3 处/千字 | >3 处/千字 |
|
|
492
|
+
| 13 | `exclamation_density` | 0-3 处/千字 | >3 且 ≤5 处/千字 | >5 处/千字 |
|
|
388
493
|
|
|
389
494
|
> `vocabulary_diversity` 是方法名,`vocabulary_richness` 是现行 style-profile 字段,`vocabulary_diversity_score` 是 Layer 4 观测指标名;三者指向同一维度的不同层名。
|
|
390
495
|
> `humanize_technique_variety` 是复合条件指标,也是事后观察指标,不是生成配额;不要为了把分数刷到 green,机械往章节里塞技法。
|
|
391
|
-
>
|
|
496
|
+
> `em_dash_count` 无 yellow 区间:破折号是最明显的 AI 写作标志,只要出现即为 red。
|
|
497
|
+
> `sentence_pattern_score` 聚合自 `sentence_pattern_violations[]`;分项证据仍保留在独立数组中。
|
|
498
|
+
> `simile_density` 仅计 `像+具体意象`(如”像一把刀”),排除非比喻义(”好像有人来了””像是累了”)。
|
|
499
|
+
> `dialogue_distinguishability` 由 LLM 基于”去掉对话标签后,仅凭语气/用词/句式能否分辨说话人”进行估算。
|
|
500
|
+
> green 表示”仍在人类可接受范围”,不等于旧 5 分制的满分;若沿用 Legacy Fallback 或旧 `quality-rubric` 打满分,`blacklist_hit_rate` 仍建议压到 0 次/千字。
|
|
392
501
|
|
|
393
502
|
建议映射:
|
|
394
503
|
- 全 green → 5 分
|
|
@@ -396,6 +505,7 @@ StyleRefiner 默认按 §2.12 的四步流程执行,并额外遵守:
|
|
|
396
505
|
- 3 个及以上 yellow,或恰好 1 个 red → 3 分
|
|
397
506
|
- 2-3 个 red → 2 分
|
|
398
507
|
- 4 个及以上 red → 1 分
|
|
508
|
+
- `structural_rule_violations` 0 条不降分;1-2 条按“额外 +1 个 yellow”处理;3 条及以上按“额外 +1 个 red”处理
|
|
399
509
|
|
|
400
510
|
### Legacy Fallback:原 4 指标 5 分表
|
|
401
511
|
|
|
@@ -411,9 +521,9 @@ StyleRefiner 默认按 §2.12 的四步流程执行,并额外遵守:
|
|
|
411
521
|
|
|
412
522
|
### 升级提示
|
|
413
523
|
|
|
414
|
-
- 旧项目若还没有新的统计字段,可先继续使用 `vocabulary_richness` 等枚举代理,并在无法取得
|
|
524
|
+
- 旧项目若还没有新的统计字段,可先继续使用 `vocabulary_richness` 等枚举代理,并在无法取得 13 指标时回退到 7 指标或 Legacy Fallback
|
|
525
|
+
- 回退层级:`13-indicator`(默认)→ `7-indicator`(正文过短或 `ai_sentence_patterns` 缺失时)→ `4-indicator-compat`(正文破损或 style_profile 缺失时)
|
|
415
526
|
- 现有章节不需要立刻整库重评;从下次重跑 StyleAnalyzer、StyleRefiner、QualityJudge 时逐步补齐即可
|
|
416
|
-
- 本次变更只更新方法论基线;`agents/style-refiner.md`、`agents/quality-judge.md` 等消费方定义仍按后续 CS-A3 / CS-A4 changeset 跟进
|
|
417
527
|
|
|
418
528
|
### 黑名单维护机制
|
|
419
529
|
|
package/skills/start/SKILL.md
CHANGED
|
@@ -20,11 +20,26 @@
|
|
|
20
20
|
|
|
21
21
|
1) 用 AskUserQuestion 询问是否写入平台画像(可选):
|
|
22
22
|
- `qidian` (Recommended)
|
|
23
|
-
- `
|
|
23
|
+
- `fanqie (番茄)`
|
|
24
|
+
- `jinjiang (晋江)`
|
|
24
25
|
- 暂不设置(后续可手动补齐 `platform-profile.json`)
|
|
25
26
|
|
|
26
|
-
|
|
27
|
-
|
|
27
|
+
> 兼容说明:若用户在 free-form 输入里手动填 `tomato`,仍应接受;但不要把它作为可见选项展示。
|
|
28
|
+
|
|
29
|
+
2) 再询问用户的**预期题材**(仅用于兼容性提醒与后续 `brief.md` 对齐,不阻断 init):
|
|
30
|
+
- `玄幻 (xuanhuan)`
|
|
31
|
+
- `都市 (dushi)`
|
|
32
|
+
- `科幻 (scifi)`
|
|
33
|
+
- `历史 (history)`
|
|
34
|
+
- `悬疑 (suspense)`
|
|
35
|
+
- `言情 (romance)`
|
|
36
|
+
|
|
37
|
+
> 选择后提醒用户:后续填写 `brief.md` 时,`- **题材**:` 字段应与这里保持一致,否则 CLI 无法稳定匹配 `genre_excitement_map` / `genre_golden_standards`。
|
|
38
|
+
|
|
39
|
+
3) 若可读取到当前项目根目录中的 `genre-golden-standards.json`,或可读取到 CLI 自带的同名模板,且用户选择的 genre + platform 命中 `invalid_combinations`,显示 WARNING,但继续初始化(不阻断);若两处都不可读(例如全新空目录尚未 init),则跳过检查且不提示。
|
|
40
|
+
|
|
41
|
+
4) 执行初始化:
|
|
42
|
+
- `${NOVEL} init --platform <qidian|fanqie|jinjiang>` 或
|
|
28
43
|
- `${NOVEL} init`
|
|
29
44
|
|
|
30
45
|
> `init` 只负责创建 `.checkpoint.json` + `staging/**`(以及可选平台模板)。后续所有流程都由 `next/instructions` 驱动。
|
|
@@ -38,4 +53,9 @@
|
|
|
38
53
|
## 常见断点策略(建议)
|
|
39
54
|
|
|
40
55
|
- 遇到 `${NOVEL} commit ...`:执行前用 AskUserQuestion 让用户确认(commit 会移动 staging → final);commit 后运行 `${NOVEL} next --json` 继续
|
|
56
|
+
- QUICK_START 顺序固定为 `world → characters → style → f0 → trial → results`;不要跳步,也不要凭经验跳过 `novel validate` / `novel advance`
|
|
57
|
+
- 遇到 `quickstart:f0` / PlotArchitect packet 时,把它当成 `vol-01` 的迷你规划:生成 chapters `1..3` 的 `outline.md`、3 个 L3 契约、`storyline-schedule.json`、`foreshadowing.json`(以及 `new-characters.json`),先写到 `staging/volumes/vol-01/`,经 `novel validate quickstart:f0` 校验后,再由 `novel advance quickstart:f0` 提交到 `volumes/vol-01/`
|
|
58
|
+
- Quick Start resume 语义:`quickstart_phase=style` 的下一步是 `f0`;`quickstart_phase=f0` 且 `volumes/vol-01/` 种子已提交时,下一步是 `trial`
|
|
59
|
+
- 遇到 `quickstart:trial` / `quickstart:results` 且 packet manifest 中存在 `paths.chapter_contract` / `paths.volume_outline` / `paths.volume_foreshadowing` 时,原样透传给 ChapterWriter / QualityJudge;这些都是来自 `volumes/vol-01/` 的黄金三章规划产物。若缺失,则保持 legacy free-writing fallback
|
|
60
|
+
- 遇到 `volume:outline` / PlotArchitect packet 时,若 `packet.manifest.inline.genre_excitement_map` 存在,原样透传给 `plot-architect`;这是 CLI 按 `brief.md` 题材匹配后的 Ch1-3 默认爽点映射,skill 层不要重算或改写
|
|
41
61
|
- 遇到 `review:*`(卷末回顾):按 packet.next_actions 执行;必要时暂停让用户阅读 `volumes/vol-XX/review.md`
|