# Write-Router

> 写作流水线唯一调度中心。接收用户写作意图 → 内容类型检测与判断 → 段落预分配 → 调度Core/Combat/Romance/NSFW处理 → 结果拼合 → 调度长篇专项(伏笔/回忆) → 调度成品输出校验(落盘)。减轻Core路由压力，让各写作技能专注本职工作。当用户表达写作意图时触发：写正文、写章节、润色、写战斗、写言情、写NSFW等。

- Skill: `jackal9384/write-router` (Agent Skill)
- Install (CLI): `npx skillmds@latest add jackal9384/write-router`
- Raw SKILL.md: https://api.skillmd.com/api/skills/jackal9384/write-router/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: jackal9384 (https://skillmd.com/u/jackal9384)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/jackal9384/write-router

---


# Write-Router — 写作流水线路由调度中心

此技能是写作系统的**唯一调度中心**，负责接收用户写作意图，完成内容检测、段落预分配、技能调度、结果整合、以及后续流水线（伏笔→校验→落盘）的全流程编排。

## 核心定位

- **唯一调度入口**：所有正文类技能（Core/Combat/Romance/NSFW）统一由此技能接收和分发——用户不直接调用，创建阶段技能也不直接调用，均由 Write-Router 代为调度
- **判断与预分配**：在文本进入任何写作技能之前，先完成内容类型检测和段落分割——哪些段落是一般叙事、哪些是战斗、哪些是 NSFW，提前判定并分组
- **解放 Core**：Core 不再承担检测/分割/调度/整合职责，只做一件事——接收文本+上下文，按规范库（`body/Core/norms/` 注册表驱动）优化后返回
- **流水线编排**：Core/Special → 整合 → Long（伏笔/回忆）→ Proofreading（校验+落盘），全流程由此技能驱动
- **双模式调度**：全文写作流水线（标准模式，步骤 0-9）+ 创建阶段文本加工（轻量模式，步骤 L0-L3）。轻量模式仅做文本类型确认和 Core 调度，不执行段落分配、专项检测、长篇处理或成品校验

## 调度源

此技能接收两个调度源的请求：

### 调度源 A：用户直接触发（标准模式）

当用户表达以下意图时，主技能将路由到此技能处理，执行完整流水线（步骤 0-9）：

- "润色这段文字"、"优化写作"、"帮我改一下这段"
- "写正文"、"开始写正文"、"写章节"、"写这一段"
- "改写"、"润色"、"优化一下"、"帮我看看这段"
- "写一场战斗"、"写打斗场景"、"优化这段打斗"
- "写 NSFW 内容"、"写成人内容"、"写床戏"
- "继续写"、"往下写"、"接着写"
- 用户在对话中提供待写入的正文内容
- 任何表达"对文本进行优化/润色/创作"的表述

### 调度源 B：创建阶段技能调度（轻量模式）

创建人物、设定编辑、剧情编辑、快速创建、提示词增强五个技能在产出供人阅读的文本后，将文本传入此技能进行加工。此调度源通过数据包中 `mode: "creation_phase"` 标识。执行轻量处理分支（步骤 L0-L3），**仅**调度 Core，不执行段落分配、专项检测、长篇处理或成品校验。

## 关联文件

| 文件 | 位置 | 用途 | 读写 |
|------|------|------|------|
| `写作配置.json` | `大纲/` | 润色模式 + **`角色语气`（角色级语气配置）**，传递给 Core/Special | 只读 |
| `项目信息.json` | `大纲/` | 内容分级 + 分卷信息 + NSFW 偏好 + 伏笔数据 | 只读 |
| `主要角色.md` / `次要角色.md` / `龙套角色.md` | `大纲/人物/`（或分卷子目录） | 传递给各技能的角色上下文 | 只读 |
| `设定.md` | `大纲/设定/` | 世界观约束，传递给各技能 | 只读 |
| `术语表.json` | `大纲/` | 核心术语定义 + 禁用混指词——组装 context.glossary 随数据包分发 | 只读 |
| `Prompt.md` | `大纲/剧情/` | 预生成的写作提示词，零提示词时读取 | 只读 |
| `type-detection.json` | `data/` | 内容类型检测数据（快速路由关键词 + 三级/四级扫描命中词表与条件枚举） | 只读 |
| `packet-schemas.json` | `data/` | 分发协议规格（7 个协议字段定义/必填/返回结构，机器规格） | 只读 |
| `chapter-tension-guide.json` | `data/` | 阶段张力与章节分类指引（tension_levels L1-L5 + chapter_types 7 类，机器规格） | 只读 |

