dsh-novel-write-engine 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,7 +4,9 @@
4
4
 
5
5
  它不是一个提示词合集,也不是独立的写作软件。它把「这一章处于什么阶段、下一步只能做什么、正文是否达标、归档要核销哪些实体」变成可执行、可回滚、可审计的引擎;模型负责写,引擎负责裁决和记账。
6
6
 
7
- > **当前版本:0.1.2** · 中文界面 · MIT
7
+ 0.2.0 起,它同时管理**整本书**:书级蓝图 → 卷/章大纲 → 世界观设定集 → 单章 P1–P9 流水线 → 归档回写大纲 → 报告/体检/搜索/面板。大纲可以从 Markdown/YAML/JSON 导入,也可以由模型按章卡结构生成;严格模式下 P2/P3 会按章卡校验标题、场景、字数与 cast。
8
+
9
+ > **当前版本:0.2.0** · 中文界面 · MIT
8
10
  >
9
11
  > **宿主范围**:DSH `>=0.2.1-rc.2 <0.3.0-0`;Node `>=24.9.0`。
10
12
 
@@ -47,17 +49,18 @@
47
49
  ```text
48
50
  模型 / 用户
49
51
  │
50
- ├── 18 个 novel_* 工具
51
- ├── 5 条 /novel* 命令
52
+ ├── 27 个 novel_* 工具
53
+ ├── 5 条 /novel* 命令(含 outline/guide/report/doctor/search 子命令)
52
54
  ├── 只读侧边栏「网文工坊」
53
55
  └── 7 份阶段任务书(briefs)
54
56
  │
55
57
  ▼
56
58
  EngineService(唯一写入口)
57
59
  │
58
- ├── 12 条门控 PG-01 ~ PG-12
60
+ ├── 13 条门控 PG-01 ~ PG-13
59
61
  ├── 15 维评分 / 满分 150
60
62
  ├── 规则包 rulepacks/default.yaml
63
+ ├── 书级蓝图/大纲/世界观(outline/)
61
64
  ├── 事务化归档 + journal 审计
62
65
  └── chapters/ 正文 + state/ 影子账本
63
66
  ```
@@ -70,26 +73,29 @@
70
73
  - 不是「装完就自动写完整本书」的生成器;它管流程、门禁和状态,正文仍由模型写。
71
74
  - 不是独立 CLI;必须作为 DSH 插件安装到某个 profile 才能使用。
72
75
  - 不提供云端同步、账号体系、在线书城或多人协作。
73
- - 0.1.2 只有中文界面与中文任务书,没有 `locale/`,也不读取系统语言。
76
+ - 0.2.0 仍是中文界面与中文任务书,没有 `locale/`,也不读取系统语言。
77
+ - 不提供云端同步、多人协作、RAG/向量库或富文本编辑器;整书规划与单章流水线都在本地 YAML/Markdown 上完成。
74
78
 
75
79
  ---
76
80
 
77
81
  ## 二、功能全貌
78
82
 
79
- | 能力 | 说明 |
80
- |---|---|
81
- | 18 个 `novel_*` 工具 | 从建项目、领任务书、写初稿、评审、修订、校验、归档到导出、审计、回退 |
82
- | 5 条 `/novel*` 命令 | 状态、下一步、统计、导出、隐藏操作;命令与工具共用同一套服务 |
83
- | 1 个侧边栏面板「网文工坊」 | 只读;Hero、统计、九阶段轨、下一步卡、章节卡、门控区 |
84
- | 1 个内置 Agent 预设「网文工坊」 | 18 个工具全开,**不挂载 bash / 文件写入工具**;会话开始后不能切换 |
85
- | 1 个入口技能 | 告诉模型什么时候该用引擎、哪些写入口是唯一的 |
86
- | 12 条门控 | 任务书、阶段、字数、格式、摘要、场景类型、评分、问题清零、阅读证明、一致性、轮次、归档原子性 |
87
- | 15 维评分 | 满分 150,默认过关线 120;分数必须逐项可核对 |
88
- | 事务化归档 | staging → 校验 → 备份 → pending journal → rename → 读回 → committed journal |
89
- | 规则包外置 | 词表、格式、标点、语义、跨章阈值都在 `rulepacks/default.yaml`,代码只执行 |
90
- | 三种导出 | Markdown、纯文本、EPUB 3;附 `cover.svg` 与 `blurb.txt` |
91
- | 多项目注册表 | `stateDir/projects.yaml` 记录已知项目与当前项目;不影响项目目录 |
92
- | 运行期依赖极少 | 只有 `yaml` 一个运行时依赖;不联网、不调用外部 API、不读环境变量里的密钥 |
83
+ | 能力 | 说明 |
84
+ | ------------------------------- | -------------------------------------------------------------------------------------------- |
85
+ | 27 个 `novel_*` 工具 | 书级蓝图/大纲/世界观 + 单章流水线 + 报告/体检/搜索/引导/重开 |
86
+ | 5 条 `/novel*` 命令 | 状态、下一步、统计、导出、隐藏操作;`/novel` 内含 outline/guide/report/doctor/search 子命令 |
87
+ | 1 个侧边栏面板「网文工坊」 | 只读;Hero、统计、全书规划、世界观、质量趋势、健康、最近活动、九阶段轨、章节卡、门控区 |
88
+ | 1 个内置 Agent 预设「网文工坊」 | 27 个工具全开,**不挂载 bash / 文件写入工具**;会话开始后不能切换 |
89
+ | 1 个入口技能 | 告诉模型什么时候该用引擎、哪些写入口是唯一的 |
90
+ | 13 条门控 | 任务书、阶段、字数、格式、摘要、场景类型、大纲对齐、评分、问题清零、阅读证明、一致性、轮次、归档原子性 |
91
+ | 15 维评分 | 满分 150,默认过关线 120;分数必须逐项可核对 |
92
+ | 事务化归档 | staging → 校验 → 备份 → pending journal → rename → 读回 → committed journal |
93
+ | 规则包外置 | 词表、格式、标点、语义、跨章阈值都在 `rulepacks/default.yaml`,代码只执行 |
94
+ | 六种导出 | Markdown、纯文本、EPUB 3、大纲、世界观、书级提案;正文导出附 `cover.svg` 与 `blurb.txt` |
95
+ | 整书规划层 | 书级蓝图、卷结构、章卡(严格模式)、世界观设定集;支持 Markdown/YAML/JSON 导入 |
96
+ | 可观测性 | `novel_status` 书级摘要、`novel_report`、`novel_doctor`、`novel_search`、panel v2、journal 活动 |
97
+ | 多项目注册表 | `stateDir/projects.yaml` 记录已知项目与当前项目;不影响项目目录 |
98
+ | 运行期依赖极少 | 只有 `yaml` 一个运行时依赖;不联网、不调用外部 API、不读环境变量里的密钥 |
93
99
 
94
100
  ### 关键设计
95
101
 
@@ -103,46 +109,47 @@
103
109
 
104
110
  ### 九个阶段
105
111
 
106
- | 阶段 | 名称 | 谁执行 | 产物 |
107
- |---|---|---|---|
108
- | P1 | 世界观约束 | 模型 | `plans/chNNN.world.yaml` |
109
- | P2 | 章节计划 | 模型 | `plans/chNNN.chapter.yaml` |
110
- | P3 | 初稿 | 模型 | `chapters/chapter-NNN.md` |
111
- | P4 | 评审 | 模型 | `reviews/chNNN.review.yaml` |
112
- | P5 | 修订 | 模型(有 blocker 时) | 覆盖正文 |
113
- | P6 | 一致性校验 | 引擎机检 + 模型语义项 | `checks/chNNN.check.yaml` |
114
- | P7 | 状态同步 | **引擎事务** | `state/*.yaml` |
115
- | P8 | 终审 | **引擎事务** | 三端一致性报告 |
116
- | P9 | 归档 | **引擎事务** | 章节索引 + 交接 |
112
+ | 阶段 | 名称 | 谁执行 | 产物 |
113
+ | ---- | ---------- | --------------------- | --------------------------- |
114
+ | P1 | 世界观约束 | 模型 | `plans/chNNN.world.yaml` |
115
+ | P2 | 章节计划 | 模型 | `plans/chNNN.chapter.yaml` |
116
+ | P3 | 初稿 | 模型 | `chapters/chapter-NNN.md` |
117
+ | P4 | 评审 | 模型 | `reviews/chNNN.review.yaml` |
118
+ | P5 | 修订 | 模型(有 blocker 时) | 覆盖正文 |
119
+ | P6 | 一致性校验 | 引擎机检 + 模型语义项 | `checks/chNNN.check.yaml` |
120
+ | P7 | 状态同步 | **引擎事务** | `state/*.yaml` |
121
+ | P8 | 终审 | **引擎事务** | 三端一致性报告 |
122
+ | P9 | 归档 | **引擎事务** | 章节索引 + 交接 |
117
123
 
