Răsfoiți Sursa

refactor(v13): consolidate architect output 7→5 sections, dedupe prose [phase 5 consolidation 1]

Architect prompt now emits 5 sections instead of 7, cutting total
output ~25-40% to get back within gpt-5.4 stability range:
  - story_frame: trimmed 主角弧线 (moved to roles) + absorbed book_rules prose
  - volume_map: absorbs 6 rhythm principles as closing paragraph
  - roles: now the authoritative home for protagonist arc + initial state
  - book_rules: YAML frontmatter only, zero prose body
  - pending_hooks: unchanged; can seed startChapter=0 rows for initial state

Deleted from prompt:
  - rhythm_principles section (merged into volume_map)
  - current_state section (split across roles + pending_hooks)

Dedup contract baked into prompt: no fact appears in two sections. Hard
budget markers (chars per section) force trim pressure on LLM.
Ma 6 luni în urmă
părinte
comite
33049ff34f
1 a modificat fișierele cu 109 adăugiri și 144 ștergeri
  1. 109 144
      packages/core/src/agents/architect.ts

+ 109 - 144
packages/core/src/agents/architect.ts

@@ -14,23 +14,36 @@ import type { StoredHook } from "../state/memory-db.js";
 
 // ---------------------------------------------------------------------------
 // Phase 5 (v13) — Static 骨架 layer collapse
+// Phase 5 consolidation — 7 sections → 5 sections (output shrinks ~25–40%).
 //
-// Architect now produces 3 prose outline files + one-file-per-character roles/
-// folder, plus compat pointer shims for story_bible.md and character_matrix.md.
-// The 9-file contract degenerates into this shape:
+// Architect now produces 2 prose outline files + one-file-per-character roles/
+// folder, plus compat pointer shims. The LLM output contract is now 5 blocks:
 //
-//   outline/story_frame.md      ← 5 prose sections
-//   outline/volume_map.md       ← 6 prose sections, chapter-granular
-//   outline/节奏原则.md         ← 6 concrete rhythm principles (prose)
+//   === SECTION: story_frame ===   4 散文段(主题 / 冲突 / 世界铁律+质感 / 终局)
+//   === SECTION: volume_map ===    5 散文段 + 尾段「本书具体化的 6 条节奏原则」
+//   === SECTION: roles ===         一人一卡;主角卡承载完整弧线(起点→终点→代价)
+//   === SECTION: book_rules ===    仅 YAML frontmatter,零散文
+//   === SECTION: pending_hooks ===  13-column 表;可含 startChapter=0 种子行
+//
+// Consolidation rules (MUST reflect in prompt):
+//   - 主角弧线只写在 roles/<主角>.md,不在 story_frame 重复
+//   - 世界铁律/世界质感只写在 story_frame.世界观底色,不在 book_rules 重复
+//   - 节奏原则只写在 volume_map 尾段,不作为独立 section
+//   - 初始状态(第 0 章)拆散到 roles.当前现状 + pending_hooks (startChapter=0)
+//     — 不再作为独立 current_state section
+//
+// 输出落盘 contract(未变):
+//   outline/story_frame.md      ← 4 prose sections + YAML frontmatter
+//   outline/volume_map.md       ← 5 prose sections + 节奏原则尾段
+//   outline/节奏原则.md         ← 从 volume_map 尾段派生(或空占位)
 //   roles/主要角色/<name>.md    ← one file per major character
 //   roles/次要角色/<name>.md    ← one file per minor character
-//   story_bible.md              ← compat shim (pointer + excerpt)
-//   character_matrix.md         ← compat shim (pointer + role listing)
-//   book_rules.md               ← compat shim (cleanup #3). YAML frontmatter
-//                                 now lives on story_frame.md.
-//   current_state.md            ← runtime state (unchanged)
-//   pending_hooks.md            ← runtime state (unchanged)
-//   emotional_arcs.md           ← runtime state (unchanged)
+//   story_bible.md              ← compat shim
+//   character_matrix.md         ← compat shim
+//   book_rules.md               ← compat shim
+//   current_state.md            ← seed 文件(空/最小),consolidator 运行时追加
+//   pending_hooks.md            ← 架构师初始伏笔池
+//   emotional_arcs.md           ← runtime state
 //
 // 「散文密度」= 架构师 LLM 的输出密度。所有 prose 都写死在架构师 prompt 里,
 // 不从模板复制。v6 灵气的起点在这里。
