# 成品输出校验

> 写作系统的唯一落盘入口。任何技能不得自行将内容写入本地文件系统——必须经此技能校验通过后统一落盘。校验范围覆盖所有输出类型：正文文本（CPS.json 标点 + Core 结构规范）、JSON 文件（语法/模式/引用一致性）、结构化 Markdown（字段完整性/跨文件引用）。不通过项自动修正至合格后写入。不经校验直接写入视为流程违规。

- Skill: `jackal9384/skill-12` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add jackal9384/skill-12`
- Raw SKILL.md: https://api.skillmd.com/api/skills/jackal9384/skill-12/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Docs & Writing
- Author: jackal9384 (https://skillmd.com/u/jackal9384)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/jackal9384/skill-12

---


# 成品输出校验

此技能是写作系统的**唯一落盘入口**。任何技能（基础写作辅助、NSFW 专项写作、提示词增强、人物/设定/大纲编辑等）不得自行将内容写入本地文件系统——必须将待写入内容传入此技能，经校验通过后由此技能统一执行落盘。**不经校验直接写入视为流程违规。**

## 核心定位

- **唯一落盘入口**：系统内没有任何技能可以 bypass 此技能直接写文件——这是硬约束，不是建议
- **全类型覆盖**：所有输出到本地持久存储的文件均需校验——正文(.md)、JSON(.json)、结构化 Markdown（角色/设定/大纲）
- **格式感知**：根据文件类型自动选择校验策略（正文文本 / JSON / 结构化 Markdown）
- **校验不过自动改到过**：发现违规 → 自动修正 → 复检确认 → 落盘。不回头找上游，不自称"无法处理"退回
- **正文双轨校验**：标点合规（CPS.json）+ 段落/字句合规（Core 规范）
- **JSON 校验**：语法有效性 + 必填字段完整性 + 引用一致性
- **结构化 MD 校验**：必填字段完整性 + 跨文件引用有效性
- **NSFW 感知**：NSFW 内容的专项校验由 NSFW 技能步骤 4 自行完成，此技能仅做通用结构校验
- **被动调度**：由上游技能在准备写入时主动调用——上游技能不持有文件写入权限

## 触发条件

- **强制触发**：任何技能在将内容写入本地文件前**必须**调用此技能。不调用直接写入 = 流程违规，写入的内容视为不合规
- **手动触发**：用户直接要求"检验一下"、"检查一下"、"合规检查"等

## 关联文件

| 文件 | 位置 | 用途 |
|------|------|------|
| `CPS.json` | 本技能同目录 | 中文标点符号用法国家标准（GB/T 15834），正文标点合规性校验的唯一权威依据 |
| 基础写作辅助 SKILL.md | `body/Core/SKILL.md` | 段落节奏、间接描写等规范的校验基线 |
| `项目信息.json` | `大纲/` | 跨文件引用一致性校验的参照源（卷结构、章节数等） |
| `主要角色.md` / `次要角色.md` / `龙套角色.md` | `大纲/人物/` | 角色文件字段完整性校验的参照模板 |
| `Prompt.md` | `大纲/剧情/` | JSON 模式校验对象之一 |
| `proofreading-checklist.json` | `data/` | 检查项清单（标点/结构/JSON 模式与引用/结构化 MD，机器规格） | 只读 |

## 文件类型识别与校验策略路由

接收待校验内容时，首先根据文件路径和内容特征判定类型，然后路由到对应的校验策略：

| 文件类型 | 判定依据 | 校验策略 |
|---------|---------|---------|
| **正文文本** | 路径含 `正文/` 或 `番外/`，文件为 `.md`，内容为叙事/对话/描写 | 第一轮（CPS.json 标点）+ 第二轮（Core 结构规范） |
| **JSON 数据** | 文件为 `.json` | 语法有效性 + 必填字段模式校验 + 引用一致性 |
| **角色 Markdown** | 路径含 `人物/`，文件名含角色类型 | 必填字段完整性 + 与其他角色文件的关系一致性 |
| **设定 Markdown** | 路径含 `设定/` 或文件名含 `设定` | 结构完整性 + 世界观规则自洽性 |
| **大纲 Markdown** | 路径含 `剧情/` 或 `大纲/`，非 JSON | 章节编号连续性 + 卷章对应关系 |
| **写作配置 JSON** | 文件名含 `写作配置` | 模式值域合法性 + 分卷覆盖完整性 |

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

- `data/proofreading-checklist.json` 为机器规格（标点扫描项/结构校验项/JSON 模式与引用校验项/结构化 MD 校验项清单）：**首次调度本技能时完整读取一次**（同会话仅此一次），读取后按工作记忆执行，后续调度不重复读取
- 仅当规格数据变更（版本升级）或新会话首次调度时重新读取

## 执行模式

由上游技能调度时：跳过计划模式，直接按步骤执行。
用户直接触发时：进入计划模式（EnterPlanMode）。

---

## 执行步骤

### 步骤 0：接收待校验内容

接收上游技能传来的待写入内容及相关元数据。**根据内容类型，数据包结构不同**：

**正文文本类**：
```
{
  "type": "prose",
  "content": "{待校验的完整成品文本}",
  "file_path": "{目标写入路径，如 正文/第三章 初入江湖.md}",
  "source_skill": "{Core / NSFW / other}",
  "word_count": {字数},
  "chapter": "{当前章号/章名（如有）}",
  "volume": "{当前卷号（分卷多文件时必填，不分卷时为 null）}",
  "content_type": "{叙事文本 / 对话文本 / 描写文本 / NSFW}",
  "prose_mode": "{narrative / outline}",
  "exempted_norms": ["规范2", "规范2.2"]
}
```

| 字段 | 说明 |
|------|------|
| `prose_mode` | `"narrative"`（默认）→ 适用规范 1 段落节奏控制；`"outline"` → 适用规范 1.5 大纲类文本处理（免短段强制拆分，允许长段叙述和分号分隔） |

**JSON 数据类**：
```
{
  "type": "json",
  "content": "{JSON 字符串}",
  "file_path": "{目标写入路径，如 大纲/剧情/Prompt.md}",
  "source_skill": "{提示词增强 / other}",
  "expected_schema": "{Prompt / 项目信息 / 写作配置}"
}
```

> **协议来源**：`expected_schema` 与 `md_category` 的枚举统一定义于模板库 `templates/index.json` 的 `protocols`——`expected_schema` 通过 `aliases` 匹配对应 schema 文件（如 `项目信息` → `templates/project-info.schema.json`）。新增数据模式时在 index.json 注册即可，本技能不自行维护枚举。

**结构化 Markdown 类**：
```
{
  "type": "structured_md",
  "content": "{Markdown 文本}",
  "file_path": "{目标写入路径，如 大纲/人物/主要角色.md}",
  "source_skill": "{创建人物 / 设定编辑 / 剧情编辑 / other}",
  "md_category": "{角色 / 设定 / 大纲}"
}
```

### 步骤 1：正文文本校验 — 标点符号合规性（CPS.json）

**仅 `type = "prose"` 时执行。其他类型跳过此步骤。**

读取本技能同目录下的 `CPS.json`，以其中的标点符号定义、用法规则为校验依据，对成品文本进行全量标点扫描。**所有 E 级违规自动修正，所有 W 级违规在上下文可判定时自动修正**。

#### 1.1 扫描项目与自动修正规则

按 `data/proofreading-checklist.json` → `punctuation_checks` 逐项扫描（16 项：扫描项/依据来源/违规判定/自动修正动作以规格数据为准）。

#### 1.2 自动修正执行方式

对文本逐句扫描，发现违规后立即执行修正并记录修正日志：

```
🔧 标点自动修正日志：
  L3: "他推开门——" [破折号断开] → 已合并同行
  L7: "……等等" [省略号与"等"同用] → 已删省略号
  L12: "这是巧合还是有意安排？" [选择问句中位→逗号] → "？"改为"，"
  L15: "你知道吗？？？" [问号叠用超三个] → 缩减为"你知道吗？"
  L20: ""你好。"他说道。"好久不见。"" [引号嵌套反序] → 修正为'你好。'他说道。"好久不见。"
