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/briefs/P1.md CHANGED
@@ -7,6 +7,7 @@
7
7
  - 《{{title}}》,类型 {{genre}},平台 {{platform}}。
8
8
  - 先调 `novel_state` 读 `characters`、`world`、`locks`、`foreshadows`,确认人物状态与已锁定设定。
9
9
  - 再调 `novel_status` 看当前章与阻塞项。
10
+ - 本阶段 brief 的 `context.book_plan` 是书级蓝图、当前卷目标与当前章卡;`context.worldbook` 是世界观设定集中与本章最相关的条目。章卡里的 cast 必须在本阶段 `characters` 中登记,否则 P2 无法把它写进计划。
10
11
 
11
12
  ## 产出
12
13
 
package/briefs/P2.md CHANGED
@@ -7,6 +7,8 @@
7
7
  - P1 的世界观计划:`novel_state {"kind":"planWorld","chapter":{{chapter}}}`(对应 `plans/ch{{chapter_pad}}.world.yaml`)。
8
8
  - 上一章结尾(`state/handoff.yaml` 的 `last_summary`)。
9
9
  - 未回收伏笔:`novel_state foreshadows`。
10
+ - 当前章卡:`novel_state {"kind":"outline"}`(`context.outline_card` 已带入 brief)。只要存在章卡,标题、场景类型、目标字数区间与 cast 就必须一致,否则 PG-13 会拒绝;严格模式还要求章卡必须存在。
11
+ - 世界观相关条目:`context.worldbook`。
10
12
 
11
13
  ## 产出
12
14
 
@@ -14,13 +16,18 @@
14
16
 
15
17
  | 字段 | 要求 |
16
18
  |---|---|
17
- | `title` | 不带「第N章」前缀,4~8 字;引擎会拼前缀并校验 |
19
+ | `title` | 不带「第N章」前缀;长度读 rulepack 的 `format.title.min_chars/max_chars`,引擎会拼前缀并校验 |
18
20
  | `scene_type` | 四选一:战斗/动作章、日常过渡章、情感爆发章、纯叙事章 |
19
21
  | `narrator` | 视角人物,必须在本章出场;第一人称写成 `陈默(第一人称「我」)`,引擎接受括号/引号里的正文别名 |
20
22
  | `beats` | 5~8 个节拍,每个是一句话的可检验动作 |
21
23
  | `opening` | 前两段打算怎么写(场景 + 动作 + 一个钩子) |
22
24
  | `ending` | 断章点,必须是新信息或新麻烦 |
23
25
  | `target_words` | `[{{min_words}}, {{max_words}}]` |
26
+ | `cast` | 可选,1–8 个本章真正上场的人物:`{name,entry_state?,goal?,knowledge?,exit_change?}`;name 必须来自 P1 世界计划或角色台账 |
27
+
28
+ `cast` 不是出场名单的重复:它告诉 P3 这一章谁在舞台上、各自带着什么目标与信息差。没有 cast 时,引擎会从计划正文与人物台账推断;新计划建议显式给出,避免 120 个角色里裁掉真正上场的人。
29
+
30
+ 章卡有 cast 时,P2 的 cast 必须覆盖章卡里的每一个名字;章卡没有 cast 时不强制。
24
31
 
25
32
  ## 场景类型纪律
26
33
 
package/briefs/P3.md CHANGED
@@ -10,6 +10,10 @@
10
10
  - 不写 Markdown:禁 `#`、`**`、`---`、`>`、表格。
11
11
  - 不写「Day 1」「第X卷」「读者」「作者」这类出戏标签。
12
12
 
13
+ ## 上下文
14
+
15
+ P3 brief 的 `context.world_plan` 是 P1 的本章约束;`context.characters` 是本章活跃角色的完整档案,`context.other_characters` 只是压缩索引;`context.outline_card` 是本章章卡,`context.worldbook` 是相关世界观条目。先读 `world_plan`、`characters` 与 `outline_card` 再落笔;不要在正文里临时发明未申报的世界规则或人物。
16
+
13
17
  ## 写法
14
18
 
15
19
  1. 一段一个信息点。先动作,后反应,最后才允许一句心理。
package/briefs/P4.md CHANGED
@@ -72,6 +72,6 @@
72
72
  - 每条 issue 写清 `problem` 与 `fix`,fix 要是可执行动作。
73
73
  - `dimension` 必须是本任务书十五维之一(`R-W-01`…`R-W-15` 的实际集合);`location` 必须是「第 N 段」,且 N 在本章实际段落范围内。
74
74
  - `blocker` 不能在 P4 或 P5 标记为 `waived`;只能修好后带正文证据标记 `fixed`。
