dsh-novel-write-engine 0.2.4 → 0.2.6

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/CHANGELOG.md CHANGED
@@ -1,5 +1,56 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.6
4
+
5
+ ### Added
6
+
7
+ - **语义证据配对**:`novel_check` 失败项新增 `conflicts`(`duplicate`/`same_sentence`/`interval_overlap`,带 `other_id`、重叠原文/字数/比例、段落、句子),submission 错误的 message 汇总最多五条配对;aborted journal 写紧凑 blocking,失败后仍可审计。句边界统一由 `domain/text.ts` 的 `splitSentenceSpans` 提供,支持 `…` 与英文句点。
8
+ - **world 实体锚点**:`summary.new_element_anchors` 支持 `name + anchors`;PG-05 与新世界实体归档共用 `entity-anchors.ts`,新 ledger 持久化 `anchors`,旧数据无 anchors 继续按 name 回退。
9
+ - **panel v6**:`summary.bookData` 增加身份/蓝图、当前章卡与 metrics、世界/人物/关系/伏笔/时间线、15 维质量、节奏、逐章 effort、outline drift、state_errors/pending/damaged 区分;`quality` 明确区分全书 `average` 与 `last_ten_average`。
10
+ - **pipeline 恢复**:`novel_restore { paths: ["state/pipeline.yaml"], txid }` 可从有效备份恢复损坏 pipeline;status/doctor 报 `PIPELINE_UNREADABLE`,普通写操作在恢复前 fail-closed。
11
+ - **回归**:summary-only 的 PG-01 旁路只对紧接的 P6 check 生效;outline restore 复用归档卷守卫;PG-05 对 null world row 不再崩溃;PG-09 重复句匹配所有段落。
12
+
13
+ ### Fixed
14
+
15
+ - `resources:null` 不再被当成空对象;summary-only 不再静默吞掉 `issues`/`proof`;rulepack 递归 unknown-key 覆盖 `reader_intrusion`/`god_view`、`genres.*`、`water_words.scene_thresholds`。
16
+ - 面板 `pending` 不再丢失,活跃章详情改读 `pipeline.draft.summary`,`revisionLabel` 用本章 revise 轮次,samples/attempts 不再倒挂,章节行补齐 dialogue ratio 与 archived_at,教程版本升至 0.2.6。
17
+ - 测试与 docs 移除真实项目正文,新增覆盖 docs 的隐私扫描;工具数固定 28 并断言全集;R7 识别 `skipIf`;panel v6 从真实 engine 快照集成验证。
18
+
19
+ ### Migration
20
+
21
+ - check/world/summary 新字段均为 additive;旧文档可读,不自动迁移 anchors。
22
+ - 面板 v6 与 v5 不混用;旧标签页显示刷新。
23
+ - 工具 28、操作 32、语义项 5、门控 13、导出 6 均不变。
24
+
25
+ ## 0.2.5
26
+
27
+ ### Fixed
28
+
29
+ - **语义证据跨句/跨段**:`novel_check` 的引文不再要求落在同一句;支持句末收尾引号、跨段证据,逐条返回 `pass|fail|missing|invalid|not_found|too_short|duplicate|overlap|same_sentence`,并在失败时给出 `nearest`/`conflict_with`。同一段被两条证据复用、或同一句不同子串仍按 `overlap`/`same_sentence` 拒绝;真实 r0076 的四段双句引文全部通过,r0075 的编造 POV 引文只报 `not_found`。
30
+ - **check submission/content 分流**:形状、缺项、引文不存在等提交错误改为 `ENGINE_CHECK_SUBMISSION_INVALID`,不写 check、不增加 blocking、不消耗 `rounds.check`;只有正文/机器门真正的 content failure 才写 check 并 `counted:true`。工具错误行会回传逐条 `items`。
31
+ - **world delta 双真源仲裁**:`summary.new_elements` 只作为意图声明;`state/world.yaml` 的存在性为真源。已有实体写 `created` 归一化为 `updated`,新实体写 `updated`/`no_change` 在 kind/正文可判定时归一化为 `created`;kind/detail 冲突仍拒绝。`archiveChapter` 返回 `delta_warnings` 与 `normalized_world`,warning 不再静默。
32
+ - **pending 只读诊断**:`inspectPending` 分类 `none|complete|untouched|partial`;status/doctor/audit/panel 对 complete/untouched 给 warning、partial 给 `ENGINE_PENDING_PARTIAL`,不再误报 hash mismatch。`novel_init` 会先恢复/拒绝崩溃 init,partial 不被 PROJECT_EXISTS 掩盖。
33
+ - **outline 归档不变量统一**:`novel_blueprint`、`novel_outline_import`(含 dry-run)、`novel_amend(outline)` 与 `novel_outline` 共用 `assertArchivedCardVolumes`/`assertArchivedCardsInVolumes` 和 active 卡保护;即使旧卡缺失或卷重排,归档章也必须由最终卡指向覆盖它的卷。`reindexed`/`would_reindex` 显式回显,omitted 归档卡不再伪造 `archived_at`。
34
+ - **summary-only 修复**:`novel_revise` 可只传 `summary`:正文 hash、章文件和历史不变,不消耗 revise 轮次,保持/推进到 P6;不要求 P4/P6 proof,接下来可直接 check/archive。summary-only 明确拒绝 `issues`/`proof`,避免静默吞掉评审/证明。P8 与工具文档已改为先 summary-only、只有正文需要改才走 P5。
35
+ - **PG-05 前置**:P3/P5 即检查 `summary.new_elements` 名字在正文出现、已在 world ledger 时报“remove/use updated”,并校验 `characters_appeared` 正文/叙述者别名,避免错误留到 P8。
36
+ - **资源余额**:`current_state.resources` 与旧余额深合并,保留兄弟资源;created/updated 都校验有限非负整数,负值/字符串/null/数组拒绝;P8 示例与错误提示改为非负。
37
+
38
+ ### Hardened
39
+
40
+ - brief digest 绑定完整 project/outline/worldbook/plan/worldPlan,而不只是裁剪后的 context。
41
+ - characters/world 重复实体名在 load 与 amend 均拒绝;`strict_explicit` 只允许内部 provenance,公共 outline 写入拒绝该字段。
42
+ - FsStore 将 EACCES/EPERM/EROFS 包装为 `ENGINE_IO_PERMISSION`;rulepack 对每个 section/nested object 递归 knownKeys,包括 `reader_intrusion`/`god_view`、`genres.*` 与 `water_words.scene_thresholds`。
43
+ - worldbook 导出补 `数值事实`;duplicate paragraph 指回原章真实段落号;time regression 指向正文段落;timeline.characters 必须是已声明角色;export 在 artifact 缺失时使 replay 失效并重写。
44
+ - migration 备份 `backups/migrations/` 不参与 retention prune;无硬链接文件系统(FAT/SMB/WSL)用受控 rename fallback 回收 stale lock;面板选择中配置 projectRoot 优先于单行 registry;commands 错误行与 tools 一样保留 blocking/items。
45
+
46
+ ### Migration
47
+
48
+ - check 文档 schema_version 不变;新增字段可选,旧 check 可读。旧项目已消耗的 rounds 不回滚。
49
+ - archive 遇到旧 `summary.new_elements` 与 ledger 冲突时按新规则成功并给 warning;不会回写旧 ledger。
50
+ - summary-only 是新增调用模式,旧 content/patch 修订语义不变。
51
+ - `strict_explicit` 若曾被外部写入,仍可被读取;新的公共写入必须改用 `strict`。
52
+ - 详细验收与真实项目/模型证据见 `docs/0.2.5-acceptance.md`、`docs/0.2.5-real-model-evidence.md`。
53
+
3
54
  ## 0.2.4