```

修正后立即对该句做复查确认修正成功。

#### 1.3 仅警告不修改的项（上下文无法判定时）

以下情况不做自动修正，仅在报告中标注供上游参考：

| 情形 | 原因 |
|------|------|
| 破折号与括号用途边界模糊 | 取决于作者意图（重要补充→破折号连读 / 普通注释→括号） |
| 分号/逗号在复杂多重复句中的选择 | 取决于作者对分句层次的判断 |
| 书名号与引号对"题"类短语的适用 | 取决于是否视为作品名 |

### 步骤 2：正文文本校验 — 段落/字句结构合规性（Core 规范）

**仅 `type = "prose"` 时执行。其他类型跳过此步骤。**

读取 `body/Core/SKILL.md` 中的写作规范，对成品文本进行结构性校验。**所有违规自动修正至合规状态**。

**校验前先读取步骤 0 输入数据包中的 `exempted_norms`**：如包含 `"规范2.2"` 则跳过 2.1.7（贴标签式性格描写）。`"规范2"`（人物外观间接描写）在 Proofreading 检查项中无直接对应子项，不产生跳过效果。2.1.8（参考源原文复刻）属规范 5，永不免除。2.1.6（破折号禁令）属规范 1.6，永不免除。其余规范照常过检。

#### 2.1 校验项与自动修正规则

检查项清单（8 项：id/名称/适用规范/触发条件/豁免规则）见 `data/proofreading-checklist.json` → `structure_checks`；判定与修正细则如下。

**`prose_mode` 感知**：校验前读取数据包中的 `prose_mode`。若为 `"outline"`，规范 1 项下的 2.1.1~2.1.5 全部跳过（类比规范 1.5 大纲类特殊处理），仅执行 2.1.6 和 2.1.7。

##### 2.1.1 段落长度超标（规范 1 — `prose_mode = "narrative"` 时执行）

**检验**：段落中完整自然句（以。！？… 收尾）超过 3 个 → 违规。

**自动修正**：在最佳拆分点将长段一分为二。
- 拆分点优先选择：句号之后 > 问号之后 > 叹号之后
- 如段落超过 5 个完整自然句 → 拆分为 2~3 段，每段 ≤3 句
- 拆分后检查：新段落的第一句是否仍能独立成意 → 如太短（≤5字）则并入下一段

```
修正前：
  她走进房间。窗帘紧拉着。光线昏暗。空气里浮着一层薄灰。她打开灯。然后看到了桌上的信。

