Browse Source

feat(v7): 完成十维知识分发切换

lingfengQAQ 3 months ago
parent
commit
a48fd6cdee
47 changed files with 440 additions and 144 deletions
  1. 1 1
      .trellis/spec/backend/database-guidelines.md
  2. 2 2
      .trellis/spec/backend/directory-structure.md
  3. 1 0
      .trellis/spec/backend/index.md
  4. 74 0
      .trellis/spec/backend/knowledge-runtime.md
  5. 6 6
      .trellis/tasks/07-10-knowledge-runtime-framework/implement.md
  6. 8 8
      .trellis/tasks/07-10-knowledge-runtime-framework/prd.md
  7. 7 7
      docs/architecture/multi-agent-adaptation-spec-2026-06-05.md
  8. 96 39
      docs/architecture/story-repo-spec-2026-06-10.md
  9. 36 28
      docs/architecture/v7-prd.md
  10. 6 2
      v7/bin/webnovel-writer.js
  11. 0 1
      v7/docs/knowledge/调用者与字段矩阵.md
  12. 3 3
      v7/references/README.md
  13. 1 1
      v7/references/追读/钩子-危机钩.md
  14. 0 1
      v7/references/题材/仙侠.md
  15. 0 1
      v7/references/题材/历史.md
  16. 0 1
      v7/references/题材/古言.md
  17. 0 1
      v7/references/题材/奇幻.md
  18. 0 1
      v7/references/题材/年代.md
  19. 0 1
      v7/references/题材/幻言.md
  20. 0 1
      v7/references/题材/快穿.md
  21. 0 1
      v7/references/题材/悬疑.md
  22. 0 1
      v7/references/题材/末世.md
  23. 0 1
      v7/references/题材/游戏.md
  24. 0 1
      v7/references/题材/玄幻.md
  25. 0 1
      v7/references/题材/现言.md
  26. 0 1
      v7/references/题材/种田.md
  27. 0 1
      v7/references/题材/科幻.md
  28. 0 1
      v7/references/题材/衍生.md
  29. 0 1
      v7/references/题材/都市.md
  30. 7 1
      v7/roles/事实审查.md
  31. 6 5
      v7/roles/编辑审.md
  32. 52 1
      v7/scripts/pack-install-e2e.mjs
  33. 9 5
      v7/skills/webnovel-writer/SKILL.md
  34. 2 1
      v7/src/commands/save-review.js
  35. 1 1
      v7/src/installer/vendor.js
  36. 1 1
      v7/src/prep/index.js
  37. 2 2
      v7/src/state-machine/detectors.js
  38. 19 0
      v7/test/fixtures/sample-book/大纲/创作设计/设定/ITEM-002-玄阶令牌.md
  39. 3 0
      v7/test/fixtures/sample-book/定稿/正文/0001-开局.md
  40. 4 0
      v7/test/fixtures/sample-book/定稿/正文/0002-初遇.md
  41. 6 0
      v7/test/fixtures/sample-book/工作区/细纲.md
  42. 15 5
      v7/test/host-shells/generate.test.js
  43. 4 0
      v7/test/installer/install.test.js
  44. 10 0
      v7/test/knowledge/pipeline.test.js
  45. 5 8
      v7/test/references/format.test.js
  46. 29 0
      v7/test/review/orchestration.test.js
  47. 24 0
      v7/test/storage/adapters/DesignReader.test.js

+ 1 - 1
.trellis/spec/backend/database-guidelines.md

@@ -6,7 +6,7 @@
 
 ## 1. 真源原则
 
-1.1 **文件即真相**:一本书的全部持久状态必须且只能存在于书仓库的 Markdown / YAML 源文件中(`定稿/`、`大纲/`、`文风/`)。禁止任何"只存在于数据库里"的状态。
+1.1 **文件即真相**:一本书的全部持久状态必须且只能存在于书仓库的 Markdown / YAML 源文件中(`作品契约/`、`定稿/`、`大纲/`、`文风/`)。禁止任何"只存在于数据库里"的状态。
 
 1.2 多条记录必须**每条一个文件**(角色卡、伏笔、悬念、感情线、信息差各自成文件);禁止大一统数据文件。自由文本归 Markdown 正文,front matter 只承载少量平铺短字段。
 

+ 2 - 2
.trellis/spec/backend/directory-structure.md

@@ -1,6 +1,6 @@
 # 目录结构规范
 
-> 版本:基线 1.1(2026-06-27,M0 仓库骨架落地,回填 §2/§4)。依据:v7 PRD 1.0、story-repo-spec 0.8。
+> 版本:基线 1.2(2026-07-18,十维知识运行时与治理文档分发生效)。依据:v7 PRD 1.6、story-repo-spec 0.17。
 
 ---
 
@@ -68,7 +68,7 @@ v7/
 
 4.2 模块为按职责(Use Case)划分,**非通用工具层**;端口拆小,禁止上帝对象(spec §1.5)。
 
-4.3 知识库真源存放于 `v7/references/`(M4 平移);7.0 运行时尚未接线,**不进 npm files 白名单**——接线里程碑必须同步把它加入白名单并补安装链路断言。
+4.3 十维知识真源存放于 `v7/references/`,治理真源存放于 `v7/docs/knowledge/`;两者都必须进入 npm `files` 和 vendored `.webnovel/`。`references/README.md` 指向的三份治理文档必须在安装产物中存在,具体命令与测试契约见 [知识运行时](./knowledge-runtime.md)。
 
 4.4 命令分级协议(M5):命令模块可选导出 `scope`——`'book'`(缺省,得 `{repoPath, cache}`)/ `'workdir'`(得 `{workdir, packageRoot}`,不建缓存)/ `'workdir-or-book'` / `'anywhere'`;空工作目录仍可跑的命令导出 `allowNoBook = true`(当前仅 `next`,状态机以 `repoPath=null` 判序 1 建书)。定位三分支见 `src/runtime/locate.js`:cwd 含 `book.yaml` 直启 → cwd 含 `.webnovel/` 按当前书解析 → 否则人话提示。
 

+ 1 - 0
.trellis/spec/backend/index.md

@@ -21,6 +21,7 @@
 | [错误处理](./error-handling.md) | 永不崩溃、错误分级、原子性、错误文案 | 基线 1.0 |
 | [质量规范](./quality-guidelines.md) | 零依赖、职责分界、CI 要求、评审清单 | 基线 1.0 |
 | [输出与日志](./logging-guidelines.md) | 作者界面域/机器域分离、报告文风 | 基线 1.0 |
+| [知识运行时](./knowledge-runtime.md) | 十维查询、作品契约、计划对象、章级选择、事实转正与分发契约 | 基线 1.0 |
 
 ## 质量检查(Quality Check)
 

+ 74 - 0
.trellis/spec/backend/knowledge-runtime.md

@@ -0,0 +1,74 @@
+# 知识运行时开发规范
+
+> 版本:基线 1.0(2026-07-18)。产品边界以 PRD 1.6、story-repo-spec 0.17 和 `v7/docs/knowledge/` 为准。
+
+## 1. Scope / Trigger
+
+修改十维知识查询、建书、作品契约、计划对象、章级知识、事实转正、宿主壳或 installer 时适用。目标是保持“通用知识是可选材料,本书文件是运行时真源”:固定路由禁止替作者选择创意,知识缺失可自定义继续,作品契约缺失必须停止。
+
+## 2. Signatures
+
+```text
+knowledge-pack --类型=<主题材> [--副题材=a,b] [--流派=a,b]
+knowledge-query --维度=<十维之一> --问题=<真实未决问题>
+persist-book --file=<json> [--dir=<目录>]
+persist-contract --file=<json>
+persist-design --file=<json>
+read-design <ID或名称>
+finalize <章号> --payload=<json>
+```
+
+章级细纲只认六个声明:`本章节拍`、`本章场景`、`本章技法`、`本章追读`、`知识变体`、`本章对象`。禁止恢复全量索引 DTO 或旧声明桥。
+
+## 3. Contracts
+
+- `persist-book` 必须收到作者确认、完整作品契约和非空 `知识选择`;分类与来源版本必须和 `book`、选择记录一致。
+- `persist-contract` 只保存作者确认的新版本;版本严格递增,生效起章不得早于下一未定稿章。
+- `persist-design` 写 `大纲/创作设计/设定|人物/`;对象至少含 `ID`、`名称`、`## 本书设计`、`## 一致性边界`。目录即计划状态。
+- 事实审查可在报告顶层输出 `factChanges`;`validateReviewReport`、合并和 `工作区/评审报告/事实审查.json` 必须保留该数组。finalize 在任何写盘前校验冲突、路径和 hash,并把事实写入、计划删除、章节提交纳入同一原子边界。
+- 章档案的 `知识选择` 只保存 `维度|名称` 与真实 `变体|说明`,是近期软降权的唯一输入;不保存评分、满意度或空反馈。
+- npm 包和 vendored 运行时必须同时包含 `references/` 与 `docs/knowledge/`;治理 README 链接不得失效。
+
+## 4. Validation & Error Matrix
+
+| 条件 | 必须行为 |
+|---|---|
+| 通用维度目录缺失、查询无命中 | 返回空候选;允许 AI/作者自定义,创作不停 |
+| 作品契约缺失或结构损坏 | 建书/备料/审稿停止并给中文错误;禁止读旧路径补造 |
+| canonical 路由未命中 | 原样报告未命中,禁止伪装成正式条目 |
+| 计划对象 ID、正名或别名冲突 | 写盘前拒绝,零文件变更 |
+| `factChanges` 为冲突/歧义、hash 漂移或路径逃逸 | 整章零写入,要求作者裁决或重新审查 |
+| installer 缺治理文档或 README 链接目标 | 单测和 pack-install e2e 必须失败 |
+
+## 5. Good / Base / Bad Cases
+
+- Good:同一题材查询得到少量材料,规划者组合并写真实变体,作者确认整份细纲后精准注入。
+- Base:某维度为空,细纲写自定义文本,备料/审稿保留该文本并继续。
+- Bad:按题材固定选择唯一流派、人物或关系结算答案;从当前通用库覆盖已经冻结的作品契约。
+
+## 6. Tests Required
+
+- 知识查询:每维最多三条、无命中空集、近期历史只降权不排除。
+- 建书/契约:必需字段、分类/来源同源、更新版本与批次失效、旧路径不回退。
+- 计划/事实:精准读取、重名拒绝、四种 decision、hash 漂移、手动/批量原子一致。
+- 审稿:顶层 `factChanges` 经 schema 归一化后仍存在于正式事实报告。
+- 分发:installer 文件清单、三条治理链接、host-shell drift、`npm pack → 中文路径 init → 完整契约建书 → next → update`。
+
+## 7. Wrong vs Correct
+
+Wrong:
+
+```js
+const choice = topicDefaults[book.类型]
+const contract = await readOldStyleGuide()
+```
+
+Correct:
+
+```js
+const candidates = await queryKnowledge(ctx, { dimension, question, limit: 3 })
+const contract = await new ContractReader(repoPath).readWritingSections()
+if (!contract.ok) return { ok: false, error: `备料停止:${contract.error}` }
+```
+
+前者制造固定答案和双真源;后者只提供材料,并以作者确认的本书契约驱动运行时。

+ 6 - 6
.trellis/tasks/07-10-knowledge-runtime-framework/implement.md

@@ -52,12 +52,12 @@
 
 ## 阶段 5:分发与文档一次性切换
 
-- [ ] 5.1 更新 CLI help、webnovel-writer skill、编辑审 role 和 host shells,删除题材流派指导与恩怨档位话术。
-- [ ] 5.2 更新 sample-book、命令/state/prep/review/finalize fixtures 和测试到 0.17 目标书仓。
-- [ ] 5.3 installer vendoring 加入 `docs/knowledge/`,验证安装后 references README 的治理链接存在。
-- [ ] 5.4 激活 story repo spec 0.17,更新架构文档当前态;不留下“待运行时实施”的错误状态。
-- [ ] 5.5 全库搜索旧路径、旧字段、全量菜单和无消费者字段,允许的历史归档材料单独列明。
-- [ ] 5.6 运行完整质量门后提交“分发收口”单元。
+- [x] 5.1 更新 CLI help、webnovel-writer skill、编辑审 role 和 host shells,删除题材流派指导与恩怨档位话术。
+- [x] 5.2 更新 sample-book、命令/state/prep/review/finalize fixtures 和测试到 0.17 目标书仓。
+- [x] 5.3 installer vendoring 加入 `docs/knowledge/`,验证安装后 references README 的治理链接存在。
+- [x] 5.4 激活 story repo spec 0.17,更新架构文档当前态;不留下“待运行时实施”的错误状态。
+- [x] 5.5 全库搜索旧路径、旧字段、全量菜单和无消费者字段,允许的历史归档材料单独列明。
+- [x] 5.6 运行完整质量门后提交“分发收口”单元。
 
 ## 质量门
 

+ 8 - 8
.trellis/tasks/07-10-knowledge-runtime-framework/prd.md

@@ -20,14 +20,14 @@
 
 ## Acceptance Criteria
 
-- [ ] 建书、规划、写作、审稿和定稿的知识调用链均有行为测试与降级测试。
-- [ ] 同题材输入不会被固定路由收敛到唯一创意或章节方案。
-- [ ] 生成侧与审查侧使用同一版本的本书契约和本书化设定。
-- [ ] 最终书级选择与来源版本固化在作品契约中;契约四类更新路径、未定稿生效边界和批次失效均有行为测试。
-- [ ] 设定、人物和命名结果能够持久化、精准读取并接受一致性审查。
-- [ ] 计划对象不会被当成既成事实;无冲突事实自动转正,冲突事实不会静默覆盖。
-- [ ] 章级知识随细纲整体确认,近期重复只触发软性降权或提醒;不存在逐条评分、章后反馈或作者侧扩库流程。
-- [ ] installer、目标 schema 一次性切换和源码回滚点明确且测试通过;vendored 运行时包含知识治理文档,不产生失效链接;不存在旧路径双读或书仓数据迁移器。
+- [x] 建书、规划、写作、审稿和定稿的知识调用链均有行为测试与降级测试。
+- [x] 同题材输入不会被固定路由收敛到唯一创意或章节方案。
+- [x] 生成侧与审查侧使用同一版本的本书契约和本书化设定。
+- [x] 最终书级选择与来源版本固化在作品契约中;契约四类更新路径、未定稿生效边界和批次失效均有行为测试。
+- [x] 设定、人物和命名结果能够持久化、精准读取并接受一致性审查。
+- [x] 计划对象不会被当成既成事实;无冲突事实自动转正,冲突事实不会静默覆盖。
+- [x] 章级知识随细纲整体确认,近期重复只触发软性降权或提醒;不存在逐条评分、章后反馈或作者侧扩库流程。
+- [x] installer、目标 schema 一次性切换和源码回滚点明确且测试通过;vendored 运行时包含知识治理文档,不产生失效链接;不存在旧路径双读或书仓数据迁移器。
 
 ## Notes
 