75
- - 判断不了是否「作者故意」时,先按普通问题处理;0.1.2 不提供自动豁免。
75
+ - 判断不了是否「作者故意」时,先按普通问题处理;0.2.0 不提供自动豁免。
76
76
 
77
77
  完成后:仍有 blocker → P5 修订;全部清零 → P6 校验。
package/briefs/P6.md CHANGED
@@ -16,11 +16,12 @@
16
16
  { "id": "L2-SCENE-ANCHOR", "verdict": "pass", "evidence": "正文中的逐字引用", "note": "场景与计划一致" },
17
17
  { "id": "L2-CHARACTER-STATE", "verdict": "pass", "evidence": "正文中的逐字引用", "note": "心理状态与台账一致" },
18
18
  { "id": "L2-CAUSALITY", "verdict": "pass", "evidence": "正文中的逐字引用", "note": "转折有前置因果" },
19
- { "id": "L2-VOICE", "verdict": "pass", "evidence": "正文中的逐字引用", "note": "对话可区分" }
19
+ { "id": "L2-VOICE", "verdict": "pass", "evidence": "正文中的逐字引用", "note": "对话可区分" },
20
+ { "id": "L2-POV", "verdict": "pass", "evidence": "正文中的逐字引用", "note": "叙述视角与计划一致" }
20
21
  ]
21
22
  ```
22
23
 
23
- 四个 id 必须各出现一次;`verdict` 只能是 `pass`/`fail`;`evidence` 至少 8 字、必须逐字出现在正文里,且四条引用必须互不相同。四项引用同一句话不算四份证据,会被 `SEMANTIC_EVIDENCE_INVALID` 拒绝。
24
+ 五个 id 必须各出现一次;`verdict` 只能是 `pass`/`fail`;`evidence` 至少 8 字、必须逐字出现在正文里,且五条引用必须互不相同、来自不同句子。五条引用同一句话不算五份证据,会被 `SEMANTIC_EVIDENCE_INVALID` 拒绝。
24
25
 
25
26
  | id | 检查 |
26
27
  |---|---|
@@ -28,18 +29,19 @@
28
29
  | `L2-CHARACTER-STATE` | 人物状态与 `characters` 台账一致 |
29
30
  | `L2-CAUSALITY` | 关键转折有前置因果,不是突然降神 |
30
31
  | `L2-VOICE` | 对话能区分说话人 |
32
+ | `L2-POV` | 叙述视角与 `narrator`/计划一致,没有中途越界 |
31
33
 
32
34
  每项必须带 `evidence`:正文中的逐字引用。找不到引用=该项不成立。
33
35
 
34
36
  ## 判定
35
37
 
36
- - 调用时可以传 `scope`:默认 `["content","integrity"]`;只跑 `content` 或只跑 `integrity` 是合法的,空数组/未知值会被拒绝。只跑一类时另一类规则不参与本次 check,但归档仍会重新执行全量机检。
38
+ - 调用时可以传 `scope`:默认 `["content","integrity"]`;只跑 `content` 或只跑 `integrity` 是合法的,空数组/未知值会被拒绝。只跑一类时另一类规则不参与本次 check,但**不会**进入 `ready_to_archive`:管线停在 P6 并返回 `CHECK_SCOPE_PARTIAL`,必须再跑一次完整 scope。
39
+ - 完整 scope 全过 → 管线进入 `ready_to_archive`,先 `novel_brief P8` 领取终审任务书,再调用 `novel_archive`。
37
40
  - 任一项 `fail` → 校验不过,先重新领取 `novel_brief P6`(check 已改变上下文,旧 digest 会失效),再调用 `novel_revise` 修订并回到 P4 重评(轮次 +1)。
38
- - 全过 → 管线进入 `ready_to_archive`,先 `novel_brief P8` 领取终审任务书,再调用 `novel_archive`。
39
41
 
40
42
  ## 损坏与恢复
41
43
 
42
- - 如果 `novel_status` 返回 `state_errors` 或 `STATE_UNREADABLE`,不要手改文件;按 `next` 指向的 `novel_rollback` 回到 P6,重新取 P6 任务书并 `novel_check`。
44
+ - 如果 `novel_status` 返回 `state_errors` 或 `STATE_UNREADABLE`,不要手改文件;plan/review/check 按 `next` 指向的 `novel_rollback` 回到重建点;八个 ledger 则按 `next` 调 `novel_amend`,先用 `novel_state` 取 raw 文档再提交完整替换。
43
45
  - 如果 `novel_archive` 报 review 没有 `review_digest`,回退到 P4 重新 `novel_review`;不要编辑 `state/pipeline.yaml`。
44
46
 
45
47
  ## 不许做的