修正后：
  她走进房间。窗帘紧拉着，光线昏暗，空气里浮着一层薄灰。
  
  她打开灯，然后看到了桌上的信。
```

##### 2.1.2 句末标点链接（规范 1）

**检验**：短句/超短句/长句之间出现"X{标点}Y{标点}"的链式结构 → 违规。

**自动修正路径**：
- 句号链接 → 合并为逗号，或拆段（优先合并）
- 问号链接 → **强制拆段**，每句独立成段（保留追问感）
- 叹号链接 → **强制拆段**，每句独立成段（保留冲击力）
- 省略号链接 → 强制拆段
- 混合标点链接（？！）→ 强制拆段

```
修正前："这是什么？这怎么可能呢？为什么会这样呢？"
修正后：
  "这是什么？
  
  这怎么可能呢？
  
  为什么会这样呢？"

修正前："他做到了！他真的做到了！"
修正后：
  "他做到了！
  
  他真的做到了！"
```

##### 2.1.3 超短句堆叠（规范 1）

**检验**：超短句（≤5字）成段时出现连续 ≥2 个句末标点 → 违规。

**自动修正**：将连续超短句改为逗号相连（同一意群）或各自换行（非同一意群）。

```
修正前："跑了。追。没追上。算了。"
修正后："跑了，追，没追上——算了。"

修正前："他停下。回头。皱眉。没说话。"
修正后：
  "他停下，
  
  回头，
  
  皱眉。
  
  没说话。"
```

##### 2.1.4 无必要短句断裂（规范 1）

**检验**：同一意群被句号无理切断（三问判定法：同一件事？无转折？每句不独立？全中 → 违规）。

**自动修正**：将句号改为逗号合并为一个完整句。

```
修正前："你累了。回去休息吧。"
修正后："你累了，回去休息吧。"

修正前："我知道。你不会来的。所以我没有等。"
修正后："我知道你不会来的——所以我没有等。"
```

##### 2.1.5 对话叙述被句号截断（规范 1 衍生）

**检验**：对话+叙述+对话的"三明治"结构中，中间叙述以句号结尾 → 违规。

**自动修正**：将句号改为逗号。

```
修正前："教宗大人。"丽丽没有收剑。"我只是想问一个问题。"
修正后："教宗大人。"丽丽没有收剑，"我只是想问一个问题。"
```

##### 2.1.6 破折号禁令（规范 1.6 — 全技能不免）

**检验**：文本中出现 `——`（U+2014 U+2014）且不属于声音延长等允许例外 → 违规。

**全技能不豁免**：此规则不进入 `exempted_norms` 列表，NSFW 返回的任何豁免声明对此规则无效。无论 `prose_mode` 为何值均强制执行。

**自动修正**：检测到 `——` 后判定上下文：
- 解释/转折/插入 → 替换为逗号
- 停顿/犹豫/中断 → 替换为省略号
- 强调 → 拆分为独立短句
- 声音延长（前后为感叹词如"啊""呜""嗯"、拟声词、或对话中拖长音）→ 保留
- 无法判定用途 → 默认替换为逗号，标记 `[⚠️ 需人工：破折号用途不明，已默认替换为逗号]`

```
修正前："他提到了那个人——他的父亲"
修正后："他提到了那个人，他的父亲"

