日期:2026-04-12 状态:草案 v2 定位:理想态总架构蓝图
当前 webnovel-writer 已经具备以下能力:
references/csv/ 提供条目化知识检索references/*.md 提供方法论与流程约束scripts/data_modules/ 提供 state / index / memory / context 的运行时能力skills/webnovel-* 提供初始化、规划、写作、审查等执行入口但当前系统更准确的状态是:
L0 / L1 / L2 的按步加载能力md 必读 + CSV 检索 的双轨 reference 体系context_manager + genre_* 这类半成品聚合能力真正缺的不是“会不会按需读取资料”,而是:
reference_search.py 只能返回散条目,不能生成稳定的故事系统合同context_manager / genre_* 还没有演进成可持久化的 Story ContractMaster + Overrides 承载结构本 spec 的目标不是继续增强“检索”,而是把项目升级成一个:
的 Story Intelligence System。
仓库中已有:
2026-04-09-skills-restructure-and-reference-gaps.md2026-04-12-story-system-pro-max-retrofit-spec.md它们分别解决:
2026-04-09:skills / references / scripts 的职责边界与资料缺口2026-04-12 retrofit:在不大改现有链路的前提下,为现系统补一个较保守的 story_system本 spec 与它们不同:
换句话说:
retrofit spec 是“怎么稳妥地补”为避免后续实施时两份 spec 相互打架,这里明确边界:
reference_search.py 作为底层 primitive 的定位.story-system/ 作为持久化目录的基本方向StorySystemDict 作为 phase 1 JSON contract 的种子结构Master / Volume / Chapter 三层StorySystemDict 扩展为合同家族,而不再只是一份聚合结果skills 的定位从“直接读 reference”升级为“合同优先 + 局部按需加载”state / memory / index 明确下沉为运行时事实层story_system.py 不再只是一个附加脚本,而是未来的一线中枢genre-profiles.md 不再担任核心配置中心templates/genres/*.md 不再担任题材主知识源如果两份 spec 出现冲突,裁决原则为:
retrofit spec本 spec 明确借鉴 ui-ux-pro-max-skill 的核心链路,而不是照搬它的文件名:
对 webnovel-writer 来说,真正需要学习的是这条系统链,而不是“多几个 CSV”。
webnovel-writer 的理想态,不应再是:
md reference + csv search + skill 手动拼装而应重构为:
Reasoning Layer + Multi-domain Knowledge Layer + Story System Generator + Persistence Contracts + Skill Runtimereferences/csv/ 已经具备良好的条目化方向,理想态中它应升级为:
而不是“补充资料”。
references/*.md 中的方法论、审查规则、AI 味规避、流程规范,仍应保留为 md。
但它们不再直接承担:
webnovel-init / plan / write / review 的最佳状态是:
但这里的“只消费合同”,不是说 skill 从此不再按步加载任何 reference,而是指:
现有:
state.jsonmemory_contractindex.db / vectors / bm25context_managerquery_router都仍然有价值。
但它们的定位应从“主流程拼装器”变为:
本 spec 不推翻 2026-04-09 中“渐进式披露 + 双轨制 + 按需加载”的哲学,而是重新划分消费边界。
anti_patternssystem_constraints这些内容的共同特点是:
但运行时还必须补一条消费边界:
这些内容的共同特点是:
因此理想态不是“contract 替代所有 reference”,而是:
理想态重构要达成 8 个目标:
Master / Volume / Chapter 合同结构.story-system/skills 只消费合同,不再直接拼 reference本 spec 明确不追求以下事情:
reference_search.py 继续作为一线入口genre-profiles.md 继续担任核心配置中心知识迁移必须遵守以下硬规则:
AI味、去 AI 腔、润色替换规则,不进入 CSV这里的“禁止脚本迁移”,针对的是知识内容迁移,不针对正常的工程脚本开发。
理想态系统分为五层:
Reasoning LayerKnowledge LayerContract LayerPersistence LayerSkill Runtime Layer用户意图 / 题材诉求
↓
Reasoning Layer
↓
Knowledge Layer
↓
Story System Generator
↓
Contract Layer
↓
Persistence Layer
↓
Skill Runtime Layer
↓
正文 / 大纲 / 审查 / 状态回写
${CLAUDE_PLUGIN_ROOT}/
├── story_system/
│ ├── data/
│ │ ├── reasoning/
│ │ ├── rules/
│ │ ├── tropes/
│ │ ├── characters/
│ │ ├── pacing/
│ │ └── naming/
│ ├── engine/
│ │ ├── search_engine.py
│ │ ├── reasoning_engine.py
│ │ ├── aggregator.py
│ │ ├── anti_pattern_engine.py
│ │ ├── contract_builder.py
│ │ ├── renderer.py
│ │ └── persistence.py
│ ├── runtime/
│ │ ├── memory_bridge.py
│ │ ├── state_bridge.py
│ │ ├── index_bridge.py
│ │ └── review_bridge.py
│ ├── templates/
│ │ ├── master_setting.md.j2
│ │ ├── volume_brief.md.j2
│ │ ├── chapter_brief.md.j2
│ │ ├── anti_patterns.md.j2
│ │ └── review_contract.md.j2
│ └── cli.py
├── references/
│ ├── csv/
│ ├── shared/
│ ├── outlining/
│ └── review/
├── skills/
└── scripts/
${PROJECT_ROOT}/
├── .webnovel/
└── .story-system/
说明:
CLAUDE_PLUGIN_ROOT 是插件安装目录,负责承载代码、skills、scripts、referencesPROJECT_ROOT 是真实书项目根目录,定义为包含 .webnovel/state.json 的目录.story-system/ 必须落在 PROJECT_ROOT 下,而不是 CLAUDE_PLUGIN_ROOTstory_system/ 是新的一线中枢scripts/reference_search.py 与 scripts/data_modules/ 可继续存在,但不再承载主设计中心engine/ 下的多个文件表示“职责分层目标”,不是 day 1 必须拆成 7 个文件理想态需要清晰的职责边界,但不意味着第一版工程实现必须把每个职责拆成独立文件。
推荐做法:
search_reasoning.py + contract_runtime.py + persistence.py也就是说:
Reasoning Layer 是整个系统的大脑,负责把模糊的创作意图,转成可执行的系统约束。
它回答的不是:
而是:
新增核心路由表:
题材与调性推理.csv题材与调性推理题材与调性推理.csv 仍然必须遵守现有 CSV 通用契约。
这里列出的,是通用列之外的专属列:
| 字段 | 说明 |
|---|---|
题材/流派 |
主题材名 |
中文名 |
供人读的标准名 |
题材别名 |
黑话、俗称、平台常用叫法 |
核心调性 |
草根逆袭、极致拉扯、压抑蓄爆、诡异压迫等 |
节奏策略 |
黄金三章、慢热蓄势、持续兑现、节点爆发等 |
主爽点 |
该题材最核心的兑现类型 |
辅助爽点 |
次级交付 |
冲突引擎 |
冲突主要如何生成 |
适配人设 |
推荐的人设框架 |
适配金手指 |
推荐的外挂或设定类型 |
适配桥段 |
高频桥段方向 |
强制禁忌/毒点 |
题材级红线 |
推荐基础检索表 |
生成系统时优先查的基础域 |
推荐动态检索表 |
生成卷/章简报时优先查的动态域 |
默认查询词 |
当用户输入模糊时的扩展查询词 |
推理顺序应为:
这里必须允许“主辅题材”结构,而不是只识别单一标签。
网文题材经常不是单标签,而是:
赛博朋克 + 克苏鲁修仙 + 直播都市异能 + 恋爱修罗场因此 reasoning engine 不应采用简单的 Top 1 命中逻辑,而应支持多标签加权融合。
建议规则如下:
主题材辅题材核心调性 以主题材为主,辅题材只允许调味,不得反客为主强制禁忌/毒点 采用并集策略主爽点 按主题材排序,辅助爽点 允许来自辅题材推荐基础检索表 / 推荐动态检索表 采用加权合并,而不是单条覆盖简化说法:
这条规则必须写进实现,而不能只停留在概念层。
reasoning engine 不能走向两个极端:
推荐采用 L0 / L1 / L2 三层:
L0 Deterministic RouterL1 Deterministic FusionL2 LLM Classifier / Synthesizer负责:
这层的职责是把自然语言意图收敛成候选集合,而不是直接输出最终文学判断。
负责:
这层保证:即便没有 LLM,也能对清晰输入产出一个可用但偏保守的 MASTER。
只有在以下场景才启用:
LLM 的职责不是自由发挥,而是:
随后必须经过本地 schema 校验,失败则回退到 L1 baseline。
默认要求:
MASTERfallback 策略:
L0 + L1 已得到高置信结果,则不调用 LLM这样做的目的,是把:
同时控制在工程可接受范围内
理想态中,知识层应分成三类,而不是全塞在一起:
Reasoning TablesRule TablesMethodology Docs这些表负责“全局推理与路由”:
| 文件名 | 中文名 | 角色 |
|---|---|---|
题材与调性推理.csv |
题材与调性推理 | 题材路由与全局调度 |
这些表负责“结构化规则与条目知识”:
| 文件名 | 中文名 | 角色 |
|---|---|---|
命名规则.csv |
命名规则 | 人名、地名、势力、功法等命名规则 |
场景写法.csv |
场景写法 | 战斗、对话、冲突、桥段场景的写法模式 |
写作技法.csv |
写作技法 | 技法与误区 |
桥段套路.csv |
桥段套路 | 套路、铺垫、反转、变种 |
人设与关系.csv |
人设与关系 | 人设原型、关系互动、禁区 |
爽点与节奏.csv |
爽点与节奏 | 节奏阶段、情绪调度、崩盘误区 |
金手指与设定.csv |
金手指与设定 | 金手指、世界规则、限制、代价 |
建议后续补两张表:
| 文件名 | 中文名 | 角色 |
|---|---|---|
冲突设计.csv |
冲突设计 | 冲突触发源、升级链、回收方式 |
反派机制.csv |
反派机制 | 反派逻辑、层级、失败方式、禁区 |
这些内容继续保留 md,不进 csv:
review-schema.mdreading-power-taxonomy.mdshared/core-constraints.mdwebnovel-write/references/anti-ai-guide.mdwebnovel-write/references/polish-guide.mdwebnovel-write/references/style-adapter.md原因很简单:
skill 不应再直接消费:
skill 只应消费标准合同。
理想态至少有五类合同:
MASTER_SETTINGVOLUME_BRIEFCHAPTER_BRIEFANTI_PATTERNSREVIEW_CONTRACT负责全书级稳定设定:
负责卷级目标:
负责本章执行要求:
负责把所有题材级、桥段级、角色级、节奏级毒点聚合成显式红线。
负责告诉审查环节:
每份合同可以同时存在两种产物:
但必须明确:
JSON 是唯一真理源Markdown 只是从 JSON 渲染出的只读产物原因:
因此必须执行以下硬规则:
GENERATED FILE / DO NOT EDIT如果 Markdown 被人工修改:
这里需要与 retrofit spec 的 marker 方案明确裁决,避免两份 spec 在 phase 1/2 打架。
retrofit spec<!-- STORY-SYSTEM:BEGIN --> / END 自动生成区块,则脚本只更新 marker 内内容无论 phase 1 还是 phase 2,都必须坚持:
JSON 是唯一真理源既然 JSON 要作为 skill 的稳定输入,就不能只“尽量输出正确”,而必须做结构校验。
建议实现:
MASTER_SETTING / VOLUME_BRIEF / CHAPTER_BRIEF / REVIEW_CONTRACT 定义显式 schemaPydantic 或等价 schema 校验机制最低要求:
anti_patterns 必须始终是列表overrides 必须始终是结构化对象locked / append_only / override_allowed 必须可机读lock_policy 必须始终可机读这不是“测试增强”,而是合同系统的基础完整性约束。
所有合同 JSON 都必须带版本元数据,最低要求:
schema_versioncontract_typegenerator_version推荐规则:
schema_version 使用显式字符串,例如 story-system/v1schema_version,再决定:
StorySystemDict 过渡来的合同,也必须显式写入版本号,而不是默认“无版本”否则 phase 1 生成的旧合同进入 phase 2 后,会在新代码下出现“静默丢字段”或“校验失败但原因不明”的问题。
本 spec 不从零重新发明 JSON contract,而采用以下策略:
retrofit spec 中的 StorySystemDict 作为基础结构MASTER / VOLUME / CHAPTER / REVIEW / ANTI_PATTERNS 五类合同最小字段要求如下。
MASTER_SETTING.json至少包含:
metagenre_reasoningcore_rulesanti_patternssystem_constraintscontractsoverridesVOLUME_BRIEF.json至少包含:
metavolume_goalselected_tropesselected_pacingselected_scenesanti_patternssystem_constraintsoverridesCHAPTER_BRIEF.json至少包含:
metachapter_goalscene_strategyhook_strategymust_coveranti_patternssystem_constraintsoverrides这里的 system_constraints 与 anti_patterns 必须区分:
anti_patterns:明确禁止项system_constraints:能力边界、世界规则、数值限制一个实用判据是:
anti_patternssystem_constraints例如:
金手指每天只能用三次 属于 system_constraints打脸桥段必须靠反派强行降智才能成立 属于 anti_patternsREVIEW_CONTRACT.json至少包含:
metamust_checkblocking_rulesgenre_specific_risksanti_patternssystem_constraintsreview_thresholdsoverrides其中:
must_check:本章/本卷必须重点检查的审查项blocking_rules:命中后直接阻断通过的规则genre_specific_risks:题材特定高风险点review_thresholds:各维度最低通过阈值或 blocking 条件StorySystemDict 到合同家族的映射为避免 phase 1 的 StorySystemDict 到 phase 2 的合同家族迁移时产生歧义,这里给出最小映射。
StorySystemDict 字段 |
phase 2 目标位置 | 说明 |
|---|---|---|
meta |
MASTER_SETTING.meta |
生成来源、查询词、时间戳等元信息 |
route |
MASTER_SETTING.genre_reasoning |
题材路由、候选题材、命中依据 |
master_constraints |
MASTER_SETTING.core_rules + MASTER_SETTING.system_constraints |
题材调性、世界边界、硬约束分拆进入核心规则与系统边界 |
base_context |
MASTER_SETTING.contracts.base_context_seed |
基础表命中结果作为全书级种子上下文 |
dynamic_context |
VOLUME_BRIEF.selected_* + CHAPTER_BRIEF.scene_strategy / hook_strategy / must_cover |
phase 2 由“动态上下文”拆成卷级选择与章级执行要求 |
anti_patterns |
各级合同中的 anti_patterns + 派生 anti_patterns.json |
条目级与题材级毒点进入各合同,再生成运行时聚合视图 |
override_policy |
MASTER_SETTING.contracts.override_policy |
字段覆盖规则与默认 policy |
source_trace |
各合同 meta.source_trace 或审计区 |
调试、审计与追溯信息 |
这张映射表的作用不是冻结最终字段名,而是明确:
在真实书项目根目录 PROJECT_ROOT 下建立:
PROJECT_ROOT/
├── .webnovel/
└── .story-system/
├── MASTER_SETTING.md
├── MASTER_SETTING.json
├── anti_patterns.md
├── anti_patterns.json
├── volumes/
│ ├── volume_001.md
│ ├── volume_001.json
│ └── ...
└── chapters/
├── chapter_001.md
├── chapter_001.json
└── ...
补充规则:
*.json 是合同真源*.md 是渲染产物WORKSPACE_ROOT 出发,但必须先统一解析到真实 PROJECT_ROOT 再读写 .story-system/ANTI_PATTERNS 独立文件与各级合同的关系这里必须避免双真理源:
MASTER_SETTING / VOLUME_BRIEF / CHAPTER_BRIEF 中各自的 anti_patterns 字段,才是分层真源.story-system/ 根目录下的 anti_patterns.json 是派生聚合视图anti_patterns.md 只从 anti_patterns.json 渲染也就是说:
MASTER_SETTING.json.anti_patterns 负责全书级红线VOLUME_BRIEF.json.anti_patterns 负责卷级补充红线CHAPTER_BRIEF.json.anti_patterns 负责章级补充红线anti_patterns.json 负责把“当前可见层级”的红线汇总成运行时/审计友好的扁平视图若出现冲突,以各级合同中的分层字段为准,anti_patterns.json 必须重算,不得反向成为真源。
文件命名规范:
volume_001.jsonchapter_001.jsonmeta.title 中,而不是写进文件名版本控制建议:
.story-system/*.json 与其对应的主 Markdown 渲染文件应默认纳入 git 追踪.gitignore覆盖优先级固定为:
chapter_xxxvolume_xxxMASTER_SETTING但覆盖不是“静默替换”,而必须显式记录覆盖行为。
Master / Volume / Chapter 的覆盖关系必须按字段类型区分,而不是统一“下层覆盖上层”。
| 字段类型 | Master -> Volume | Volume -> Chapter | 说明 |
|---|---|---|---|
locked |
默认不可直接覆盖 | 默认不可直接覆盖 | 是否允许通过 amend-* 突破,取决于 lock_policy |
append_only |
可追加,不可删除 | 可追加,不可删除 | 最终值为并集 |
override_allowed |
可覆盖,需记录 reason | 可覆盖,需记录 reason | 最终值取最近一层 |
补充规则:
Master.locked 对 Volume / Chapter 都生效Volume.locked 只约束本卷下属 ChapterChapter 不能直接“解锁”上层已锁定字段append_only 字段的最终值始终是 Master + Volume + Chapter 的合并结果override_allowed 字段的最终值采用最近一层,但必须保留 override ledgerlock_policy为避免把小说创作中的“合理反转”也物理锁死,所有 locked 字段都必须额外带一个 lock_policy:
system_lockeduser_lockedstory_locked含义如下:
system_locked:系统 schema、基础运行约束、不可被下游合同修改user_locked:用户明确给出的硬约束,运行时不得自动修改,只能由用户显式确认后上游修订story_locked:当前故事系统中的核心稳定设定,不能被 Volume / Chapter 直接覆盖,但允许通过 amend-master / amend-volume proposal + 人工确认 上游改写也就是说:
locked 仍然存在locked 都是同一强度Chapter 直接冲破锁当 chapter_xxx 或 volume_xxx 与上层合同发生冲突时,生成器必须产出显式 override 标记,而不是只保留最终值。
Markdown 层建议使用类似格式:
本章节奏:[Override 自 MASTER: 慢热蓄势 -> 极限爆发]本章桥段:[Override 自 VOLUME: 试探对峙 -> 当场打脸]JSON 层至少要记录:
fieldbase_valueoverride_valuesource_levelreason目的不是给人审美,而是让模型和后续脚本明确知道:
override ledger 必须保留,但默认不应整包注入写作 prompt。
推荐分成两种消费模式:
audit/debug moderuntime prompt mode允许读取完整账本,用于:
只应暴露:
默认禁止:
webnovel-write prompt原因很简单:
所有 override_allowed 字段在发生覆盖时,都应尽量附带 reason。
推荐原因标签:
ARC_ESCALATIONCHAPTER_PAYOFFTWIST_REQUIREMENTPOV_SWITCHCONFLICT_INTENSIFICATION这些标签是推荐值,不是封闭枚举。
允许格式:
reason_tag + free_textfree_text没有原因的覆盖,只能视为低可信覆盖。
字段必须被标记为三类之一:
lockedappend_onlyoverride_allowed示例:
世界规则:locked全局毒点:append_only本章桥段策略:override_allowed没有这个字段级规则,后续局部覆盖会失控。
补充规则:
locked,则必须同时声明 lock_policylock_policy 未声明时,默认按 story_locked 处理,不允许静默放宽对于 append_only 字段,还应补一条规则:
尤其是:
anti_patterns世界规则限制金手指边界这些字段一旦下层能删除上层内容,合同体系就会失去刚性。
此外必须明确 phase 1 的去重策略:
append_only 默认不做语义级自动合并anti_patterns:
也就是说,phase 1 的策略是:
对 skill / agent / 测试体系可见的稳定入口,必须挂到现有统一 CLI webnovel.py 下,而不是在主链里直接引入第二套平行入口。
理想态 CLI 应支持:
python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" story-system generate-master --genre "修仙退婚流"
python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" story-system generate-volume --title "拍卖会卷"
python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" story-system generate-chapter --query "拍卖会打脸"
如果保留 story_system/cli.py,它也只能作为:
而不应成为 skill/prompt 直接依赖的外部命令。
原因:
webnovel.py story-system ... 一条稳定入口参数设计补充规则:
此外必须预留显式合同修订入口:
python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" story-system amend-master --event "主角获得第二核心金手指"
python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" story-system amend-volume --volume 2 --event "阵营关系反转"
python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" story-system refresh-chapter --chapter 15
这类命令的职责不是“随便重算”,而是:
合同生成与修订命令必须遵守幂等性规则。
generate-*amend-*--force-rebuild也就是说:
generate-master 不是“无限次覆盖”amend-*--force-rebuildphase 1 不应假定 .story-system/*.json 已具备复杂的多写者并发合并能力。
因此最低要求是:
generate-* / amend-* / refresh-* 对同一目标文件必须串行执行BUSY / RETRY 错误,而不是继续写入skill 只负责执行,不负责系统拼装。
webnovel-init职责应收敛为:
generate-master.story-system/MASTER_SETTING.json.story-system/MASTER_SETTING.mdwebnovel-plan职责应收敛为:
MASTER_SETTINGgenerate-volumegenerate-chapter如果规划阶段发现以下事件,允许提出 amend-master / amend-volume:
默认流程应为:
contract-auditor / diff analyzer 生成结构化修订建议amend-master / amend-volume除非系统明确配置了自动修订策略,否则不应由 plan skill 自行改写 MASTER
它不应该再自己决定:
这些应该由 story system 统一处理。
webnovel-write职责应收敛为:
chapter briefvolume briefmaster写作阶段默认不允许直接修改 MASTER_SETTING。
只有在检测到“重大结构事件”时,才允许通过显式 hook 进入:
amend-masteramend-volume重大结构事件示例:
也就是说:
MASTER 因章节波动而持续漂移推荐增加一个独立钩子:
contract-auditor它的职责不是改合同,而是:
amend proposalwebnovel-review职责应收敛为:
review contractanti_patterns这是本 spec 最关键的部分之一:不是抛弃旧数据链,而是重新定位。
references/csv/新定位:
references/*.md新定位:
templates/genres/*.md新定位:
templates/output/*.md新定位:
scripts/reference_search.py新定位:
scripts/data_modules/context_manager.py新定位:
story-system contract + memory/state/index演进路径应为:
context_manager,不做平地重写story_systemcontext_manager 收敛为纯运行时上下文装配器也就是说:
Day 2 以后,context_manager 必须有明确的 contract 注入口,而不是只在文档层说“合同优先”。
最小要求:
_build_pack() 读取 .story-system/ 中当前章可见的合同story_contractstory_contract 的优先级高于旧的 genre_profile 摘要和临时全局拼装结果genre_profile + global + reader_signal 组装链推荐顺序:
chapter contractvolume contractmaster contractgenre_profile / global / references换句话说,contract-first 必须落成真实的 pack 组装顺序,而不是停留在 skill 文本。
genre_aliases.py / genre_profile_builder.py / genre-profiles.md这些模块和文档不是“旧包袱”,而是 route table 建设前的重要种子源。
新定位:
genre_aliases.py:继续作为题材归一化字典的现役来源genre_profile_builder.py:继续作为复合题材 hints 的现役来源genre-profiles.md:在 phase 1 / phase 2 期间,继续作为结构化题材参考源它们的退出方式不应是“一刀切降级”,而应是:
题材与调性推理.csvstory_system 优先读 CSV、缺省回退 mdgenre-profiles.md 才从主源降级为参考源在 phase 1 / phase 2 期间,题材相关信息不能出现“双真源并列”。
优先级必须固定为:
.story-system 中的 contract题材与调性推理.csvgenre-profiles.mdtemplates/genres/*.md约束:
context_manager 不得再独立输出与 contract 冲突的题材结论genre-profiles.md 在过渡期只能作为回退源或补充说明源templates/genres/*.md 在过渡期只能作为样例/补充题材源否则就会出现:
这会直接破坏 contract-first 目标
state.json新定位:
它不是故事总设定中心。
index.db / vectors / bm25新定位:
memory_contract / orchestrator / summaries新定位:
这一层与 CSV 的关系应为:
CSV 给规则memory 给事实story_system 负责把规则和事实一起装进合同理想态合同系统不能假设 memory 所有子模块都已经工业化完成。
phase 1 的最低事实输入标准应为:
state.jsonindex.db 中可直接读取的实体、关系、状态变化MemoryOrchestrator 可作为增强项,但不是 phase 1 的硬依赖。
如果 memory 子系统某些组件不可用,合同系统的降级策略应为:
generate-master / generate-volume这部分虽然是理想态 spec,也需要给出最基本的迁移判断标准。
题材与调性推理.csvgenerate-masterreference_search.pycontext_managergenre-profiles.md 作为活跃题材源2026-04-09 的 L0/L1/L2 策略运行story-system 先以内核模块存在,不强制对 skill 暴露webnovel.py story-system ... 形式接入统一入口Volume 层合同genre-profiles.md 仍可作为回退源,不应提前降级context_manager 正式注入 story_contract.story-systemtemplates/genres/*.md 逐步退出主链reference_search.py 只作为底层 primitivestory_system 成为技能层的唯一系统入口在以下条件满足前,不应把 genre-profiles.md 和 templates/genres/*.md 提前降级:
题材与调性推理.csv 已覆盖当前系统支持的主流主题材genre_aliases.py 中的高频别名能在 route table 中找到稳定归一化目标CSV + contract 生成可用结果简单说:
Day 2 以后,contract 应优先接管:
继续由 step-bound reference 保留:
运行时还必须补一条:
context_manager 和 webnovel-write 默认读取最终结算态合同scripts/data_modules/config.py当前 DataModulesConfig 已经是项目级事实上的统一配置入口,覆盖:
理想态 story_system 不应再平行发明第二套完全独立的配置树。
推荐策略:
DataModulesConfigstory_system_* 命名空间StorySystemConfig,也应只是 DataModulesConfig 的薄包装或子视图,而不是完全分家必须避免的反模式:
那样会让 contract、context、memory 三条链路重新分叉。
.story-system 的运维接入既然 .story-system 被定义为新的持久化真源,它就不能处于现有运维链路的盲区。
至少需要接入以下四类系统:
在 Day 2 以后,preflight 至少应增加:
.story-system/MASTER_SETTING.md 是否存在.story-system/MASTER_SETTING.json 是否存在dashboard 不应只监听 .webnovel/。
至少还应关注:
.story-system/MASTER_SETTING.*.story-system/volumes/*.json.story-system/chapters/*.json否则合同变更后,前端不会刷新。
状态报告不应只覆盖 .webnovel/state.json 和现有运行时数据。
还应增加:
Git 模式下通常天然覆盖 .story-system/,但本地降级备份也必须覆盖它。
最低要求:
.webnovel/state.json.story-system/ 的当前合同文件否则恢复点会丢失新的系统真源。
以下模块保留,但降级为下层能力:
reference_search.pyquery_router.pycontext_manager.pygenre_aliases.pygenre_profile_builder.py其中:
context_manager.py 更准确的路径是“保留并演进后收敛”genre_aliases.py / genre_profile_builder.py 更准确的路径是“保留并迁移其知识到 route table”以下目录保留,但职责改变:
references/csv/references/shared/references/outlining/templates/output/以下内容继续保留,但不再是主系统输入:
references/genre-profiles.mdtemplates/genres/*.md理想态应新增:
story_system/engine/search_engine.pystory_system/engine/reasoning_engine.pystory_system/engine/aggregator.pystory_system/engine/anti_pattern_engine.pystory_system/engine/contract_builder.pystory_system/engine/renderer.pystory_system/engine/persistence.py理想态不要求所有旧表立即统一字段名,但要求 story system 统一抽取。
ANTI_PATTERN_SOURCE_FIELDS = {
"题材与调性推理": ["强制禁忌/毒点"],
"人设与关系": ["忌讳写法"],
"爽点与节奏": ["常见崩盘误区"],
"场景写法": ["反面写法"],
"写作技法": ["常见误区"],
"桥段套路": ["忌讳写法"],
}
说明:
retrofit spec 为 桥段套路.csv 新增了 忌讳写法 列,phase 2 必须继续读取该列,避免两份 spec 再次分叉桥段套路.反套路变种 是变体灵感来源,不默认纳入 anti-pattern 聚合金手指与设定.数值控制边界 属于 system_constraints,不应直接等同于 anti-patternANTI_PATTERN_SOURCE_FIELDS所有生成合同中,必须存在醒目的:
## Anti-Patterns该区块是不可逾越的硬红线。
输入:
写个赛博朋克黑客流流程:
MASTER_SETTING.story-system/输入:
规划第一卷拍卖会逆袭流程:
MASTERVOLUME_BRIEFCHAPTER_BRIEF输入:
写第 15 章流程:
chapter_015volumemaster输入:
审查第 15 章流程:
review contractanti_patterns这个 CSV 数据库不需要做“每条知识点一个测试”的重型方案。
测试只需要覆盖:
不建议:
建议保留:
建议额外补两类低成本高价值验证:
locked + lock_policy 行为 test验证重点不是“知识点对不对”,而是:
知识迁移必须人工完成。
禁止:
允许:
工程层可以写脚本、CLI、渲染器、聚合器、持久化模块。
禁止脚本迁移,不等于禁止工程脚本开发。
本 spec 给出的理想态决策如下:
references/csv 升级为主知识仓references/*.md 保留为方法论层templates/genres 降级为样例模板层templates/output 升级为合同模板层reference_search.py 退出一线,降级为底层 primitivegenre-profiles.md 退出核心配置中心,职责转入结构化 reasoning 数据skills/webnovel-* 改为“contract 优先 + 局部 step-bound reference 按需加载”state / index / memory 继续保留,作为运行时事实与证据层story_system 对外只通过统一 CLI webnovel.py story-system ... 暴露稳定入口.story-system 必须接入 preflight / dashboard / health / backup,不能成为运维盲区.story-system/*.json 是唯一真理源,*.md 只是只读渲染产物L0 / L1 / L2,由确定性路由保底、LLM 负责低置信语义融合locked 字段必须带 lock_policy,剧情级核心设定的变更只能走 amend proposal + 用户确认这次重构真正要完成的,不是“把参考资料查得更准一点”。
真正的目标是:
这就是 webnovel-writer 从“离散检索工具”升级为“系统级智能写作底座”的关键跃迁。