118
124
  P7/P8/P9 在 `novel_archive` 一次事务里完成。单章归档后状态是 `done`;下一章仍从 P1 开始。只有项目配置的 `total_chapters` 全部归档,面板才显示「全书完成」。
119
125
 
120
- ### 十二道门控
121
-
122
- | 编号 | 名称 | 管什么 |
123
- |---|---|---|
124
- | PG-01 | `BRIEF_REQUIRED` | 当前阶段任务书已签发,digest 匹配 |
125
- | PG-02 | `STAGE_ORDER` | 只能提交当前阶段允许的产物 |
126
- | PG-03 | `WORD_COUNT` | 字数达到项目下限 |
127
- | PG-04 | `FORMAT` | 段落、标点、Markdown、标题等格式 blocker 为零 |
128
- | PG-05 | `SUMMARY_SCHEMA` | 十章摘要的十个字段齐全且类型正确 |
129
- | PG-06 | `SCENE_TYPE` | 场景类型合法,节奏约束满足 |
130
- | PG-07 | `SCORE` | 十五维齐全、算术闭合、总分达到 `minScore` |
131
- | PG-08 | `ISSUES_CLEARED` | 所有 blocker issue 已修复并带正文证据 |
132
- | PG-09 | `READING_PROOF` | 三段逐字引用能在正文对应位置找到;开头/结尾按实际段落判定 |
133
- | PG-10 | `CONSISTENCY` | 伏笔、时间线、资源、关系、重复段落等跨章对账 |
134
- | PG-11 | `ROUNDS` | 评审/修订、校验/修订均不超过 3 轮 |
135
- | PG-12 | `ARCHIVE_ATOMIC` | 归档事务三端一致且读回验证通过 |
126
+ ### 十三道门控
127
+
128
+ | 编号 | 名称 | 管什么 |
129
+ | ----- | ---------------- | --------------------------------------------------------- |
130
+ | PG-01 | `BRIEF_REQUIRED` | 当前阶段任务书已签发,digest 匹配 |
131
+ | PG-02 | `STAGE_ORDER` | 只能提交当前阶段允许的产物 |
132
+ | PG-03 | `WORD_COUNT` | 字数达到项目下限 |
133
+ | PG-04 | `FORMAT` | 段落、标点、Markdown、标题等格式 blocker 为零 |
134
+ | PG-05 | `SUMMARY_SCHEMA` | 十章摘要的十个字段齐全且类型正确 |
135
+ | PG-06 | `SCENE_TYPE` | 场景类型合法,节奏约束满足 |
136
+ | PG-13 | `OUTLINE_ALIGNMENT` | 有章卡时标题/场景/目标字数/cast 必须一致;严格模式无卡也拒绝;归档卡不可改 |
137
+ | PG-07 | `SCORE` | 十五维齐全、算术闭合、总分达到 `minScore` |
138
+ | PG-08 | `ISSUES_CLEARED` | 所有 blocker issue 已修复并带正文证据 |
139
+ | PG-09 | `READING_PROOF` | 三段逐字引用能在正文对应位置找到;开头/结尾按实际段落判定 |
140
+ | PG-10 | `CONSISTENCY` | 伏笔、时间线、资源、关系、重复段落等跨章对账 |
141
+ | PG-11 | `ROUNDS` | 评审/修订、校验/修订均不超过 3 轮 |
142
+ | PG-12 | `ARCHIVE_ATOMIC` | 归档事务三端一致且读回验证通过 |
136
143
 
137
144
  门控按固定顺序求值,并且**收集全部失败项**,不是遇到第一个就返回——这样模型可以一次改完。
138
145
 
139
146
  ### 十五维评分
140
147
 
141
- | 组 | 维度 |
142
- |---|---|
148
+ | 组 | 维度 |
149
+ | ---------------- | ----------------------------------------------------------------------------------------------------------------------------- |
143
150
  | A 核心叙事(90) | R-W-01 人设驱动 15 · R-W-02 情绪外化 10 · R-W-03 对话区分度 10 · R-W-04 爽点密度 20 · R-W-05 断章法则 15 · R-W-12 反文青病 20 |
144
- | B 商业指标(45) | R-W-11 元描写与视角侵入 10 · R-W-13 信息增量 15 · R-W-14 钩子质量 10 · R-W-15 期待值兑现 10 |
145
- | C 格式硬性(15) | R-W-06 段落长度 4 · R-W-07 去 AI 味 4 · R-W-08 硬性禁令 4 · R-W-09 字数 2 · R-W-10 标题 1 |
151
+ | B 商业指标(45) | R-W-11 元描写与视角侵入 10 · R-W-13 信息增量 15 · R-W-14 钩子质量 10 · R-W-15 期待值兑现 10 |
152
+ | C 格式硬性(15) | R-W-06 段落长度 4 · R-W-07 去 AI 味 4 · R-W-08 硬性禁令 4 · R-W-09 字数 2 · R-W-10 标题 1 |
146
153
 
147
154
  合计严格 150。默认 `minScore = 120`,可在配置里改;它是 PG-07 的唯一过关线。
148
155
 
@@ -157,15 +164,15 @@ P7/P8/P9 在 `novel_archive` 一次事务里完成。单章归档后状态是 `d
157
164
 
158
165
  ## 三、兼容性与前置条件
159
166
 
160
- | 项目 | 要求 |
161
- |---|---|
162
- | DSH | `>=0.2.1-rc.2 <0.3.0-0`;由 `package.json` 的 `engines.dsh` 声明,安装与启动都会检查 |
163
- | Node.js | `>=24.9.0` |
164
- | pnpm | CLI 安装/卸载插件需要;建议 11.x(本仓库开发基线为 11.28.9) |
167
+ | 项目 | 要求 |
168
+ | -------- | ---------------------------------------------------------------------------------------------------- |
169
+ | DSH | `>=0.2.1-rc.2 <0.3.0-0`;由 `package.json` 的 `engines.dsh` 声明,安装与启动都会检查 |
170
+ | Node.js | `>=24.9.0` |
171
+ | pnpm | CLI 安装/卸载插件需要;建议 11.x(本仓库开发基线为 11.28.9) |
165
172
  | 宿主形态 | Web(面板 + 预设)、Desktop(面板 + 预设,插件由桌面壳管理)、headless(只有工具/命令,无面板/预设) |
166
- | 磁盘 | 项目根目录可写;默认 `stateDir` 可写 |
167
- | 网络 | 安装时需要访问 npm / Git 托管;运行插件本身不联网 |
168
- | 语言 | 0.1.2 仅中文 |
173
+ | 磁盘 | 项目根目录可写;默认 `stateDir` 可写 |
174
+ | 网络 | 安装时需要访问 npm / Git 托管;运行插件本身不联网 |
175
+ | 语言 | 0.2.0 仅中文 |
169
176
 
170
177
  检查命令:
171
178
 
@@ -233,12 +240,12 @@ corepack pnpm dsh web
233
240
 
234
241
  DSH 把不同应用形态放在 profile 里:
235
242
 
236
- | 启动方式 | profile | 面板 | 内置预设 |
237
- |---|---|---|---|
238
- | `dsh web` | `web` | 有 | 有 |
239
- | Desktop | `desktop` | 有 | 有 |
240
- | `dsh headless` | `headless` | 无 | 无 |
241
- | `dsh --profile <名字> web` | `<名字>` | 取决于该 profile | 取决于该 profile |
243
+ | 启动方式 | profile | 面板 | 内置预设 |
244
+ | -------------------------- | ---------- | ---------------- | ---------------- |
245
+ | `dsh web` | `web` | 有 | 有 |
246
+ | Desktop | `desktop` | 有 | 有 |
247
+ | `dsh headless` | `headless` | 无 | 无 |
248
+ | `dsh --profile <名字> web` | `<名字>` | 取决于该 profile | 取决于该 profile |
242
249
 
243
250
  profile 默认位于:
244
251
 
@@ -269,7 +276,7 @@ dsh plugin --profile web add dsh-novel-write-engine
269
276
  固定版本:
270
277
 
271
278
  ```bash
272
- dsh plugin --profile web add dsh-novel-write-engine@0.1.2
279
+ dsh plugin --profile web add dsh-novel-write-engine@0.2.0
273
280
  ```
274
281
 
275
282
  `dsh` 不在 PATH 时,用 `npx @deepseek-ai/dsh` 代替命令开头的 `dsh`。
@@ -324,13 +331,13 @@ corepack pnpm pack
324
331
  会得到类似:
325
332
 
326
333
  ```text
327
- dsh-novel-write-engine-0.1.2.tgz
334
+ dsh-novel-write-engine-0.2.0.tgz
328
335
  ```
329
336
 
330
337
  把这个 tarball 复制到目标机器,放在一个**稳定、不会随手删除**的路径,然后:
331
338
 
332
339
  ```bash