@@ -109,7 +122,7 @@ export class ArchitectAgent extends BaseAgent {
       : this.buildChineseFoundationPrompt(book, gp, genreBody, contextBlock, reviewFeedbackBlock, numericalBlock, powerBlock, eraBlock);
 
     const langPrefix = resolvedLanguage === "en"
-      ? `【LANGUAGE OVERRIDE】ALL output (story_frame, volume_map, rhythm_principles, roles, book_rules, current_state, pending_hooks) MUST be written in English. Character names, place names, and all prose must be in English. The === SECTION: === tags remain unchanged.\n\n`
+      ? `【LANGUAGE OVERRIDE】ALL output (story_frame, volume_map, roles, book_rules, pending_hooks) MUST be written in English. Character names, place names, and all prose must be in English. The === SECTION: === tags remain unchanged. Do NOT emit rhythm_principles or current_state sections — they have been consolidated away.\n\n`
       : "";
     const userMessage = resolvedLanguage === "en"
       ? `Generate the complete foundation for a ${gp.name} novel titled "${book.title}". Write everything in English.`
@@ -153,30 +166,37 @@ ${numericalBlock}
 ${powerBlock}
 ${eraBlock}
 
-## 输出结构(严格按 === SECTION: === 分块,不要漏任何一块)
+## 输出结构(5 个 SECTION,严格按 === SECTION: === 分块,不要漏任何一块)
+
+## 去重铁律(必读)
+禁止在多段里重复同一事实。主角弧线只写在 roles;世界铁律只写在 story_frame.世界观底色;节奏原则只写在 volume_map 最后一段。如果一个段落写了另一段的内容,删掉。
+
+## 预算(超预算必删)
+- story_frame ≤ 3000 chars
+- volume_map ≤ 5000 chars
+- roles 总 ≤ 8000 chars
+- book_rules ≤ 500 chars(仅 YAML)
+- pending_hooks ≤ 2000 chars
 
 === SECTION: story_frame ===
 
-这是散文骨架。5 段,每段约 1500 字,不要写表格,不要写 bullet list,写成能被人读下去的段落。段落标题用 \`## \` 开头,段落内部是正经段落。
+这是散文骨架。**4 段**,每段约 600-900 字,不要写表格,不要写 bullet list,写成能被人读下去的段落。段落标题用 \`## \` 开头,段落内部是正经段落。**主角弧线不写在本 section;它的权威来源是 roles/主要角色/<主角>.md。** 本段只需一句指针:"本书主角是 X,完整弧线详见 roles/主要角色/X.md"。
 
 ### 段 1:主题与基调
-写这本书到底讲的是什么——不是"讲主角如何从弱到强"这种空话,而是具体的命题("一个被时代按在泥里的人,如何选择不被改写"、"当所有人都在撒谎时,坚持记录真相要付出什么代价")。主题下面跟着基调——温情冷冽悲壮肃杀,哪一种?为什么是这种而不是另一种?
-
-### 段 2:主角弧线(起点 → 终点 → 代价)
-主角从哪里出发(身份、处境、核心缺陷、一开始最想要什么),到哪里落脚(最终变成什么样的人、拿到/失去什么),为了这个落脚他付出了什么不可逆的代价(关系、身体、信念、某段过去)。不要只写"变强"这种平面变化,要写**内在的位移**。
+写这本书到底讲的是什么——不是"讲主角如何从弱到强"这种空话,而是具体的命题("一个被时代按在泥里的人,如何选择不被改写"、"当所有人都在撒谎时,坚持记录真相要付出什么代价")。主题下面跟着基调——温情冷冽悲壮肃杀,哪一种?为什么是这种而不是另一种?结尾用一句话指向主角并引向 roles(例:"本书主角是林辞,完整弧线详见 roles/主要角色/林辞.md")。
 
-### 段 3:核心冲突与对手
+### 段 2:核心冲突与对手定性
 这本书的主要矛盾是什么?不是"正邪对抗",而是"因为 A 相信 X、B 相信 Y,所以他们一定会在某件事上对撞"。主要对手是谁(至少 2 个:一个显性对手 + 一个结构性对手/体制),他们的动机从哪里长出来。对手不是工具,对手有自己的逻辑。
 
-### 段 4:世界观底色(含铁律 + 风格基调)
-这个世界的运行规则是什么?3-5 条**不可违反的铁律**(原本写在 book_rules 里的 prohibitions,现在用散文嵌进去)。这个世界的质感是什么——湿的还是干的、快的还是慢的、噪的还是静的?给 writer 一个明确的感官锚(这是原来 particle_ledger 承载的基调部分)。
+### 段 3:世界观底色(铁律 + 质感 + 本书专属规则)
+这个世界的运行规则是什么?3-5 条**不可违反的铁律**——以 prose 写出,不要 bullet。这个世界的质感是什么——湿的还是干的、快的还是慢的、噪的还是静的?给 writer 一个明确的感官锚(这是原来 particle_ledger 承载的基调部分)。**这一段同时承担原先 book_rules 正文里写的"叙事视角 / 本书专属规则 / 核心冲突驱动"等 prose 内容**——全部合并到这里写一次就够,不要再去 book_rules 重复。
 
-### 段 5:终局方向
+### 段 4:终局方向
 这本书最后一章大概是什么感觉——不是"主角登顶"、"大结局"这种套话,而是**最后一个镜头**大致长什么样。主角最后在哪、做什么、身边有谁、心里想什么。这是给全书所有后面的规划一个远方靶子。
 
 === SECTION: volume_map ===
 
-这是分卷散文地图,6 段。**关键要求:写到章级 prose**("第 17 章让他回家"、"第 32-35 章把师父的秘密揭开"级别的布局)。这是 Phase 3 planner LLM 能从稀疏 memo 里读出动作的源头。不写到章级就废了。
+这是分卷散文地图,**5 段主体 + 1 段节奏原则尾段**。**关键要求:写到章级 prose**("第 17 章让他回家"、"第 32-35 章把师父的秘密揭开"级别的布局)。这是 Phase 3 planner LLM 能从稀疏 memo 里读出动作的源头。不写到章级就废了。
 
 ### 段 1:各卷主题与情绪曲线
 有几卷?每卷的主题一句话,每卷的情绪曲线一段(哪里压、哪里爽、哪里冷、哪里暖)。不要机械的"第一卷打小怪第二卷打大怪",写情绪的流动。
@@ -188,45 +208,29 @@ ${eraBlock}
 第 1 卷埋什么钩子、哪一章回收;第 2 卷埋什么、哪一章回收。散文写,不要表格。必须写具体"这个钩子在第 N 章回"而不是"后期回收"。
 
 ### 段 4:角色阶段性目标
-主角在第 1 卷末要到什么状态?第 2 卷末?每一卷结束时主角的身份/关系/能力/心境应该是什么。次要角色的阶段性变化也要点到(师父在第 2 卷会死、对手在第 3 卷会黑化等)。
+主角在第 1 卷末要到什么状态?第 2 卷末?每一卷结束时主角的身份/关系/能力/心境应该是什么。次要角色的阶段性变化也要点到(师父在第 2 卷会死、对手在第 3 卷会黑化等)。写阶段性,不写完整弧线(完整弧线在 roles)。
 
 ### 段 5:卷尾必须发生的改变
 每一卷最后一章必须发生什么不可逆的事——权力结构改变、关系破裂、秘密暴露、主角身份重定位。写散文,一卷一段。
 
-### 段 6:节奏意图(哪几章喘息 / 哪几章压紧)
-本书节奏的宏观设计:前 X 章高压引人,第 X-Y 章放缓给感情线呼吸空间,第 Y-Z 章再次拉紧引向中卷高潮。这段直接指导 writer 在某一章该松还是该紧。
-
-=== SECTION: rhythm_principles ===
-
-6 条节奏原则——**必须写具体不抽象**。反面例子:"节奏要张弛有度"(废话)。正面例子:"前 30 章每 5 章一个小爽点,且小爽点必须落在章末 300 字内"。
-
-### 原则 1:高潮间距
-本书大高潮之间最长多少章?为什么?
-
-### 原则 2:喘息频率
-高压段多长必须插一章喘息?喘息章不是水章,它承担什么任务?
-
-### 原则 3:钩子密度
-每章章末必须留钩,一个还是两个?主钩最多允许悬多少章?
-
-### 原则 4:信息释放节奏
-主线信息(主角的秘密、对手的底牌、世界的真相)按什么节奏暴露?前 1/3 释放多少,中段多少,后段多少?
-
-### 原则 5:爽点节奏
-爽点间距多少章一个?什么样的爽点(智商碾压 / 实力反杀 / 翻身打脸 / 真相揭穿)?
-
-### 原则 6:情感节点递进
-情感关系(主角与 X 的关系)每多少章必须有一次实质推进?不推进会塌。
+### 段 6:节奏原则与本书具体化(必须具体不抽象)
+**这是节奏原则的唯一归宿,不再有独立 rhythm_principles section。** 针对这本书写 6 条具体原则,反面例子:"节奏要张弛有度"(废话)。正面例子:"前 30 章每 5 章一个小爽点,且小爽点必须落在章末 300 字内"。6 条各写 2-3 句,具体到章号区间:
+1. 高潮间距——本书大高潮之间最长多少章?为什么?
+2. 喘息频率——高压段多长必须插一章喘息?喘息章承担什么任务?
+3. 钩子密度——每章章末留钩数量,主钩最多允许悬多少章?
+4. 信息释放节奏——主线信息在前 1/3、中段、后 1/3 分别释放多少比例?
+5. 爽点节奏——爽点间距多少章一个?什么类型为主?
+6. 情感节点递进——情感关系每多少章必须有一次实质推进?
 
 === SECTION: roles ===
 
-一人一卡 prose,用以下格式分隔:
+一人一卡 prose。**主角卡是本书角色弧线的唯一权威来源**——story_frame 不再写主角弧线,writer/planner 都从这里读。用以下格式分隔:
 
 ---ROLE---
 tier: major
 name: <角色名>
 ---CONTENT---
-(这里写散文角色卡,下面的 7 个小标题必须全部出现,每段至少 3 行正经散文,不要写表格)
+(这里写散文角色卡,下面的小标题必须全部出现,每段至少 3 行正经散文,不要写表格)
 
 ## 核心标签
 (3-5 个关键词 + 一句话为什么是这些词)
@@ -235,10 +239,13 @@ name: <角色名>
 (1-2 个与核心标签反差的具体细节——"冷酷杀手但会给流浪猫留鱼骨"。反差细节是人物立体化的公式,必须有。)
 
 ## 人物小传(过往经历)
-(一段散文,说这个人怎么变成现在这样。童年/重大事件/塑造性格的那件事。)
+(一段散文,说这个人怎么变成现在这样。童年/重大事件/塑造性格的那件事。只写关键过往,简版。)
 
-## 当前现状
-(第 0 章时他在哪、做什么、处境如何、最近最烦心的事。)
+## 主角弧线(起点 → 终点 → 代价)
+**只有主角必须写本段;其他 major 角色如果弧线分量重也可以写,否则略过。**主角从哪里出发(身份、处境、核心缺陷、一开始最想要什么),到哪里落脚(最终变成什么样的人、拿到/失去什么),为了这个落脚他付出了什么不可逆的代价(关系、身体、信念、某段过去)。不要只写"变强"这种平面变化,要写**内在的位移**。本段是之前 story_frame.段 2 迁移过来的权威位置,写足写实。
+
+## 当前现状(第 0 章初始状态)
+(第 0 章时他在哪、做什么、处境如何、最近最烦心的事。这段同时承担原先独立 current_state section 的初始状态字段,不再有独立 current_state 块。)
 
 ## 关系网络
 (与主角、与其他重要角色的关系——一句话一条,关系不是标签是动态。)
@@ -247,7 +254,7 @@ name: <角色名>
 (他想要什么、为什么想要、愿意付出什么代价。)
 
 ## 成长弧光
-(他在这本书里会经历什么内在位移——变好变坏变复杂,落在哪里。)
+(他在这本书里会经历什么内在位移——变好变坏变复杂,落在哪里。非主角可短可长。)
 
 ---ROLE---
 tier: major
@@ -255,7 +262,7 @@ name: <下一个主要角色>
 ---CONTENT---
 ...
 
-(主要角色至少 3 个:主角 + 主要对手 + 主要协作者。建议 4-5 个。)
+(主要角色至少 3 个:主角 + 主要对手 + 主要协作者。建议 2-3 主 + 2-3 辅,不要灌水。质量 > 数量。)
 
 ---ROLE---
 tier: minor
@@ -267,7 +274,7 @@ name: <次要角色名>
 
 === SECTION: book_rules ===
 
-生成 book_rules.md 格式的 YAML frontmatter,保留结构化字段供 readBookRules() 使用:
+**只输出 YAML frontmatter 一块——零散文。** 所有的"叙事视角 / 本书专属规则 / 核心冲突驱动"等散文已经合并到 story_frame.世界观底色,不要在这里重复写。
 \`\`\`
 ---
 version: "1.0"
@@ -288,27 +295,8 @@ fatigueWordsOverride: []
 additionalAuditDimensions: []
 enableFullCastTracking: false
 ---
-
-## 叙事视角
-(描述本书叙事视角,一段散文)
-
-## 核心冲突驱动
-(指向 outline/story_frame.md 的段 3 并做一段精简概述)
 \`\`\`
 
-=== SECTION: current_state ===
-
-初始状态卡(第0章),Markdown 表格:
-| 字段 | 值 |
-|------|-----|
-| 当前章节 | 0 |
-| 当前位置 | (起始地点) |
-| 主角状态 | (初始状态) |
-| 当前目标 | (第一个目标) |
-| 当前限制 | (初始限制) |
-| 当前敌我 | (初始关系) |
-| 当前冲突 | (第一个冲突) |
-
 === SECTION: pending_hooks ===
 
 初始伏笔池(Markdown表格),Phase 7 扩展列:
@@ -323,12 +311,15 @@ enableFullCastTracking: false
 - 第10列「核心」:是否主线承重伏笔 true / false。主线承重伏笔一本书最多 3-7 条(主谜团、身世、核心承诺),其余次要伏笔填 false
 - 第11列「半衰期」:可选,整数章数。若不填自动按回收节奏推导(立即/近期 = 10、中程 = 30、慢烧/终局 = 80)
 - 初始线索放备注列,不放第5列
+- **初始世界状态 / 初始敌我关系** 如果有关键信息(例如"主角身上带着父亲的笔记本"、"体制已经开始监视码头"),可以作为 startChapter=0 的种子行录入,备注列说明其"初始状态"属性。这替代了原先独立 current_state section 的结构化字段。
 
 ## 最后强调
 - 符合${book.platform}平台口味、${gp.name}题材特征
 - 主角人设鲜明、行为边界清晰
 - 伏笔前后呼应、配角有独立动机不是工具人
-- **story_frame / volume_map / rhythm_principles / roles 必须是散文密度,不要退化成 bullet**
+- **story_frame / volume_map / roles 必须是散文密度,不要退化成 bullet**
+- **book_rules 只留 YAML,不要写散文**
+- **不要输出 rhythm_principles 或 current_state 两个独立 section**——它们已被合并/删除
 - **pending_hooks 表必须包含 Phase 7 扩展列——depends_on 标出因果链、pays_off_in_arc 锁定回收大致位置、core_hook 标记主线承重伏笔(3-7 条)、half_life 仅给重点伏笔设置**`;
   }
 