## 加载策略（规格数据）

- `data/packet-schemas.json`、`data/chapter-tension-guide.json` 为机器规格：**首次调度本技能时完整读取一次**（同会话仅此一次），读取后按工作记忆执行，后续调度不重复读取
- 仅当规格数据变更（版本升级）或新会话首次调度时重新读取

## 执行模式

**标准模式（用户直接触发）**：进入计划模式（EnterPlanMode），列出处理步骤后执行。

**标准模式（由主技能调度）**：跳过计划模式，直接按步骤 0-9 执行。

**轻量模式（由创建技能调度）**：跳过计划模式，直接按轻量步骤 L0-L3 执行。此模式处理速度快、开销小，不涉及用户交互。

---

## 步骤 0：零提示词检测与 Prompt.md 读取

**仅当用户未提供正文/提示词内容时执行**（如"写第3章""写正文"但无任何剧情描述或写作方向）。

1. 从用户消息中提取章节号（如"第3章"）
2. **分卷感知章号定位**：读取 `项目信息.json` → `volumes`：
   - 分卷多文件模式 → 根据 `volumes.list[].chapter_range` 匹配章号所属卷
   - 不分卷/单文件 → 跳过卷号推算
3. **Prompt.md 定位**：`大纲/剧情/Prompt.md`。分卷与不分卷共用同一文件——提示词增强技能统一写入此路径，不按卷拆分子目录
4. 若 Prompt.md 存在 → 查找目标章的 `prompt_text`：
   - 命中 → 提取完整提示词，跳过步骤 2（上下文预读取，Prompt.md 已含完整上下文），直接进入步骤 3（内容类型检测）
   - 未命中 → 询问用户：是否调度「提示词增强」先生成提示词（提示词增强产出提示词后将回写 Prompt.md 或直传 Write-Router 继续写作）
5. 若 Prompt.md 不存在 → 同上，询问用户是否先生成提示词

**由提示词增强技能调用时**（提示词增强步骤 5.1 → 用户确认执行 → 传入 Write-Router）：收到的数据包中已包含完整提示词，跳过此步骤，直接进入步骤 1。「提示词增强 → Write-Router」的调度方向是单向的——Write-Router 执行写作后不再回呼提示词增强。

---

## 步骤 1：路由类型判定（快速路由）

> 在上下文读取和内容扫描之前，先检查用户意图是否已明确指定文本类型——如果用户说"写床戏"，不需要再扫描文本中是否有性词汇。

### 1.1 用户意图关键词匹配

读取 `data/type-detection.json` → `quick_route` 组，扫描用户输入消息匹配路由类型关键词（各类型关键词表见数据文件，命中即全文标记为该类型）：

| 命中 | 路由类型 | 后续动作 |
|------|---------|---------|
| 命中 `quick_route.nsfw` 任一词 | `nsfw` | 跳过步骤 2 全类型扫描，全文标记为 NSFW |
| 命中 `quick_route.combat` 任一词 | `combat` | 跳过步骤 2 全类型扫描，全文标记为 combat |
| 命中 `quick_route.romance` 任一词 | `romance` | 跳过步骤 2 全类型扫描，全文标记为 romance |
| 未命中（"润色""优化""改写""继续写"等无明确类型指向） | 无命中 | 正常进入步骤 2 多类型扫描 |

**关键词仅匹配用户意图表达，不匹配待处理的正文内容。** 快速路由判断的是"用户想干什么"，步骤 2 判断的是"文本里有什么"。

### 1.2 快速路由命中时

命中后设置路由标签 `route_type`，步骤 3（内容类型检测）和步骤 4（段落预分配）跳过——全文作为一个段落组直接打包到目标技能。步骤 2（上下文按需预读取）按命中类型读取对应子集。

### 1.3 快速路由未命中时

正常进入步骤 2，执行完整的多类型逐段扫描。

---

## 步骤 2：上下文按需预读取