333
- dsh plugin --profile web add /absolute/path/to/dsh-novel-write-engine-0.1.2.tgz
340
+ dsh plugin --profile web add /absolute/path/to/dsh-novel-write-engine-0.2.0.tgz
334
341
  ```
335
342
 
336
343
  tarball 安装不会运行源码构建,也不会要求 `allowBuilds`;包内已经包含 `lib/`、`rulepacks/`、`briefs/`、`skills/`、`presets/` 和两层 patch。它是最接近「发布产物」的安装方式。
@@ -345,9 +352,9 @@ tarball 安装不会运行源码构建,也不会要求 `allowBuilds`;包内
345
352
  2. 点 **添加插件**(或旁边的箭头 → **安装第三方插件**)。
346
353
  3. 在包名字段填入以下任一形式:
347
354
  - npm 包名:`dsh-novel-write-engine`
348
- - 精确版本:`dsh-novel-write-engine@0.1.2`
355
+ - 精确版本:`dsh-novel-write-engine@0.2.0`
349
356
  - 源码目录:`/absolute/path/to/dsh-novel-write-engine`
350
- - tarball:`/absolute/path/to/dsh-novel-write-engine-0.1.2.tgz`
357
+ - tarball:`/absolute/path/to/dsh-novel-write-engine-0.2.0.tgz`
351
358
  4. npm 包名从 npm 官方源安装;本地目录和 tarball 直接使用宿主路径。
352
359
  5. 点 **安装**,等待完成。
353
360
  6. 如果出现 **立即启用**,点它;否则安装后到「已安装插件」里把 **dsh-novel-write-engine** 打开。
@@ -397,7 +404,7 @@ dsh --profile web --dump-config | grep -A8 '# == dsh-novel-write-engine'
397
404
  列出你当前可用的 novel_* 工具。
398
405
  ```
399
406
 
