2026-04-14-story-system-final-convergence-spec.md 15 KB

Story System 最终收束 Spec

日期: 2026-04-14 状态: 草案 v1 定位: 基于当前代码真实状态,把 Story System 从“半成品并存”收束到“六层主链 + 消费端同步”的最终 spec


1. 文档定位

1.1 这份 spec 解决什么问题

前面的文档已经分别回答了三个问题:

这份 spec 解决的是更直接的问题:

在不考虑向后兼容的前提下,如何把现在的代码、CSV、合同、提交链、投影链和消费端,一次性收束到最终可用状态。

1.2 一句话结论

这次收束的目标不是“再补一个模块”,而是:

  • 六层全做
  • 旧散写路径直接删
  • context_manager 降级为纯 JSON 组装器
  • CSV_CONFIG + 裁决表 + 合同树 + commit/projection 成为唯一主链
  • 所有消费者只吃合同和投影视图

2. 已确认的关键决策

这轮 brainstorming 已经确认以下决策,不再反复摇摆:

2.1 范围

  • 六层全覆盖
  • 不只改代码层
  • 必须同步改 skill / agent / CLI / eval / docs 等消费端

2.2 向后兼容

  • 不考虑向后兼容
  • 旧散写路径、旧直读路径、旧 fallback 路径,能删就删
  • 不保留 deprecated 双路径

2.3 context_manager

  • 降级为 纯 JSON payload 组装器
  • 不再负责 text 渲染
  • 不再保留为旧说明书式文本输出服务的 snapshot 逻辑

2.4 CSV_CONFIG

  • 放在 reference_search.py
  • 形态模仿 ui-ux-pro-max/core.py
  • 每张表显式声明 file / search_cols / output_cols / poison_cols / role

2.5 裁决层

  • 新建独立 裁决规则.csv
  • key 为题材
  • 它回答的是“命中后怎么裁决、优先谁、注入哪层”,不是“查哪些表”

2.6 anti-ai-guide.mdcore-constraints.md

  • anti-ai-guide.md 保留为 md 真源
    • 不拆 CSV
    • 不给消费者直读
    • 只在需要的步骤被上游吸收后转写
  • core-constraints.md 不再整篇读取
    • 拆成具体约束
    • 分步骤落到合同、runtime、review、commit 校验和消费端文案里

2.7 消费端真源

  • 所有消费者只允许直接吃:
    • 合同树
    • CHAPTER_COMMIT
    • 投影视图
  • 不再允许运行时直接读 CSV / md / reference 来补洞

2.8 首批题材范围

这次先做好 7 个题材:

  1. 西方奇幻
  2. 东方仙侠
  3. 科幻末世
  4. 都市日常
  5. 都市修真
  6. 都市高武
  7. 历史古代

其余题材不在本轮收束范围内。

2.9 实施顺序

  • 从底层往上推
  • 走串行,不走并行
  • 先把基础收稳,再做消费者同步

3. 总体链路

最终链路固定为:

知识表 / 裁决表
        ↓
CSV_CONFIG + reference_search
        ↓
story_system_engine
        ↓
MASTER / VOLUME / CHAPTER / REVIEW
        ↓
context_manager(只出 JSON)
        ↓
context-agent(按示例写任务书)
        ↓
webnovel-write Step 2(只吃任务书)
        ↓
review / data-agent
        ↓
CHAPTER_COMMIT
        ↓
projection writers
        ↓
state / index / summaries / memory / vector

这里有两个硬边界:

  1. 消费端不再运行时直读知识层
  2. 写后事实只允许经 CHAPTER_COMMIT -> projection 进入各存储

4. Section 1:CSV_CONFIG 注册层

4.1 要做什么

reference_search.py 里引入注册式 CSV_CONFIG,替代当前全局硬编码的:

  • _SEARCH_FIELD_WEIGHTS
  • _CONTENT_COLUMNS

改成每张表自己定义:

  • file
  • search_cols
  • output_cols
  • poison_cols
  • role

4.2 目标形态