4
55
 
5
56
  ### Changed
package/README.md CHANGED
@@ -4,15 +4,9 @@
4
4
 
5
5
  它不是一个提示词合集,也不是独立的写作软件。它把「这一章处于什么阶段、下一步只能做什么、正文是否达标、归档要核销哪些实体」变成可执行、可回滚、可审计的引擎;模型负责写,引擎负责裁决和记账。
6
6
 
7
- 0.2.0 起,它同时管理**整本书**:书级蓝图 → 卷/章大纲 → 世界观设定集 → 单章 P1–P9 流水线 → 归档回写大纲 → 报告/体检/搜索/面板。大纲可以从 Markdown/YAML/JSON 导入,也可以由模型按章卡结构生成;严格模式下 P2/P3 会按章卡校验标题、场景、字数与 cast。
7
+ 0.2.6 把“证据、台账、书籍数据”从能跑推进到可解释:语义证据改为配对冲突并统一句边界;world 新实体支持 `name + anchors`,不再逼正文写台账名;网文工坊 v6 增加书脊/当前章/人物关系/世界/伏笔/质量节奏/逐章 effort/健康恢复;同时补上 pipeline 备份恢复、summary-only 一次性 PG-01、outline restore 卷守卫与 PG-05 null 行保护。详见 [0.2.6 方案](docs/0.2.6-plan.md)。
8
8
 