> 根据路由类型按需拉取上下文——后续各技能不再重复读取。快速路由命中时只读目标技能所需的文件子集，多类型扫描时全量读取。

### 2.1 读取矩阵（按路由类型）

按路由类型读取对应字段子集——**人物字段列直接引用 `templates/character.schema.json` 的字段名，设定列引用 `templates/settings.schema.json` 的板块**，杜绝模糊描述：

| 路由类型 | 项目信息.json | 写作配置.json | 人物字段（character.schema 字段名） | 设定.md（settings.schema 板块） | NSFW 偏好 |
|---------|:---:|:---:|------|------|:---:|
| `general`（全 Core） | ✓ 基础字段 | ✓ 正文轨道 | 人物性格、人物简介、人物基本关系 | 世界观-场景相关分类 | — |
| `combat` | ✓ 基础字段 | ✓ 正文轨道 | 人物性格、人物简介、人物能力（战斗/魔力） | 世界观-战斗相关分类 | — |
| `romance` | ✓ 基础字段 | ✓ 正文轨道 | 人物性格、人物简介、人物基本关系、人物语气 | 世界观约束 | — |
| `nsfw` | ✓ 含 NSFW 偏好 | ✓ 正文轨道 | 人物性格、人物简介、XP、三维、性特征、人物X能力 | — | ✓ |
| 混合类型（无命中/多类型） | ✓ 全部字段 | ✓ 正文轨道 | 全部三类角色全字段 | 全部 | ✓ 如涉及 |

**基础字段** = `content_rating` + `volumes`（所有类型均读）。

**facts 事实约束块**：按本矩阵读取的角色字段值（≤6 字段/角色），组装为 `context.facts` 随数据包分发给写作技能（见步骤 4.4 与步骤 5）——写作技能不再自行读取角色文件，OOC 约束前移至写作前。**facts 不含隐藏设定**（伏笔，正文包不携带以防提前泄底）。

**glossary 术语约束块**：若 `大纲/术语表.json` 存在且 `terms` 非空，读取其 `terms` 数组，组装为 `context.glossary`（{术语: {定义, 禁用词[]}}）随数据包分发——写正文时遇禁用混指词自动纠偏。术语表为空或文件不存在时省略该字段。

### 2.2 写作配置确认

**仅当待处理内容为正文类且将写入 `正文/` 文件夹时执行。**

读取写作配置后，向用户展示当前有效配置（不分卷时展示全局，分卷时展示卷覆盖）。**询问策略**：

- **本会话首次写作 / 配置刚被变更过** → 询问是否沿用（用户选择调整时更新 `写作配置.json`，通过成品输出校验落盘）
- **本会话已确认过配置** → 静默沿用，不重复询问（懒人友好：能用默认值的不让你选；用户可随时说"改润色模式""切换润色"触发调整）

### 2.3 阶段张力与章节分类（双结构，B）

> 张力分两层：**阶段级事件烈度**（`tension_level` L1-L5，传导为背景）+ **章节级内容分类**（`chapter_type` 7 类，阶段内二次规划）。两者解耦独立判断——张力只指导**事件安排**（内容层），不挂钩写作参数（句子节奏/信息密度/换气频率/篇幅）。数据见 `data/chapter-tension-guide.json`。

**① 阶段张力判断（`context.tension_level`）**：读取当前章所属阶段（卷/篇）的张力信息——
- 剧情大纲阶段标题旁已标注 `〔L1-L5〕` → 直接读取
- 未标注 → 按该阶段阶段目标/描述，对照 `chapter-tension-guide.json` → `tension_levels` 的事件烈度特征判断（LLM 判断）
- 无大纲或无法定位阶段 → 省略该字段

**② 章节分类判断（`context.chapter_type`）**：按以下来源**依次**判断当前章内容分类（7 类：daily/transition/mainline/combat/romance/climax/wrapup，定义见数据文件 `chapter_types`）：

1. **用户明示**——用户消息中直接说明了本章内容（"写日常""大战前夜""写一场战斗"）
2. **Prompt.md**——该章 `prompt_text` 的剧情描述（如多为交战描写 → `combat`）
3. **剧情大纲**——当前章所属阶段的阶段目标/章节要点描述
4. **步骤 3 检测结果回填**——来源 1-3 均无法确定时，等步骤 3 内容检测完成后按检测结果定类（大量 combat 段落 → `combat`；大量 romance 段落 → `romance`；无专项内容 → `mainline` 或 `daily`）

