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.
- package/README.md +1 -1
- package/agents/chapter-writer.md +69 -29
- package/agents/character-weaver.md +7 -1
- package/agents/plot-architect.md +20 -7
- package/agents/quality-judge.md +239 -15
- package/agents/style-analyzer.md +14 -8
- package/agents/style-refiner.md +48 -25
- package/agents/world-builder.md +8 -1
- package/dist/__tests__/agent-prompts-anti-ai-upgrade.test.js +311 -0
- 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 +156 -0
- 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 +416 -28
- package/skills/start/SKILL.md +23 -3
- package/skills/start/references/vol-planning.md +12 -3
- package/templates/ai-blacklist.json +1275 -54
- package/templates/ai-sentence-patterns.json +167 -0
- package/templates/brief-template.md +5 -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 +18 -1
|
@@ -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
|
|