9
- 0.2.2 把多项目选择从“进程最近一次工具调用”改为**会话级持久绑定**:显式 `project_root` 成功后会记住当前 DSH 会话;同一工作区的 A/B 会话不再串书。面板 v4 增加项目选择器与 choose/missing 状态,`/novel scan` 用于发现项目,`/novel resume` 与面板复制按钮共用同一份续写指令;项目被删除/移动/替换时 fail-closed,不静默换书。
10
-
11
- 0.2.3 把“账本说真话”补到旧项目:`report` 从 journal 回填旧章 effort,quality 每章只算最终评审并区分 `samples`/`attempts`;briefs 按当前章隔离;归档失败可直接修订;advisory 按章去重并带证据;面板 v5 改为书桌式工作台,项目选择器分离写作/待修复/失效;`check:host` 不再污染真实注册表。
12
-
13
- 0.2.4 根治 `novel_outline` 的“省略即删除”:`chapters` 按 `num`、`volumes` 按 `title` 做 upsert,省略的卡保持不动;删除必须显式 `remove` / `remove_volumes`;新增 `dry_run`、`added`/`updated`/`removed` 回显、`outline.deprecated.yaml` 与 `novel_restore` 的 outline 恢复路径。这是有意的 BREAKING 语义修正:从“提交集合就是全集”变成“提交的是要改的对象”。
14
-
15
- > **当前版本:0.2.4** · 中文界面 · MIT
9
+ > **当前版本:0.2.6** · 中文界面 · MIT
16
10
  >
17
11
  > **宿主范围**:DSH `>=0.2.1-rc.2 <0.3.0-0`;Node `>=24.9.0`。
18
12
 
@@ -99,7 +93,7 @@
99
93
  | 规则包外置 | 词表、格式、标点、语义、跨章阈值都在 `rulepacks/default.yaml`,代码只执行 |
100
94
  | 六种导出 | Markdown、纯文本、EPUB 3、大纲、世界观、书级提案;正文导出附 `cover.svg` 与 `blurb.txt` |
101
95
  | 整书规划层 | 书级蓝图、卷结构、章卡(严格模式)、世界观设定集;支持 Markdown/YAML/JSON 导入 |
102
- | 可观测性 | `novel_status` 书级摘要、`novel_report`、`novel_doctor`、`novel_search`、panel v5、journal 活动 |
96
+ | 可观测性 | `novel_status` 书级摘要、`novel_report`、`novel_doctor`、`novel_search`、panel v6、journal 活动 |
103
97
  | 多项目注册表 | `stateDir/projects.yaml` 记录已知项目与面板默认 active;不影响项目目录 |
104
98
  | 运行期依赖极少 | 只有 `yaml` 一个运行时依赖;Host 侧不访问外部网络、不调用外部 API、不读环境变量里的密钥 |
105
99
 
@@ -282,7 +276,7 @@ dsh plugin --profile web add dsh-novel-write-engine
282
276
  固定版本:
283
277
 
284
278
  ```bash
285
- dsh plugin --profile web add dsh-novel-write-engine@0.2.4
279
+ dsh plugin --profile web add dsh-novel-write-engine@0.2.6
286
280
  ```
287
281
 
288
282
  `dsh` 不在 PATH 时,用 `npx @deepseek-ai/dsh` 代替命令开头的 `dsh`。
@@ -337,13 +331,13 @@ corepack pnpm pack
337
331
  会得到类似:
338
332
 
339
333
  ```text
340
- dsh-novel-write-engine-0.2.4.tgz
334
+ dsh-novel-write-engine-0.2.6.tgz
341
335
  ```
342
336
 
343
337
  把这个 tarball 复制到目标机器,放在一个**稳定、不会随手删除**的路径,然后:
344
338
 