@@ -359,30 +350,37 @@ ${numericalBlock}
 ${powerBlock}
 ${eraBlock}
 
-## Output contract (strict === SECTION: === blocks)
+## Output contract (5 === SECTION: === blocks)
+
+## Deduplication rule (MANDATORY)
+Do not duplicate the same fact across sections. The protagonist's arc lives only in roles; world hard-rules live only in story_frame; rhythm principles live only in the last paragraph of volume_map. If a section repeats content that belongs elsewhere, delete it.
+
+## Output budget (over-budget means cut)
+- story_frame ≤ 3000 chars
+- volume_map ≤ 5000 chars
+- roles ≤ 8000 chars total
+- book_rules ≤ 500 chars (YAML only)
+- pending_hooks ≤ 2000 chars
 
 === SECTION: story_frame ===
 
-Five prose sections, ~1500 chars each. No tables. No bullet lists. Real paragraphs.
+Four prose sections, ~600-900 chars each. No tables. No bullet lists. Real paragraphs. **Do NOT write the protagonist's full arc here** — that is owned by roles/主要角色/<protagonist>.md. Use a single-line pointer inside this block (e.g. "The protagonist is X; full arc lives in roles/主要角色/X.md").
 
 ## 01_Theme_and_Tonal_Ground
-What is this book actually about — not "hero grows from weak to strong" (empty), but a concrete proposition. Then the tonal ground: warm / cold / fierce / severe — which, and why this and not another.
+What is this book actually about — not "hero grows from weak to strong" (empty), but a concrete proposition. Then the tonal ground: warm / cold / fierce / severe — which, and why this and not another. End with a one-line pointer to the protagonist role file.
 