修正前："我——我不知道"
修正后："我……我不知道"

修正前："救命啊——"声音在山谷里拖了很长
修正后：保留（声音延长，合法例外）
```

##### 2.1.7 贴标签式性格描写（规范 2.2）

**检验**：初登场文本中出现叙述者直接贴性格标签（"他是XX的人""她看起来XX"）→ 违规。

**自动修正**：将标签句改写为行为展现。如标签句无法确定对应的行为替代，标记 `[⚠️ 需人工: 性格标签→行为展现]` 向用户说明。

```
修正前："他是个莽撞冒失的人。"
修正后："他一头撞开门冲进来，才发现走错了教室——满屋子的人转头看他，他挠挠头，又撞上了门框。"
```

> 如上下文不足以推断合适的替代行为，标注 `[⚠️ 需人工]` 保留原文并提示用户。

##### 2.1.8 参考源原文复刻（规范 5）

**检验**：段落中出现与任何参考源（大纲/角色文件/设定文件/Prompt.md）中原文高度重合的描述 → 违规。

**自动修正**：无法自动修正（需要创作级替换）。标记 `[⚠️ 降重提醒: 以下段落与参考源原文高度重合，建议换感官/换语境重写]` 并列出重合段落和对应参考源出处，由上游技能最终处理。

```
⚠️ 降重提醒：
  段落 2："B罩杯，底盘紧致，乳峰挺翘"
  → 与角色文件（`主要角色.md` / `次要角色.md` / `龙套角色.md`）中「林婉儿」条目原文高度重合
  → 建议：换触觉/互动角度重写（如"他解开时指尖擦过一处——刚好盈满"）

⚠️ 降重提醒：
  段落 1："西城窄巷，天色将暗，巷口灯笼初亮，光线昏暗逼仄。"
  → 与 Prompt.md（第5章）提示词原文高度重合
  → 建议：换时间/天气/感官角度重写，提示词是写作指引不是正文底稿
```

#### 2.2 自动修正执行流程

```
待校验文本
    │
    ▼
逐段扫描 ──→ 发现违规段 → 执行对应修正规则 → 写出修正后文本
    │
    ▼
全篇修正完成 → 生成修正日志
```

#### 2.3 输出结构修正报告

```
📋 段落/字句结构修正报告

🔍 扫描范围：{N} 段落，{N} 自然句

🔧 自动修正：
  • L5：段落长度超标（5个完整句）→ 拆分为2段
  • L8："这是什么？这怎么可能呢？"问号链接 → 逐句拆段
  • L12："跑了。追。没追上。"超短句堆叠 → 逗号合并
  • L18：对话叙述句号截断 → 改逗号
  • L22：贴标签式性格 → 已改写为行为展现
  • L30：参考源复刻 → 已标记 [⚠️ 降重提醒]（需人工确认）

✅ 结构修正完成（{N}处修正）
```

---

### 步骤 3：JSON 文件校验

**仅 `type = "json"` 时执行。其他类型跳过此步骤。**

#### 3.1 JSON 语法有效性

- 解析 JSON 字符串 → 解析失败则标记具体错误行/位置并自动修复（补逗号、补引号、删尾逗号等常见错误）
- 修复后重新解析确认

#### 3.2 模式校验（按 expected_schema）

**校验依据**：`expected_schema` 通过模板库注册表 `templates/index.json`（相对技能根目录，按 `aliases` 匹配）定位对应 schema 文件。按 schema 的 `required` 必填字段、`enum` 枚举值、`type` 类型、`pattern` 格式逐项校验，违规按规则修正。**字段规则唯一来源是 schema 文件**——本技能不自行维护字段规则表。

**Prompt.md 模式**：

> Prompt.md 为 Markdown 文件，不进入 JSON 校验流程。提示词增强技能以 `type: "prose"` + `prose_mode: "outline"` 将其传入此技能，走步骤 1（CPS 标点）+ 步骤 2（Core 结构）校验后落盘。Prompt.md 中的提示词文本与大纲类文本共享规范 1.5 段落豁免，破折号禁令（规范 1.6）正常执行。

**模式校验项**（项目信息/写作配置：校验项/规则/违规处理）见 `data/proofreading-checklist.json` → `json_mode_checks`（含对应 schema 路径）。

#### 3.3 引用一致性校验

对 JSON 中的跨文件引用做一致性检查——检查项（3 项：检查项/校验方式/违规处理）见 `data/proofreading-checklist.json` → `json_reference_checks`。

#### 3.4 JSON 校验报告

```
📋 JSON 校验报告 — {文件路径}