345
339
  ```bash
346
- dsh plugin --profile web add /absolute/path/to/dsh-novel-write-engine-0.2.4.tgz
340
+ dsh plugin --profile web add /absolute/path/to/dsh-novel-write-engine-0.2.6.tgz
347
341
  ```
348
342
 
349
343
  tarball 安装不会运行源码构建,也不会要求 `allowBuilds`;包内已经包含 `lib/`、`rulepacks/`、`briefs/`、`skills/`、`presets/` 和两层 patch。它是最接近「发布产物」的安装方式。
@@ -358,9 +352,9 @@ tarball 安装不会运行源码构建,也不会要求 `allowBuilds`;包内
358
352
  2. 点 **添加插件**(或旁边的箭头 → **安装第三方插件**)。
359
353
  3. 在包名字段填入以下任一形式:
360
354
  - npm 包名:`dsh-novel-write-engine`
361
- - 精确版本:`dsh-novel-write-engine@0.2.4`
355
+ - 精确版本:`dsh-novel-write-engine@0.2.6`
362
356
  - 源码目录:`/absolute/path/to/dsh-novel-write-engine`
363
- - tarball:`/absolute/path/to/dsh-novel-write-engine-0.2.4.tgz`
357
+ - tarball:`/absolute/path/to/dsh-novel-write-engine-0.2.6.tgz`
364
358
  4. npm 包名从 npm 官方源安装;本地目录和 tarball 直接使用宿主路径。
365
359
  5. 点 **安装**,等待完成。
366
360
  6. 如果出现 **立即启用**,点它;否则安装后到「已安装插件」里把 **dsh-novel-write-engine** 打开。
@@ -432,7 +426,7 @@ dsh --profile web --dump-config | grep -A8 '# == dsh-novel-write-engine'
432
426
  先做全书蓝图、第一卷大纲和世界观设定,再写第一章的世界观约束和章节计划。
433
427
  ```
434
428
 
435
- 模型会调用 `novel_init` 建项目,然后按 `novel_guide` 的提示做书级规划;也可以跳过蓝图直接写第一章,严格大纲是可选开关。0.2.4 推荐顺序:
429
+ 模型会调用 `novel_init` 建项目,然后按 `novel_guide` 的提示做书级规划;也可以跳过蓝图直接写第一章,严格大纲是可选开关。0.2.6 推荐顺序:
436
430
 
437
431
  ```text
438
432
  novel_init
@@ -945,7 +939,7 @@ corepack pnpm test
945
939
 
946
940
  0.2.3 不迁移项目数据,只改变读模型、面板 wire 版本与项目卫生:
947
941
 
948
- 1. **面板 payload v5**:旧标签页显示刷新;刷新后是书桌式布局、分组项目选择器和独立的提示/旧数据区。
942
+ 1. **面板 payload v6**:旧标签页显示刷新;刷新后是书桌式布局、分组项目选择器和独立的提示/旧数据区。
949
943
  2. **report 口径**:旧章 effort 从 journal 回填,quality 每章只算最终评审;`samples` 是章数,`attempts` 是 committed 评审轮次(含历史),样本不足时 `trend` 为 `null`。
950
944
  3. **briefs 按章**:`pipeline.briefs` 只显示当前章;`novel_state {kind:"briefs"}` 仍保留全书收据。
951
945
  4. **归档失败**:`ready_to_archive` 可以直接 `novel_revise` 回 P4,不需要先 rollback。
@@ -1022,7 +1016,7 @@ dsh plugin --profile web add dsh-novel-write-engine@latest
1022
1016
  也可以固定版本:
1023
1017
 
1024
1018
  ```bash
1025
- dsh plugin --profile web add dsh-novel-write-engine@0.2.4
1019
+ dsh plugin --profile web add dsh-novel-write-engine@0.2.6
1026
1020
  ```
1027
1021
 
1028
1022
  升级后核对:
@@ -1064,7 +1058,7 @@ corepack pnpm pack
1064
1058
 
1065
1059
  ```bash
1066
1060
  dsh plugin --profile web remove dsh-novel-write-engine
1067
- dsh plugin --profile web add /absolute/path/to/dsh-novel-write-engine-0.2.4.tgz
1061
+ dsh plugin --profile web add /absolute/path/to/dsh-novel-write-engine-0.2.6.tgz
1068
1062
  ```
1069
1063
 
1070
1064
  ### 11.5 在 Web / Desktop 里升级