+ 7 - 7
docs/architecture/multi-agent-adaptation-spec-2026-06-05.md

@@ -1,8 +1,8 @@
 # Webnovel Writer 多宿主与多智能体适配 Spec
 
-> 日期:2026-06-05(v3 修订:2026-06-11;v3.1:同日,hook 语义 deny → ask,依据 #113;v3.2:2026-06-12,按 PRD 1.0 §10.2 修订——安装器重写为工作目录布局、AGENTS.md 公约数层、SessionStart 注入、模板条件块、放弃插件市场;v3.3:2026-06-26,RFC 后续决策——两审模式、审稿清单定义;v3.4:2026-06-27,RFC 深度核验——事实审查增 D3 未登记伏笔检测 category;v3.5:2026-07-02,设计边界回顾——§6.1 目录图角色清单同步两审实态;v3.6:2026-07-03,M1-M5 review S-2——§7.1 registry 示例补 M5 实态字段 detect_bin/install_dir 等,照抄示例不再被 validator 打回;v3.7:2026-07-04,M6 自动模式——SKILL.md 单源增「自动模式(连写)」段并重渲染各宿主壳,§5.1 补批次暂存不开第二条写入路径;v3.8:2026-07-07,知识库重构(story-repo-spec 0.15)——§8.1 工作目录布局补知识库 references vendoring,SKILL.md 单源同步知识声明位与建书蒸馏并重渲染各宿主壳)
-> 状态:草案 v3.8
-> 基线:**v7 story repo**(`story-repo-spec-2026-06-10.md` 0.12)+ **PRD**(`v7-prd.md` 1.2,产品法律文本,冲突时以 PRD 为准)。v2 的基线是 v6.1.0 Python runtime,该架构已被 v7 推翻;本版继承 v2 的元层纪律,重写全部基座层。
+> 日期:2026-06-05(v3 修订:2026-06-11;v3.1:同日,hook 语义 deny → ask,依据 #113;v3.2:2026-06-12,按 PRD 1.0 §10.2 修订——安装器重写为工作目录布局、AGENTS.md 公约数层、SessionStart 注入、模板条件块、放弃插件市场;v3.3:2026-06-26,RFC 后续决策——两审模式、审稿清单定义;v3.4:2026-06-27,RFC 深度核验——事实审查增 D3 未登记伏笔检测 category;v3.5:2026-07-02,设计边界回顾——§6.1 目录图角色清单同步两审实态;v3.6:2026-07-03,M1-M5 review S-2——§7.1 registry 示例补 M5 实态字段 detect_bin/install_dir 等,照抄示例不再被 validator 打回;v3.7:2026-07-04,M6 自动模式——SKILL.md 单源增「自动模式(连写)」段并重渲染各宿主壳,§5.1 补批次暂存不开第二条写入路径;v3.8:2026-07-07,知识库重构(story-repo-spec 0.15)——§8.1 工作目录布局补知识库 references vendoring,SKILL.md 单源同步知识声明位与建书蒸馏并重渲染各宿主壳;v3.9:2026-07-18,story-repo-spec 0.17——宿主壳切换到作品契约、计划对象、四维章级选择与事实转正,安装器同时分发十维知识治理文档)
+> 状态:草案 v3.9
+> 基线:**v7 story repo**(`story-repo-spec-2026-06-10.md` 0.17)+ **PRD**(`v7-prd.md` 1.6,产品法律文本,冲突时以 PRD 为准)。v2 的基线是 v6.1.0 Python runtime,该架构已被 v7 推翻;本版继承 v2 的元层纪律,重写全部基座层。
 > 来源:v2(基于 PR #110 review 重写)+ 2026-06 多平台调研核验 + Trellis 多宿主机制调研(2026-06-11)+ PRD 1.0 + RFC 后续决策(2026-06-26)+ RFC 深度核验(2026-06-27)
 > 定位:把 v7 的格式层(story repo)原封不动地暴露给多个 agent 宿主——格式平台无关,本 spec 只管入口怎么落、角色怎么生成、安装怎么零门槛、支持等级怎么诚实。
 
@@ -114,9 +114,9 @@ Claude Code 的使用体验是其他宿主的对照基准。**插件市场渠道
 
 **完整模式**(推荐):
 - 两审(story repo spec §8 第 6 步:事实审查/编辑审)在支持 subagent 的宿主上用独立 subagent 保证"各自新鲜上下文"。
-- 事实审查:v6 的 5 维度(设定一致性、时间线、叙事连贯、角色一致性、逻辑)+ v7 特有项("要写到的事"核对、泄密候选判断、履历证据验证、未登记伏笔检测 `unregistered_thread` 候选)
-- 编辑审:结构、节奏、商业性、主角动机
-- 输出格式:结构化问题清单(severity + category + blocking),参考 v6 review schema
+- 事实审查:核对设定、时间线、叙事连贯、角色、逻辑、"要写到的事"、泄密候选、履历证据、未登记伏笔,以及细纲引用的计划对象与既有事实;输入含冻结作品契约和已选章级知识审稿切片。需要转正事实时可输出顶层 `factChanges`,冲突/歧义不得替作者裁决。
+- 编辑审:核对结构、节奏、商业性、主角动机、作品契约和已选章级知识审稿切片;不回读当前通用题材/流派条目补规则。
+- 输出格式:两份报告均含结构化问题清单(severity + category + blocking);事实审查可额外含顶层 `factChanges`,schema 归一化和正式报告必须保留。
 
 **兼容模式**(降级):
 - 不支持 subagent 的宿主:主 agent 按同一份两审任务书顺序执行
@@ -272,7 +272,7 @@ node scripts/build-host-shells.mjs --check     # drift check,CI 必跑
 ### 8.1 init
 
 1. **检测环境**:Node ≥ 22(不足时人话提示升级);识别已安装的 agent CLI(按 registry 顺序探测)。
-2. **生成工作目录布局**(story repo spec §2.0):`AGENTS.md`(公约数层,标记块)、`.webnovel/`(Node 脚本、角色定义、知识库 references、模板哈希清单、`books.jsonl`)、检测到的各平台壳(`.claude/`、`.codex/` 等,由生成器按 §5.9 条件块编译)。
+2. **生成工作目录布局**(story repo spec §2.0):`AGENTS.md`(公约数层,标记块)、`.webnovel/`(Node 脚本、角色定义、十维知识 `references/`、治理真源 `docs/knowledge/`、模板哈希清单、`books.jsonl`)、检测到的各平台壳(`.claude/`、`.codex/` 等,由生成器按 §5.9 条件块编译)。
 3. **输出报告**:装到了哪、各宿主支持等级、降级说明、下一步(打开 agent CLI 说"开始写书")。
 
 ### 8.2 update

+ 96 - 39
docs/architecture/story-repo-spec-2026-06-10.md

@@ -1,10 +1,13 @@
-# Story Repo 格式规格(v7 草案 0.16;0.17 目标已冻结)
-
-> **0.17 目标状态(2026-07-16,尚未生效)**:知识库十维治理、作品契约、故事对象两阶段生命周期和章级候选契约已由任务 `07-10-knowledge-taxonomy-governance` 冻结,见 `v7/docs/knowledge/` 与 §14 决策 45-51。运行时框架子任务完成目录、schema、DTO、书仓、installer 与测试的一次性切换后,才将本规格升为现行 0.17;在此之前正文描述的 0.16 路径仍是代码实际格式,不建设双读兼容层。
+# Story Repo 格式规格(v7 现行 0.17)
+
+> 状态:0.17(2026-07-18 生效)。相对 0.16 的变更(决策 45-51 见 §14):
+> - 知识库采用十维唯一归属,治理真源随安装器分发在 `docs/knowledge/`;固定路由只归一书级名称,不选择创意答案。
+> - `作品契约/作品契约.md` 成为唯一书级真源;删除旧书级指导路径、关系结算枚举和题材默认值。
+> - 故事对象采用 `大纲/创作设计/` 计划对象到 `定稿/设定/` 事实对象的两阶段生命周期,事实转正与章节同一提交。
+> - 章级知识按节拍/场景/技法/追读给少量候选,随整份细纲确认;备料与两审只读取所选切片,近期历史只做软降权和提醒。
+> - v7 尚未生产,不提供旧 v7 书仓迁移、旧路径双读或旧 schema 兼容。
 >
-> 状态:0.16。相对 0.15 的变更(2026-07-08 ima 蒸馏收编,决策 43-44 见 §14):
-> - §6.3 恩怨清算档位三档扩五档:有仇必报 | 宿命必偿 | 恩怨分明 | 以直报怨 | 留有余地(从狠到缓;语义随蒸馏范本注入,`knowledge-pack.js`)
-> - 知识库收编 ima 蒸馏批次 20 条(题材/末世、流派 6 含诡秘流新立、节拍 PA-108~110、场景 5、追读钩子 5)+ 存量修正 9 件;路由表 38 条数据行(含表头共 39 个物理行),「诡秘」别名由克苏鲁移交诡秘流
+> 0.16 为 2026-07-08 的历史版本:完成 ima 蒸馏批次 20 条与存量修正 9 件;其关系结算档位设计已由 0.17 决策 47 替代。
 >
 > 0.15 相对 0.14 的变更(2026-07-07 知识库重构,决策 40-42 见 §14):
 > - §5/§6.3/§7 知识层重写适配:题材/流派分维、声明即路由、建书蒸馏契约、恩怨清算迁出文风铁律
@@ -123,6 +126,9 @@
 │   ├── 总纲.md                 # 主题、金手指、结局
 │   ├── 卷纲/
 │   │   └── 第05卷.md           # 主线/支线的推进写在这里,不另设条目
+│   ├── 创作设计/               # 尚未转正的故事对象计划(§4.2)
+│   │   ├── 设定/
+│   │   └── 人物/
 │   ├── 灵感池.md               # 偏离大纲的素材与未用的好点子(§7)
 │   ├── 伏笔/
 │   │   └── 伏笔-031-灭门真凶.md  # 三类线索条目,每条一文件(§5)
@@ -130,9 +136,11 @@
 │   │   └── 悬念-008-神秘老者身份.md
 │   └── 感情线/
 │       └── 感情线-012-林晚主线.md
+├── 作品契约/                   # ── 本书长期创作边界 ──
+│   ├── 作品契约.md             # 唯一书级真源(§6.3)
+│   └── 知识选择记录.md         # 实际采用/拒绝/自定义证据,不进日常上下文
 ├── 文风/                       # ── 品味库 ──
 │   ├── 文风铁律.md             # (§6.1)
-│   ├── 题材流派指导.md          # 建书蒸馏产物:本书写作契约(§6.3)
 │   └── 金句库/                 # 7.0 手动放入;自动收割见 §6.2 附录(7.x)
 ├── 工作区/                     # ── 还没定稿的一切,默认不入 git ──
 │   ├── 细纲.md                 # (§7)
@@ -225,7 +233,31 @@ spec_version: "7.0"
 正文……
 ```
 
-### 4.2 角色卡 `定稿/设定/角色/<正名>.md`
+### 4.2 故事对象:计划与定稿事实
+
+跨章复用、持续约束规划写作或影响一致性的设定/人物先写入 `大纲/创作设计/设定|人物/`;一次性路人、普通物品和临时地点不为目录完整性建档。计划对象可修改、改名或放弃,不触发吃书;目录本身表示计划状态,不再增加状态字段。最小格式:
+
+```markdown
+---
+ID: ITEM-002
+名称: 玄阶令牌
+对象类型: 物品
+别名:
+  - 北境令
+---
+## 本书设计
+(本书采用的具体设计)
+## 一致性边界
+(后续规划、写作和审查不能越过的边界)
+## 知识依据
+(可选:采用了哪些通用方法及本书适配)
+```
+
+`ID` 与名称用于 `本章对象` 精确引用;正名/别名等命名结果附着在对象上,不另建平行命名实体目录。prep 和事实审查只读取细纲显式声明的计划对象,并始终标明“计划不等于已发生事实”。
+
+正文首次建立该对象时,事实审查可在定稿包给出 `factChanges`:每项含安全的 `planPath`、`factPath`、完整事实 Markdown、`decision`、可选 `expectedHash`/`resolution` 和 `removePlan`。`无冲突`可随章节原子转正;`冲突`/`歧义`整章零写入并要求作者裁决;`作者已裁决`必须记录裁决说明。事实文件、计划删除和章节正文属于同一 git commit 与同一精确回滚集合。
+
+#### 4.2.1 角色卡 `定稿/设定/角色/<正名>.md`
 
 front matter 是机检消费的结构化字段(平铺、块列表);正文是自由设定文本。客观事实(境界/位置/持有/状态)由定稿步骤增量更新——这是"客观事实记账"的落点。**只记设定原意与已发生事实,不写"第 N 章登场/第 M 卷洗白"这类排程**(不变量 13)——排程归 `大纲/卷纲`,角色的未来走向归感情线等线索条目。
 
@@ -373,7 +405,7 @@ front matter 是机检消费的结构化字段(平铺、块列表);正文
 - 不要用天气开篇(出处:第 89/103/121 章三次否决)
 ```
 
-规则入铁律走"三次同类否决→系统提议→作者确认"的流程,每条带出处。文风铁律只承载**作者品味**(禁词/禁句式/口癖/节奏偏好/来自否决的规则);题材知识(含恩怨清算,原 0.14 的"反和解"节)归 §6.3 契约与知识条目毒点,不写进本文件。
+规则入铁律走"三次同类否决→系统提议→作者确认"的流程,每条带出处。文风铁律只承载**作者品味**(禁词/禁句式/口癖/节奏偏好/来自否决的规则);题材、流派、创意约束及关系结算边界归 §6.3 作品契约,不写进本文件。
 
 ### 6.2 金句库 `文风/金句库/`
 
@@ -381,32 +413,49 @@ front matter 是机检消费的结构化字段(平铺、块列表);正文
 
 **附录(7.x,自动收割,本节为预留设计不在 7.0 实现)**:自动判定只产生**候选**(作者改写且字数相近才候选,净删减不算);作者在对话中夸某段("那儿写得不错")也触发候选;最终入库一律经作者审核(审稿时顺手勾选)——品味决策不交给阈值。每文件保留最近 20 条,旧的轮换归档。
 
-### 6.3 题材流派指导 `文风/题材流派指导.md`
+### 6.3 作品契约 `作品契约/作品契约.md`
 
-建书蒸馏产物:把知识库的题材/流派骨架与本书设定在建书对谈中对撞一次("库怎么说 → 你怎么定"),固化成作者签字的**本书写作契约**。下游(备料、两审)只消费本文件,不回读运行时知识库——库升级不影响在写的书;作者手改本文件走手改补登(序 2 范围)。
+建书时把题材/流派/创意约束材料与作者意图对撞一次,固化为作者确认的本书长期边界。下游(规划、备料、两审)只读取本文件,不回读当前通用书级条目;通用库升级不会静默改变在写作品。契约缺失或损坏属于阻断性源文件错误,不得从文风铁律或任何旧路径补造。
 
 ```markdown
 ---
-题材: 玄幻
+类型: 玄幻
+副题材:
+  - 悬疑
 流派:
   - 系统流
-恩怨清算: 恩怨分明          # 有仇必报 | 宿命必偿 | 恩怨分明 | 以直报怨 | 留有余地(从狠到缓,0.16 扩五档)
-来源:
-  - 题材/玄幻.md@<hash>     # 或整行「对谈共创」(路由未命中时)
+创意约束:
+  - 系统会说谎
+来源版本:
+  - 题材/玄幻.md@sha256:<hash>
+  - 题材/悬疑.md@sha256:<hash>
+  - 对谈共创
+契约版本: 1
+生效起章: 1
+更新原因: 初始建书
+变更类型: 建书
 ---
+## 核心读者承诺
+(读者长期能得到什么)
 ## 骨架约定
-(本书遵循的题材/流派结构约定)
+(本书采用的题材与流派骨架)
+## 题材融合协议
+(主题材、副题材和流派如何分工,冲突时谁优先)
+## 创意约束落地
+(限制、代价和防绕过条件)
 ## 差异化点
-(必填 ≥3 条:本书与流派常规的不同点——蒸馏是过滤器不是复印机)
+- 至少三条本书特有差异
+## 冲突与关系结算原则
+- 主角底线、伤害后果、和解条件、救赎条件、允许余地
 ## 本书专属毒点
 (编辑审逐条核对)
-## 节奏参数
-(首打章数等;恩怨清算档位的本书化表述)
+## 节奏与兑现参数
+(首打章数、阶段兑现等)
 ```
 
-**恩怨清算**(原 0.14 §6.1"反和解",AI 对齐训练的和解倾向对爽文是毒药,只能随写作材料前置反制):纪律本体分布在知识条目毒点里,不设中央规则;档位约束**主角行动线与恩怨结算结果**,不约束配角人设——圣母/和事佬配角是合法设计与冲突来源,红线是其主张不得被叙事背书并软化结算("留有余地"档除外)。毒点措辞一律"恩怨结算不得X/主角不得X",禁止"不得出现X角色"。
+`作品契约/知识选择记录.md` 由持久化层从结构化选择渲染,只保存实际采用的来源/变体和真实发生的拒绝、修改、自定义证据;不保存全量候选、评分、满意度、效果预期或空反馈。最终分类、选择和来源版本同时固化在作品契约 front matter,不能出现两份不同答案。
 
-**缺口降级**:知识库路由未命中 → 契约由对谈现场共创(`来源: 对谈共创`),流程不变;无本文件的书(存量/迁移书)备料跳过该锚点,全流程照常。
+契约只通过显式 `persist-contract` 更新:作者确认的新版本必须严格递增,说明生效起章、原因和变更类型;默认只影响下一未定稿章及以后。作者主动修改、重大改纲或阻断性冲突立即呈报;同类非阻断问题连续两章或同卷三次在下一个作者停顿点呈报;卷末固定复盘。信号只产生修订候选,作者确认前不得落盘。更新会使生效章后的未定稿材料与审稿结果失效,已定稿章节仍走影响分析/吃书。
 
 ## 7. 工作区/ 与细纲
 
@@ -422,9 +471,12 @@ front matter 是机检消费的结构化字段(平铺、块列表);正文
 - 连续弱钩:2 章
 ## 本章提案
 本章定位:推进章。推进伏笔-031(林晚取得实证)、顺手埋下伏笔-058、结尾玄阶令牌现世收钩。
-本章节拍:PA-001 压抑蓄力爆发
-章尾钩子:悬念钩
+本章节拍:PA-026 证据累积逼真相
 本章场景:拍卖会、突破
+本章技法:限制视角呈现
+本章追读:悬念钩
+知识变体:悬念钩递进既有灭门谜题,不另开无主谜团
+本章对象:ITEM-002
 ## 本章要写到的事(确认即生效)
 - [ ] 林晚得知灭门真相的第一条实证
 - [ ] 伏笔-058 埋下:神秘老者来历
@@ -435,7 +487,9 @@ B 方案:本章纯感情线过渡(定位改"过渡章"),伏笔-031 推
 
 作者动作只有三种:点头 / 改 / 选备选。改 = 直接编辑此文件,或一句话让系统改(不变量 10)。
 
-**知识声明位(0.15,声明即路由)**:`本章提案` 段内三条标签行——`本章节拍:`(知识库节拍编号或自定义文本)、`章尾钩子:`(追读钩子类型)、`本章场景:`(顿号分隔多值,场景名或自定义文本)。三者**皆可空**;起草细纲的 DTO 附节拍/场景紧凑索引与场景候选(脚本按场景关键词扫卷纲对应段与上一章结尾,只出候选不拦截),AI 从菜单点选或自定义。备料与两审按声明查知识库注入对应切片与毒点(§8 第 3/6 步);**声明查不到表时注入声明文本本身**,不报错不挡流程。
+**知识与对象声明位(0.17)**:`本章提案` 段可写 `本章节拍:`、`本章场景:`、`本章技法:`、`本章追读:`、`知识变体:`、`本章对象:`。六者皆可空;前四者可多选、组合或自定义,变体可多行,对象只接受计划对象 ID/名称。序 6 按本章任务、卷纲相关段、上章结尾和近期定稿/批内前章历史查询,每维最多三条候选,只给摘要、规划切片、来源与软重复信号,不展示全量菜单,不自动选答案。作者确认整份细纲即确认这些章级软策略,不逐项打断;越过作品契约、人物底线、核心设定或既有事实时仍须独立确认。
+
+备料只读取命中选择的「落笔时」切片,编辑审只读取同一选择的「审稿时」切片;自定义声明和真实变体原样保留。手动定稿与暂存都在清理细纲前把最终选择写入章 front matter 的平铺 `知识选择` 列表(`维度|名称`、`变体|说明`),这是近期历史的唯一输入;未选候选不持久化,重复只降权和提醒,不硬禁有递进/回响/回收目的的复用。
 
 **收卷提议(声明制)**:本章提案可声明"本章收卷"——AI 依据卷纲进度与 `卷规模`(参考值)提议,作者确认细纲即生效,定稿时写入章 front matter `收卷: 是`(§4.1),下次启动触发卷复盘(§10 序 4)。收不收卷是创作决策,只由作者确认;状态机不用章号整除推算卷末。
 
@@ -445,12 +499,12 @@ B 方案:本章纯感情线过渡(定位改"过渡章"),伏笔-031 推
 
 | # | 阶段 | 执行体 | 文件效果 |
 |---|------|--------|----------|
-| 1 | 起草细纲 | 脚本读全书近况 + AI 拟提案 | 生成 `工作区/细纲.md`,含本章定位声明与知识声明位(节拍/钩子/场景,§7);DTO 附知识紧凑索引与场景候选 |
-| 2 | 确认细纲 | **作者** | 细纲的"要写到的事"固化(`自动确认细纲: true` 时默认采纳提案,跳过停顿) |
-| 3 | 备料 | 脚本 | 组装 `工作区/本章写作材料.md`:全书近况+要写到的事+事实切片+信息差边界+近章结尾+反复读清单+文风锚点+题材流派契约(§6.3,无契约的书跳过)+细纲声明命中的知识切片(节拍/场景条目的「落笔时」节;查不到表注入声明文本本身)。**默认精准片段**(当前卷+上一卷时间线、按编号取条目、按需取正文段,§11.1) |
+| 1 | 起草细纲 | 脚本读全书近况 + AI 拟提案 | 生成 `工作区/细纲.md`,含本章定位、要写到的事和六类可选声明(§7);DTO 每维最多给三条相关候选,不发全量菜单 |
+| 2 | 确认细纲 | **作者** | 整份细纲的任务、章级知识选择、变体和计划对象引用一并确认(`自动确认细纲: true` 时默认采纳提案,跳过停顿) |
+| 3 | 备料 | 脚本 | 组装 `工作区/本章写作材料.md`:全书近况+要写到的事+定稿/批内事实+信息差边界+近章结尾+反复读清单+文风锚点+作品契约所需小节+显式引用的计划对象+细纲所选知识的「落笔时」切片。契约缺失阻断;通用章级知识无命中按自定义继续。**默认精准片段**(当前卷+上一卷时间线、按编号取条目、只读命中知识,§11.1) |
 | 4 | 写稿 | AI(干净上下文) | `工作区/草稿-*.md`;关键章 best-of-N |
 | 5 | 机检 | 脚本(零 token) | **只做可计数项**:字数、禁词/禁句式、复读检测、跨章高频意象统计("空气仿佛凝固"全书 47 次这类)、句式体检(句长方差/段落长度分布/高频句式开头)、新专名比对名册、front matter 格式完整性、条目文件是否变动(只查形式不判内容)、信息差关键词命中(**只出候选清单,不拦截**)。不过关直接打回第 4 步,不打扰作者 |
-| 6 | 两审 | AI ×2(各自新鲜上下文) | **事实审查**(v6 的 5 维度:设定一致性、时间线、叙事连贯、角色一致性、逻辑 + v7 特有项:①"要写到的事"逐条核对正文;②机检泄密候选是否真泄密;③条目履历引用的章内证据是否属实;④**未登记伏笔检测**:搭整章通读反查"正文里出现疑似伏笔但无对应条目",只出候选不拦截,见下)、**编辑审**(结构、节奏、商业性、主角动机:主角每个主要行动是否有即时驱动、可见压力、预期收益、情绪原因,或明确标注为非理性行为;**毒点核对**:审稿输入按 book.yaml 类型/流派与细纲声明附上契约专属毒点与命中知识条目毒点,逐条核对——恩怨清算类毒点只判叙事结果与主角行为,不判配角人设,§6.3)→ `工作区/评审报告/`。输出格式:结构化问题清单(severity + category + blocking),参考 v6 review schema。|
+| 6 | 两审 | AI ×2(各自新鲜上下文) | **事实审查**核对设定/时间线/连贯/角色/逻辑、要写到的事、泄密候选、履历证据、计划对象与既有事实,并输出可选 `factChanges`;冲突/歧义须作者裁决。**编辑审**核对结构、节奏、商业性、主角动机、作品契约和所选章级知识的审稿切片;合理宽恕与有代价救赎合法,无成本洗白或无动机让渡底线才报问题。契约问题填写条款标识。两审输出结构化问题清单(severity + category + blocking)→ `工作区/评审报告/`。|
 | 7 | 审稿 | **作者** | `工作区/审稿.md` = 草稿 + 三句话审意见 + 待确认新专名 + 章摘要(扫一眼可改)。动作:接受 / 改完接受 / 打回。手动模式逐章审;自动模式按批次审(§8.1)。**定稿永远需要作者敲定**(不变量 5) |
 | 8 | 定稿 | 脚本,**原子** | 见下 |
 
@@ -482,7 +536,7 @@ v7 的伏笔/悬念/感情线是**声明制**——系统只跟踪细纲「本
 - **作者裁决**(第 7 步审稿单):登记成条目(触发"开新条目必须写收尾计划",自动防悬空)/ 忽略(普通描写)/ 删掉。
 - 边界:系统只负责"像伏笔但没登记"的提醒,不判断"这个伏笔好不好"。
 
-**定稿的一次 commit 包含**:草稿 → `定稿/正文/`(front matter 写入章档案与条目变动);`设定/` 变更(位置/状态/境界/持有/信息差/名册/时间线追加);涉及的三类条目文件**创建与更新**(本章「埋下/设下/开启」的新条目在此建档——条目文件由定稿创建,声明不建档下一章就会被机检误报"条目不存在";既有条目 front matter + 履历追加);`摘要/章摘要/`(审稿单定稿版);工作区清空。
+**定稿的一次 commit 包含**:草稿 → `定稿/正文/`(front matter 写入章档案、条目变动和细纲最终 `知识选择`);`设定/` 变更(位置/状态/境界/持有/信息差/名册/时间线追加);无冲突/已裁决的 `factChanges` 事实写入及对应计划删除;涉及的三类条目文件**创建与更新**;`摘要/章摘要/`(审稿单定稿版);commit 成功后才清工作区。任一事实冲突、hash 漂移或写入故障都整章零提交并精确回滚本次文件集合。
 
 **commit message 约定**(前缀 ASCII 是机器协议,便于 `git log --grep`):
 
@@ -526,14 +580,14 @@ ch(152): 北境的雪
 | 序 | 条件 | 下一步 |
 |----|------|--------|
 | 0 | 任一源文件解析失败 | **修复确认**:定位到行、展示上下文、AI 提议保留意图的修复、作者确认。全角冒号/逗号出现在结构位置属确定性错误,直接预修复后只报不问。**永不带堆栈崩溃** |
-| 1 | 工作目录无任何书 / 当前书不存在 | **建书引导**:问答式生成 book.yaml(类型+流派按知识库路由表归一)、总纲、第一卷卷纲、题材流派契约(§6.3,蒸馏对撞;路由未命中→对谈共创),生成书仓库(含指路 AGENTS.md),登记进 `books.jsonl` |
-| 2 | 定稿/大纲有未登记手改 | 提议 fix 补登:出示变更清单问"补登吗",确认后脚本 `relink` 入档(`fix(手改): 说明`)并刷新缓存 |
+| 1 | 工作目录无任何书 / 当前书不存在 | **建书引导**:问答式生成 book.yaml、总纲和第一卷卷纲;路由只归一类型/副题材/流派名称,真实未决的创意问题才查询少量候选。作者确认完整作品契约、知识选择和实际裁决后一次性生成书仓库(含指路 AGENTS.md),登记进 `books.jsonl` |
+| 2 | 作品契约/定稿/大纲/文风有未登记手改 | 提议 fix 补登:出示变更清单问"补登吗",确认后脚本 `relink` 入档(`fix(手改): 说明`)并刷新缓存 |
 | 3 | 工作区有未完成流程(细纲/材料/草稿/审稿,含待定稿批次) | 按续跑映射表从中断的阶段继续(见下) |
 | 4 | 最新定稿章声明了收卷(front matter `收卷: 是`,§4.1/§7) | 卷复盘(产物由脚本 commit `vol(NN)` 并刷新缓存,见 §9) |
 | 5 | 距上次体检已满「体检周期」章(体检记录存 `.cache`,丢失则重测,无害) | 体检 |
 | 6 | 其余 | 起草新章细纲(内环第 1 步) |
 
-**序 0 的"源文件"清单(钉死范围,实现不得自行增减)**:`定稿/正文`、`大纲/伏笔|悬念|感情线`、`定稿/设定/角色`、`定稿/设定/信息差` 的 front matter;`book.yaml`;`文风/文风铁律.md` 的 front matter;`定稿/设定/名册.md` 与 `定稿/设定/时间线/` 的表格。清单之外不属序 0 扫描范围(总纲/卷纲/摘要是自由 Markdown,无可失败的结构)。**任一清单文件解析失败都不得静默降级为默认值**——必须进修复确认。
+**序 0 的"源文件"清单(钉死范围,实现不得自行增减)**:`定稿/正文`、`大纲/伏笔|悬念|感情线`、`定稿/设定/角色`、`定稿/设定/信息差` 的 front matter;`大纲/创作设计/设定|人物` 的计划对象格式与跨对象 ID/正名/别名唯一性;`book.yaml`;必需的 `作品契约/作品契约.md`;`文风/文风铁律.md` 的 front matter;`定稿/设定/名册.md` 与 `定稿/设定/时间线/` 的表格。清单之外不属序 0 扫描范围(总纲/卷纲/摘要/知识选择记录是自由 Markdown,无可失败的结构)。**任一清单文件解析失败都不得静默降级为默认值**——必须进修复确认。
 
 **序 3 的续跑映射**(`细纲.md` 计入未完成流程——已确认的细纲是作者决策,不得被序 6 重新起草覆盖):
 
@@ -569,6 +623,9 @@ v6 的 8 个命令全部内化为以上状态。作者只需要一个入口和"
 | 正文 | 读 0152 章结尾 500 字 / 读 0148-0152 章的章摘要 |
 | 时间线 | 读当前卷+上一卷 / 按"在场含某人"过滤 |
 | 设定 | 读林晚角色卡的 front matter / 读世界观的指定小节 |
+| 作品契约 | 按规划、落笔或审稿阶段读取本章需要的小节;缺失或损坏时阻断,不读旧路径补造 |
+| 计划对象 | 按 ID 或名称 `read-design`,只读细纲 `本章对象` 显式引用的对象 |
+| 通用知识 | 按维度和真实未决问题查询最多三条候选;备料/审稿只读细纲最终选择的对应切片 |
 | 全文检索 | 查"玄阶令牌"在全书的出现章与上下文(Grep 正文——正文本身就是无损数据库) |
 | 报表 | 悬了太久清单 / 信息差蓄积报表("读者还不知道主角底牌已 23 章") |
 
@@ -576,7 +633,7 @@ v6 的 8 个命令全部内化为以上状态。作者只需要一个入口和"
 
 ## 12. 迁移映射(v6 → v7,一次性脚本)
 
-迁移引导首先处理**市场版插件卸载 + npx 重装**(v7 不再走插件市场),然后:
+本节只定义 v6 → 当前 v7 的一次性导入。0.17 不迁移开发期旧 v7 书仓,不读取旧路径,也不保留旧 schema 兼容层。迁移引导首先处理**市场版插件卸载 + npx 重装**(v7 不再走插件市场),然后:
 
 | v6 | v7 |
 |----|----|
@@ -589,7 +646,7 @@ v6 的 8 个命令全部内化为以上状态。作者只需要一个入口和"
 | `.webnovel/state.json` | 一次性展开进 `定稿/设定/` |
 | `summaries/` | `定稿/摘要/` |
 | project_memory patterns / scratchpad | `文风/文风铁律.md`(人工过一遍再入) |
-| references(题材模板/追读力/爽点节奏) | 知识层重写适配后继承(0.15:题材/流派分维、声明路由,见 §5/§6.3/§7) |
+| references(题材模板/追读力/爽点节奏) | 按十维宪章逐条重写策展;具体模板不平移,无法抽象为可复用原理者删除 |
 | `.story-system/` 提交链 | 压成初始 commit,原目录只读归档 |
 | index.db / vectors.db / projection_log | 删除(缓存重建;向量为可选插件) |
 
@@ -614,11 +671,11 @@ v6 的 8 个命令全部内化为以上状态。作者只需要一个入口和"
 
 ## 14. 决策记录
 
-### 0.17 目标冻结(待运行时框架子任务一次性生效)
+### 0.16 → 0.17(2026-07-18 运行时框架一次性生效)
 
 45. **知识库采用十维唯一归属**:作品契约层为题材/流派/创意约束,故事对象层为设定/人物/命名,篇章执行层为节拍/场景/技法/追读。每条正式知识只有一个 canonical 路径;桥段、结构、兑现及物品/能力/组织/关系不建平行顶层。边界真源为 `v7/docs/knowledge/维度宪章.md`。
 46. **字段由调用者反推**:不建立十维统一 schema,不预设协同维度或关联维度字段。front matter 只保留会改变筛选、注入、持久化或审查行为的机器信息;来源和策展状态留在开发治理记录。消费者真源为 `v7/docs/knowledge/调用者与字段矩阵.md`。
-47. **作品契约替代题材流派指导**:删除 `文风/题材流派指导.md`,新建 `作品契约/作品契约.md` 作为下游唯一书级真源,`知识选择记录.md` 保存候选、拒绝、自定义和来源证据。删除恩怨清算五档及题材默认值,改用“冲突与关系结算原则”核对动机、责任、代价、边界和读者承诺。
+47. **作品契约替代题材流派指导**:删除 `文风/题材流派指导.md`,新建 `作品契约/作品契约.md` 作为下游唯一书级真源,`知识选择记录.md` 只保存实际采用的来源/变体,以及真实发生的拒绝、修改和自定义证据。删除恩怨清算五档及题材默认值,改用“冲突与关系结算原则”核对动机、责任、代价、边界和读者承诺。
 48. **故事对象分计划与事实**:建书、大纲和对象设计确认的设定/人物/命名结果先进入 `大纲/创作设计/`;正文首次出现并定稿后,无冲突事实随章节原子转入或更新 `定稿/设定/`。冲突、歧义或既有事实改写必须由作者裁决,计划对象可修改或放弃且不触发吃书。
 49. **章级知识随整份细纲确认**:节拍、场景、技法和追读只对真实未决问题给少量候选,允许组合、变体、拒绝和自定义。细纲至少保存最终选择与变体;近期历史只做降权、机械重复提醒和变体说明,不硬禁有递进、回响或回收目的的复用。
 50. **使用记录和反馈最小化**:不增加逐条评分、满意度、章后反馈、自动排名或效果占位记录;拒绝、修改或审稿问题只在真实发生时保存,单次使用不得自动回写通用知识库。
@@ -626,13 +683,13 @@ v6 的 8 个命令全部内化为以上状态。作者只需要一个入口和"
 
 ### 0.15 → 0.16(依据:2026-07-08 ima 蒸馏收编,作者逐项拍板,任务 07-08-kb-ima-distill-integration)
 
-43. **恩怨清算档位三档扩五档**:有仇必报 | 宿命必偿 | 恩怨分明 | 以直报怨 | 留有余地(从狠到缓)。语义:有仇必报=结仇必清算、代价足额落地;宿命必偿=清算可迟到不缺席、因果闭环由叙事兜底兑现;恩怨分明=有恩报恩有仇报仇、等价对付不扩大化;以直报怨=以公正回应仇怨、威胁未除不滥慈悲、除害不虐杀;留有余地=结算保留回旋空间、允许有代价的宽宥。落点:`knowledge-pack.js` 蒸馏范本、`format.test.js` 档位校验、§6.3 契约示例。存量题材取值不回改;`宿命必偿` 暂无题材默认使用,`以直报怨` 由末世首个采用;建书对谈可在五档中选择。
+43. **恩怨清算档位三档扩五档(历史决策,已由决策 47 替代)**:有仇必报 | 宿命必偿 | 恩怨分明 | 以直报怨 | 留有余地(从狠到缓)。语义:有仇必报=结仇必清算、代价足额落地;宿命必偿=清算可迟到不缺席、因果闭环由叙事兜底兑现;恩怨分明=有恩报恩有仇报仇、等价对付不扩大化;以直报怨=以公正回应仇怨、威胁未除不滥慈悲、除害不虐杀;留有余地=结算保留回旋空间、允许有代价的宽宥。该版本曾落在 `knowledge-pack.js`、`format.test.js` 与 §6.3;0.17 已删除枚举、题材默认值和对应运行时字段。
 44. **ima 蒸馏批次收编与策展**:ima.copilot 以订阅库为参照蒸馏的 20 条新条目与 9 件存量修正,经逐条独立审查收编(记录见任务 research/content-review/)。策展裁决:①「诡秘」不立题材——新立 `流派/诡秘流.md`(克苏鲁管恐惧纪律、诡秘流管仿诡秘书骨架,两个知识对象),条目由单书模板泛化重写,路由「诡秘」别名由克苏鲁行移交诡秘流行;②场景维度收入手法型条目(冲突对话/名场面/对比反差/微冲突/画面感单场戏),与事件型并存;③场景关键词须避大纲高频泛词(防候选误触,probe:`sceneCandidates` 测试);④PA-037/040 编号缺口维持 P2 合并裁决不补;⑤ima 云端库不回传不收敛,本地仓库为唯一真源。
 
 ### 0.14 → 0.15(依据:2026-07-07 知识库重构讨论,作者逐项拍板,任务 07-07-knowledge-layer-rework)
 
-40. **知识层从「平移继承」改「重写适配」,消费走声明路由**:v6「CSV + AI 主动关键词检索」废弃(与不变量"只吃整理好的 DTO"冲突,检索触发靠模型自觉不可测试)。知识注入全部由脚本按确定性键查表:书级键=book.yaml 类型+流派(建书蒸馏成 §6.3 契约);章级键=细纲声明位 本章节拍/章尾钩子/本章场景(§7,备料与两审按声明注入切片与毒点)。题材与流派两维分立(题材=玄幻,流派=退婚流,可多选);知识库是旁路增益不是必经关卡——路由未命中→对谈共创,声明查不到→声明本身即知识,无契约旧书照常。
-41. **"反和解"更名"恩怨清算"并迁出文风铁律**:文风铁律回归纯作者品味;恩怨清算纪律分布在知识条目毒点(不设中央规则文件),档位(有仇必报/恩怨分明/留有余地)按题材配默认、建书对谈可调、落契约"节奏参数"节。档位约束主角行动线与恩怨结算结果,不禁配角人设(圣母/和事佬配角合法,红线=叙事背书)。
+40. **知识层从「平移继承」改「重写适配」,消费走声明路由(历史决策,声明与路由细节已由决策 47/49 替代)**:v6「CSV + AI 主动关键词检索」废弃(与不变量"只吃整理好的 DTO"冲突,检索触发靠模型自觉不可测试)。0.15 曾使用书级确定性键和本章节拍/章尾钩子/本章场景三类声明;0.17 改为路由只归一名称、书级以作品契约冻结、章级四维少量候选随整份细纲确认。知识库旁路增益、无命中可自定义继续的原则仍保留。
+41. **"反和解"更名"恩怨清算"并迁出文风铁律(历史决策,已由决策 47 替代)**:0.15 曾把关系结算纪律分布在知识条目毒点并按题材提供档位默认;0.17 已删除该枚举与题材默认,文风铁律仍只承载作者品味,关系边界改由作品契约的自然语言原则表达。
 42. **知识内容纪律(反同质化)**:条目只写结构与禁忌,不写示例情节(示例仅毒点反例);蒸馏差异化点必填 ≥3;毒点喂编辑审(负面清单),生成侧只注入声明命中条目。知乎短篇删除不迁(v7 只考虑长篇);直播文按分类实践归流派(直播流)。
 
 ### 0.13 → 0.14(依据:2026-07-06/07 第三轮全量 review 修复收口)

+ 36 - 28
docs/architecture/v7-prd.md

@@ -1,6 +1,6 @@
 # webnovel-writer v7 产品需求文档(PRD)
 
-> 状态:1.5(2026-07-16 修订,知识库冻结为十维:题材/流派/创意约束、设定/人物/命名、节拍/场景/技法/追读;作品契约替代题材流派指导;删除恩怨清算档位并建立计划对象到定稿事实的两阶段生命周期,依据任务 07-10-knowledge-taxonomy-governance。1.4 于 2026-07-08 修订恩怨清算五档,作为被 1.5 替代的历史决策保留;1.3 于 2026-07-07 修订五维声明路由;1.2 于 2026-07-04 修订 §4 #2 验收用词;1.1 于 2026-07-02 修订 §5 依赖口径;1.0 于 2026-06-12 作者逐项确认定稿)
+> 状态:1.6(2026-07-18 修订,十维知识运行时与 story repo spec 0.17 一次性生效:作品契约成为唯一书级真源,计划对象到定稿事实形成闭环,章级知识按四维少量候选随整份细纲确认,审稿统一为事实审查+编辑审两审。1.5 于 2026-07-16 冻结十维治理;1.4 于 2026-07-08 修订关系结算五档,已被 1.5 删除;1.3 于 2026-07-07 修订旧声明路由,已被 1.5/1.6 替代;1.2 于 2026-07-04 修订 §4 #2 验收用词;1.1 于 2026-07-02 修订 §5 依赖口径;1.0 于 2026-06-12 作者逐项确认定稿)
 > 日期:2026-06-12
 > 读者:①开发实施者(含 AI);②issue 区用户(RFC 母本,裁剪时换大白话)
 > 地位:本 PRD 是 v7 的产品法律文本。spec 0.5 的"冻结"已解除——本 PRD 先行,`story-repo-spec` 与 `multi-agent-adaptation-spec` 随本文档修订(修订指令见 §10)。
@@ -57,15 +57,15 @@ v6 的病根(issue 与代码互证):
 ```text
 ① 安装        npx webnovel-writer init
               (检测 Node ≥22 与已装的 AI 工具,生成工作目录;缺 Node 时人话提示升级)
-② 建书        打开 AI 工具说"开始写书"→ 引导式问答生成 book.yaml、总纲、第一卷卷纲
-③ 写第一章    确认细纲(AI 拟,作者点头或改)→ AI 写稿 → 机检 → 三审 → 审稿 → 定稿
+② 建书        打开 AI 工具说"开始写书"→ 引导式问答生成 book.yaml、作品契约、总纲、第一卷卷纲
+③ 写第一章    确认整份细纲(含章级知识选择与计划对象引用)→ AI 写稿 → 机检 → 两审 → 审稿 → 定稿
 ④ 日常        每次打开,AI 先报全书近况(写到哪、哪些伏笔悬了太久、连续几章钩子弱)
               → 继续写下一章,或说"改第 N 章""把这条感情线收了"
-⑤ 卷末        卷复盘:伏笔清账、卷摘要、与作者对谈定下卷卷纲、伏笔机会扫描
+⑤ 卷末        卷复盘:伏笔清账、卷摘要、下卷卷纲、伏笔机会扫描;同时复盘作品契约,有问题只提修订候选
 ⑥ 发布        一键导出干净正文(单章/范围/全书,去 front matter),贴到起点/番茄
 ```
 
-体验底线:全程看不到 git、看不到报错堆栈、看不到英文术语;目录里只有 定稿/大纲/文风/工作区 四个中文文件夹。
+体验底线:全程看不到 git、看不到报错堆栈、看不到英文术语;书的核心内容只在 定稿/大纲/作品契约/文风/工作区 五个中文目录中。
 
 ### 2.2 旅程二:v6 迁移作者
 
@@ -151,7 +151,7 @@ v6 的病根(issue 与代码互证):
 │   └── 感情线/感情线-012-林晚主线.md
 ├── 作品契约/
 │   ├── 作品契约.md             # ★ 唯一书级契约真源
-│   └── 知识选择记录.md         # 候选、拒绝、自定义与来源证据;不进日常上下文
+│   └── 知识选择记录.md         # 实际采用/变体与真实发生的拒绝、修改、自定义证据;不进日常上下文
 ├── 文风/
 │   ├── 文风铁律.md             # ★ 原「风格宪法.md」;纯作者品味(禁词/口癖/来自否决的规则)
 │   └── 金句库/战斗.md …
@@ -195,16 +195,16 @@ v6 的病根(issue 与代码互证):
 
 | # | 阶段 | 执行体 | 说明 |
 |---|------|--------|------|
-| 1 | 起草细纲 | 脚本读全书近况 + AI 拟 | 生成 `工作区/细纲.md`;**细纲声明本章定位(推进/过渡/日常)**——过渡章合法,消除模型撒谎动机(替代 0.5 的"每章必须动一条承诺"硬门检与豁免机制) |
-| 2 | 确认细纲 | **作者** | 点头 / 改 / 选备选;自动模式可跳过 |
-| 3 | 备料 | 脚本 | 组装 `工作区/本章写作材料.md`:全书近况+要写到的事+事实切片+信息差边界+近章结尾+反复读清单+文风锚点+作品契约所需小节+细纲最终选择的知识切片;**默认用精准片段**(当前卷+上一卷时间线、按编号取账本条目),不回读当前通用书级条目 |
+| 1 | 起草细纲 | 脚本读全书近况 + AI 拟 | 生成 `工作区/细纲.md`;声明本章定位,并从节拍/场景/技法/追读每维最多三条候选中选择、组合、变体或自定义;按 ID/名称显式声明本章用到的计划对象。候选是材料,不是固定答案 |
+| 2 | 确认细纲 | **作者** | 整份确认本章任务、章级知识选择、真实变体与计划对象引用;不逐项打断。自动模式可跳过停顿,但定稿仍归作者 |
+| 3 | 备料 | 脚本 | 组装 `工作区/本章写作材料.md`:全书近况+要写到的事+定稿/批内事实+信息差边界+近章结尾+反复读清单+文风锚点+作品契约所需小节+显式引用的计划对象+细纲最终选择的落笔切片;**默认用精准片段**,不回读当前通用书级条目 |
 | 4 | 写稿 | AI(干净上下文) | `工作区/草稿-*.md`;关键章 best-of-N |
 | 5 | 机检 | 脚本,零 token | **只做可计数项**:字数、禁词/禁句式、复读、高频意象统计、句式体检(句长方差/段落分布/高频开头)、新专名比对名册、front matter 格式、账本文件是否变动(只查形式)、信息差关键词命中(**只出候选清单,不拦截**)。不过关打回第 4 步,不打扰作者 |
-| 6 | 三审 | AI ×3(各自新鲜上下文) | 读者审(爽不爽/哪段想划走,用追读力知识库的标准)、编辑审(结构与商业性)、**设定校对**(语义判断在这里:①"本章要写到的事"逐条核对正文写没写到;②机检的泄密候选是不是真泄密;③账本履历引用的章内证据是否属实) |
+| 6 | 两审 | AI ×2(各自新鲜上下文) | **事实审查**核对设定、时间线、连贯、角色、逻辑、要写到的事、泄密候选、履历证据、计划对象与既有事实,并可输出 `factChanges`;冲突/歧义交作者裁决。**编辑审**核对结构、节奏、商业性、主角动机、作品契约与所选章级知识的审稿切片 |
 | 7 | 审稿 | **作者** | `工作区/审稿.md` = 草稿 + 三句话审意见 + 待确认新人名 + 章摘要(扫一眼可改)。动作:接受 / 改完接受 / 打回。手动模式逐章审;自动模式按批次审(§2.3)。**定稿永远需要作者敲定,没有"自动定稿"** |
-| 8 | 定稿 | 脚本,**原子** | 一次 git commit:正文进定稿、设定/时间线/名册更新、账本各条目写入履历、章摘要存入 `定稿/摘要/`、工作区清空。要么完成要么原样保留,没有中间态 |
+| 8 | 定稿 | 脚本,**原子** | 一次 git commit:正文与章级最终知识选择进定稿、无冲突/已裁决事实转正、对应计划对象删除、设定/时间线/名册更新、三类条目写入履历、章摘要入档;commit 成功后才清工作区。要么完成要么原样保留 |
 
-写评分离:写稿与三审必须在不同上下文中进行;机检先于 AI 审。
+写评分离:写稿与两审必须在不同上下文中进行;机检先于 AI 审。完整模式两审各用独立上下文,降级模式在单一审稿上下文中顺序执行并如实声明。
 
 ### 3.5 单入口状态机(spec 0.5 §10 修订版)
 
@@ -213,11 +213,12 @@ v6 的病根(issue 与代码互证):
 | 序 | 条件 | 下一步 |
 |----|------|--------|
 | 0 | 任一源文件解析失败 | **修复确认**(原"修复卡"):定位到行、AI 提议保留意图的修复、作者确认;全角标点结构性错误直接预修复只报不问。永不带堆栈崩溃 |
-| 1 | 定稿/大纲有未入账手改 | 提议补登(系统适应作者,不报错) |
-| 2 | 工作区有未完成流程 | 从中断的阶段继续 |
-| 3 | 刚定稿的章是卷末章 | 卷复盘 |
-| 4 | 章号到达体检周期 | 体检 |
-| 5 | 其余 | 起草新章细纲 |
+| 1 | 工作目录无书 / 当前书不存在 | 建书引导:名称路由只做 canonical 归一,作者确认作品契约、知识选择和大纲后一次落盘 |
+| 2 | 作品契约/定稿/大纲/文风有未入账手改 | 提议补登(系统适应作者,不报错) |
+| 3 | 工作区有未完成流程 | 从中断的阶段继续 |
+| 4 | 最新定稿章声明收卷且尚未复盘 | 卷复盘,同时检查作品契约是否需要提出修订候选 |
+| 5 | 章号到达体检周期 | 体检 |
+| 6 | 其余 | 起草新章细纲 |
 
 v6 的 8 个命令全部内化为以上状态;作者只需要一个入口和"继续"。
 
@@ -228,6 +229,8 @@ v6 的 8 个命令全部内化为以上状态;作者只需要一个入口和"
 - 读伏笔-031 的履历 / 读感情线-012 的当前状态
 - 读第 5 卷卷纲的高潮节点 / 读总纲的结局承诺段
 - 读 0152 章结尾 500 字 / 读第 148–152 章的章摘要
+- 读作品契约在当前阶段需要的小节 / 按 ID 或名称读一个尚未转正的计划对象
+- 按真实未决问题查询某一知识维度最多三条候选 / 只读细纲已选知识的落笔或审稿切片
 - 查"玄阶令牌"在全书的出现章(Grep 正文,正文本身就是无损数据库)
 
 `.cache/index.db` 的表设计必须支撑这些查询;写作材料组装默认用精准片段。
@@ -238,15 +241,15 @@ v6 的 8 个命令全部内化为以上状态;作者只需要一个入口和"
 
 | # | 问题 | 解法 | 版本 | 验收方式 |
 |---|---|---|---|---|
-| 1 | 客观事实吃书(修为/资产/物品) | 角色卡结构化字段增量记账,定稿时脚本更新 | 7.0 | 改 100 章前的设定,影响分析能列全受影响章 |
+| 1 | 客观事实吃书(修为/资产/物品) | 故事对象先在 `大纲/创作设计/` 规划,首次正文定稿时由事实审查给出差异;无冲突事实与章节原子转正,冲突须作者裁决 | 7.0 | 计划不被当事实;转正、冲突、hash 漂移和写入故障均有原子性用例 |
 | 2 | 时间线混乱 | 每章强制时间锚点;时间线按卷拆分,append-only | 7.0 | 从第 1 章起强制;体检报告缺时间锚点的章为零 |
-| 3 | 信息差泄密 | 登记表(每条一文件:知情人/读者已知/关键词)+ 机检出候选 + 设定校对判真伪;写作材料注入出场人物知识边界 | 7.0 | 构造泄密样章,三审能逮住;误报不拦截流程 |
+| 3 | 信息差泄密 | 登记表(每条一文件:知情人/读者已知/关键词)+ 机检出候选 + 事实审查判真伪;写作材料注入出场人物知识边界 | 7.0 | 构造泄密样章,两审能逮住;误报不拦截流程 |
 | 4 | 人设语气漂移 | 角色卡存典型对话原文 few-shot + 周期语气体检 + 遮名盲测 | 7.x(体检后置) | 盲测准确率报告 |
 | 5 | 摘要信息损耗 | 分层摘要(章≤200字/卷≤500字/全书骨架按需拼接、不落盘)+ Grep 正文管细节 + 账本即"人工标注的未来相关性" | 7.0 | 写第 0153 章时,写作材料能召回第 12 章埋下、第 152 章推进的伏笔 |
 | 6 | 大纲漂移 | 偏离是决策点不是 bug:细纲阶段给"拉回/改纲/进灵感池"三选 | 7.0 | 细纲模板含偏离报告段 |
 | 7 | 改稿三档 | 未发布:直接改+自动重入账;已发布:只读,生成"顺势圆"方案;设定/大纲:影响分析出已发布/未发布两清单 | 7.0 | 三档各有端到端用例 |
 | 8 | 无成本洗白或无动机让渡底线 | 不设题材默认强硬档位;`作品契约.md` 的“冲突与关系结算原则”明确主角底线、伤害后果、和解条件、救赎条件与允许余地。善良、宽恕和关系修复均合法,编辑审只核对动机、责任、代价、边界和读者承诺 | 7.0 | 合理宽恕/无成本洗白/有代价救赎/无动机让渡底线四类样例可区分 |
-| 9 | 桥段循环 | 高频意象统计(零 token 脚本,7.0)+ 桥段使用史"冷却中"清单(7.x) | 7.0/7.x | "空气仿佛凝固"全书 47 次这类能被机检报出 |
+| 9 | 桥段循环 | 高频意象统计(零 token 脚本)+ 节拍/场景/技法/追读近期选择史的软降权与重复提醒;有递进、回响或回收目的时允许复用 | 7.0 | 高频意象能被机检报出;同名章级知识只降权不硬排除 |
 | 10 | 情绪节奏失控 | 每章情绪定位入 front matter(7.0)+ 波形体检与平台预设周期(7.x) | 7.0/7.x | 体检报告含情绪波形图 |
 | 11 | AI 味 | 分布问题分层打:禁词表(第一层)+ 句式体检脚本(7.0)+ 文风锚定 few-shot(7.x)。**诚实边界:承诺"读者不出戏",不承诺过 AI 检测器** | 7.0/7.x | 句式体检指标进体检报告 |
 | 12 | 对话同质化 | 口癖卡 + 遮名盲测 | 7.x | 盲测用例 |
@@ -263,7 +266,7 @@ v6 的 8 个命令全部内化为以上状态;作者只需要一个入口和"
 |---|---|
 | 运行时 | Node ≥ 22.13.0;运行时直接依赖仅 `js-yaml`(YAML 解析;序列化手写防呆),其余零依赖,缓存用内置 `node:sqlite`(决策记录:M1 任务 design §8.1);安装器检测版本并人话提示 |
 | 平台 | Windows 中文环境一等公民:全链路 UTF-8 无 BOM、`core.quotepath false`、CI 含 Windows 中文路径全链路测试(建库→写章→定稿→重建缓存) |
-| Token 成本 | 机检零 token;精准读取默认片段化;分层摘要控制长程上下文;每章 AI 调用次数有预算上限(实现时定数) |
+| Token 成本 | 机检零 token;精准读取默认片段化;分层摘要控制长程上下文;完整两审每章 2 次 AI 调用,降级模式 1 次审稿上下文 |
 | 健壮性 | 永不带堆栈崩溃(修复确认兜底);定稿原子性;git 健康检查;容错读取(未知字段保留原样写回) |
 | 可诊断性 | 强制项目级安装,目录结构全网统一;issue 里贴目录清单即可定位 |
 | 防呆 | 系统写出的 YAML 一律平铺、块列表、危险值加引号;多条记录每条一文件 |
@@ -278,10 +281,10 @@ v6 的 8 个命令全部内化为以上状态;作者只需要一个入口和"
 
 ### v7.0(首发)
 
-- 骨架:状态机单入口、写章流程八阶段(机检/三审新分工)、三类账本(声明制)、客观事实记账、时间线(按卷)、分层摘要、改稿三档、git 隐身全套(含健康检查与"回到第 N 章")、精准读取接口
-- 高呼声卖点:自动模式(连写,**按批次定稿**)、反和解规则、信息差登记(候选制泄密检查)
+- 骨架:状态机单入口、写章流程八阶段(机检/两审分工)、三类账本(声明制)、故事对象计划→事实生命周期、时间线(按卷)、分层摘要、改稿三档、git 隐身全套(含健康检查与"回到第 N 章")、精准读取接口
+- 高呼声卖点:自动模式(连写,**按批次定稿**)、作品契约长期边界、十维知识少量候选与自由组合、信息差登记(候选制泄密检查)
 - 配套:npx 安装器(工作目录布局)+ update、`/migrate`、干净导出、AGENTS.md
-- 文风层基础:文风铁律 + 禁词/句式机检 + 高频意象统计(v6 资产平移);金句库目录与手动放入
+- 知识与文风基础:十维通用知识(开发期策展、作者侧只读)+ 作品契约 + 文风铁律 + 禁词/句式机检 + 高频意象统计;金句库目录与手动放入
 - 宿主:一级(Claude Code + Codex),亲测过 smoke
 
 ### v7.x(增量)
@@ -295,6 +298,7 @@ v6 的 8 个命令全部内化为以上状态;作者只需要一个入口和"
 
 - RAG/向量库(语义检索=可选插件,永不做事实召回主路径)、常驻服务、敏感词/合规、AI 检测器承诺
 - 大一统 YAML 数据文件、事件级 witnesses 投影、自建提交链、模型自由评"文笔好坏"、模型裸奔编纲
+- 旧 v7 书仓迁移、旧路径双读、旧 schema 兼容;作者侧知识投稿/评分/自动扩库;按固定路由替作者选择创意或剧情答案
 - 术语禁用词 CI 检查(术语一致性靠自审与评审把关,不上机器)
 
 ---
@@ -304,7 +308,7 @@ v6 的 8 个命令全部内化为以上状态;作者只需要一个入口和"
 | 阶段 | 过线标准 |
 |---|---|
 | **发 RFC** | 本 PRD 定稿;术语表/目录图/三条作者旅程齐;RFC 以大白话裁剪发 GitHub Discussions(需先开启 Discussions,issue 区发置顶指引),征求意见至少开放 1 周 |
-| **beta** | 用 v7 真实写一本书到 50 章(自用验证,覆盖建书→日更→吃书→卷复盘);Windows 中文路径全链路 CI 绿;"删光 .cache 全量重建" CI 绿 |
+| **beta** | 用 v7 真实写一本书到 50 章(自用验证,覆盖作品契约建书→计划对象→章级知识选择→两审→定稿→吃书→卷复盘);Windows 中文路径全链路 CI 绿;"删光 .cache 全量重建" CI 绿 |
 | **7.0.0** | `/migrate` 在 ≥3 个真实 v6 项目跑通;beta 期无数据丢失级 bug;迁移指引文档齐 |
 
 ---
@@ -323,7 +327,7 @@ v6 的 8 个命令全部内化为以上状态;作者只需要一个入口和"
 | 盘面 | 全书近况 | |
 | 上下文包 | 本章写作材料 | |
 | 合同 | 本章要写到的事 | |
-| 镜头评审 | 三审(读者审/编辑审/设定校对) | 出版业原生词 |
+| 镜头评审 | 两审(事实审查/编辑审) | 事实可验证性与编辑判断分开;读者体验由编辑审结合作品契约和所选追读知识核对 |
 | 棘轮 | 删除该比喻 | 直接说"定稿前/定稿后" |
 | 风格宪法 | 文风铁律 | |
 | 决策卡 | **取消"卡"概念**:环节叫"确认细纲",文件 `工作区/细纲.md` | AI 拟细纲→作者点头或改 |
@@ -340,7 +344,8 @@ v6 的 8 个命令全部内化为以上状态;作者只需要一个入口和"
 
 | 风险 | 控制 |
 |---|---|
-| 三审每章 3 次 AI 调用,弱模型宿主上质量参差 | 三审任务书单源;设定校对给的是核对清单不是开放问题;降级模式(无 subagent 顺序执行)如实声明 |
+| 两审在弱模型宿主上质量参差 | 两份任务书单源;事实审查给核对清单与结构化事实差异;无 subagent 时用单上下文顺序审稿并如实声明 |
+| 固定路由使不同作品或章节收敛到同一答案 | 路由只归一名称;候选每维最多三条且允许组合、变体、拒绝、自定义;近期历史只软降权,不自动选择 |
 | 自动模式错误连锁 | 按批次定稿——错误不经作者审稿不入定稿,污染上限一个批次且未定稿可直接改;已发布后的错误走影响分析+顺势圆 |
 | 中文路径在小众平台/工具链上出幺蛾子 | CI 全链路 + 一级宿主 smoke;问题平台降级到二三级,不硬保 |
 | Node 22 普及度 | 安装器人话提示升级;22 已是 LTS,写手装最新版无历史包袱 |
@@ -355,7 +360,9 @@ v6 的 8 个命令全部内化为以上状态;作者只需要一个入口和"
 
 (已消解,均为作者 2026-06-12 拍板:编号体系→全称中文编号;攒批审稿落点→按批次定稿后问题不复存在;多本书切换→`.webnovel/books.jsonl` 登记 + hook 注入;启动点→只支持工作目录启动;O1 书仓库自描述→根部指路 `AGENTS.md`。)---
 
-## 10. spec 修订指令清单(本 PRD 对两份 spec 的下行要求)
+## 10. 历史 spec 修订指令(PRD 1.0 下行记录)
+
+本节记录 1.0 对当时两份 spec 的修订要求,不再代表 1.6 当前实现;其中“三审”等旧口径已由后续决策替代。当前格式以 story repo spec 0.17 和 multi-agent spec 现行版为准。
 
 ### 10.1 story-repo-spec 0.5 → 0.6
 
@@ -409,3 +416,4 @@ v6 的 8 个命令全部内化为以上状态;作者只需要一个入口和"
 - [x] 发布判据可执行(每阶段有可验证的过线条件)
 - [x] RFC 可从本 PRD 直接裁剪产出(§1.1、§2、§3.2、§6、§8 为裁剪主体)
 - [x] spec 修订指令完整(两份 spec 的每处冲突都有下行指令)
+- [x] 十维知识有清晰消费者与降级边界;固定路由不替作者选择创意,作品契约/计划对象/章级选择均有唯一持久化落点

+ 6 - 2
v7/bin/webnovel-writer.js

@@ -36,6 +36,7 @@ if (!command || command === '--help') {
   console.log('  list-threads [--悬了太久|--type=<t> [--status=<s>]|--strength=<强>]')
   console.log('  read-timeline [--current-and-prev|--current-volume|--卷=N|--在场=名]')
   console.log('  read-character <正名> [--front-matter|--section=<标题>]')
+  console.log('  read-design <ID或名称>                     精读尚未转正的计划对象')
   console.log('  resolve-alias <别名>')
   console.log('  list-characters [--status=<状态>]')
   console.log('  read-worldview --section=<标题>')
@@ -55,8 +56,11 @@ if (!command || command === '--help') {
   console.log('  review-input <章号> [--draft=<路径>]      组装两审输入 → 工作区/审稿输入.json')
   console.log('  save-review <章号> --file=<两审json>      两审报告校验合并 → 工作区/审稿.md')
   console.log('  persist-outline --file=<json>            细纲落盘({细纲})')
-  console.log('  persist-book --file=<json> [--dir=<目录>] 建书落盘+登记({book,总纲,卷纲,题材流派指导})')
-  console.log('  knowledge-pack --类型=<题材> [--流派=a,b]  建书蒸馏材料包(知识路由归一+命中条目全文)')
+  console.log('  persist-book --file=<json> [--dir=<目录>] 建书落盘+登记(作品契约必需,须作者确认)')
+  console.log('  knowledge-pack --类型=<题材> [--副题材=a,b] [--流派=a,b]  归一书级分类并读取材料')
+  console.log('  knowledge-query --维度=<十维之一> --问题=<未决问题>  查询最多三条候选材料')
+  console.log('  persist-contract --file=<json>           保存作者确认的作品契约新版本')
+  console.log('  persist-design --file=<json>             保存或放弃作者确认的计划对象')
   console.log('  persist-volume-review --file=<json>      卷复盘落盘({卷号,卷摘要,下卷卷纲,伏笔条目})')
   console.log('  persist-repair --file=<json>             修复回写({repairs},仅限检测失败清单内)')
   console.log('  finalize <章号> --payload=<json>          定稿原子 commit + 缓存刷新')

+ 0 - 1
v7/docs/knowledge/调用者与字段矩阵.md

@@ -46,7 +46,6 @@
 |---|---|---|---|---|
 | 题材 | canonical 名称、别名、条目路径 | `路由.csv` | 归一主题材并定位条目 | 必要 |
 | 题材 | 核心承诺与审查边界 | Markdown 正文 | 蒸馏进作品契约 | 必要,非 front matter |
-| 题材 | 恩怨清算默认 | 无 | 不再按题材决定关系结算 | 删除 |
 | 流派 | canonical 名称、别名、兼容题材、条目路径 | `路由.csv` | 归一多选流派并做兼容提醒 | 必要 |
 | 流派 | 推进引擎与失败模式 | Markdown 正文 | 蒸馏进作品契约 | 必要,非 front matter |
 | 创意约束 | 名称、紧凑摘要 | 条目索引 | 组成不同整体方向包 | 必要 |

+ 3 - 3
v7/references/README.md

@@ -36,11 +36,11 @@ references/
 
 `路由.csv` 只负责书级 canonical 名称、别名和兼容范围归一,不得自动决定具体创意、人物、剧情或章节方案。
 
-## 当前过渡基线
+## 当前基线
 
-截至 2026-07-16,已提交基线为 166 条:题材 16、流派 22、节拍 102、场景 16、追读 10。新增五个维度及现有条目的移动、拆分和合并由 07-10 十维治理任务的运行时与内容子任务一次性完成;在切换提交落地前,当前五维仍是代码实际读取面。
+截至 2026-07-18,十维目录和运行时调用契约已生效。已签收内容基线为 166 条:题材 16、流派 22、节拍 102、场景 16、追读 10;创意约束、设定、人物、命名和技法的正式条目由对应内容策展任务补充,空目录或无命中不会阻断创作。
 
-这里不建立旧路径双读、旧 schema 兼容或历史书仓迁移器。v7 尚未生产,目标目录、读取器、installer、fixture 和测试在对应实现阶段同步切换。
+这里不建立旧路径双读、旧 schema 兼容或历史书仓迁移器。运行时、installer、fixture 和测试只认本页列出的十维结构。
 
 ## 内容纪律
 

+ 1 - 1
v7/references/追读/钩子-危机钩.md

@@ -23,5 +23,5 @@
 ## 审稿时
 
 - 核对危机是否与主线或活跃条目相关(对照毒点第一条)。
-- 核对近数章的章尾钩子类型分布,同型连用超过三章提示换型。
+- 核对近数章所选追读类型的分布,同型连用超过三章提示换型。
 - 核对下一章(若已有细纲)是否存在"开头秒解"倾向。

+ 0 - 1
v7/references/题材/仙侠.md

@@ -1,6 +1,5 @@
 ---
 名称: 仙侠
-恩怨清算默认: 恩怨分明
 毒点:
   - 境界突破不得脱离资源、心性或天劫代价
   - 修炼段不得以时间流逝与数字堆砌代替斗法兑现

+ 0 - 1
v7/references/题材/历史.md

@@ -1,6 +1,5 @@
 ---
 名称: 历史
-恩怨清算默认: 恩怨分明
 毒点:
   - 时代细节不得与背景朝代冲突,制度思想不得无铺垫超前
   - 人物言行不得脱离时代条件与阶层身份、不得用现代口语

+ 0 - 1
v7/references/题材/古言.md

@@ -1,6 +1,5 @@
 ---
 名称: 古言
-恩怨清算默认: 恩怨分明
 毒点:
   - 礼法约束不得消失,反击须在规则内完成
   - 权谋翻盘不得无证据凭空反转

+ 0 - 1
v7/references/题材/奇幻.md

@@ -1,6 +1,5 @@
 ---
 名称: 奇幻
-恩怨清算默认: 恩怨分明
 毒点:
   - 魔法不得脱离精神力、生命力、理智或契约代价
   - 种族与阵营不得沦为无立场差异的背景装饰

+ 0 - 1
v7/references/题材/年代.md

@@ -1,6 +1,5 @@
 ---
 名称: 年代
-恩怨清算默认: 恩怨分明
 毒点:
   - 年代设定不得沦为换皮舞台——时代约束必须真的改变人物选择
   - 主角行动不得脱离所处年代的认知边界与代价

+ 0 - 1
v7/references/题材/幻言.md

@@ -1,6 +1,5 @@
 ---
 名称: 幻言
-恩怨清算默认: 恩怨分明
 毒点:
   - 宿命不得万能,不得替代人物选择
   - 女主成长不得被男主代打包办

+ 0 - 1
v7/references/题材/快穿.md

@@ -1,6 +1,5 @@
 ---
 名称: 快穿
-恩怨清算默认: 恩怨分明
 毒点:
   - 单元任务不得模板化,每个世界须有独立主题与核心关系
   - 通关不得靠系统剧透,主角须在限制中自己做出选择

+ 0 - 1
v7/references/题材/悬疑.md

@@ -1,6 +1,5 @@
 ---
 名称: 悬疑
-恩怨清算默认: 恩怨分明
 毒点:
   - 真相不得空降——揭晓的答案须由前文已埋线索支撑
   - 规则不得为当前诡计临时漂移

+ 0 - 1
v7/references/题材/末世.md

@@ -1,6 +1,5 @@
 ---
 名称: 末世
-恩怨清算默认: 以直报怨
 毒点:
   - 资源危机不得架空——生存硬约束须持续兑现,不可口头喊缺粮实则无限供应
   - 主角狠辣度不得失位——威胁与资源竞争下主角不得圣母式心软放过必除之敌

+ 0 - 1
v7/references/题材/游戏.md

@@ -1,6 +1,5 @@
 ---
 名称: 游戏
-恩怨清算默认: 恩怨分明
 毒点:
   - 比赛不得只报结果不写博弈
   - 技能机制不得含糊,胜负不得靠临时发明的机制

+ 0 - 1
v7/references/题材/玄幻.md

@@ -1,6 +1,5 @@
 ---
 名称: 玄幻
-恩怨清算默认: 有仇必报
 毒点:
   - 恩怨结算不得软收尾——反派认错道歉不能抵消实际代价
   - 主角不得说教式原谅未付代价的仇敌

+ 0 - 1
v7/references/题材/现言.md

@@ -1,6 +1,5 @@
 ---
 名称: 现言
-恩怨清算默认: 留有余地
 毒点:
   - 情感推进不得生硬,禁止工业糖精与强行 HE
   - 误会不得低级化硬拖冲突

+ 0 - 1
v7/references/题材/种田.md

@@ -1,6 +1,5 @@
 ---
 名称: 种田
-恩怨清算默认: 留有余地
 毒点:
   - 经营过程不得沦为记账——每阶段须有可解的阻力与瓶颈
   - 积累不得抽象化,必须兑现为具体可感的资产与生活改善

+ 0 - 1
v7/references/题材/科幻.md

@@ -1,6 +1,5 @@
 ---
 名称: 科幻
-恩怨清算默认: 恩怨分明
 毒点:
   - 资源与能源不得取用无度,末世不得失去生存压迫
   - 危机不得只靠堆怪物数量而不推进资源格局

+ 0 - 1
v7/references/题材/衍生.md

@@ -1,6 +1,5 @@
 ---
 名称: 衍生
-恩怨清算默认: 恩怨分明
 毒点:
   - 角色改写不得无铺垫地背离核心动机,变化须有可信过程
   - 情节不得停留在复述原作,须由新变量推动出原作没有的走向

+ 0 - 1
v7/references/题材/都市.md

@@ -1,6 +1,5 @@
 ---
 名称: 都市
-恩怨清算默认: 有仇必报
 毒点:
   - 恩怨结算不得软收尾——仇敌口头认错不能抵消现实代价
   - 主角动用超凡力量不得无代价、战斗后不得无人追责

+ 7 - 1
v7/roles/事实审查.md

@@ -7,7 +7,7 @@ description: 读整章草稿,逐维度核出可验证的事实/一致性/逻
 你是事实审查员。只用传入的 ReviewInput 核对草稿,逐维度找出可验证的问题,输出问题清单 JSON。不读文件、不调脚本。
 
 ## 输入(ReviewInput)
-章号、草稿全文、本章要写到的事、全书近况、相关角色(境界/状态/位置/持有)、相关条目(含拟变动与近期履历)、时间线片段、信息差候选。
+章号、草稿全文、本章要写到的事、全书近况、作品契约、知识审查、相关角色(境界/状态/位置/持有)、相关条目(含拟变动与近期履历)、名册、时间线片段、信息差候选、本章计划对象、批内待转正事实。计划对象只表示设计意图,不是已发生事实;定稿事实与正文证据优先。
 
 ## 维度(category)
 - setting:能力/境界/地点/物品与相关角色及已建立规则一致
@@ -23,10 +23,16 @@ description: 读整章草稿,逐维度核出可验证的事实/一致性/逻
 可用 category 全集:{{categories.factCheck}}
 
 ## 输出(严格 JSON,无其他文本)
+以此 schema 为主体:
 {{schema.example}}
 
+需要新建或更新事实时,额外加顶层 `factChanges` 数组;没有变化就省略,不写空占位。每项为 `{"planPath","factPath","content","decision","expectedHash"?,"resolution"?,"removePlan"}`:`content` 是完整事实 Markdown;`decision` 只能是 `无冲突`、`作者已裁决`、`冲突`、`歧义`。覆盖既有事实时填写其当前 `sha256`;首次转正通常 `removePlan:true`。
+
 ## 规则
 - 每条 issue 给 evidence:草稿引用 vs 输入数据
 - severity ∈ {{severities}};critical 自动 blocking=true
 - unregistered_thread 恒 blocking=false,交作者裁决
+- 只对本章声明的计划对象或既有事实提出 factChanges;不得把计划描述直接当作正文已经成立
+- 有语义冲突或歧义时如实写 decision,不能替作者裁决;`作者已裁决` 必须复述裁决依据
+- 作品契约问题在 issue 上填写准确 `contract_clause`;阻断性冲突必须 blocking=true
 - 只报可验证问题,评事实不评文笔

+ 6 - 5
v7/roles/编辑审.md

@@ -7,19 +7,20 @@ description: 读整章草稿,从结构/节奏/商业性/主角动机给出可
 你是编辑审稿员。只用传入的 ReviewInput 评估草稿的可读性与商业性,输出问题清单 JSON。不读文件、不调脚本。
 
 ## 输入(ReviewInput)
-章号、草稿全文、本章要写到的事、全书近况、相关角色、时间线片段、毒点清单。
+章号、草稿全文、本章要写到的事、全书近况、作品契约、知识审查、相关角色、相关条目、时间线片段。本章知识只核对细纲最终选择的审稿切片,不从通用题材或流派库补规则。
 
 ## 维度(category)
 - structure:场景切分、信息密度、起承转合
 - pacing:爽点密度、章末钩子、张弛节奏
-- commercial:题材卖点是否兑现,同质化风险
+- commercial:作品契约的读者承诺与差异化是否兑现,同质化风险
 - motivation:主角目标与动机清晰可信、驱动情节
 
 可用 category 全集:{{categories.editorial}}
 
-## 毒点核对
-- 按「毒点清单」逐条核对草稿,命中的按来源归入上述 category(节奏类毒点归 pacing,题材/流派/契约毒点归 commercial,主角行为毒点归 motivation)
-- 恩怨清算类毒点只判叙事结果与主角行为:配角可以是圣母/和事佬,红线是其主张被情节证明正确并软化恩怨结算
+## 契约与知识核对
+- 按作品契约的本书专属毒点、冲突与关系结算原则及 `知识审查` 逐条核对;只报正文有证据的问题
+- 合理宽恕、善良和有代价的救赎可以成立;无成本洗白或无动机让渡底线才是问题
+- 契约相关 issue 填写准确 `contract_clause`,供运行时判断立即呈报或延迟复盘
 
 ## 输出(严格 JSON,无其他文本)
 {{schema.example}}

+ 52 - 1
v7/scripts/pack-install-e2e.mjs

@@ -67,6 +67,9 @@ try {
     '.webnovel/books.jsonl',
     '.webnovel/references/路由.csv',
     '.webnovel/references/节拍/PA-001-压抑蓄力爆发.md',
+    '.webnovel/docs/knowledge/维度宪章.md',
+    '.webnovel/docs/knowledge/调用者与字段矩阵.md',
+    '.webnovel/docs/knowledge/策展规则.md',
     '.claude/skills/webnovel-writer/SKILL.md',
     '.claude/agents/事实审查.md',
     '.claude/settings.json',
@@ -81,9 +84,55 @@ try {
   await fs.writeFile(
     path.join(workdir, '建书.json'),
     JSON.stringify({
-      book: { spec_version: '7.0', 书名: '雪落长安', 卷规模: 40, 体检周期: 50 },
+      book: {
+        spec_version: '7.0',
+        书名: '雪落长安',
+        类型: '玄幻',
+        副题材: [],
+        流派: [],
+        卷规模: 40,
+        体检周期: 50,
+      },
       总纲: '# 总纲\n## 结局\n终成一代大家。',
       卷纲: '# 第1卷\n初入长安。',
+      作品契约: [
+        '---',
+        '类型: 玄幻',
+        '副题材:',
+        '流派:',
+        '创意约束:',
+        '来源版本:',
+        '  - 作者自定义',
+        '契约版本: 1',
+        '生效起章: 1',
+        '更新原因: 初始建书',
+        '变更类型: 建书',
+        '---',
+        '## 核心读者承诺',
+        '成长与选择都有可见后果。',
+        '## 骨架约定',
+        '按卷推进长期目标。',
+        '## 题材融合协议',
+        '本书暂不混合副题材。',
+        '## 创意约束落地',
+        '主线困境不由临时奖励解决。',
+        '## 差异化点',
+        '- 线索改变人物关系。',
+        '- 成长代价延续到后文。',
+        '- 反派掌握先手信息。',
+        '## 冲突与关系结算原则',
+        '- 主角底线:不牺牲无辜。',
+        '- 伤害后果:责任必须可见。',
+        '- 和解条件:先有修复行动。',
+        '- 救赎条件:持续付出代价。',
+        '- 允许余地:善良与克制可以成立。',
+        '## 本书专属毒点',
+        '- 不用旁白直接揭谜。',
+        '## 节奏与兑现参数',
+        '每三章推进一次主线。',
+      ].join('\n'),
+      知识选择: [{ 维度: '题材', 名称: '玄幻', 来源: '作者自定义' }],
+      作者已确认: true,
     }),
     'utf8'
   )
@@ -91,6 +140,8 @@ try {
   check(pb.stdout.includes('已登记为当前书'), '建书并登记为当前书(vendored bin)')
   check(await exists(path.join(workdir, '雪落长安', 'book.yaml')), '书仓库 book.yaml')
   check(await exists(path.join(workdir, '雪落长安', 'AGENTS.md')), '书仓库指路 AGENTS.md')
+  check(await exists(path.join(workdir, '雪落长安', '作品契约', '作品契约.md')), '书仓库作品契约真源')
+  check(await exists(path.join(workdir, '雪落长安', '作品契约', '知识选择记录.md')), '书仓库知识选择记录')
 
   // 5. next --json → 序6 起草第 1 章
   const nx = await node(vendoredBin, ['next', '--json'])

+ 9 - 5
v7/skills/webnovel-writer/SKILL.md

@@ -18,12 +18,15 @@ SessionStart 已注入「当前在写哪本 / 共几本 / 全书近况入口」
 ## 单入口:判定下一步
 作者说「继续」,运行 `{{cmd}} next --json`(git 健康检查先行),按返回的 `序` 执行:
 - 序0 修复确认:对 `dto.failures` 逐个给「保留作者意图」的修复方案,作者确认后写 `{"repairs":[{"file","content"}]}`,运行 `{{cmd}} persist-repair --file=<json路径>`。
-- 序1 建书:问答收集书名、类型、流派、主角、金手指、结局(类型/流派按 `dto.知识路由` 菜单归一);运行 `{{cmd}} knowledge-pack --类型=<题材> --流派=<a,b>` 取蒸馏材料,与作者逐节对撞(库怎么说 → 作者怎么定)产出题材流派指导(front matter:题材/流派/恩怨清算/来源;四节:骨架约定/差异化点≥3/本书专属毒点/节奏参数),产出 `{"book","总纲","卷纲","题材流派指导"}`,运行 `{{cmd}} persist-book --file=<json路径>`。
+- 序1 建书:问答收集书名、类型、副题材、流派、主角、核心机制和结局;`dto.知识路由` 只用于名称归一。运行 `{{cmd}} knowledge-pack --类型=<主题材> --副题材=<a,b> --流派=<a,b>` 取书级材料,只有真实未决的创意问题才追加 `{{cmd}} knowledge-query --维度=创意约束 --问题=<问题>`。与作者对撞后生成完整作品契约:front matter 含类型/副题材/流派/创意约束/来源版本/契约版本/生效起章/更新原因/变更类型,正文含核心读者承诺、骨架约定、题材融合协议、创意约束落地、差异化点(至少 3 条)、冲突与关系结算原则、本书专属毒点、节奏与兑现参数。作者确认后产出 `{"book","总纲","卷纲","作品契约","知识选择","实际裁决"?,"作者已确认":true}`,运行 `{{cmd}} persist-book --file=<json路径>`。
 - 序2 手改补登:向作者出示 `dto.变更文件` 问「补登吗」,确认后运行 `{{cmd}} relink --message=<一句话说明>`。
 - 序3 断点续跑:按 `dto.从哪继续` 回到写章流程对应步骤。
 - 序5 体检:按返回的 `message` 指引执行。
-- 序4 卷复盘:吃 DTO 与作者对谈,产出 `{"卷号","卷摘要","下卷卷纲","伏笔条目"}`,运行 `{{cmd}} persist-volume-review --file=<json路径>`。
-- 序6 起草细纲:吃 DTO 拟细纲提案(本章定位声明 + 本章要写到的事 + 备选;本章提案段内按需从 `dto.节拍索引/钩子清单/场景索引/场景候选` 点选或自定义,写成标签行 `本章节拍:`/`章尾钩子:`/`本章场景:`,皆可空),作者确认后产出 `{"细纲"}`,运行 `{{cmd}} persist-outline --file=<json路径>`。
+- 序4 卷复盘:吃 DTO 与作者对谈,产出 `{"卷号","卷摘要","下卷卷纲","伏笔条目"}`,运行 `{{cmd}} persist-volume-review --file=<json路径>`;同时复盘作品契约,无问题就保持不变,有问题只提出修订候选。作者确认新版本后才生成含 `作品契约`、`知识选择`、`作者已确认:true` 的更新 JSON,运行 `{{cmd}} persist-contract --file=<json路径>`。
+- 序6 起草细纲:吃 DTO 拟整份细纲提案(本章定位 + 本章要写到的事 + 备选)。`dto.章级知识候选` 每维最多三条,只是材料,不是固定答案;可组合、变体、拒绝或自定义。提案段按需写 `本章节拍:`、`本章场景:`、`本章技法:`、`本章追读:`、`知识变体:`、`本章对象:`,六者皆可空,前四者可多选,变体可多行。作者确认整份细纲后产出 `{"细纲"}`,运行 `{{cmd}} persist-outline --file=<json路径>`;若 DTO 带作品契约复盘提示,只呈报修订候选,不自动改契约。
+
+## 故事对象
+跨章复用或影响一致性的设定、人物、关系、地点、组织、能力和特殊物品才建计划对象;一次性路人、普通物品和临时地点不建档。按真实问题用 `knowledge-query --维度=设定|人物|命名` 取少量材料,作者确认后生成完整 Markdown(front matter 至少有 `ID`、`名称`,可有 `对象类型`、`正名`、`别名`;正文至少有 `## 本书设计`、`## 一致性边界`),通过 `{"作者已确认":true,"对象":[{"分类":"设定|人物","内容":"完整 Markdown"}],"放弃":[]}` 运行 `{{cmd}} persist-design --file=<json路径>`。规划与细纲用 `{{cmd}} read-design <ID或名称>` 精读;计划不是既成事实。
 
 ## 写章流程
 1. 备料:`{{cmd}} prepare-chapter <章号>`,读 `工作区/本章写作材料.md` 写草稿到 `工作区/草稿-A.md`。
@@ -35,8 +38,8 @@ SessionStart 已注入「当前在写哪本 / 共几本 / 全书近况入口」
 {{#unless agentCapable}}
    兼容模式——按 `事实审查`、`编辑审` 两份任务书顺序自审,`mode` 填 `degraded`。
 {{/unless}}
-   两份报告合成 `{"事实审查","编辑审","mode","待确认新专名","章摘要"}`,运行 `{{cmd}} save-review <章号> --file=<json路径>`;审稿单落 `工作区/审稿.md`,交作者:接受 / 改完接受 / 打回。
-4. 定稿:作者敲定后组定稿包(`frontMatter`、`body`、`summary`、`threadCreates`(本章「埋下/设下/开启」的新条目,`{id, 短题, frontMatter, body}`)、`threadUpdates`、`characterUpdates`、`rosterUpserts`(`类型` 用中文:`角色`/`地点`/`组织`/`物品`)、`timelineRows`、`secretWrites`、`commitLines`、`workspaceFiles`——本章用过的工作区文件全列进 `workspaceFiles`),运行 `{{cmd}} finalize <章号> --payload=<json路径>`,再运行 `{{cmd}} next --json` 进下一步。
+   两份报告合成 `{"事实审查","编辑审","mode","待确认新专名","章摘要"}`,运行 `{{cmd}} save-review <章号> --file=<json路径>`;审稿单落 `工作区/审稿.md`,交作者:接受 / 改完接受 / 打回。事实审查的 `factChanges` 若含冲突或歧义,先呈报差异与影响,作者裁决后把对应项改为 `作者已裁决` 并写明 `resolution`,不得静默覆盖。
+4. 定稿:作者敲定后组定稿包(`frontMatter`、`body`、`summary`、`threadCreates`(本章「埋下/设下/开启」的新条目,`{id, 短题, frontMatter, body}`)、`threadUpdates`、`characterUpdates`、`rosterUpserts`(`类型` 用中文:`角色`/`地点`/`组织`/`物品`)、`timelineRows`、`secretWrites`、事实审查给出的 `factChanges`、`commitLines`、`workspaceFiles`——本章用过的工作区文件全列进 `workspaceFiles`),运行 `{{cmd}} finalize <章号> --payload=<json路径>`,再运行 `{{cmd}} next --json` 进下一步。`知识选择` 由脚本从确认细纲归档,不让定稿包另写一份答案。
 
 ## 自动模式(连写,作者说「连写/挂机写一批」才进入)
 1. 批内每章走写章流程 1-3;`next --json` 返回 `dto.自动确认细纲 = true` 时细纲提案直接 `{{cmd}} persist-outline` 生效,不问作者。
@@ -60,4 +63,5 @@ SessionStart 已注入「当前在写哪本 / 共几本 / 全书近况入口」
 - 事实变更只经定稿流程入 git。
 - 能数的交脚本,要判断的交两审。
 - 只吃整理好的 DTO,按提供的上下文工作。
+- 通用知识库只读;不向作品作者开放投稿、评分或自动扩库流程。
 - 传给命令的 JSON 一律先写成文件再走 `--file`/`--payload`(临时 JSON 放 `工作区/`;建书时放工作目录根)。

+ 2 - 1
v7/src/commands/save-review.js

@@ -5,7 +5,8 @@ import { readJsonInput } from '../util/json-input.js'
 
 /**
  * save-review <章号> --file=<两审json> [--draft=<repo相对路径>]:两审产物入库。
- * JSON:{factCheck|事实审查, editorial|编辑审, mode?, 待确认新专名?, 章摘要?}。
+ * JSON:{factCheck|事实审查, editorial|编辑审, mode?, 待确认新专名?, 章摘要?};
+ * 事实审查可带顶层 factChanges,schema 归一化与正式报告必须原样保留。
  * schema 校验 → 合并 → 落 工作区/审稿.md + 评审报告/(原始输出与归一化分存)。
  * 契约:纯返回 {ok, output?, error?}。
  */

+ 1 - 1
v7/src/installer/vendor.js

@@ -8,7 +8,7 @@ import { createRequire } from 'node:module'
  * 复制源 = 当前运行的包根;js-yaml 及其传递依赖从本包的解析位置递归收集。
  */
 
-const RUNTIME_ENTRIES = ['bin', 'src', 'roles', 'references', 'package.json']
+const RUNTIME_ENTRIES = ['bin', 'src', 'roles', 'references', 'docs/knowledge', 'package.json']
 
 /** 文件集/清单键统一正斜杠:清单跨平台可移植(双平台 CI、网盘搬家不失配) */
 const posix = (p) => p.split(path.sep).join('/')

+ 1 - 1
v7/src/prep/index.js

@@ -18,7 +18,7 @@ import {
 /**
  * 备料:组装 工作区/本章写作材料.md(spec §8 step3,默认精准片段)。
  * 组件:全书近况 + 要写到的事 + 事实切片 + 信息差边界 + 近章结尾 + 反复读清单 + 文风锚点
- *       + 题材流派契约(§6.3,无契约的书降级)+ 细纲声明命中的知识切片(声明即路由,§7)。
+ *       + 必需作品契约 + 显式引用的计划对象 + 细纲最终选择的章级知识落笔切片。
  * 有待定稿批次时按"定稿 + 批内预登记"叠加组装(spec §8.1,批内事实只取本章之前的章)。
  * @param {{repoPath: string, cache: object, packageRoot?: string}} ctx
  * @param {{chapterNum: number}} args

+ 2 - 2
v7/src/state-machine/detectors.js

@@ -23,8 +23,8 @@ export function isTrackedSourcePath(p) {
 }
 
 /**
- * 序0:扫描源文件解析失败。清单钉死于 spec 0.9 §10(实现不得自行增减):
- * 六目录 front matter + book.yaml + 文风铁律 front matter + 名册表 + 时间线表。
+ * 序0:扫描源文件解析失败。清单钉死于现行 spec §10(实现不得自行增减):
+ * 六目录 front matter + 计划对象 + book.yaml + 必需作品契约 + 文风铁律 + 名册/时间线表。
  * 任一清单文件解析失败都不得静默降级为默认值。
  */
 export async function detectParseFailures(repoPath) {

+ 19 - 0
v7/test/fixtures/sample-book/大纲/创作设计/设定/ITEM-002-玄阶令牌.md

@@ -0,0 +1,19 @@
+---
+ID: ITEM-002
+名称: 玄阶令牌
+对象类型: 物品
+别名:
+  - 北境令
+---
+## 本书设计
+
+玄阶令牌是北境旧案的权限凭证,首次出现时只展示材质与残缺纹路,不直接解释来历。
+
+## 一致性边界
+
+- 令牌不能直接提供战力或替主角解谜。
+- 完整权限须在取得第二块残片后才能启用。
+
+## 知识依据
+
+采用“信息分层揭示”的自定义变体,先让用途成立,再解释历史。

+ 3 - 0
v7/test/fixtures/sample-book/定稿/正文/0001-开局.md

@@ -13,6 +13,9 @@
 本章要写到的事:
   - 林晚初入宗门
   - 神秘老者出现
+知识选择:
+  - 节拍|前五章卖点直出
+  - 追读|危机钩
 ---
 
 林晚抬头望着宗门大殿,心中忐忑不安。

+ 4 - 0
v7/test/fixtures/sample-book/定稿/正文/0002-初遇.md

@@ -10,6 +10,10 @@
 情绪定位: 铺垫
 本章要写到的事:
   - 林晚寻找玉佩线索
+知识选择:
+  - 场景|冲突对话
+  - 追读|悬念钩
+  - 变体|由大师兄的异常反应递进玉佩谜题
 ---
 
 林晚握着玉佩,思索了一夜。

+ 6 - 0
v7/test/fixtures/sample-book/工作区/细纲.md

@@ -5,6 +5,12 @@
 - 连续弱钩:0 章
 ## 本章提案
 本章定位:推进章。推进伏笔-001(林晚查到玉佩线索),结尾埋强钩。
+本章节拍:PA-026 证据累积逼真相
+本章场景:自定义藏经阁查证
+本章技法:限制视角呈现
+本章追读:悬念钩
+知识变体:悬念钩递进既有玉佩谜题,不另开无主谜团
+本章对象:ITEM-002
 ## 本章要写到的事(确认即生效)
 - [ ] 林晚查到玉佩的第一条线索
 - [ ] 伏笔-001 推进

+ 15 - 5
v7/test/host-shells/generate.test.js

@@ -25,9 +25,15 @@ test('生成 claude-code 壳:hasHooks 块入、unless 块去;两审完整模
   assert.match(skill, /独立 subagent/)
   assert.ok(!skill.includes('兼容模式'), 'agentCapable=true 应去掉兼容模式块')
   assert.match(skill, /node \.webnovel\/bin\/webnovel-writer\.js next --json/, '命令引用变量应渲染为 vendored 调用')
-  for (const cmdName of ['review-input', 'save-review', 'finalize', 'persist-book', 'persist-outline']) {
+  for (const cmdName of [
+    'review-input', 'save-review', 'finalize', 'persist-book', 'persist-outline',
+    'knowledge-query', 'persist-contract', 'persist-design', 'read-design',
+  ]) {
     assert.ok(skill.includes(cmdName), `写章流程应接 F1 命令 ${cmdName}`)
   }
+  assert.match(skill, /本章技法/)
+  assert.match(skill, /factChanges/)
+  assert.doesNotMatch(skill, /题材流派指导|恩怨清算|章尾钩子|节拍索引/)
   assert.ok(!skill.includes('{{'), '占位符应全部渲染')
 })
 
@@ -43,10 +49,14 @@ test('生成 codex 壳:无 hook → unless 块入;角色输出 TOML', async
 
 test('角色占位符注入 category(来自 schema.js 单源)', async () => {
   const out = await generateHostShells(V7)
-  const role = out['claude-code']['agents/事实审查.md']
-  assert.match(role, /unregistered_thread/)
-  assert.ok(!role.includes('{{categories'), 'category 占位符已渲染')
-  assert.ok(!role.includes('{{schema'), 'schema 占位符已渲染')
+  const factRole = out['claude-code']['agents/事实审查.md']
+  const editorialRole = out['claude-code']['agents/编辑审.md']
+  assert.match(factRole, /unregistered_thread/)
+  assert.match(factRole, /factChanges/)
+  assert.match(editorialRole, /作品契约/)
+  assert.doesNotMatch(`${factRole}\n${editorialRole}`, /题材流派指导|恩怨清算默认|恩怨清算:/)
+  assert.ok(!factRole.includes('{{categories'), 'category 占位符已渲染')
+  assert.ok(!factRole.includes('{{schema'), 'schema 占位符已渲染')
 })
 
 test('drift check:同输入连跑两次逐字节一致', async () => {

+ 4 - 0
v7/test/installer/install.test.js

@@ -40,6 +40,10 @@ test('init:一条命令装出完整布局(AC2),vendored bin 自包含可
       '.webnovel/src/session/index.js',
       '.webnovel/roles/事实审查.md',
       '.webnovel/roles/编辑审.md',
+      '.webnovel/references/README.md',
+      '.webnovel/docs/knowledge/维度宪章.md',
+      '.webnovel/docs/knowledge/调用者与字段矩阵.md',
+      '.webnovel/docs/knowledge/策展规则.md',
       '.webnovel/node_modules/js-yaml/package.json',
       '.webnovel/node_modules/argparse/package.json',
       '.webnovel/package.json',

+ 10 - 0
v7/test/knowledge/pipeline.test.js

@@ -342,6 +342,16 @@ test('installer vendoring 含 references(A4,目录结构规范 4.3)', asyn
   const files = await collectRuntimeFiles(packageRoot)
   assert.ok(files['.webnovel/references/路由.csv'])
   assert.ok(files['.webnovel/references/节拍/PA-001-压抑蓄力爆发.md'])
+  for (const name of ['维度宪章.md', '调用者与字段矩阵.md', '策展规则.md']) {
+    assert.ok(files[`.webnovel/docs/knowledge/${name}`], `安装包缺治理文档 ${name}`)
+  }
+  const readme = files['.webnovel/references/README.md']
+  const governanceLinks = [...readme.matchAll(/\]\((\.\.\/docs\/knowledge\/[^)]+)\)/g)]
+  assert.equal(governanceLinks.length, 3, 'references README 应明确链接三份治理真源')
+  for (const match of governanceLinks) {
+    const target = path.posix.normalize(path.posix.join('.webnovel/references', match[1]))
+    assert.ok(files[target], `references README 链接失效:${match[1]}`)
+  }
 })
 
 test('知识库整体缺失时序1/序6 DTO 零报错(A3)', async () => {

+ 5 - 8
v7/test/references/format.test.js

@@ -62,15 +62,12 @@ test('书级条目三节齐全(骨架约定/读者预期/毒点展开)', asy
   }
 })
 
-test('题材条目必有 恩怨清算默认 且取值合法', async () => {
-  const 合法档位 = ['有仇必报', '宿命必偿', '恩怨分明', '以直报怨', '留有余地']
+test('题材条目不携带关系结算枚举或题材默认值', async () => {
   for (const f of await mdFiles('题材')) {
     const raw = await fs.readFile(path.join(ROOT, '题材', f), 'utf8')
     const fm = parseFrontMatter(raw)
-    assert.ok(
-      合法档位.includes(fm.data.恩怨清算默认),
-      `题材/${f} 恩怨清算默认 取值不合法:${fm.data.恩怨清算默认}`
-    )
+    assert.equal('恩怨清算默认' in fm.data, false, `题材/${f} 仍有已删除的题材默认值`)
+    assert.equal('恩怨清算' in fm.data, false, `题材/${f} 仍有已删除的关系结算枚举`)
   }
 })
 
@@ -93,7 +90,7 @@ test('路由表:名称唯一、别名不与任何名称冲突、维度合法
   }
 })
 
-test('毒点措辞不误伤角色设计(恩怨清算红线只判叙事与主角)', async () => {
+test('毒点措辞不以禁止某类角色替代叙事结果核对', async () => {
   for (const dir of [...章级目录, ...书级目录]) {
     for (const f of await mdFiles(dir)) {
       const raw = await fs.readFile(path.join(ROOT, dir, f), 'utf8')
@@ -101,7 +98,7 @@ test('毒点措辞不误伤角色设计(恩怨清算红线只判叙事与主
       for (const p of fm.data.毒点 || []) {
         assert.ok(
           !/不得出现.{0,6}角色/.test(p),
-          `${dir}/${f} 毒点「${p}」疑似禁角色人设——毒点只判叙事结果与主角行为`
+          `${dir}/${f} 毒点「${p}」疑似用禁角色人设替代叙事结果核对`
         )
       }
     }

+ 29 - 0
v7/test/review/orchestration.test.js

@@ -81,6 +81,35 @@ test('runReviews:DI 注入两审 → 校验+合并+落盘审稿单与评审报
   } finally { await cleanup() }
 })
 
+test('事实审查顶层 factChanges 穿过 schema 归一化并写入正式报告', async () => {
+  const { ctx, cleanup, root } = await makeReviewBook()
+  try {
+    const factChanges = [{
+      planPath: '大纲/创作设计/设定/ITEM-002-玄阶令牌.md',
+      factPath: '定稿/设定/物品/玄阶令牌.md',
+      content: '---\n名称: 玄阶令牌\n---\n正文已建立的事实。\n',
+      decision: '无冲突',
+      removePlan: true,
+    }]
+    const reviewers = {
+      factCheck: async (input) => ({ chapter: input.章号, issues: [], factChanges }),
+      editorial: async (input) => ({ chapter: input.章号, issues: [] }),
+    }
+    const result = await runReviews(ctx, {
+      chapterNum: 2,
+      draftPath: '工作区/草稿.md',
+      mode: 'complete',
+      reviewers,
+    })
+    assert.equal(result.ok, true)
+    assert.deepEqual(result.merged.事实审查.factChanges, factChanges, 'schema 归一化不得丢顶层事实差异')
+    const saved = JSON.parse(
+      await fs.readFile(path.join(root, '工作区', '评审报告', '事实审查.json'), 'utf8')
+    )
+    assert.deepEqual(saved.factChanges, factChanges, '正式事实审查报告必须保留 factChanges')
+  } finally { await cleanup() }
+})
+
 test('runReviews:降级模式 → 审稿单含兼容声明', async () => {
   const { ctx, cleanup, root } = await makeReviewBook()
   try {

+ 24 - 0
v7/test/storage/adapters/DesignReader.test.js

@@ -0,0 +1,24 @@
+import { test } from 'node:test'
+import assert from 'node:assert/strict'
+import path from 'node:path'
+import { fileURLToPath } from 'node:url'
+import { DesignReader } from '../../../src/storage/adapters/DesignReader.js'
+
+const __dirname = path.dirname(fileURLToPath(import.meta.url))
+const fixtureRoot = path.join(__dirname, '../../fixtures/sample-book')
+
+test('sample-book 的计划对象可按 ID 和名称精确读取', async () => {
+  const reader = new DesignReader(fixtureRoot)
+  const listed = await reader.list()
+  assert.equal(listed.ok, true, listed.errors.join(';'))
+  assert.ok(listed.objects.some((item) => item.ID === 'ITEM-002' && item.名称 === '玄阶令牌'))
+
+  const byId = await reader.read('ITEM-002')
+  assert.equal(byId.ok, true, byId.error)
+  assert.equal(byId.data.path, '大纲/创作设计/设定/ITEM-002-玄阶令牌.md')
+  assert.match(byId.data.sections.get('本书设计'), /权限凭证/)
+
+  const byName = await reader.read('玄阶令牌')
+  assert.equal(byName.ok, true, byName.error)
+  assert.equal(byName.data.ID, 'ITEM-002')
+})