CSV_CONFIG = {
    "命名规则": {
        "file": "命名规则.csv",
        "search_cols": ["关键词", "意图与同义词", "核心摘要"],
        "output_cols": ["编号", "命名对象", "核心摘要", "大模型指令", "详细展开"],
        "poison_cols": ["毒点"],
        "role": "base",
    },
    "场景写法": {
        "file": "场景写法.csv",
        "search_cols": ["关键词", "意图与同义词", "核心摘要"],
        "output_cols": ["编号", "模式名称", "核心摘要", "大模型指令", "详细展开"],
        "poison_cols": ["毒点"],
        "role": "base",
    },
    "题材与调性推理": {
        "file": "题材与调性推理.csv",
        "search_cols": ["题材关键词", "别名"],
        "output_cols": ["题材", "默认调性", "推荐基础表", "推荐动态表"],
        "poison_cols": ["毒点"],
        "role": "route",
    },
    "裁决规则": {
        "file": "裁决规则.csv",
        "search_cols": ["题材"],
        "output_cols": [
            "题材",
            "风格优先级",
            "爽点优先级",
            "节奏默认策略",
            "毒点权重",
            "冲突裁决",
            "contract注入层",
            "反模式",
        ],
        "poison_cols": [],
        "role": "reasoning",
    },
}

4.3 改动要求

  • reference_search.py
    • 改为从 CSV_CONFIG 读取 per-table 配置
  • story_system_engine.py
    • 不再内部硬编码表角色
    • 改为使用 CSV_CONFIG
  • 新增校验脚本
    • 校验 CSV_CONFIG
    • 校验 CSV 表头
    • 校验 README.md

4.4 验收

  • 同一 CLI 在不同表上确实用的是不同 search_cols
  • CSV_CONFIG 的每张表字段都能在 CSV 头里找到
  • 校验脚本通过

5. Section 2:CSV 内容修补

5.1 要做什么

对现有表做一次统一审计和修补,让它们能稳定被裁决层和合同层消费。

5.2 重点问题

  • 毒点列命名不统一
  • 路由表字段不足
  • 同义词填充不足
  • 各题材覆盖不均衡

5.3 具体改造

5.3.1 毒点列统一

把以下旧列统一改名为 毒点

  • 反面写法
  • 忌讳写法
  • 常见误区
  • 常见崩盘误区

5.3.2 路由表补字段

题材与调性推理.csv 至少补齐:

  • 推荐基础表
  • 推荐动态表
  • 默认调性
  • 风格锚点

5.3.3 内容补全规则

所有补全都手工做,不写自动迁移脚本。

最低要求:

  • 每张表至少覆盖这 7 个题材的常见场景
  • 每条 意图与同义词 至少 3 个同义表达
  • 每条 毒点 非空

5.3.4 README 同步

README.md 必须同步更新:

  • 毒点列统一命名
  • 路由表新字段
  • 各表 schema 描述

5.4 验收

  • 所有表的毒点列统一叫 毒点
  • 路由表能返回推荐基础表和动态表
  • READMECSV_CONFIG 对齐

6. Section 3:裁决表

6.1 要做什么

新建 裁决规则.csv,作为独立 Reasoning Layer

它不负责“查哪些表”,只负责:

  • 多条命中后怎么选
  • 哪类爽点优先
  • 哪类毒点更致命
  • 结果注入合同树哪一层

6.2 与路由表的边界

  • 路由表:回答“查哪些表”
  • 裁决表:回答“查到之后怎么用”

这正是 ui-ux-pro-max 里:

  • products.csv
  • ui-reasoning.csv

的对应关系。

6.3 字段

裁决规则.csv 至少包含:

  • 题材
  • 风格优先级
  • 爽点优先级
  • 节奏默认策略
  • 毒点权重
  • 冲突裁决
  • contract注入层
  • 反模式

6.4 首批覆盖

先覆盖 7 个题材,各 1 行。

6.5 验收

  • source_trace 能追溯到裁决表
  • 多表命中时,顺序符合 冲突裁决
  • 同题材输出能解释“为什么是这些条目进入合同”

7. Section 4:engine 接入裁决表

7.1 当前问题