🔍 语法检查：✅ 通过

🔧 模式校验：
  • last_updated → 已更新为 2026-06-14
  • prompts[2].foreshadowing → 已修正为 false
  • 章名"初入江湖"在第3条和第7条重复 → 已保留最新，移除旧条目

🔗 引用一致性：
  • Prompt.md 第5章引用的章名"夜探禁地"在大纲中不存在 → ⚠️ 需人工确认

✅ JSON 校验完成（{N}处修正，{M}处需确认）
```

---

### 步骤 4：结构化 Markdown 校验

**仅 `type = "structured_md"` 时执行。其他类型跳过此步骤。**

#### 4.0 纯文本内容合规校验（所有 md_category 共用）

> 结构化 MD 文件（角色/设定/大纲）中同样包含大量叙述性文本——角色简介、设定描述、剧情梗概等。这些文本的标点和结构合规性直接影响后续技能的读取准确性，必须经与正文相同的双轨校验。

在分类字段校验之前，先将结构化 MD 的**全部文本内容**视为 `type: "prose"` + `prose_mode: "outline"` 执行步骤 1（CPS.json 标点扫描）和步骤 2（Core 结构规范扫描）：

| 校验层 | 执行内容 | 说明 |
|--------|---------|------|
| 标点合规 | 全量 CPS.json 逐句扫描 | 与正文步骤 1 完全一致——标点错误同样影响参考源可读性 |
| 段落节奏 | 免检 | `prose_mode: "outline"` → 适用规范 1.5，允许长段叙述、分号分隔 |
| 间接描写 | 规范 2 / 2.2（贴标签式描写、性格间接化） | **角色文件豁免**——角色文件本身就是参考数据源，允许直接陈述特征；设定和大纲文件中若包含示例描写语句仍需遵守 |
| 降重率 | 规范 5（禁止原文复刻） | 全类别执行——结构化 MD 中的描述语句不得大段照搬其他参考源原文 |

**修正方式**：标点违规自动修正后写回文本；结构违规自动修正；需人工项标记后阻断落盘。

#### 4.1 角色 Markdown 分类校验（`md_category = "角色"`，schema：`templates/character.schema.json`）

校验项（5 项：校验项/规则/违规处理）见 `data/proofreading-checklist.json` → `md_checks.character`。

#### 4.2 设定 Markdown 校验（`md_category = "设定"`，schema：`templates/settings.schema.json`）

校验项（3 项）见 `data/proofreading-checklist.json` → `md_checks.settings`。

#### 4.3 大纲 Markdown 校验（`md_category = "大纲"`，schema：`templates/plot.schema.json`）

校验项（4 项）见 `data/proofreading-checklist.json` → `md_checks.plot`。

#### 4.4 结构化 MD 校验报告

```
📋 结构化 MD 校验报告 — {文件路径}

🔍 文件类别：角色 / 主要角色

🔧 字段完整性：
  • "林婉儿"缺失年龄字段 → ⚠️ 已标记
  • "张三"与"李四"的关系标注为"好友"，但李四文件中未提及张三 → ⚠️ 已标记单向关系

✅ 结构化 MD 校验完成（{N}处标记）
```

---

### 步骤 5：复检确认

所有校验轮次完成后，对修正后的内容再做一次快速扫描，确认所有违规已消除：

1. **正文文本**：标点逐句检查 + 结构逐段检查，确认无新引入错误
2. **JSON**：重新解析确认语法有效 + 模式字段完整
3. **结构化 MD**：重新确认标记项已正确标注；确认 4.0 纯文本校验的修正未引入新的标点/结构违规

如发现修正引入的新问题 → 对该处再次修正后重检。
复检通过则进入步骤 6。

### 步骤 6：落盘写入

所有校验通过后，**由此技能将修正后的内容写入 `file_path` 指定的目标路径**。上游技能不持有文件写入权限——它们只是内容生产者，此技能是唯一的落盘执行者。

**写入流程**：

1. 确认目标目录存在（如 `正文/`、`正文/卷{N}/`、`大纲/剧情/` 等）→ 不存在则自动创建
2. 将修正后的最终内容写入 `file_path`
3. 输出校验摘要确认落盘成功：

```
✅ 成品输出校验完成 → 已落盘