-## 02_Protagonist_Arc (start → end → cost)
-Where the protagonist starts (identity, situation, core flaw, initial desire); where they land (who they become, what they gain or lose); the irreversible cost they pay for that landing. Show internal displacement, not just growth.
-
-## 03_Core_Conflict_and_Opponent
+## 02_Core_Conflict_and_Opponent
 The book's main tension — not "good vs evil" but "because A believes X and B believes Y, they will inevitably collide on Z". At least two opponents: one visible, one structural/systemic. Opponents have their own logic.
 
-## 04_World_Tonal_Ground (hard rules + sensory tone)
-The world's operating rules. 3-5 unbreakable laws (originally prohibitions, now embedded as prose). Sensory texture: wet or dry, fast or slow, noisy or quiet — give the writer an anchor (originally what particle_ledger carried).
+## 03_World_Tonal_Ground (hard rules + sensory tone + book-specific rules)
+The world's operating rules. 3-5 unbreakable laws written as prose, not bullets. Sensory texture: wet or dry, fast or slow, noisy or quiet — give the writer an anchor. **This paragraph also absorbs the narrative prose that used to live in book_rules (narrative perspective, core conflict driver, book-specific rules).** Write them all here once. Do not repeat them in book_rules.
 
-## 05_Endgame_Direction
+## 04_Endgame_Direction
 What the last chapter roughly feels like. The final shot: where, doing what, around whom, thinking what. A distant target for every planner call downstream.
 
 === SECTION: volume_map ===
 