@@ -1332,6 +1326,14 @@ tests/ # 单测、集成、falsify、e2e
1332
1326
 
1333
1327
  ### 16.5 当前验证基线
1334
1328
 
1329
+ 0.2.6 在 Node 24.19 / DSH 0.2.1-rc.3 上完成:
1330
+
1331
+ - `npm test` 全绿:**90 个测试文件 / 906 项**;
1332
+ - 覆盖率:**语句 93.51% / 分支 89.14% / 函数 98.12% / 行 93.51%**;`test:coverage` 与逐文件 domain/book/insight/viewmodel 门禁全过;
1333
+ - `typecheck`、`lint`、`build` 通过;`check:hygiene`(155 files,0 v8 ignore)、`test:isolated`(62 源文件)、`validate:rulepack`、`check:pack`(26 files)、`check:artifacts`、`check:install`(26 packages)、`check:preset`(13 packages)、`check:host`、`check:crash` 全绿;
1334
+ - M1–M7、S1–S8 与 P2/P3 硬化见 [0.2.5 验收](docs/0.2.5-acceptance.md);0.2.6 的 E1–E6 见 [0.2.6 验收](docs/0.2.6-acceptance.md);
1335
+ - 真实模型:0.2.6 临时项目中 `agnes-2.5-flash` 实时完成 P1/P2/P3,公开引擎 P4/P6/P8(确定性夹具)归档成功,`stage=done`、`score=145`;`agnes-3.0-flash` 连续 HTTP 429,未产出第二份实时结果。0.2.5 的两篇真实正文也在 0.2.6 引擎离线重放通过;爸爸已确认接受 3.0 的离线重放作为唯一 3.0 证据,详见 [0.2.6 验收](docs/0.2.6-acceptance.md) 4.1 节。
1336
+
1335
1337
  0.2.4 在 Node 24.19 / DSH 0.2.1-rc.3 上完成:
1336
1338
 
1337
1339
  - `npm test` 全绿:**80 个测试文件 / 848 项**;
@@ -1362,6 +1364,11 @@ tests/ # 单测、集成、falsify、e2e
1362
1364
  | [PLAN.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/PLAN.md) | 0.1.0 实施计划(历史) |
1363
1365
  | [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 整书生命周期:蓝图/大纲/世界观/章卡/观测 |
1364
1366
  | [docs/0.2.4-plan.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/docs/0.2.4-plan.md) | 0.2.4 outline upsert、显式删除、dry_run 与恢复路径的根治方案 |
1367
+ | [docs/0.2.6-plan.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/docs/0.2.6-plan.md) | 0.2.6 语义配对、实体锚点、面板 v6、恢复与证据方案 |
1368
+ | [docs/0.2.6-acceptance.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/docs/0.2.6-acceptance.md) | 0.2.6 验收矩阵、门禁与真实项目探针 |
1369
+ | [docs/0.2.7-backlog.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/docs/0.2.7-backlog.md) | 0.2.6 审计保留到 0.2.7 的 worldbook replace 等项 |
1370
+ | [docs/0.2.5-acceptance.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/docs/0.2.5-acceptance.md) | 0.2.5 验收矩阵、真实项目回归与门禁证据 |
1371
+ | [docs/0.2.5-real-model-evidence.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/docs/0.2.5-real-model-evidence.md) | 0.2.5 agnes 2.5/3.0 正文经引擎 P3→P8/归档回执 |
1365
1372
  | [docs/0.2.4-acceptance.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/docs/0.2.4-acceptance.md) | 0.2.4 验收矩阵、质量门与边界 |
1366
1373
  | [docs/0.2.4-real-model-evidence.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/docs/0.2.4-real-model-evidence.md) | 0.2.4 两条真实模型 P1→P8 链路回执 |
1367
1374
  | [docs/0.2.3-plan.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/docs/0.2.3-plan.md) | 0.2.3 可信账本、工作流、advisory、面板 v5 与项目卫生 |
package/briefs/P3.md CHANGED
@@ -35,6 +35,7 @@ P3 brief 的 `context.world_plan` 是 P1 的本章约束;`context.characters`
35
35
  "resolved": ["FS-002"]
36
36
  },
37
37
  "new_elements": { "locations": ["旧办公室"], "abilities": [], "artifacts": [] },