400
- 应能看到 18 个(`toolsMode=core` 时只有 8 个,见[第八节](#八使用方式))。
407
+ 应能看到 27 个(`toolsMode=core` 时只有 10 个,见[第八节](#八使用方式))。
401
408
 
402
409
  ---
403
410
 
@@ -407,7 +414,7 @@ dsh --profile web --dump-config | grep -A8 '# == dsh-novel-write-engine'
407
414
 
408
415
  左侧栏 → 新建会话 → 预设选 **网文工坊**。
409
416
 
410
- 这个预设的工具是「小说专用」的:有 18 个 `novel_*` 工具、任务书、网页、待办、子智能体等,但**不挂载 bash / 文件写入工具**。正文只能经引擎写。
417
+ 这个预设的工具是「小说专用」的:有 27 个 `novel_*` 工具、任务书、网页、待办、子智能体等,但**不挂载 bash / 文件写入工具**。正文只能经引擎写。
411
418
 
412
419
  ### 2. 直接说人话
413
420
 
@@ -416,10 +423,18 @@ dsh --profile web --dump-config | grep -A8 '# == dsh-novel-write-engine'
416
423
  ```text
417
424
  在 /home/me/novels/星海 开一本都市现代、番茄平台的书,
418
425
  书名《星海旧梦》,作者是我,每章 2200–2800 字,共 120 章。
419
- 先做第一章的世界观约束和章节计划,不要一次写太多。
426
+ 先做全书蓝图、第一卷大纲和世界观设定,再写第一章的世界观约束和章节计划。
420
427
  ```
421
428
 
422
- 模型会调用 `novel_init` 建项目,然后按阶段领取任务书。
429
+ 模型会调用 `novel_init` 建项目,然后按 `novel_guide` 的提示做书级规划;也可以跳过蓝图直接写第一章,严格大纲是可选开关。0.2.0 推荐顺序:
430
+
431
+ ```text
432
+ novel_init
433
+ → novel_blueprint(梗概/主题/基调/视角/卷结构)
434
+ → novel_outline(章卡)或 novel_outline_import(Markdown/YAML/JSON)
435
+ → novel_worldbook(设定/规则/势力/地点/角色/术语/前史)
436
+ → novel_brief P1 …
437
+ ```
423
438
 
424
439
  ### 3. 等价的 `novel_init` 参数
425
440
 
@@ -434,39 +449,45 @@ dsh --profile web --dump-config | grep -A8 '# == dsh-novel-write-engine'
434
449
  "description": "一句话简介",
435
450
  "words_per_chapter": [2200, 2800],
436
451
  "total_chapters": 120,
452
+ "premise": "旧案重启,档案员被迫入局。",
453
+ "strict_outline": true,
437
454
  "project_root": "/home/me/novels/星海"
438
455
  }
439
456
  ```
440
457
 
458
+ `premise`、`logline`、`themes`、`tone`、`pov`、`audience`、`selling_points`、`ending` 与 `strict_outline` 都是可选的书级种子;不填也能开书,之后用 `novel_blueprint` 补。
459
+
441
460
  `genre` 必须是 12 类之一,`platform` 必须是 `fanqie` / `qidian` / `qimao` / `jinjiang` 之一。`project_root` 省略时按「最近活跃项目 → 注册表 active → 配置里的 `projectRoot`(默认 `./novel`,相对于 DSH 进程工作目录)」解析;有多个项目时请显式传 `project_root`,避免写错书。
442
461
 
443
462
  ### 4. 一章的标准调用顺序
444
463
 
445
- | 步骤 | 调用 | 说明 |
446
- |---|---|---|
447
- | 1 | `novel_brief P1` | 领取 P1 世界观任务书,签收 digest |
448
- | 2 | `novel_plan_world` | 提交世界观约束 |
449
- | 3 | `novel_brief P2` | 领取 P2 章节计划任务书 |
450
- | 4 | `novel_plan_chapter` | 提交本章计划 |
451
- | 5 | `novel_brief P3` | 领取 P3 初稿任务书 |
452
- | 6 | `novel_write_draft` | 提交正文;格式/字数/摘要不过则整体拒绝 |
453
- | 7 | `novel_brief P4` | 领取 P4 评审任务书 |
454
- | 8 | `novel_review` | 十五维评分 + 三段阅读证明 |
455
- | 9 | 有 blocker:`novel_brief P5` → `novel_revise` | 修订后回到 P4 重评 |
456
- | 10 | 无 blocker:`novel_brief P6` → `novel_check` | 机检 + 四个语义项 |
457
- | 11 | `novel_brief P8` | 领取终审任务书 |
458
- | 12 | `novel_archive` | 必须带 `state_delta`,一次事务归档 |
459
- | 13 | `novel_export md` | 或 `txt` / `epub` |
464
+ | 步骤 | 调用 | 说明 |
465
+ | ---- | --------------------------------------------- | -------------------------------------- |
466
+ | 0 | `novel_blueprint` / `novel_outline` | 书级蓝图与当前章卡(严格模式必须) |
467
+ | 1 | `novel_brief P1` | 领取 P1 世界观任务书,签收 digest |
468
+ | 2 | `novel_plan_world` | 提交世界观约束 |
469
+ | 3 | `novel_brief P2` | 领取 P2 章节计划任务书 |
470
+ | 4 | `novel_plan_chapter` | 提交本章计划 |
471
+ | 5 | `novel_brief P3` | 领取 P3 初稿任务书 |
472
+ | 6 | `novel_write_draft` | 提交正文;格式/字数/摘要不过则整体拒绝 |
473
+ | 7 | `novel_brief P4` | 领取 P4 评审任务书 |
474
+ | 8 | `novel_review` | 十五维评分 + 三段阅读证明 |
475
+ | 9 | 有 blocker:`novel_brief P5` → `novel_revise` | 修订后回到 P4 重评 |
476
+ | 10 | 无 blocker:`novel_brief P6` → `novel_check` | 机检 + 五个语义项(含 POV) |
477
+ | 11 | `novel_brief P8` | 领取终审任务书 |
478
+ | 12 | `novel_archive` | 必须带 `state_delta`,一次事务归档 |
479
+ | 13 | `novel_export md` | 或 `txt` / `epub` / `outline` / `worldbook` / `proposal` |
460
480
 
461
481
  关键点:
462
482
 
463
483
  - **每一步提交前都要先领任务书**,PG-01 会检查 digest。`novel_status` / `novel_pipeline` 在任务书缺失或过期时会先返回 `novel_brief`,不会让你直接撞 PG-01。
464
- - **plan/review/check 损坏时不是死锁**:status 返回 `state_errors` 与 `STATE_UNREADABLE`;当前阶段晚于重建点时,`next` 指向 `novel_rollback`,已经处在 P2/P4/P6 时则直接指向 `novel_brief` → 对应的 `novel_plan_chapter`/`novel_review`/`novel_check`。不会让模型在同一条 rollback 上循环。P6 的 check 损坏优先于旧 revision 阻塞;归档前 `review_digest` 缺失/不匹配会显示 `REVIEW_DIGEST_MISSING`/`REVIEW_DIGEST_MISMATCH` 并回退 P4。
465
- - **计划先校验再落盘**:P1 的 `constraints`/`characters`/`locations`/`continuity_notes` 有形状校验;P2 的标题 4–8 字、5–8 个非空节拍、narrator、opening/ending 都会在服务边界拒绝。
466
- - **上下文有预算**:每个 brief 的 `context.context_meta` 给出 `budget`/`used`/`truncated`/`omitted`;正文、当前 plan/review/check 与摘要受保护,不会被静默截断。裁剪会参与 digest,升级后旧 brief 需要重新领取。
484
+ - **坏状态不是死锁**:plan/review/check/worldPlan、八个 ledger 与 outline/worldbook 损坏时,status 返回 `state_errors` 与 `STATE_UNREADABLE`;plan/review/check 走 rollback/阶段重建,ledger/project/规划文档则 `novel_state` 返回 `raw`、`next` 指向 `novel_amend`。`novel_amend` 会为当前所有不可读状态文档豁免 journal 的既有 hash,并在同一事务里写目标文档与 `state/pipeline.yaml`(不是只写一个文件);其他可读文件的外部改动仍拒绝。P6 的 check 损坏优先于旧 revision 阻塞;归档前 `review_digest` 缺失/不匹配会回退 P4。损坏或丢失的 `novel.yaml` 也走同一条 `PROJECT_UNREADABLE` 修复路径。
485
+ - **计划先校验再落盘**:P1 的 `constraints`/`characters`/`locations`/`continuity_notes` 有形状校验;P2 的标题长度读 rulepack、5–8 个非空节拍、narrator、opening/ending 都会在服务边界拒绝。P2 可选 `cast`(1–8 人),名字必须来自 P1 世界计划或角色台账。
486
+ - **上下文有预算且不裁主角团**:每个 brief 的 `context.context_meta` 给出 `budget`/`used`/`truncated`/`omitted`;P1 `world_plan` 的目标/约束/连续性说明、P3/P4/P5 的本章活跃角色完整卡、P6 的 `active_cast` 与正文/当前 plan/review/check/摘要受保护;`world_plan.characters/locations` 是可裁剪的候选名单,`other_characters` 只放压缩索引。裁剪会参与 digest,升级后旧 brief 需要重新领取。
487
+ - **长书读口**:`novel_state {kind:"chapters"}` 默认返回紧凑索引,`include_summary`/`chapter_range` 按需取;panel 只送最近 30 行。归档继承上一章 handoff 的 volume/volume_name;act/act_progress 从上一章推进,`handoff.act`/`act_progress` 可覆盖。
467
488
  - `ready_to_archive` 在 P8 任务书当前后,`next.tool` 才返回 `novel_archive`;P5/P6 有阻塞时返回 `novel_revise`。
468
489
  - `novel_review` 的 `total` 是必填的,必须等于 `150 - Σdelta`;三段阅读证明必须逐字来自正文,开头/结尾按**实际段落**判定;issue 的 `dimension` 必须是当前十五维之一,`location` 必须是本章实际段落。
469
- - `novel_check` 的 `semantic` 恰好四个语义项,每项带至少 8 字、四条互不相同的正文引用;`scope` 默认 `content + integrity`,只跑一类时另一类不参与本次 check。
490
+ - `novel_check` 的 `semantic` 恰好五个语义项(`L2-SCENE-ANCHOR` / `L2-CHARACTER-STATE` / `L2-CAUSALITY` / `L2-VOICE` / `L2-POV`),每项带至少 8 字、五条互不相同且来自不同句子的正文引用;`scope` 默认 `content + integrity`,只跑一类时另一类不参与本次 check,且通过后仍停留 P6(`CHECK_SCOPE_PARTIAL`),不能归档。
470
491
  - `novel_archive` 的 `state_delta` 要逐实体核销角色、伏笔、时间线、世界、关系;新伏笔标题必须出现在正文,`no_change` 也要写原因;review 存在但 `review_digest` 缺失时拒绝归档,需重新 `novel_review`。
471
492
  - 正文改动后,旧的评审分数和 check 会失效;不要试图手工改 `state/` 绕过。
472
493
 
@@ -476,9 +497,10 @@ dsh --profile web --dump-config | grep -A8 '# == dsh-novel-write-engine'
476
497
 
477
498
  - Hero:书名、类型、平台、当前章、阶段;
478
499
  - 统计:已归档章节、总字数、平均分、待处理门控;
500
+ - 全书规划:蓝图/严格模式、章卡进度、卷列表、世界观计数、质量趋势、健康度;
479
501
  - 九阶段轨;
480
502
  - 下一步卡;
481
- - 章节卡与门控区。
503
+ - 章节卡、门控区与最近活动。
482
504
 
483
505
  面板每 15 秒静默同步一次,也可以点刷新;它**只读**,所有写操作仍在对话/工具里。
484
506
 
@@ -488,38 +510,47 @@ dsh --profile web --dump-config | grep -A8 '# == dsh-novel-write-engine'
488
510
 
489
511
  ### 8.1 三种会话形态
490
512
 
491
- | 形态 | 怎么进 | 工具 | 写文件能力 | 面板/预设 |
492
- |---|---|---|---|---|
493
- | 内置预设「网文工坊」 | 新会话选预设 | 18 个全开 | 不挂 bash/fs 写入工具,正文只经引擎 | 有 |
494
- | 普通会话 | 任意标准会话 | 18 个工具在根层注册 | 可能还有 bash/fs;引擎保证会被绕过 | 有面板,无专用预设 |
495
- | headless / 自动化 | `dsh --profile headless "..."` | 18 个(或 core 8 个) | 取决于该 profile | 无面板、无预设 |
513
+ | 形态 | 怎么进 | 工具 | 写文件能力 | 面板/预设 |
514
+ | -------------------- | ------------------------------ | --------------------- | ----------------------------------- | ------------------ |
515
+ | 内置预设「网文工坊」 | 新会话选预设 | 27 个全开 | 不挂 bash/fs 写入工具,正文只经引擎 | 有 |
516
+ | 普通会话 | 任意标准会话 | 27 个工具在根层注册 | 可能还有 bash/fs;引擎保证会被绕过 | 有面板,无专用预设 |
517
+ | headless / 自动化 | `dsh --profile headless "..."` | 27 个(或 core 10 个) | 取决于该 profile | 无面板、无预设 |
496
518
 
497
519
  **要用「引擎保证」就用「网文工坊」预设。** 普通会话里,模型仍然可以用文件工具直接改 `state/` 或正文;那时你得到的是「引擎工具 + 人工操作」的混合状态,事务、门控、审计都不再完整。
498
520
 
499
521
  预设是会话类型,**会话开始后不能切换**。要换形态就新开一个会话。
500
522
 
501
- ### 8.2 18 个工具
502
-
503
- | 工具 | 阶段 | 做什么 | 写盘 |
504
- |---|---|---|---|
505
- | `novel_init` | — | 建项目:`novel.yaml` + `state/` + 目录 | 是 |
506
- | `novel_status` | 任意 | 当前活跃章、阶段、轮次、阻塞项、`state_errors`、下一步;`chapter` 只用于字数查询 | 否 |
507
- | `novel_brief` | P1–P6 / P8 | 领取当前活跃章的任务书,返回 `fields`、`context` 与 `context_meta` 并记录 digest | 仅任务书签收 |
508
- | `novel_plan_world` | P1 | 提交世界观约束;数组/对象形状在服务边界校验 | 是 |
509
- | `novel_plan_chapter` | P2 | 提交章节计划;标题 4–8 字、5–8 个节拍、opening/ending 非空 | 是 |
510
- | `novel_write_draft` | P3 | 提交初稿;格式/字数/摘要不过整体拒绝 | 是 |
511
- | `novel_review` | P4 | 十五维评分、问题清单、三段阅读证明;issue 维度/段落和 blocker waived 会被拒绝 | 是 |
512
- | `novel_revise` | P5/P6 | 提交修订;blocker 必须有正文证据,不能降级或 waived;issue 只能改 status/evidence | 是 |
513
- | `novel_check` | P6 | 机检 + 四个语义一致性项;`scope` 可只跑 `content` 或 `integrity` | 是 |
514
- | `novel_archive` | P7–P9 | 事务归档;必须带 `state_delta`;旧 review 无 digest 时拒绝 | 事务 |
515
- | `novel_word_count` | 任意 | 按引擎唯一口径数字数 | 否 |
516
- | `novel_state` | 任意 | 读账本、计划、评审、检查、handoff;`review`/`check` 可按历史章读取 | 否 |
517
- | `novel_amend` | 任意 | 带原因修订一个状态文档 | 是,入 journal |
518
- | `novel_rollback` | 任意 | 只退回当前阶段或更早,保留正文供参考 | 是 |
519
- | `novel_diff` | 任意 | 与上次归档备份或两段文本比较 | 否 |
520
- | `novel_export` | 任意 | 导出 `md` / `txt` / `epub` | 导出目录 |
521
- | `novel_audit` | 任意 | 读追加式 journal 审计记录 | 否 |
522
- | `novel_pipeline` | 任意 | 「下一步该做什么」的建议 | 否 |
523
+ ### 8.2 27 个工具
524
+
525
+ | 工具 | 阶段 | 做什么 | 写盘 |
526
+ | -------------------- | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | -------------- |
527
+ | `novel_init` | — | 建项目:`novel.yaml` + `state/` + `outline/` + 目录 | 是 |
528
+ | `novel_status` | 任意 | 当前活跃章、阶段、轮次、阻塞项、`state_errors`、下一步;`chapter` 只用于字数查询 | 否 |
529
+ | `novel_brief` | P1–P6 / P8 | 领取当前活跃章的任务书,返回 `fields`、`context`;`context.world_plan` 与 `context.context_meta` 在 `context` 内,并记录 digest | 仅任务书签收 |
530
+ | `novel_plan_world` | P1 | 提交世界观约束;数组/对象形状在服务边界校验 | 是 |
531
+ | `novel_plan_chapter` | P2 | 提交章节计划;标题长度读 rulepack、5–8 个节拍、opening/ending 非空;可选 `cast` 1–8 人 | 是 |
532
+ | `novel_write_draft` | P3 | 提交初稿;格式/字数/摘要不过整体拒绝 | 是 |
533
+ | `novel_review` | P4 | 十五维评分、问题清单、三段阅读证明;issue 维度/段落和 blocker waived 会被拒绝 | 是 |
534
+ | `novel_revise` | P5/P6 | 提交修订;blocker 必须有正文证据,不能降级或 waived;issue 只能改 status/evidence | 是 |
535
+ | `novel_check` | P6 | 机检 + 五个语义一致性项;`scope` 可只跑 `content`/`integrity`,但单 scope 不推进归档 | 是 |
536
+ | `novel_archive` | P7–P9 | 事务归档;必须带 `state_delta`;旧 review 无 digest 时拒绝 | 事务 |
537
+ | `novel_word_count` | 任意 | 按引擎唯一口径数字数 | 否 |
538
+ | `novel_state` | 任意 | 读账本、计划、评审、检查、handoff、outline/worldbook;`review`/`check` 可按历史章读取;chapters 默认紧凑,支持 `include_summary`/`chapter_range`;损坏 ledger 返回 raw | 否 |
539
+ | `novel_amend` | 任意 | 带原因修订 `novel.yaml`、八个 ledger 或 outline/worldbook,带不变量与单目标 repair | 是,入 journal |
540
+ | `novel_rollback` | 任意 | 只退回当前阶段或更早,保留正文供参考 | 是 |
541
+ | `novel_diff` | 任意 | 与上次归档备份或两段文本比较 | 否 |
542
+ | `novel_export` | 任意 | 导出 `md` / `txt` / `epub` / `outline` / `worldbook` / `proposal` | 导出目录 |
543
+ | `novel_audit` | 任意 | 读追加式 journal 审计记录 | 否 |
544
+ | `novel_pipeline` | 任意 | 「下一步该做什么」的建议 | 否 |
545
+ | `novel_blueprint` | 任意 | 写书级蓝图:梗概、主题、基调、视角、读者、卖点、结局、卷结构 | 是 |
546
+ | `novel_outline` | 任意 | 写卷/章卡;严格模式、归档卡保护、归档章自动回填 | 是 |
547
+ | `novel_outline_import` | 任意 | 从 Markdown / YAML / JSON 导入大纲;`dry_run` 先预览 | 可选 |
548
+ | `novel_worldbook` | 任意 | 增量更新世界观设定集(设定/规则/势力/地点/角色/术语/前史) | 是 |
549
+ | `novel_search` | 任意 | 跨正文、摘要、大纲、世界观、台账搜索,带章号/段落号/片段 | 否 |
550
+ | `novel_doctor` | 任意 | 项目体检:项目/流水线/状态、journal、正文 hash、孤立正文、大纲覆盖与漂移、当前阶段产物、锁、备份、目标进度、下一步 | 否 |
551
+ | `novel_report` | 任意 | 全书报告:进度、大纲、世界观、质量、节奏、角色、伏笔、时间线、关系、活动 | 否 |
552
+ | `novel_guide` | 任意 | 上手引导:当前状态、已完成步骤、下一步工具、命令与提示;无项目也能用 | 否 |
553
+ | `novel_reopen` | 已归档章 | 从归档备份把紧邻的上一章重开到 P3;必须带非空 `reason`,活动章未开始、备份存在时才允许 | 是 |
523
554
 
524
555
  工具失败时统一返回:
525
556
 
@@ -537,32 +568,37 @@ dsh --profile web --dump-config | grep -A8 '# == dsh-novel-write-engine'
537
568
 
538
569
  注册的命令是 5 条:
539
570
 
540
- | 命令 | 作用 |
541
- |---|---|
542
- | `/novel` | 不带参数 = 状态;`/novel status` 同义 |
543
- | `/novel-next` | 下一步工具与理由 |
544
- | `/novel-stats` | 章节数、总字数、平均分、未回收伏笔、规则包版本 |
545
- | `/novel-export` | 导出 `md` / `txt` / `epub`,例如 `/novel-export epub` |
546
- | `/novel-admin` | `/novel-admin <op> <json>` 执行隐藏/运维操作 |
571
+ | 命令 | 作用 |
572
+ | --------------- | ----------------------------------------------------- |
573
+ | `/novel` | 不带参数 = 状态;`/novel status` 同义 |
574
+ | `/novel-next` | 下一步工具与理由 |
575
+ | `/novel-stats` | 章节数、总字数、平均分、未回收伏笔、规则包版本 |
576
+ | `/novel-export` | 导出 `md` / `txt` / `epub` / `outline` / `worldbook` / `proposal` |
577
+ | `/novel-admin` | `/novel-admin <op> <json>` 执行隐藏/运维操作 |
547
578
 
548
579
  `/novel` 还有子命令:
549
580
 
550
581
  ```text
551
582
  /novel next
552
583
  /novel stats
553
- /novel export md|txt|epub
584
+ /novel outline
585
+ /novel guide
586
+ /novel report
587
+ /novel doctor
588
+ /novel search <关键词>
589
+ /novel export md|txt|epub|outline|worldbook|proposal
554
590
  /novel admin
555
591
  /novel admin novel_state {"kind":"pipeline"}
556
592
  ```
557
593
 
558
- **`toolsMode=core` 时**只注册 8 个高频工具:
594
+ **`toolsMode=core` 时**只注册 10 个高频工具:
559
595
 
560
596
  ```text
561
- novel_init, novel_status, novel_brief, novel_write_draft,
562
- novel_review, novel_revise, novel_check, novel_archive
597
+ novel_init, novel_status, novel_guide, novel_brief, novel_outline,
598
+ novel_write_draft, novel_review, novel_revise, novel_check, novel_archive
563
599
  ```
564
600
 
565
- 其余 10 个工具不消失,改走命令:
601
+ 其余 17 个非 core 工具不消失,改走命令(`novel_outline` 与 `novel_guide` 同时在 core 中,也可通过 admin 调用):
566
602
 
567
603
  ```text
568
604
  /novel admin novel_plan_world {...}
@@ -575,6 +611,15 @@ novel_review, novel_revise, novel_check, novel_archive
575
611
  /novel admin novel_export {"kind":"md"}
576
612
  /novel admin novel_audit {"limit":20}
577
613
  /novel admin novel_pipeline
614
+ /novel admin novel_blueprint {...}
615
+ /novel admin novel_outline {...}
616
+ /novel admin novel_outline_import {...}
617
+ /novel admin novel_worldbook {...}
618
+ /novel admin novel_search {"query":"..."}
619
+ /novel admin novel_doctor
620
+ /novel admin novel_report
621
+ /novel admin novel_guide
622
+ /novel admin novel_reopen {"chapter":2,"reason":"..."}
578
623
  ```
579
624
 
580
625
  多项目注册表与设定包导入**只有命令入口**:
@@ -619,6 +664,9 @@ novel_review, novel_revise, novel_check, novel_archive
619
664
  /novel export md
620
665
  /novel export txt
621
666
  /novel export epub
667
+ /novel export outline
668
+ /novel export worldbook
669
+ /novel export proposal
622
670
  /novel-export epub
623
671
  ```
624
672
 
@@ -628,6 +676,9 @@ novel_review, novel_revise, novel_check, novel_archive
628
676
  exports/
629
677
  ├── book.md / book.txt / book.epub # 全书
630
678
  ├── book-ch001.md / .txt / .epub # 单章
679
+ ├── outline.md # 大纲(与导入模板同形)
680
+ ├── worldbook.md # 世界观设定集
681
+ ├── proposal.md # 书级提案
631
682
  ├── cover.svg
632
683
  └── blurb.txt
633
684
  ```
@@ -645,20 +696,49 @@ exports/
645
696
  - 切换 active:`/novel admin novel_registry_activate {"root":"/abs/book"}`;
646
697
  - 删除注册行:`/novel admin novel_registry_forget {"root":"/abs/book"}`;项目文件不动。
647
698
 
699
+ ### 8.7 整书规划、观测与修复
700
+
701
+ ```text
702
+ # 1. 书级蓝图与卷
703
+ novel_blueprint {premise, logline, themes, tone, pov, audience,
704
+ selling_points, ending, strict, volumes}
705
+
706
+ # 2. 章卡;或从 Markdown/YAML/JSON 导入
707
+ novel_outline {chapters}
708
+ novel_outline_import {format:"markdown", content:"...", dry_run:true}
709
+
710
+ # 3. 世界观设定集(按段替换)
711
+ novel_worldbook {setting, rules, factions, locations, characters, glossary, backstory}
712
+
713
+ # 4. 每次写章前看 guide;写完随时看 report/doctor/search
714
+ novel_guide
715
+ novel_report
716
+ novel_doctor
717
+ novel_search {query:"蜡印", scope:"all"}
718
+
719
+ # 5. 已归档章要改:先重开紧邻的上一章,再走 P3→P9
720
+ novel_reopen {chapter:3, reason:"结尾需要重写"}
721
+ ```
722
+
723
+ - 严格大纲:`book.strict=true` 时 P2/P3 必须要有章卡;只要章卡存在,标题/场景/目标字数/cast 在任何模式下都受 PG-13 约束。要关闭严格缺卡检查用 `novel_blueprint {strict:false}`。
724
+ - 归档卡不可直接改;`novel_reopen` 需要非空 `reason`,会从该章归档事务的备份恢复索引/台账/handoff/正文。
725
+ - `novel_doctor` 只读;`novel_amend` 才是修复写入口。
726
+ - 报告/体检/搜索结果都带章号与可定位片段,不是笼统摘要。
727
+
648
728
  ---
649
729
 
650
730
  ## 九、配置
651
731
 
652
732
  ### 9.1 六个配置项
653
733
 
654
- | 键 | 默认 | 说明 |
655
- |---|---|---|
656
- | `projectRoot` | `./novel` | 默认项目根;相对路径相对于 DSH 进程工作目录。工具可用 `project_root` 覆盖 |
657
- | `minScore` | `120` | PG-07 过关线,整数 0..150;唯一 owner |
658
- | `toolsMode` | `all` | `all` 注册 18 个工具;`core` 只注册 8 个,其余走 `/novel admin` |
659
- | `briefsOverrides` | 空 | 自定义任务书目录;某阶段文件缺失时回退包内 `briefs/<阶段>.md` |
660
- | `backupRetention` | `5` | 保留的归档备份目录数;只清理引擎自己创建的 `backups/<txid>` |
661
- | `stateDir` | 空 → `~/.dsh/novel-write-engine` | 多项目注册表位置;**不要放进项目目录** |
734
+ | 键 | 默认 | 说明 |
735
+ | ----------------- | -------------------------------- | ------------------------------------------------------------------------- |
736
+ | `projectRoot` | `./novel` | 默认项目根;相对路径相对于 DSH 进程工作目录。工具可用 `project_root` 覆盖 |
737
+ | `minScore` | `120` | PG-07 过关线,整数 0..150;唯一 owner |
738
+ | `toolsMode` | `all` | `all` 注册 27 个工具;`core` 只注册 10 个,其余走 `/novel admin` |
739
+ | `briefsOverrides` | 空 | 自定义任务书目录;某阶段文件缺失时回退包内 `briefs/<阶段>.md` |
740
+ | `backupRetention` | `5` | 保留的归档备份目录数;只清理引擎自己创建的 `backups/<txid>` |
741
+ | `stateDir` | 空 → `~/.dsh/novel-write-engine` | 多项目注册表位置;**不要放进项目目录** |
662
742
 
663
743
  > `stateDir` 的默认值是代码按当前用户 home 拼出的 `~/.dsh/novel-write-engine`,不跟随 `DSH_HOME`。如果你改了 `DSH_HOME`,建议显式把它设成绝对路径。
664
744
  >
@@ -701,7 +781,7 @@ Windows 路径:
701
781
  projectRoot: D:/novels
702
782
  minScore: 125
703
783
  toolsMode: all
704
- briefsOverrides: ""
784
+ briefsOverrides: ''
705
785
  backupRetention: 5
706
786
  stateDir: C:/Users/you/.dsh/novel-write-engine
707
787
  ```
@@ -731,7 +811,7 @@ P8.md
731
811
 
732
812
  ### 9.4 规则包不能运行期切换
733
813
 
734
- `rulepacks/default.yaml` 是随包加载的:词表、格式、标点、语义、跨章阈值、平台默认值都在里面。0.1.2 **不接受**运行期外部规则包路径。
814
+ `rulepacks/default.yaml` 是随包加载的:词表、格式、标点、语义、跨章阈值、平台默认值都在里面。0.2.0 **不接受**运行期外部规则包路径。
735
815
 
736
816
  要改规则,只有两条路:
737
817
 
@@ -773,6 +853,7 @@ corepack pnpm test
773
853
  │ ├── foreshadows.yaml
774
854
  │ ├── relationships.yaml
775
855
  │ ├── handoff.yaml
856
+ │ ├── archive-digests.json # 内部归档幂等账本(journal 跟踪)
776
857
  │ └── journal.jsonl # 追加式事务日志
777
858
  ├── backups/<txid>/ # 归档前快照
778
859
  ├── exports/ # 导出产物
@@ -800,7 +881,7 @@ corepack pnpm test
800
881
  - 正文可以读,但不建议手改;正文一改,评审分数、check、content hash 都会失效。
801
882
  - `state/` 不要手改;要改就用 `novel_amend`,它要求 `reason` 并写入 journal。
802
883
  - 要回退阶段用 `novel_rollback`;它只允许退回当前阶段或更早,会保留正文为参考,清空任务书签收与轮次。
803
- - plan/review/check 损坏时,status 的 `state_errors` 会指出文件;不要手改。当前阶段晚于重建点时先 `novel_rollback`;已经处在 P2/P4/P6 时直接重新取 brief,再用对应阶段工具重建。
884
+ - plan/review/check 损坏时,status 的 `state_errors` 会指出文件;不要手改。当前阶段晚于重建点时先 `novel_rollback`;已经处在 P2/P4/P6 时直接重新取 brief,再用对应阶段工具重建。八个 ledger、`novel.yaml` 或 outline/worldbook 损坏时,`novel_state` 返回 raw,按 `next` 调 `novel_amend` 修复;当前所有不可读状态文档的 journal hash 会被豁免,其他可读文件的外部改动仍 fail-closed。
804
885
  - 不要在引擎运行时删 `.engine.lock`;锁由引擎回收,手删可能让两个写者同时进入。
805
886
 
806
887
  ### 10.4 备份与恢复
@@ -814,7 +895,21 @@ corepack pnpm test
814
895
 
815
896
  ## 十一、升级
816
897
 
817
- ### 11.0 从 0.1.1 升级到 0.1.2
898
+ ### 11.0 从 0.1.3 升级到 0.2.0
899
+
900
+ 0.2.0 新增 `outline/outline.yaml` 与 `outline/worldbook.yaml`,新增 9 个工具与 PG-13;旧项目缺少两份规划文档时按空规划读取,不会报错。新项目默认写入两份空文档;严格大纲默认关闭,`novel_outline` 首次提交才开启。P6 语义项从 4 条变 5 条(新增 `L2-POV`),旧的 4 条 check 需要重跑。面板 payload v1 → v2,旧标签页显示刷新。所有升级后第一次取 brief 会因上下文新增 `book_plan`/`outline_card`/`worldbook` 而失效,重新 `novel_brief` 即可。
901
+
902
+ 需要知道的行为变化:
903
+
904
+ 1. **损坏台账可修**:八个 ledger 或 outline/worldbook 损坏时 status/panel 仍可读;`novel_state` 返回 `raw`,用 `novel_amend` 修复。amend 会为当前所有不可读状态文档豁免 journal 的既有 hash;真正可读文件的外部改动仍 fail-closed。
905
+ 2. **chapters 不变量**:amend 不能删已归档章、不能改 `content_hash`/`archive_digest`;有章节文件时还会核对 hash。
906
+ 3. **P2 cast 可选**:旧 plan 没有 `cast` 仍可读;新 plan 可传 1–8 人,P3 会把这些人物的完整卡放进上下文。
907
+ 4. **chapters 查询变紧凑**:`novel_state {kind:"chapters"}` 默认不再带 summary;需要完整摘要加 `include_summary:true` 或 `chapter_range`。
908
+ 5. **单 scope check 不再归档**:只跑 content 或 integrity 的 check 通过后停留 P6,并附 `CHECK_SCOPE_PARTIAL`;必须再跑完整 scope。
909
+ 6. **handoff 派生**:归档不再每章重算 `ceil(chapter/20)`;volume/volume_name 继承上一章,act/act_progress 从上一章推进,`handoff.act`/`act_progress` 可覆盖。
910
+ 7. **panel 上限 30 行**:长书面板只送最近 30 章,统计仍用全书总数。
911
+
912
+ ### 11.0.1 从 0.1.1 升级到 0.1.2
818
913
 
819
914
  0.1.2 不 bump schema,也不改工具名/参数;但它会主动让三类旧状态暴露出来:
820
915
 
@@ -840,7 +935,7 @@ dsh plugin --profile web add dsh-novel-write-engine@latest
840
935
  也可以固定版本:
841
936
 
842
937
  ```bash
843
- dsh plugin --profile web add dsh-novel-write-engine@0.1.2
938
+ dsh plugin --profile web add dsh-novel-write-engine@0.2.0
844
939
  ```
845
940
 
846
941
  升级后核对:
@@ -882,7 +977,7 @@ corepack pnpm pack
882
977
 
883
978
  ```bash
884
979
  dsh plugin --profile web remove dsh-novel-write-engine
885
- dsh plugin --profile web add /absolute/path/to/dsh-novel-write-engine-0.1.2.tgz
980
+ dsh plugin --profile web add /absolute/path/to/dsh-novel-write-engine-0.2.0.tgz
886
981
  ```
887
982
 
888
983
  ### 11.5 在 Web / Desktop 里升级
@@ -999,25 +1094,25 @@ dsh --profile web --dump-config | grep dsh-novel-write-engine
999
1094
 
1000
1095
  ## 十三、故障排查
1001
1096
 
1002
- | 现象 | 最可能的原因 | 处理 |
1003
- |---|---|---|
1004
- | `dsh plugin add` 404 / 找不到包 | 包名拼错、registry 不可达,或镜像尚未同步 | 确认 `npm view dsh-novel-write-engine version`;必要时切回官方 registry |
1005
- | `npm install` 成功但 DSH 没有插件 | `npm install` 不会把插件加入 profile | 执行 `dsh plugin --profile web add dsh-novel-write-engine`,见 5.1 |
1006
- | `dsh: command not found` | CLI 未全局安装 | 用 `npx @deepseek-ai/dsh ...`,或先 `npm i -g @deepseek-ai/dsh` |
1007
- | `dsh plugin` 报找不到 pnpm | 只装了 DSH,没装 pnpm | `corepack enable && corepack prepare pnpm@11.28.9 --activate` |
1008
- | `--dump-config` 没有插件层 | 装到了别的 profile | 用实际启动的 profile 重装;`dsh --profile <name> ...` |
1009
- | 插件页显示已安装但开关打不开 | 包不完整/版本不兼容/被更高层覆盖 | 看插件页诊断;用 tarball 重装;检查 `engines.dsh` |
1010
- | 侧边栏没有「网文工坊」 | 不是 Web/Desktop profile,或 client bundle 未加载 | 用 `dsh web` / Desktop;刷新;重启 |
1011
- | 预设列表没有「网文工坊」 | headless/acp/sdk 没有 `agentPresets`,或插件未启用 | 改用 Web;插件页启用;新开会话 |
1012
- | 会话里没有 `novel_*` 工具 | 插件未启用、旧会话未刷新、装错 profile | 新开会话;重启;`--dump-config` 核对 |
1013
- | `ENGINE_STAGE_ORDER` | 跳过了阶段或顺序不对 | `/novel` / `novel_status` 看下一步;按 `novel_brief` 领任务书 |
1014
- | `ENGINE_GATE_BLOCKED` | 门控未过 | 看 `blocking` 的 code/detail/hint;改正文或补证据;不要手改 state |
1015
- | `ENGINE_PROJECT_NOT_FOUND` | 项目根不对/未初始化 | `novel_init`,或传正确的 `project_root` |
1016
- | 面板空白/显示没有项目 | 当前没有项目,或 active 指向旧路径 | 先 `novel_init`;`/novel admin novel_registry_activate` 切到正确项目 |
1017
- | 面板显示「需要刷新」 | 浏览器缓存了旧 client bundle | 刷新页面;重启 DSH |
1018
- | 升级后仍是旧行为 | 源码目录没 `corepack pnpm build`,或旧会话未换 | 重新构建;重启;新开会话 |
1019
- | 卸载后配置项还在 | profile 的 `cordis.patch.yml` 还留着覆盖 | 删除 `id: novel-write-engine` 的段落 |
1020
- | `EACCES` / 写入失败 | 项目根或 `stateDir` 对 DSH 进程不可写 | 改权限,或换可写路径 |
1097
+ | 现象 | 最可能的原因 | 处理 |
1098
+ | --------------------------------- | -------------------------------------------------- | ----------------------------------------------------------------------- |
1099
+ | `dsh plugin add` 404 / 找不到包 | 包名拼错、registry 不可达,或镜像尚未同步 | 确认 `npm view dsh-novel-write-engine version`;必要时切回官方 registry |
1100
+ | `npm install` 成功但 DSH 没有插件 | `npm install` 不会把插件加入 profile | 执行 `dsh plugin --profile web add dsh-novel-write-engine`,见 5.1 |
1101
+ | `dsh: command not found` | CLI 未全局安装 | 用 `npx @deepseek-ai/dsh ...`,或先 `npm i -g @deepseek-ai/dsh` |
1102
+ | `dsh plugin` 报找不到 pnpm | 只装了 DSH,没装 pnpm | `corepack enable && corepack prepare pnpm@11.28.9 --activate` |
1103
+ | `--dump-config` 没有插件层 | 装到了别的 profile | 用实际启动的 profile 重装;`dsh --profile <name> ...` |
1104
+ | 插件页显示已安装但开关打不开 | 包不完整/版本不兼容/被更高层覆盖 | 看插件页诊断;用 tarball 重装;检查 `engines.dsh` |
1105
+ | 侧边栏没有「网文工坊」 | 不是 Web/Desktop profile,或 client bundle 未加载 | 用 `dsh web` / Desktop;刷新;重启 |
1106
+ | 预设列表没有「网文工坊」 | headless/acp/sdk 没有 `agentPresets`,或插件未启用 | 改用 Web;插件页启用;新开会话 |
1107
+ | 会话里没有 `novel_*` 工具 | 插件未启用、旧会话未刷新、装错 profile | 新开会话;重启;`--dump-config` 核对 |
1108
+ | `ENGINE_STAGE_ORDER` | 跳过了阶段或顺序不对 | `/novel` / `novel_status` 看下一步;按 `novel_brief` 领任务书 |
1109
+ | `ENGINE_GATE_BLOCKED` | 门控未过 | 看 `blocking` 的 code/detail/hint;改正文或补证据;不要手改 state |
1110
+ | `ENGINE_PROJECT_NOT_FOUND` | 项目根不对/未初始化 | `novel_init`,或传正确的 `project_root` |
1111
+ | 面板空白/显示没有项目 | 当前没有项目,或 active 指向旧路径 | 先 `novel_init`;`/novel admin novel_registry_activate` 切到正确项目 |
1112
+ | 面板显示「需要刷新」 | 浏览器缓存了旧 client bundle | 刷新页面;重启 DSH |
1113
+ | 升级后仍是旧行为 | 源码目录没 `corepack pnpm build`,或旧会话未换 | 重新构建;重启;新开会话 |
1114
+ | 卸载后配置项还在 | profile 的 `cordis.patch.yml` 还留着覆盖 | 删除 `id: novel-write-engine` 的段落 |
1115
+ | `EACCES` / 写入失败 | 项目根或 `stateDir` 对 DSH 进程不可写 | 改权限,或换可写路径 |
1021
1116
 
1022
1117
  ### 仍然卡住时,提供这四样信息
1023
1118
 
@@ -1062,9 +1157,10 @@ DSH bundle 的 Host 半边在 DSH 进程内执行,不受工作区沙箱限制
1062
1157
 
1063
1158
  ## 十五、已知限制
1064
1159
 
1065
- - **0.1.2 只有中文**:面板、命令、错误、任务书都是中文;没有 `locale/`,不跟随系统语言。
1160
+ - **书级大纲是 0.2.0 的新数据源**:`outline/outline.yaml` 与 `outline/worldbook.yaml` 由引擎读写;有章卡时 P2/P3 受 PG-13 约束,严格模式还要求章卡存在。大纲是规划层,不替代 `state/` 台账。
1161
+ - **0.2.0 只有中文**:面板、命令、错误、任务书都是中文;没有 `locale/`,不跟随系统语言。
1066
1162
  - **通过 npm 分发**:安装与升级统一使用 `dsh plugin add`;源码目录和 tarball 用于开发或离线环境。
1067
- - **面板与预设只在 Web/Desktop**:headless / acp / sdk 没有 `agentPresets` 服务,也没有浏览器面板;18 个工具仍可用。
1163
+ - **面板与预设只在 Web/Desktop**:headless / acp / sdk 没有 `agentPresets` 服务,也没有浏览器面板;27 个工具仍可用。
1068
1164
  - **规则包不可运行期替换**:要改词表/阈值,必须改源码、重新构建、重新安装。
1069
1165
  - **普通会话可能绕过引擎**:只有「网文工坊」预设不挂 bash/fs 写工具;在普通会话里手动改文件,事务与门控保证不再完整。
1070
1166
  - **预设会话开始后不能切换**。
@@ -1109,19 +1205,19 @@ DSH_BUNDLE_ROOT=/path/to/deepseek-harness/packages/bundle/web-app corepack pnpm
1109
1205
 
1110
1206
  `check:preset` 不伪造 bundle root;没有宿主 checkout 时它不会假装通过。
1111
1207
 
1112
- `check:host` 使用临时 `DSH_HOME` 与临时 profile:`npm pack → dsh plugin add → --dump-config → 启动 Web → 面板 401/200 → 卸载 → 确认层消失`。它需要 PATH 里有 `dsh`(或设置 `DSH_BIN`),不会碰你的真实 profile;没有 DSH 时以退出码 2 明确失败,不伪造通过。
1208
+ `check:host` 使用临时 `DSH_HOME` 与临时 profile:`build → npm pack → dsh plugin add → --dump-config → 启动 Web → 面板 401/200 → 卸载 → 确认层消失`,并断言宿主声明全部 27 个工具。它需要 PATH 里有 `dsh`(或设置 `DSH_BIN`),不会碰你的真实 profile;没有 DSH 时以退出码 2 明确失败,不伪造通过。
1113
1209
 
1114
1210
  ### 16.3 发布前手动验证
1115
1211
 
1116
1212
  1. `corepack pnpm build && corepack pnpm pack`;
1117
1213
  2. 在临时 DSH home 里 `dsh plugin --profile web add <tarball>`;
1118
1214
  3. `--dump-config` 确认插件层;
1119
- 4. 启动 Web,确认面板、预设、18 个工具、`/novel`;
1215
+ 4. 启动 Web,确认面板、预设、27 个工具、`/novel`;
1120
1216
  5. 跑一遍 `novel_init → P1 → … → archive → export`;
1121
1217
  6. `dsh plugin remove`,确认层与面板消失;
1122
1218
  7. 确认项目数据未被卸载动作删除。
1123
1219
 
1124
- `pnpm check:host` 覆盖第 1–4 与第 6 步的自动断言;第 5 步仍是人工全流程(需要可用模型)。
1220
+ `pnpm check:host` 覆盖第 1–4 与第 6 步的自动断言(含 27 个工具的宿主声明与面板结构);`/novel` 命令的注册与路由由 `tests/adapters` 覆盖;第 5 步仍是人工全流程(需要可用模型)。
1125
1221
 
1126
1222
  ### 16.4 项目结构
1127
1223
 
@@ -1131,7 +1227,7 @@ src/
1131
1227
  ├── rules/ # 规则编译器、注册表、检测流水线
1132
1228
  ├── store/ # FsStore、事务、锁、journal、迁移、注册表
1133
1229
  ├── engine/ # EngineService、门控、任务书、投影
1134
- ├── tools/ # 18 个工具适配器
1230
+ ├── tools/ # 27 个工具适配器
1135
1231
  ├── commands/ # 5 条命令 + admin
1136
1232
  ├── client/ # 侧边栏面板
1137
1233
  ├── remote/ # 只读 panel 路由
@@ -1145,12 +1241,13 @@ tests/ # 单测、集成、falsify、e2e
1145
1241
 
1146
1242
  ### 16.5 当前验证基线
1147
1243
 
1148
- 0.1.2 在 Node 24.19 / DSH 0.2.1-rc.3 上完成过:
1244
+ 0.2.0 在 Node 24.19 / DSH 0.2.1-rc.3 上完成过:
1149
1245
 
1150
- - `corepack pnpm test` 全绿(当前树 379 项);
1151
- - 覆盖率语句/分支/函数/行均达到门槛;
1246
+ - `corepack pnpm test` 全绿(当前树 625 项,71 个测试文件);
1247
+ - 最近一次覆盖率语句 93.94% / 分支 89.16% / 函数 98.02% / 行 93.94%(V8 分支/行计数会有 ±0.01 波动,门禁按单次真实结果判定),`test:coverage` 与逐文件 domain/book/insight 门禁全过;
1152
1248
  - `typecheck`、`lint`、`check:hygiene`、`test:isolated`、`build`、`validate:rulepack`、`check:pack`、`check:artifacts`、`check:install` 全绿;
1153
- - `check:host` 在临时 DSH profile 中实测:插件层出现、预设可见、面板未认证 401、认证后 200、headless 真实触发 `novel_init` 工具并落盘、`remove` 后层消失。
1249
+ - `check:host` 在临时 DSH profile 中实测:插件层出现、预设可见、面板未认证 401、认证后 200、headless 真实触发 `novel_init` 工具并落盘、`remove` 后层消失;`check:preset` 从真实 bundle 解析 13 个包;
1250
+ - `check:crash` 在真实子进程 SIGKILL 后恢复 pending journal:目标项目仍可读,无遗留 pending 事务。
1154
1251
 
1155
1252
  具体数字会随代码变化;发布前请以重新跑出的结果为准,不要把上面的历史数字当保证。
1156
1253
 
@@ -1158,15 +1255,17 @@ tests/ # 单测、集成、falsify、e2e
1158
1255
 
1159
1256
  ## 十七、文档地图与许可
1160
1257
 
1161
- | 文档 | 内容 |
1162
- |---|---|
1163
- | [DESIGN.md](DESIGN.md) | 完整设计书:架构、数据模型、规则、门控、事务、面板、预设 |
1164
- | [PLAN.md](PLAN.md) | 0.1.0 实施计划(历史) |
1165
- | [docs/0.1.2-plan.md](docs/0.1.2-plan.md) | 0.1.2 长书可运行性与证据闭环方案 |
1166
- | [docs/0.1.1-plan.md](docs/0.1.1-plan.md) | 0.1.1 契约收口与证据加固方案(历史) |
1167
- | [docs/tools.md](docs/tools.md) | 18 个工具与命令面速查 |
1168
- | [docs/states.md](docs/states.md) | 状态机、迁移表、轮次与回退 |
1169
- | [docs/rulepack.md](docs/rulepack.md) | 规则包结构、编译器断言、改词表流程 |
1258
+ | 文档 | 内容 |
1259
+ | ---------------------------------------- | --------------------------------------------------------- |
1260
+ | [DESIGN.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/DESIGN.md) | 完整设计书:架构、数据模型、规则、门控、事务、面板、预设 |
1261
+ | [PLAN.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/PLAN.md) | 0.1.0 实施计划(历史) |
1262
+ | [docs/0.2.0-plan.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/docs/0.2.0-plan.md) | 0.2.0 整书生命周期:蓝图/大纲/世界观/章卡/观测 |
1263
+ | [docs/0.2.0-real-model-evidence.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/docs/0.2.0-real-model-evidence.md) | 真实模型全链路验证回执 |
1264
+ | [docs/0.1.2-plan.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/docs/0.1.2-plan.md) | 0.1.2 长书可运行性与证据闭环方案(历史) |
1265
+ | [docs/0.1.1-plan.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/docs/0.1.1-plan.md) | 0.1.1 契约收口与证据加固方案(历史) |
1266
+ | [docs/tools.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/docs/tools.md) | 27 个工具与命令面速查 |
1267
+ | [docs/states.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/docs/states.md) | 状态机、迁移表、轮次与回退 |
1268
+ | [docs/rulepack.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/docs/rulepack.md) | 规则包结构、编译器断言、改词表流程 |
1170
1269
  | [CHANGELOG.md](CHANGELOG.md) | 版本变更 |
1171
1270
  | [LICENSE](LICENSE) | MIT |
1172
1271