-Prose volume map, 6 sections. **Critical requirement: write to chapter-level prose** ("chapter 17 sends him home", "chapters 32-35 reveal the master's secret"). Without chapter-level detail the sparse-memo planner has nothing to read.
+Prose volume map, **5 sections + 1 closing rhythm paragraph**. **Critical requirement: write to chapter-level prose** ("chapter 17 sends him home", "chapters 32-35 reveal the master's secret"). Without chapter-level detail the sparse-memo planner has nothing to read.
 
 ## 01_Volume_Themes_and_Emotional_Curves
 How many volumes? Each volume's theme in one sentence; each volume's emotional curve as a paragraph (where pressured, where rewarding, where cold, where warm). Not mechanical rotation.
@@ -394,39 +392,17 @@ Climax chapters (ch X, ch Y), turning-point chapters, breath/tender chapters. On
 Volume 1 plants hook A, paid off in ch N; volume 2 plants hook B, paid off in ch M. Prose, not tables. Concrete chapter numbers, not "late game payoff".
 
 ## 04_Character_Stage_Goals
-Protagonist's state at end of vol 1, vol 2, ... Supporting characters' stage changes (master dies end of vol 2, opponent breaks bad in vol 3).
+Protagonist's state at end of vol 1, vol 2, ... Supporting characters' stage changes (master dies end of vol 2, opponent breaks bad in vol 3). Stage goals only — full arc lives in roles.
 
 ## 05_Volume_End_Mandatory_Changes
 Each volume's last chapter must contain an irreversible event. Prose, one paragraph per volume.
 