38
+ "new_element_anchors": { "locations": { "旧办公室": ["三楼尾房"] } },
38
39
  "resource_changes": [
39
40
  { "character": "他", "resource": "铜钱", "delta": -200, "reason": "买信封" }
40
41
  ],
@@ -48,6 +49,7 @@ P3 brief 的 `context.world_plan` 是 P1 的本章约束;`context.characters`
48
49
 
49
50
  - `foreshadows.planted` **不是字符串数组**,每项是 `{key,title,description}`。
50
51
  - `new_elements` 是**对象**,不是数组;三个键都必须是字符串数组(没有就 `[]`)。
52
+ - `new_element_anchors` 可选:只用于新地点/能力/物品;键必须同时出现在对应 `new_elements` 数组;每个实体 1–8 个正文锚点,每个 2–120 字。有锚点时任一锚点逐字命中即可,不再要求正文出现可读登记名。
51
53
  - `resource_changes` 每项是 `{character,resource,delta,reason}`,`delta` 是非零整数;没有变化就 `[]`。
52
54
  - `opening` 必须逐字出现在正文前两段,不能写剧情概括。
53
55
  - `continuity` 是 `{opens_from,ends_with}` 对象。
package/briefs/P5.md CHANGED
@@ -39,6 +39,8 @@
39
39
 
40
40
  `ready_to_archive` 阶段也允许直接 `novel_revise`:正文会退回 P4 重新评审,不需要先 `novel_rollback`,也不会多写一份废稿快照。
41
41
 
42
+ **summary-only 模式**:如果正文不需要改,只传 `{chapter, summary}`(不要传 content/patch/proof)。它只更新 draft summary,正文 hash、章历史与 revise 轮次都不变;校验 PG-05 后可继续 check/archive。summary 与正文事件不符时优先用这个模式。
43
+
42
44
  ## 常见返工原因
43
45
 
44
46
  - 只改了措辞,没解决 issue 指出的信息缺口。
package/briefs/P6.md CHANGED
@@ -22,7 +22,7 @@
22
22
  ]
23
23
  ```
24
24
 
25
- 五个 id 必须各出现一次;`verdict` 只能是 `pass`/`fail`;`evidence` 至少 8 字、必须逐字出现在正文里,且五条引用必须互不相同、来自不同句子。五条引用同一句话不算五份证据,会被 `SEMANTIC_EVIDENCE_INVALID` 拒绝。
25
+ 五个 id 必须各出现一次;`verdict` 只能是 `pass`/`fail`;`evidence` 至少 8 字、必须逐字出现在正文里,可以跨句/跨段。五条引用必须互不相同、不得复用同一句;同一句不同子串、完全重复、真正包含或达到 `max(8, 较短引文一半)` 的区间重叠会被按 `same_sentence`/`duplicate`/`interval_overlap` 拒绝,并回传配对 `conflicts`。不同段落只是共享常用词不算重叠。引文不存在/太短/形状不合法属于 **submission error**(`ENGINE_CHECK_SUBMISSION_INVALID`):不写 check、不消耗轮次,修正 `semantic` 后仍调用 `novel_check`。
26
26
 
27
27
  | id | 检查 |
28
28
  |---|---|
@@ -38,7 +38,8 @@
38
38
 
39
39
  - 调用时可以传 `scope`:默认 `["content","integrity"]`;只跑 `content` 或只跑 `integrity` 是合法的,空数组/未知值会被拒绝。只跑一类时另一类规则不参与本次 check,但**不会**进入 `ready_to_archive`:管线停在 P6 并返回 `CHECK_SCOPE_PARTIAL`,必须再跑一次完整 scope。
40
40
  - 完整 scope 全过 → 管线进入 `ready_to_archive`,先 `novel_brief P8` 领取终审任务书,再调用 `novel_archive`。
41
- - 任一项 `fail` → 校验不过,先重新领取 `novel_brief P6`(check 已改变上下文,旧 digest 会失效),再调用 `novel_revise` 修订并回到 P4 重评(轮次 +1)。
41
+ - 任一项 `fail` 且引文有效 → content failure,写 check 并消耗一轮;先重新领取 `novel_brief P6`(check 已改变上下文,旧 digest 会失效),再调用 `novel_revise` 修订并回到 P4 重评。
42
+ - 如果只是 summary 字段与正文不符(正文无需改),用 `novel_revise {chapter, summary}` 做 summary-only 修复:不消耗 revise、不改正文,然后可直接继续 check/archive。
42
43
 
43
44
  ## 损坏与恢复
44
45
 
package/briefs/P8.md CHANGED
@@ -81,23 +81,24 @@
81
81
  }
82
82
  ```