**判断规则**：`tension_level` 是阶段级背景（本阶段整体事件烈度），`chapter_type` 是章节级指引（本章内容规划）——**任何阶段内都可出现任何章节分类**（如 L4 阶段中的日常章/收束章），张力等级不因章节分类改变，章节分类也不被张力等级强制。

**分发**：两字段随数据包分发至 Core/四专项（字段定义见 packet-schemas.json 各协议）。各写作技能按 `chapter_type` 查 `chapter-tension-guide.json` → `chapter_types` 对应分类的 events/conflict_scale/info_release/foreshadow 作为**事件安排建议**（软引导——参考建议，不拦截不强制）。

---

## 步骤 3：内容类型检测与判断（判断功能）

> 此步骤仅在快速路由**未命中**时执行。快速路由已命中时跳过——全文类型已知。

待处理文本按以下优先级逐级扫描：

### 3.1 NSFW 内容检测（三级扫描）

读取 `data/type-detection.json` → `detections.nsfw`（命中词表与条件枚举见数据文件）。检测到以下**任一条件**时，标记为 NSFW 专项内容：

**一级 — 显性性词汇（直接命中）：**
文本中出现 `level1_direct.keywords` 中的性器官直称、性行为动词、性相关体液词汇（含同义词/代称），直接判定为 NSFW。

**二级 — 性场景描写（场景命中）：**
命中 `level2_scenes` 任一场景类型——床戏/亲密接触（接吻以上尺度）、自慰（性器官触碰）、性暗示（脱衣/抚摸/喘息呻吟等前戏边缘行为）、情色幻想。

**三级 — 语境渗透（语境命中）：**
满足 `level3_contexts` 任一语境条件——连续性挑逗/性暗示对话（≥3轮）、角色互动以性吸引力为核心驱动力（勾引/诱惑）、用户已明确指示当前章为 NSFW 章节。

**不触发条件（命中 `not_triggered` 任一 → 不触发）：**
仅身体部位词（胸/腿/臀）且上下文为正常描写；接吻描写无进一步身体接触暗示；医学/生理卫生语境下的器官名称。

### 3.2 战斗内容检测（四级扫描）

读取 `data/type-detection.json` → `detections.combat`（动词词表与条件枚举见数据文件）。检测到以下**任一条件**时，标记为战斗专项内容：

**一级 — 兵器/攻击动词命中（直接命中）：**
文本中出现明确的攻击性动作描写——`level1_direct.weapon_verbs`（兵器格斗）+ `hand_verbs`（徒手格斗）+ `ability_verbs`（超能力攻击）+ `gun_verbs`（枪械）——且该动作有明确的攻击目标（人），直接判定为战斗内容。

**二级 — 攻防交替（场景命中）：**
命中 `level2_scenes` 任一场景类型——对峙后肢体/兵器/能力冲突、格挡闪避招架+反击往复、比试/切磋/决斗（即使点到为止）、追杀/逃亡中的直接对抗（非单纯逃跑）。

**三级 — 伤势描写+攻击意图（语境命中）：**
满足 `level3_contexts` 任一语境条件——伤势描写为主且来源为人与人的直接对抗、战斗后的状态评估/战果确认。

**四级 — 战斗准备/收束（边界命中）：**
命中 `level4_boundary` 任一——对峙/蓄势描写（拔剑、摆开架势、气息对峙）、战斗后的收剑/离去/沉默。

**不触发条件（命中 `not_triggered` 任一 → 不触发）：**
单纯武器描述/兵器鉴赏（无攻击动作和目标）；练功/独自修炼（无对手）；体育竞技非格斗类；军队/大规模战争描写（百人以上）；暗杀/偷袭一击致命（无往复攻防）；魔兽/怪物狩猎（非人与人）。

### 3.3 言情内容检测（三级扫描）

读取 `data/type-detection.json` → `detections.romance`（关键词表与条件枚举见数据文件）。检测到以下**任一条件**时，标记为言情专项内容：