现在的 story_system_engine.build() 只有:

  1. 路由
  2. 检索
  3. 直接组装

没有显式裁决层。

7.2 目标流程

改成:

  1. _route()
  2. _collect_tables()
  3. _load_reasoning()
  4. _apply_reasoning()
  5. _rank_anti_patterns()
  6. _assemble_contract()

7.3 新增方法

  • _load_reasoning(genre)
  • _apply_reasoning(reasoning, base, dynamic)
  • _rank_anti_patterns(reasoning, ...)
  • _assemble_contract(ranked, anti_patterns, reasoning)

7.4 source_trace

最终进入合同的内容都要带:

  • source_table
  • source_id
  • reasoning_rule
  • priority_rank
  • inject_target

7.5 验收

  • writing_guidance 顺序符合裁决表
  • source_trace 都有 reasoning_rule
  • 低优先级冲突条目能被过滤或降级

8. Section 5:context_manager 瘦身

8.1 目标

context_manager.py 从:

  • 数据组装
  • 文本渲染
  • snapshot 缓存
  • checklist/评分说明书

降级为:

  • 纯 JSON payload 组装器

8.2 保留职责

  • 读 contracts
  • 读 runtime sources
  • 组装 genre_profile
  • 组装 writing_guidance
  • 组装 reader_signal
  • 组装 plot_structure
  • 组装 prewrite_validation
  • 返回统一 dict

8.3 删除职责

  • 所有 _render_*
  • 所有旧说明书式 text 输出
  • 为 text 渲染服务的 snapshot 管理
  • 与已拆 builder 重复的内联逻辑

8.4 输出形态

build_context() 只返回:

{
  "meta": {"context_contract_version": "v3", "chapter": 12},
  "story_contract": {},
  "runtime_status": {},
  "latest_commit": {},
  "prewrite_validation": {},
  "plot_structure": {},
  "scene": {},
  "writing_guidance": {},
  "reader_signal": {},
  "genre_profile": {},
  "long_term_memory": {},
  "core": {}
}

8.5 相关要求

  • snapshot_manager.py
    • 若无其他消费方,整文件删除
  • extract_chapter_context.py
    • 不再承担旧审计式文本说明书职责
  • 最终写作任务书
    • context-agent 直接根据 JSON payload + 示例生成

8.6 验收

  • context_manager.py 行数压到 400 行以下
  • 不再有字符串拼接型说明书输出
  • snapshot 逻辑已删除

9. Section 6:旧散写路径清理

9.1 问题

现在仍有两条写入路径并存:

  • 新链:data-agent -> chapter-commit -> projection
  • 旧链:skill / agent 直接写 state / index / summaries / memory

这必须收束成一条。

9.2 要删的路径

webnovel-write

  • Step 2 直接 state set-chapter-status
  • Step 4 直接 state set-chapter-status

其他直写入口

  • skill / agent 中任何 index process-chapter
  • data-agent 中任何直接写 state/index/memory 的描述

9.3 合法直写保留

只保留:

  • webnovel-init
  • webnovel-plan
  • 运维类人工修复命令

都不在创作主链内。

9.4 chapter_status

不再由 skill 分步手推。

改成:

  • accepted commit -> projection 推到 chapter_committed
  • rejected commit -> projection 推到 chapter_rejected

9.5 验收

  • skills/agents/ 里不再有 state set-chapter-status
  • skills/agents/ 里不再有 index process-chapter
  • 各存储只由对应 projection writer 写入

10. Section 7:projection 层收束

10.1 目标

确认 CHAPTER_COMMIT -> projection 是唯一写入链路,并补完 event 路由覆盖。

10.2 要做的事

10.2.1 补全 EventProjectionRouter

对照 story_event_schema.py,确保事件类型覆盖完整。

10.2.2 chapter_status 统一由 state_projection_writer 推进

  • accepted -> chapter_committed
  • rejected -> chapter_rejected

10.2.3 projection_status 回写 commit

最终 commit 文件里不允许残留 pending

10.2.4 失败隔离

单个 writer 失败:

  • 不阻断其他 writer
  • 失败项写 failed
  • 允许只补跑失败 writer