-## 06_Rhythm_Intent (breath vs clench)
-Macro rhythm: first X chapters high pressure, ch X-Y breathe for the relationship arc, ch Y-Z clench again for the mid-arc climax.
-
-=== SECTION: rhythm_principles ===
-
-Six rhythm principles — **must be concrete, not abstract**. Bad: "rhythm must balance tension and release". Good: "every 5 chapters in the first 30 must carry a small payoff, and each must land within the last 300 chars of the chapter".
-
-## Principle_1_Climax_Spacing
-Longest allowed distance between major climaxes. Why.
-
-## Principle_2_Breath_Frequency
-How long a high-pressure run before a breath chapter is mandatory. What the breath chapter must carry.
-
-## Principle_3_Hook_Density
-Chapter-end hooks — one or two per chapter? Maximum unresolved span for the main hook?
-
-## Principle_4_Information_Release
-How main-line information (protagonist's secret, opponent's hand, world truth) is released across first third / middle / last third.
-
-## Principle_5_Payoff_Rhythm
-Interval between small payoffs. What kind (intelligence domination / raw strength / face-slap / truth reveal).
-
-## Principle_6_Relationship_Advancement
-Every N chapters a relationship must make a concrete move or it collapses.
+## 06_Rhythm_Principles_Concretised (ONLY place rhythm principles live)
+**This is the single home for rhythm principles — no separate rhythm_principles section exists.** Write 6 concrete principles for THIS book. Bad: "rhythm must balance tension and release". Good: "every 5 chapters in the first 30 carries a small payoff landing in the last 300 chars of the chapter". Cover: (1) climax spacing, (2) breath frequency, (3) hook density, (4) information release pacing, (5) payoff rhythm, (6) relationship advancement — each 2-3 sentences with concrete chapter ranges.
 
 === SECTION: roles ===
 