**一级 — 情感互动关键词命中（直接命中）：**
文本中出现明确的情感互动关键词——`level1_direct.confession`（表白类，用于表达情感而非日常客套）+ `ambiguous`（暧昧类）+ `emotion_state`（情感状态类）——且该关键词发生在角色之间的情感互动语境中，直接判定为言情。

**二级 — 浪漫互动场景（场景命中）：**
命中 `level2_scenes` 任一场景类型——浪漫含义肢体接触（牵手/拥抱/靠肩/整理头发衣领/擦眼泪）、表白/确认关系（不论结果）、约会（日常活动但以情感互动为核心）、争吵后和好/冷战情感对峙、思念/触景生情的独处段落（情感指向特定的人）。

**三级 — 单方情感体验（语境命中）：**
满足 `level3_contexts` 任一语境条件——内心独白以对另一角色情感为核心、行为动机明确由对另一人的情感驱动、回忆与另一角色的过往互动（带情感色彩：怀念/遗憾/甜蜜）。

**不触发条件（命中 `not_triggered` 任一 → 不触发）：**
日常社交礼仪客套用语；纯友谊/兄弟情/战友情（无浪漫暗示）；家人之间的关怀（父母/子女/手足）；NSFW 性场景（由 3.1 三级扫描优先捕获，由 NSFW 处理）；角色对非人类对象的情感；职业关系层面的欣赏/钦佩/信任（无浪漫暗示）。

### 3.4 内容类型判定结果

扫描完成后，按段落标记类型：

| 标签 | 含义 | 目标技能 |
|------|------|---------|
| `general` | 一般叙事/对话/描写 | Core（基础写作辅助） |
| `nsfw` | NSFW 成人内容 | NSFW 专项写作 |
| `combat` | 战斗对决内容 | 战斗描写专项 |
| `romance` | 言情/恋爱内容 | 言情写作专项 |

---

## 步骤 4：段落预分配（预分配功能）

> 在检测完成的基础上，将全文按段落拆分为独立的任务单元，标注每段的类型和边界，然后按类型分组打包——各写作技能接收到的是"已经分好的、只属于自己的那部分文本"。

**快速路由命中或全篇仅一种类型时**：跳过段落分割与分组——全文作为一个段落组直接打包到目标技能，零分配开销。

### 4.1 段落分割

以段落为单位遍历全文，为每个段落打上类型标签（`general` / `nsfw` / `combat` / `romance`）。

**角色标注**：分割同时将段落文本与角色文件中的角色名（主要/次要角色条目标题）匹配——命中 → 该段落标记 `involved_characters`；段落组级 `involved_characters` = 组内各段落命中角色名的并集。facts 块按此名单提取字段。

### 4.2 边界合并

两个同类型的段落组之间如果仅隔 ≤2 个 `general` 段落，合并为同一段落组（避免因一句环境换气把同一场戏拆成两段）。

### 4.3 生成分配清单

```
[内部] 段落分配清单

段落组 1（L1-L3）：general → Core
段落组 2（L4-L12）：combat → 战斗描写专项
段落组 3（L13-L14）：general → Core
段落组 4（L15-L22）：romance → 言情写作专项
段落组 5（L23-L28）：nsfw → NSFW 专项写作
段落组 6（L29-L31）：general → Core
```

### 4.4 打包数据并分发

为每个段落组生成数据包，附加上下文信息（前后各一段非同类文本供语境参考），然后按目标技能并行/串行分发。

**facts 组装**：按步骤 2.1 字段化矩阵 + 段落组 `involved_characters`，从角色文件提取各角色命名字段值（≤6 字段/角色），组装为数据包 `context.facts`——各写作技能直接使用，不再自行读取角色文件。**不含隐藏设定**。

**glossary 组装**：若步骤 2 已读取术语表，将 `context.glossary` 随数据包分发至各写作技能（Core/Combat/Romance/NSFW）——遇禁用混指词自动纠偏。

---

## 步骤 5：调度写作技能处理

### 5.1 分发到 Core（一般段落）

将所有标记为 `general` 的段落组打包，按 `data/packet-schemas.json` → `protocols.to_core` 字段定义组装数据包（字段名/必填/说明以规格数据为准），传递至 Core。

Core 返回：`{ "processed_text", "changes_summary" }`（同规格数据 `returns`）

### 5.2 分发到战斗描写专项