10.3 验收

  • projection_status 最终都是 done / failed / skipped
  • accepted commit 后状态自动推进
  • 单个 writer 失败不拖死全链

11. Section 8:消费端同步

11.1 要改的文件

  • agents/context-agent.md
  • agents/data-agent.md
  • agents/reviewer.md(必要时)
  • skills/webnovel-write/SKILL.md
  • skills/webnovel-review/SKILL.md
  • skills/webnovel-query/SKILL.md
  • skills/webnovel-plan/SKILL.md(检查)
  • skills/webnovel-init/SKILL.md(检查)
  • skills/webnovel-dashboard/SKILL.md
  • skills/webnovel-write/evals/evals.json
  • docs/guides/commands.md

11.2 关键改动

webnovel-write

  • 删除 Step 2/4 的状态直写
  • 删除 Step 2 直接加载 core-constraints / anti-ai-guide
  • Step 1 生成任务书
  • Step 2 只吃任务书
  • Step 5 简化为:
    • 调 data-agent
    • 调 chapter-commit
    • 确认 projection 完成

context-agent

  • research 用底稿
  • 最终按示例写任务书
  • 不再输出旧执行包三层结构

data-agent

  • 只提取事实
  • 只产出 commit artifacts
  • 不再直接写 state/index/memory

webnovel-query

  • 查询路径改成 commit / projection
  • 不再运行时直接拼旧真源

11.3 静态测试

test_prompt_integrity.py 至少新增:

  • skill / agent 不得引用已删散写命令
  • data-agent 不直写
  • CLI 子命令引用都在注册表里

11.4 验收

  • skills / agents 不再引用旧散写路径
  • 静态测试通过
  • eval 与命令文档同步

12. Section 9:向量索引增强 + 时序查询接口

12.1 这轮只做轻量增强

不引入真正的图引擎,不做新项目级图谱系统。

这轮只做两件轻量事:

  1. commit 后把实体/事件写进向量索引
  2. 给现有 SQLite 表加统一的时序查询接口

12.2 向量索引补实体语义

EventProjectionRouter

给关键事件加 vector 路由:

  • character_state_changed
  • power_breakthrough
  • relationship_changed
  • world_rule_revealed
  • world_rule_broken
  • artifact_obtained

新增 vector_projection_writer.py

职责:

  • accepted_events
  • entity_deltas

转成自然语言句子,再写入向量库。

例如:

  • 第47章:韩立突破筑基初期
  • 第47章:韩立与陈巧倩关系变为合作

12.3 时序查询接口

新建 knowledge_query.py,提供:

  • entity_state_at_chapter(entity_id, chapter)
  • entity_relationships_at_chapter(entity_id, chapter)

context-agent research 阶段调用。

12.4 不做的事

  • 不引入 neo4j
  • 不引入 petgraph
  • 不做图遍历
  • 不做关系可视化

12.5 验收

  • 事件 chunk 能进向量库
  • 指定章节状态查询可用
  • 指定章节关系查询可用
  • RAG 能同时命中正文 chunk 和事件 chunk

13. 实施顺序

这轮按严格串行走:

  1. CSV_CONFIG
  2. CSV 内容修补
  3. 裁决表
  4. engine 接入裁决表
  5. context_manager 瘦身
  6. 旧散写路径清理
  7. projection 层收束
  8. 消费端同步
  9. 向量索引增强 + 时序查询

原因很简单:

  • 这不是日常迭代
  • 这是一次性系统收束
  • 中间态存在多久不重要
  • 重要的是每一步的验收标准清楚,最终状态正确

14. 最终判断

这份 spec 的最终判断可以压成五句话:

  1. 六层必须一起收束,不能只补前四层
  2. 消费端不能再直读知识层,必须只吃合同和投影视图
  3. core-constraints 要被拆成具体约束,不再整篇读
  4. anti-ai-guide 保留,但只由上游吸收后转写
  5. CHAPTER_COMMIT -> projection 是唯一写后真源路径

做到这一步,webnovel-writer 才算真正从“半成品并存”进入“统一主链”状态。