日期:2026-04-12 状态:草案 v1 目标:在不破坏现有
reference_search.py与 CSV 检索契约的前提下,为 Webnovel Writer 增加“题材推理 + 多表聚合 + Master/Chapter 持久化覆盖”能力。
本 spec 是以下文档的补充,不替代它们:
2026-04-02-harness-v6-design.md2026-04-09-skills-restructure-and-reference-gaps.md其中:
2026-04-02-harness-v6-design.md 负责主流程与 harness 架构。2026-04-09-skills-restructure-and-reference-gaps.md 负责 skills / references / scripts 的职责边界与 reference 设计原则。Story System。当前系统已经能做离散检索,但仍存在三个结构性问题:
因此需要引入一个新的上层能力:
MASTER + Chapter Overrides本轮改造目标只有五个:
story_system.py,作为现有 CSV 检索之上的聚合器。StorySystemDict 的稳定数据契约。.story-system/ 的持久化规范,并明确 Master + Overrides 的覆盖规则。本轮不做以下事情:
reference_search.py 的职责。SKILL.md 文件一定存在于当前仓库。reference_search.py 当前已经稳定承担以下职责:
skill / table / query / genre 过滤该脚本已有回归测试保护,见:
因此本轮不应把它改造成系统级聚合器。正确分层应为:
reference_search.py:底层单次搜索 primitivestory_system.py:系统级 orchestration 与持久化入口现有 CSV 契约已在 README.md 中明确,当前内容量也已经较大。
本轮应坚持:
如果 .story-system/ 只保存“给人看的 markdown”,后续 agent 仍需要再次解析半结构化文本,容易变脆。
因此本轮持久化必须采用双产物:
不能只写“chapter 覆盖 master”。
必须把字段分成三类:
locked:禁止局部覆盖append_only:局部只能补充override_allowed:局部允许覆盖否则局部设定会轻易冲掉全局设定与全局红线。
现有各表的“毒点/误区”字段不统一,例如:
场景写法.csv:反面写法写作技法.csv:常见误区爽点与节奏.csv:常见崩盘误区人设与关系.csv:忌讳写法这本身没有问题。
本轮正确做法是:
story_system.py 内建立 anti-pattern source field 映射Anti-Patterns当前 references/csv 中已存在:
命名规则.csv场景写法.csv写作技法.csv桥段套路.csv人设与关系.csv爽点与节奏.csv金手指与设定.csv现有通用列已稳定:
编号适用技能分类层级关键词意图与同义词适用题材大模型指令核心摘要详细展开因此新增表应继续遵守这个契约,而不是重新发明一套列体系。
当前系统缺失的不是“知识量”,而是以下能力:
新增文件:
webnovel-writer/references/csv/题材与调性推理.csv建议前缀:
GR-这不是普通知识条目表,而是路由表。
它的职责不是提供某一个桥段/某一种技法,而是回答:
除通用列外,新增以下专属列:
| 列名 | 必填 | 说明 |
|---|---|---|
题材/流派 |
是 | 主标签,如“赘婿流”“赛博朋克黑客流”“规则动物园” |
题材别名 |
是 | 同义词、平台黑话、俗称,使用 ` |
核心调性 |
是 | 全局情绪与气质 |
节奏策略 |
是 | 开局节奏、兑现节奏、章节节拍 |
主冲突模板 |
否 | 默认冲突骨架 |
必选爽点 |
否 | 该题材高频必备交付 |
强制禁忌/毒点 |
是 | 题材级全局红线 |
推荐基础检索表 |
是 | 如 `命名规则 |
推荐动态检索表 |
是 | 如 `桥段套路 |
基础检索权重 |
否 | 对基础表的排序提示 |
动态检索权重 |
否 | 对动态表的排序提示 |
默认查询词 |
否 | 当用户输入过于模糊时的默认扩展检索词 |
这张表必须能同时服务三类输入:
明确题材输入
例如:赘婿流
组合题材输入
例如:赛博朋克黑客流
模糊风格输入
例如:压抑一点,后面爆
因此 题材别名 和 默认查询词 是必要字段,不是可有可无。
本轮不强制全表改名,采用映射层:
ANTI_PATTERN_SOURCE_FIELDS = {
"场景写法": ["反面写法"],
"写作技法": ["常见误区"],
"爽点与节奏": ["常见崩盘误区"],
"人设与关系": ["忌讳写法"],
"桥段套路": ["忌讳写法"],
"题材与调性推理": ["强制禁忌/毒点"],
}
当前 桥段套路.csv 只有:
桥段名称前置铺垫核心爽点转折设计反套路变种其中 反套路变种 不是 anti-pattern 字段,不能直接拿来当“毒点”。
因此本轮建议:
桥段套路.csv 新增 忌讳写法 列系统渲染时的 Anti-Patterns 为以下内容的并集:
题材与调性推理.csv 的全局毒点注意:
新增:
webnovel-writer/scripts/story_system.pystory_system.py 是系统聚合层,不是底层检索层。
它负责:
.story-system/ 持久化它不负责:
reference_search.py建议 CLI:
python story_system.py "玄幻退婚流"
python story_system.py "玄幻退婚流" --persist
python story_system.py "拍卖会打脸" --persist --chapter chapter_015
python story_system.py "压抑一点,后面爆" --genre 现言 --persist
python story_system.py "规则动物园" --format json
建议参数:
| 参数 | 必填 | 说明 |
|---|---|---|
位置参数 query |
是 | 用户当前意图或题材描述 |
--genre |
否 | 手动指定题材 |
--chapter |
否 | 章节 override 名,如 chapter_015 |
--persist |
否 | 是否写入 PROJECT_ROOT/.story-system/ |
--format |
否 | markdown / json / both |
--csv-dir |
否 | 兼容测试与自定义目录 |
--story-root |
否 | 指定显式 .story-system/ 目录;仅开发/测试场景使用,主链运行时默认基于 PROJECT_ROOT 解析 |
story_system.py 的执行顺序应固定为:
输入 query 后,优先查 题材与调性推理.csv:
未命中时,按以下顺序降级:
--genre 时,以 --genre 为主query 中抽取与现有各表高频关键词最接近的题材名命名规则|人设与关系|金手指与设定桥段套路|爽点与节奏|场景写法根据题材路由表给出的 推荐基础检索表:
命名规则人设与关系金手指与设定题材与调性推理根据题材路由表给出的 推荐动态检索表:
桥段套路爽点与节奏场景写法写作技法把题材级毒点和条目级误区字段做统一归并。
输出:
StorySystemDict.story-system/建议数据结构:
{
"meta": {},
"route": {},
"master_constraints": {},
"base_context": {},
"dynamic_context": {},
"anti_patterns": [],
"override_policy": {},
"source_trace": []
}
meta记录:
route记录:
master_constraints记录全局不可轻易改动的内容:
base_context保存基础表检索结果:
命名规则人设与关系金手指与设定写作技法dynamic_context保存动态表检索结果:
桥段套路爽点与节奏场景写法anti_patterns统一格式:
[
{
"source_table": "爽点与节奏",
"source_id": "PA-054",
"text": "质疑太弱没有压迫"
}
]
override_policy显式写出:
lockedappend_onlyoverride_allowedsource_trace记录本次命中的来源:
这部分主要用于调试和回溯。
Markdown 不是原始数据,而是人类和 agent 的可读视图。
它必须做到:
建议 Markdown 输出结构:
# Story System
## Meta
## Route
## Master Constraints
## Base Context
## Dynamic Context
## Anti-Patterns
## Source Trace
必须保留一个显著章节:
## Anti-Patterns(绝对毒点,切勿触碰)
展示规则:
例如:
- `严禁配角连续抢戏超过 300 字`(来源:GR-003)
- `打脸节奏不能缺最后一拍补刀`(来源:PA-054)
规则必须明确:
这里必须遵守项目现有运行时目录术语,而不是使用当前源码仓库目录做推断:
CLAUDE_PLUGIN_ROOT
skills / scripts / referencesWORKSPACE_ROOT
.claude/.webnovel-current-project 指针解析当前书项目PROJECT_ROOT
.webnovel/state.json 的目录因此 .story-system/ 的默认落盘位置必须是:
PROJECT_ROOT/.story-system/而不是:
CLAUDE_PLUGIN_ROOTWORKSPACE_ROOT建议目录:
PROJECT_ROOT/
.webnovel/
正文/
大纲/
设定集/
.story-system/
MASTER_SETTING.md
MASTER_SETTING.json
chapters/
chapter_001.md
chapter_001.json
chapter_015.md
chapter_015.json
运行时约束补充:
WORKSPACE_ROOT 出发webnovel.py --project-root "${WORKSPACE_ROOT}" where 解析到真实 PROJECT_ROOTstory_system 若进入主链,应只认解析后的 PROJECT_ROOT--story-root 只作为开发期 override,不应成为 skills 的默认输入MASTER_SETTING.* 负责保存:
chapters/chapter_xxx.* 负责保存:
locked以下内容只能从 Master 读取,chapter 不允许覆盖:
append_only以下内容 chapter 只能补充,不可删除 master 已有内容:
合并方式:
override_allowed以下内容 chapter 可覆盖 master 默认值:
最终写作时生效的红线为:
生效红线 = Master 全局红线 ∪ Chapter 局部红线
注意:
为避免覆盖人工修改,本轮建议采用以下策略:
建议 marker:
<!-- STORY-SYSTEM:BEGIN -->
... 自动生成内容 ...
<!-- STORY-SYSTEM:END -->
marker 外的手写内容,脚本不得改动。
当前仓库中未直接暴露可改的 webnovel-plan / webnovel-write 的 SKILL.md 文件落点。
因此本 spec 不假定:
本轮只定义接入契约。
未来接入层必须满足:
chapters/[当前章节].json,优先读取它。override_allowed 字段,chapter 优先。append_only 字段,chapter 与 master 合并。locked 字段,只能读取 master。Anti-Patterns。接入层建议使用如下约束:
【核心状态读取逻辑】
1. 若存在 `.story-system/chapters/[当前章节].json`,先读 chapter。
2. `override_allowed` 字段以 chapter 为准。
3. `append_only` 字段按并集合并。
4. `locked` 字段只能服从 `.story-system/MASTER_SETTING.json`。
5. `Anti-Patterns` 为全局与局部的并集,任何一条都不可违反。
交付:
题材与调性推理.csv桥段套路.csv 新增 忌讳写法references/csv/README.md本阶段不要求批量改写既有表内容。
交付:
story_system.pyreference_search.py 不改职责StorySystemDict交付:
.story-system/ 自动创建MASTER_SETTING.* 持久化chapter_xxx.* 持久化交付:
本项目不需要把每个知识点都写成测试。
本轮测试只保护系统契约,不保护内容细节。
至少新增以下轻量测试:
题材路由测试
题材与调性推理.csv聚合结构测试
StorySystemDict 顶层字段完整anti-pattern 聚合测试
覆盖规则测试
locked 不会被 chapter 覆盖append_only 正确并集override_allowed chapter 优先持久化测试
--persist 会写出 md + json底层搜索回归
reference_search.py 测试继续通过本轮不要求:
最大风险不是代码复杂度,而是职责混淆。
必须避免:
reference_search.py 改坏反套路变种 错当成毒点字段本轮仍遵守当前 CSV 原则:
正确上线顺序必须是:
不能跳过中间层,直接让 prompt 去拼 CSV 检索结果。
本轮架构升级的核心不是“把检索做得更大”,而是:
最终目标不是“搜索更花”,而是:
开书有 Master,写章有 Override,任何时刻都有可追溯、可持久、可服从的系统级上下文。