将所有标记为 `combat` 的段落组打包，按 `data/packet-schemas.json` → `protocols.to_combat` 字段定义组装数据包，传递至战斗描写专项。

战斗技能返回：`{ "processed_text", "combat_type", "exempted_norms", "key_changes", "combat_notes" }`（同规格数据 `returns`）

### 5.3 分发到 NSFW 专项写作

将所有标记为 `nsfw` 的段落组打包，按 `data/packet-schemas.json` → `protocols.to_nsfw` 字段定义组装数据包，传递至 NSFW 技能。

NSFW 技能返回：`{ "processed_text", "nsfw_tier_used", "sexy_value", "exempted_norms", "key_changes", "ooc_warnings" }`（同规格数据 `returns`）

### 5.4 分发到言情写作专项

将所有标记为 `romance` 的段落组打包，按 `data/packet-schemas.json` → `protocols.to_romance` 字段定义组装数据包，传递至言情写作专项。

言情技能返回：`{ "processed_text", "romance_type", "exempted_norms", "key_changes", "romance_notes" }`（同规格数据 `returns`）

---

## 步骤 6：结果整合

所有分发的技能返回结果后，Write-Router 执行整合。

### 6.1 段落拼合

按步骤 4.3 的分配清单，将各技能返回的 `processed_text` 按原位置拼回全文中。

### 6.2 豁免收集

收集所有专项技能返回的 `exempted_norms`，取并集。此并集将传递给成品输出校验，告知哪些规范已被专项技能覆盖。

### 6.3 专项元数据汇总

收集所有专项返回的元数据（`combat_type`、`nsfw_tier_used`、`sexy_value`、`romance_type`、`key_changes`、`ooc_warnings`、`combat_notes`、`romance_notes`），汇总为最终输出的元数据段。

### 6.4 全文一致性过检

对拼合后的全文做过检——确保专项段落与一般段落在整体节奏、换气频率上协调，不出现断层。

如有 `ooc_warnings`，向用户展示并确认。

---

## 步骤 7：调度长篇专项（伏笔/剧情回忆）

整合完成后，检查是否需要伏笔管理或剧情回忆：

1. **伏笔检测**：如战斗/言情/NSFW/一般段落中用户标注了伏笔提示，或文本中存在暗示后续发展的关键信息（隐藏实力、未展露的招式、遗留的伤势、暗恋未说出口、关系阶段变化等）→ 自动调度「长篇专项」进行伏笔登记。检测到的线索按 foreshadowing 数据格式直接产出：`{第N章}_{≤50字关键意思}_{待回收}`（如 `第3章_主角隐藏魔力天赋_待回收`），避免自由文本二次转换
2. **剧情回忆**：如用户提及前文章节事件、或文本中涉及需要回溯的跨章线索 → 调度「长篇专项」进行情节回忆

传递数据包：

```
{
  "trigger_type": "{foreshadowing / recall / both}",
  "chapter": "{当前章号}",
  "volume": "{当前卷号或 null}",
  "hints": ["{检测到的伏笔提示或回忆需求}"]
}
```

长篇专项处理完成后返回确认信息。

---

## 步骤 8：调度成品输出校验（落盘）

流水线最后一步，自动调用「成品输出校验」技能。按 `data/packet-schemas.json` → `protocols.to_proofreading` 字段定义组装完整数据包（`metadata` 含 combat/romance/nsfw/foreshadowing 四键，无则 null）。

校验技能执行：CPS.json 标点扫描 → Core 结构扫描（根据 `exempted_norms` 跳过）→ 通过则落盘 / 不通过则修正后重检。

---

## 步骤 9：输出最终成品

返回经校验通过的优化后文本，附带：

- 操作摘要（Write-Router 调度了哪些技能）
- 专项技能元数据（combat 的 `combat_type` + romance 的 `romance_type` + NSFW 的 `nsfw_tier_used` / `sexy_value`）
- 长篇专项结果（伏笔登记数 / 剧情回忆摘要）
- 校验摘要（标点修正数 / 结构通过项）

---

## 轻量模式：创建阶段文本加工

> 此模式是标准流水线的极简分支。创建阶段技能（创建人物/设定编辑/剧情编辑/快速创建）产出的大纲类文本，不直接调用 Core，而是传入 Write-Router，由 Write-Router 以轻量模式完成文本类型确认和 Core 调度后返回。