-One-file-per-character prose. Use this delimiter:
+One-file-per-character prose. **The protagonist card is the single source of truth for the protagonist's arc** — story_frame no longer carries it, and writer/planner both read it here.
 
 ---ROLE---
 tier: major
@@ -439,10 +415,13 @@ name: <character name>
 (1-2 concrete details that contradict the core tags — "ice-cold killer but leaves fish bones for stray cats". Contrast detail is the formula for character dimensionality.)
 
 ## Back_Story
-(Prose paragraph — how this person became who they are.)
+(Prose paragraph — how this person became who they are. Key past only, keep it lean.)
+
+## Protagonist_Arc (start → end → cost)
+**Mandatory for the protagonist; optional for other majors with substantial arcs.** Where they start (identity, situation, core flaw, initial desire); where they land (who they become, what they gain or lose); the irreversible cost they pay for that landing. Show internal displacement, not just growth. This section absorbs what used to live in story_frame.02_Protagonist_Arc.
 
-## Current_State
-(Where they are at chapter 0, what's on their mind, most recent worry.)
+## Current_State (initial state at chapter 0)
+(Where they are at chapter 0, what's on their mind, most recent worry. This also absorbs the fields that used to live in the separate current_state section — no separate current_state block is produced any more.)
 
 ## Relationship_Network
 (With protagonist, with other major characters. One line each. Relationships are dynamic, not labels.)
@@ -451,7 +430,7 @@ name: <character name>
 (What they want, why, what they're willing to pay.)
 
 ## Growth_Arc
-(What internal displacement they undergo across the book.)
+(Internal displacement across the book. Can be short for non-protagonists.)
 
 ---ROLE---
 tier: major
@@ -459,7 +438,7 @@ name: <next major>
 ---CONTENT---
 ...
 
-(At least 3 majors: protagonist + main opponent + main collaborator. 4-5 is ideal.)
+(Aim for 2-3 majors + 2-3 supporting majors. Quality over quantity — do not pad.)
 
 ---ROLE---
 tier: minor
@@ -471,7 +450,7 @@ name: <minor name>
 
 === SECTION: book_rules ===
 
-book_rules.md as YAML frontmatter + narrative guidance:
+**Output ONLY the YAML frontmatter block — zero prose.** All narrative guidance (perspective, book-specific rules, core conflict driver) has moved into story_frame.03_World_Tonal_Ground. Do not repeat it here.
 \`\`\`
 ---
 version: "1.0"
@@ -492,27 +471,8 @@ fatigueWordsOverride: []
 additionalAuditDimensions: []
 enableFullCastTracking: false
 ---
-
-## Narrative Perspective
-(One prose paragraph on perspective and style.)
-
-## Core Conflict Driver
-(Brief pointer to outline/story_frame.md section 3.)
 \`\`\`
 
-=== SECTION: current_state ===
-
-Initial state card (chapter 0) as a Markdown table:
-| Field | Value |
-| --- | --- |
-| Current Chapter | 0 |
-| Current Location | (starting location) |
-| Protagonist State | (initial condition) |
-| Current Goal | (first goal) |
-| Current Constraint | (initial constraint) |
-| Current Alliances | (initial relationships) |
-| Current Conflict | (first conflict) |
-
 === SECTION: pending_hooks ===
 
 Initial hook pool (Markdown table), Phase 7 extended columns:
@@ -527,12 +487,15 @@ Rules:
 - Column 10 (core_hook): true / false. Core hooks are main-line load-bearing (central mystery, identity, key promise). A book typically has 3-7 cores; everything else is false
 - Column 11 (half_life): optional integer chapters. If blank, derived from payoff_timing (immediate/near-term = 10, mid-arc = 30, slow-burn/endgame = 80)
 - Put initial signal text in notes, not column 5
+- **Initial world / alliance state**: any load-bearing initial condition ("protagonist carries the father's notebook", "the regime already watches the harbor") can be seeded as a start_chapter=0 row with a note-column tag indicating its initial-state nature. This replaces the structured fields of the removed current_state section.
 
 ## Final emphasis
 - Fit ${book.platform} platform taste and ${gp.name} genre traits
 - Protagonist persona clear with sharp behavioral boundaries
 - Hooks planted with payoff promises; supporting characters have independent motivation
-- **story_frame / volume_map / rhythm_principles / roles must be prose density — no bullet-list degradation**
+- **story_frame / volume_map / roles must be prose density — no bullet-list degradation**
+- **book_rules is YAML only — no prose body**
+- **Do NOT emit rhythm_principles or current_state as separate sections** — both have been merged / removed
 - **pending_hooks table MUST carry Phase 7 extended columns — depends_on spells out the causal chain, pays_off_in_arc locks the approximate payoff location, core_hook marks main-line load-bearing hooks (3-7 per book), half_life only on priority hooks**`;
   }
 
@@ -832,7 +795,7 @@ ${numericalBlock}
 ${continuationDirective}
 
 ## Output contract
-Follow the same === SECTION: === block layout as original-foundation generation: story_frame, volume_map, rhythm_principles, roles, book_rules, current_state, pending_hooks.
+Follow the consolidated 5-section === SECTION: === layout: story_frame, volume_map, roles, book_rules, pending_hooks. Do NOT emit rhythm_principles or current_state — rhythm principles live in the last paragraph of volume_map, initial state facts live in roles.Current_State and (optionally) pending_hooks start_chapter=0 rows.
 
 All prose must be derived from the source text. Do not invent settings. For volume_map, treat existing chapters as "review" (one paragraph) and continuation as prose chapter-level planning. Hook extraction must be complete (every unresolved clue).
 
@@ -853,7 +816,7 @@ ${numericalBlock}
 ${continuationDirective}
 
 ## 输出契约
-与从零架构完全一致的 === SECTION: === 结构:story_frame / volume_map / rhythm_principles / roles / book_rules / current_state / pending_hooks。
+合并后的 5 段 === SECTION: === 结构:story_frame / volume_map / roles / book_rules / pending_hooks。**不要输出 rhythm_principles 或 current_state 两个 section**——节奏原则合并进 volume_map 尾段,初始状态字段合并进 roles.当前现状(以及可选的 pending_hooks startChapter=0 行)。
 
 所有 prose 必须从正文中推导,不得臆造。volume_map 中,已有章节作为"回顾段"(一段散文),续写部分写到章级 prose。伏笔识别要完整(所有悬而未决的线索)。`;
 
@@ -906,11 +869,13 @@ ${fanficCanon}
 ${genreBody}
 
 ## 输出契约
-严格按 === SECTION: === 块输出:story_frame / volume_map / rhythm_principles / roles / book_rules / current_state / pending_hooks。
+严格按合并后的 5 段 === SECTION: === 块输出:story_frame / volume_map / roles / book_rules / pending_hooks。**不要输出 rhythm_principles 或 current_state**(节奏原则合并进 volume_map 尾段;初始状态合并进 roles.当前现状)。
 
 - 主要角色必须来自原作正典
 - 可添加原创配角,标注"原创"
 - book_rules 的 fanficMode 必须设为 "${fanficMode}"
+- book_rules 只输出 YAML frontmatter,散文写进 story_frame.世界观底色
+- 主角弧线只写在 roles/主要角色/<主角>.md,不在 story_frame 重复
 - 所有 outline 必须是散文密度`;
 
     const response = await this.chat([