83
83
 
84
- 错误会带上 `expected` 形态和收到的字段值,例如 `characters.陈嘉树.current_state must be an object; expected {"resources":{"港币":-3},...}`。不要猜字段名,按报错补齐即可。
84
+ 错误会带上 `expected` 形态和收到的字段值,例如 `characters.陈嘉树.current_state must be an object; expected {"resources":{"港币":3},...}`。不要猜字段名,按报错补齐即可。`current_state.resources` 会与旧余额深合并,余额必须是有限非负整数。
85
85
 
86
86
  ## summary 与 delta 的联动(归档前必核)
87
87
 
88
88
  `novel_archive` **不接受 summary**;它校验的是 P3/P5 已经固定的 draft summary。delta 必须与这份 summary 对齐:
89
89
 
90
90
  - `characters` 里每个 `action:"created"` 的人物名,必须出现在 draft `summary.characters_appeared`。
91
- - `world` 里每个 `action:"created"` 的 location / ability / artifact,必须出现在 draft `summary.new_elements` 的对应数组,且 `kind` 一致;`faction` / `rule` 只需正文出现并按 kind 写入,`summary.new_elements` 没有对应数组。
91
+ - `world` 以 `state/world.yaml` 的存在性为唯一真源:已有实体写 `created` 会按 `updated` 归一化并给 warning;新实体写 `updated` 且正文出现、kind 可确定时按 `created` 归一化;kind 冲突仍拒绝。`summary.new_elements` 只是意图声明;新实体可用 `summary.new_element_anchors` 提供正文锚点(1–8 个、每个 2–120 字),有锚点时任一命中即可,无锚点才要求 name 逐字出现。已有实体不再强求 `created`。
92
92
  - `timeline` 的键必须是 draft `summary.events` 的下标(字符串)。
93
93
  - `relationships` 的两端必须已在 `characters` 里声明(本章 created 或台账已有),否则先声明人物。
94
+ - `timeline.<key>.characters` 里的每个名字必须已在 `characters` 台账里声明。
94
95
 
95
- 如果 summary 与本章事实不符,**不要直接改 delta 硬凑**:先 `novel_brief P5` → `novel_revise` 修正正文和 summary,再重走 P4/P6/P8。归档阶段没有第二次 summary 入口。
96
+ 如果 summary 与本章事实不符,先走 **summary-only** 修复:`novel_revise {chapter, summary}`(不带 content/patch/proof)只更新 draft.summary,不消耗 revise 轮次、不改正文,然后按当前阶段继续;只有正文需要改时才走 P5 全文修订。
96
97
 
97
98
  - **伏笔的 title 是可读标签,anchor 才是校验证据**:`title` 可以写「船费债」这样的短语;要归档,请把正文原句放进 `anchor`(summary 的 planted 项或 delta 项都行,至少 8 个字符)。没有 `anchor` 时,`title` 必须逐字出现在正文里,否则 `ENGINE_DELTA_UNVERIFIED`。示例:`{"action":"created","title":"船费债","anchor":"三百蚊的船费先欠着","description":"欠船费三百蚊"}`。
98
99
  - 归档失败的报错会指出字段、值和缺失的锚点;不要把 title 改成碎片来“凑命中”,补 `anchor` 即可。
99
100
  - 第一人称的叙述者若在 `narrator` 里声明为 `陈默(第一人称「我」)`,正文用「我」也视为出现,但角色键仍写 `陈默`。
100
- - 每个新实体至少写 `action: "created"`;已存在且没变化写 `action: "no_change", reason: "..."`。
101
+ - 每个新实体写 `action: "created"`(正文出现、kind 可确定);已存在实体写 `updated` 或 `no_change`,引擎会按台账归一化冲突并给 warning。
101
102
  - `world` 新实体还要写 `kind: "location"|"ability"|"artifact"|"faction"|"rule"` 和 `description`。
102
103
  - `state_delta` 可以是对象,也可以是 JSON 字符串;引擎两者都接受。
103
104
  - 未知伏笔 key、未声明角色、`no_change` 缺原因都会被 `ENGINE_DELTA_UNVERIFIED` 拒绝,引擎不会猜。