### 触发条件

当 Write-Router 接收到的数据包中 `mode` 字段为 `"creation_phase"` 时，自动进入此轻量分支。

### 跳过步骤

此模式下以下标准流水线步骤**全部跳过**：

| 跳过步骤 | 步骤名称 | 跳过原因 |
|---------|---------|---------|
| 步骤 0 | 零提示词检测 | 创建阶段不需要提示词，文本已由创建技能产出 |
| 步骤 1 | 路由类型判定 | 创建阶段不涉及正文类型路由 |
| 步骤 2 | 上下文按需预读取 | 创建技能已自行完成上下文读取和写作配置获取 |
| 步骤 3 | 内容类型检测（NSFW/Combat/Romance） | 大纲文本不存在连续的性/战斗/言情描写段落 |
| 步骤 4 | 段落预分配 | 每次仅传入单个字段文本，无需段落分割与分组 |
| 步骤 5.2/5.3/5.4 | Combat/Romance/NSFW 专项调度 | 大纲文本不涉及专项写作场景 |
| 步骤 6 | 结果整合 | 仅 Core 一个技能被调度，无需拼合 |
| 步骤 7 | 长篇专项（伏笔/回忆） | 大纲文本不涉及跨章节伏笔或情节回忆 |
| 步骤 8 | 成品输出校验（落盘） | 创建技能在接收 Core 结果后自行调度成品校验落盘 |

### 步骤 L0：入口分流

Write-Router 接收到数据包后，首先检查 `mode` 字段：

- `mode` 为 `"creation_phase"` → 进入轻量处理分支（步骤 L1-L3）
- `mode` 不存在或为其他值 → 进入标准流水线（步骤 0-9）
- 若 `mode` 缺失但 `context.content_type` 为 `"大纲文本"` 且 `context.source_skill` 为已注册的创建技能名称 → 推断为轻量模式（记录警告，建议后续调用显式传入 `mode`）

### 步骤 L1：文本类型确认

1. 检查 `context.content_type` 是否为 `"大纲文本"`
2. **field_name 合法性校验**：`context.field_name` 必须命中 `templates/index.json` → `protocols.field_name` 枚举（人物语气/梗概/阶段目标/剧情要点/世界观-{分类名}/对外简介/个人描述/核心设定-*/次要设定-{分类名}）或 `templates/character.schema.json` → `x_notes.core_polish_fields`（人物性格/人物简介/人物语气/身形特点/龙套角色描述等）
   - 命中 → 透传 `field_name` 给 Core（Core 按 `norms/index.json` → `field_standards` 应用字段级加工标准）
   - 未命中 → 记录警告并修正为最接近的协议字段名；无法确定时省略 `field_name`（Core 按普通大纲文本处理）
3. 确定目标技能为 Core，跳过所有专项检测

**与标准步骤 3 的关键区别**：标准步骤 3 执行 NSFW 三级扫描 + 战斗四级扫描 + 言情三级扫描，对全文逐段分析类型。轻量模式仅读取 `content_type` 与 `field_name` 字段做确认——不做任何文本内容扫描。

### 步骤 L2：调度 Core 加工

将数据包原样转发至 Core（基础写作辅助）——转发格式 = 入口数据包除去 `mode` 字段（字段定义见 `data/packet-schemas.json` → `protocols.lightweight_in`）。

Core 按大纲文本规范（规范 1.5：大纲类文本特殊处理 + 规范 1.6：破折号禁令 + 规范 5：降重率酌情，及 field_name 对应字段标准）加工后返回：`{ "processed_text", "changes_summary" }`。

此步骤不涉及 Combat/Romance/NSFW 调度，不执行并行调用。

### 步骤 L3：返回结果

将 Core 返回的结果直接透传给调用方创建技能：

```
{
  "processed_text": "{加工后文本}",
  "changes_summary": "{调整摘要}"
}
```

Write-Router 在此环节的角色是**调度透传**——不修改数据包内容，不在 Core 结果上做二次加工、整合或校验。创建技能接收到结果后，继续其自身流程（如将加工后文本拼入角色条目、展示给用户确认、调度成品校验落盘等）。

### 轻量模式数据包速查