📁 {file_path}
📊 校验摘要：
  • 文件类型：{正文文本 / JSON / 结构化MD}
  • 标点修正：{N} 处（仅正文文本）
  • 结构修正：{N} 处（仅正文文本）
  • JSON 修正：{N} 处（仅 JSON）
  • 字段/引用标记：{N} 处（JSON + 结构化MD）
  ⚠️ 需人工确认：{N} 项

━━━━━━━━━━━━━━━━━━━━
{落盘内容全文}
━━━━━━━━━━━━━━━━━━━━
```

**⚠️ 落盘前阻断条件**：如存在 `⚠️ 需人工确认` 项（降重提醒、引用不一致等），在落盘前向用户展示标记项并询问是否继续写入。用户确认后执行落盘；用户拒绝则退回上游技能修改。

---

## 与上游技能的协作

```
上游技能处理完毕，准备写入文件
  │  携带：{type, content, file_path, ...}
  │  ⚠️ 上游技能不自行写入——仅传递数据包
  ▼
成品输出校验（此技能）—— 唯一落盘入口
    │  步骤 0：接收 → 识别文件类型 → 路由校验策略
    │
    ├── type = "prose" ──→ 第一轮：CPS.json 标点扫描 → 自动修正 → 复检
    │                └── 第二轮：Core 规范结构扫描 → 跳过 exempted_norms → 自动修正 → 复检
    │
    ├── type = "json" ──→ 第三步：语法有效性 + 模式校验 + 引用一致性
    │
    ├── type = "structured_md" ──→ 第四步：字段完整性 + 跨文件引用有效性
    │
    ├── 步骤 5：复检确认
    │
    └── 步骤 6：落盘写入 → 输出校验摘要
            │
            ├── 无阻断项 → 直接写入 file_path
            └── 有 ⚠️ 需人工确认 → 询问用户 → 确认后写入 / 拒绝则退回上游
```

**关键原则**：
- 此技能是系统的**唯一落盘入口**——没有任何技能可以 bypass 它直接写文件
- 此技能自闭环——所有可自动修正的违规在此技能内部修正完毕，不退回上游
- 不可自动修正的项（降重提醒、引用不一致等）标记为 `⚠️ 需人工确认`，阻断落盘直到用户确认
- 上游技能是**内容生产者**，此技能是**校验者 + 落盘执行者**——职责严格分离

**NSFW 校验边界**：
- NSFW 技能负责：档位色色值合规、白描篇幅控制、精神思考比例、NSFW 降重率
- 此技能负责：标点合规（CPS.json）+ Core 通用结构（段落节奏/对话增强/风景穿插/通用降重率）+ JSON/结构化MD 完整性
- 规范 2/2.2 已由 NSFW 豁免并通过 `exempted_norms` 传递——此技能跳过

---

## 注意事项

- **硬约束：不经此技能，不得落盘**。任何技能绕过此技能直接将内容写入文件系统 = 流程违规。唯一的例外是此技能自身执行校验后的落盘操作
- 文件类型判定优先看 `type` 字段，其次看 `file_path` 扩展名
- 正文文本的两轮校验独立运行，不可跳过任何一轮
- JSON 校验中语法错误自动修复，模式违规自动修正，引用不一致标记需人工
- 结构化 MD 校验中字段缺失仅标记不自动填充（数据源在上游技能）
- 标点修正仅改标点，不改词汇；结构修正可改段落/句子边界，不改叙事内容
- 修正后必须复检一次确认无新问题
- CPS.json 是本技能同目录下的标点权威数据源
- 如输入数据包中 `exempted_norms` 非空，正文结构校验跳过其中列出的规范项；标点校验和 JSON/MD校验不受豁免影响
- **NSFW 校验边界**：此技能不负责 NSFW 专项校验——NSFW 技能步骤 4 已自行完成
- 分卷多文件项目：`volume` 字段用于跨文件引用校验中的卷号定位
- 始终以 Markdown 格式输出校验报告和最终成品
- 所有修正动作均记录日志，确保可追溯
- **不再仅校验正文**：任何写入 `正文/`、`番外/`、`大纲/`、`outline/` 目录及其子目录的文件，均纳入校验范围