```
创建技能 → Write-Router:
{ mode:"creation_phase", text, context:{source_skill, content_type:"大纲文本", field_name}, polish_mode, polish_config }

Write-Router → Core:
{ text, context:{source_skill, content_type:"大纲文本", field_name}, polish_mode, polish_config }
（与创建技能传入的数据包除去 mode 字段后完全一致）

Core → Write-Router:
{ processed_text, changes_summary }

Write-Router → 创建技能:
{ processed_text, changes_summary }
（与 Core 返回完全一致）
```

---

## 流水线总览

```
用户提示词
    │
    ▼
Write-Router（此技能）
    │
    ├── 步骤 0：零提示词检测 → 必要时调度提示词增强
    ├── 步骤 1：路由类型判定 ← 快速路由
    │          用户关键词命中 → 跳过步骤 3+4，直接打包到目标技能
    ├── 步骤 2：上下文按需预读取（按路由类型读取子集）
    ├── 步骤 3：内容类型检测与判断 ← 判断功能
    │          NSFW三级扫描 + 战斗四级扫描（快速路由命中时跳过）
    ├── 步骤 4：段落预分配 ← 预分配功能
    │          段落分割 → 边界合并 → 生成分配清单（单类型时跳过）
    ├── 步骤 5：分发到各写作技能
    │    ├── general 段落 → Core（基础写作辅助）
    │    ├── combat 段落 → 战斗描写专项
    │    ├── romance 段落 → 言情写作专项
    │    └── nsfw 段落  → NSFW 专项写作
    ├── 步骤 6：结果整合（拼合+豁免收集+一致性过检）
    ├── 步骤 7：→ 长篇专项（伏笔登记/剧情回忆）
    └── 步骤 8：→ 成品输出校验（标点+结构→落盘）
    │
    ▼
最终成品（校验通过，已落盘）
```

轻量模式流水线：
```
创建技能（数据包 mode:"creation_phase"）
    │
    ▼
Write-Router（此技能）
    ├── 步骤 L0：入口分流（识别 mode）
    ├── 步骤 L1：文本类型确认（大纲文本 → Core）
    ├── 步骤 L2：调度 Core 加工（透传数据包）
    └── 步骤 L3：返回结果给调用方
    │
    ▼
创建技能（接收 processed_text → 继续自身流程 → 自行调度成品校验 → 落盘）
```

---

## 调度协议速查

全部调度协议（7 个协议：to_core / to_combat / to_nsfw / to_romance / to_long / to_proofreading / lightweight_in 的字段定义、必填、返回结构）见 `data/packet-schemas.json`——机器规格，首次调度完整读取一次，之后按工作记忆执行。

---

## 注意事项

- **唯一调度入口**：所有正文类技能（Core/Combat/Romance/NSFW）的**文本加工调度**必须经过此技能——包括正文写作流水线（标准模式）和创建阶段文本加工（轻量模式）。不允许绕开 Write-Router 直接调用 Core/Combat/Romance/NSFW 进行文本处理。例外：Combat/Romance/NSFW 可被用户直接触发进行**只读分析**（分析战斗写法/分析情感描写/NSFW配置）——此类触发不涉及文本加工和落盘。创建阶段技能（创建人物/设定编辑/剧情编辑/快速创建/提示词增强）产出的文本，通过轻量模式（`mode: "creation_phase"`）传入 Write-Router，由 Write-Router 调度 Core 加工后返回
- **判断优先于处理**：内容检测和段落预分配在调用任何写作技能之前完成——各写作技能收到的已是"已分类、已分组"的文本
- **Core 已解放**：Core 不再承担检测/分割/调度/整合职责，只做纯文本优化。Write-Router 不要将这些职责再传回 Core
- **并行与串行**：Core/Combat/Romance/NSFW 之间无依赖关系（各处理各自的段落组）→ 可并行调用。长篇专项和成品输出校验依赖整合结果 → 必须串行
- **专项技能之间的段落重叠**：同一段落不可能同时属于两个专项——NSFW 检测优先级高于战斗检测。如某段落同时命中 NSFW 和 combat，按 NSFW 处理（NSFW 场景中的肢体冲突属于情色语境，不属于对决）
- **始终以 Markdown 格式输出**文本内容

