# S0 节点

> 来源：section-3-workflow.full.md，自动分节  
> **阶段守护（防无限停在 S0）**：team-lead 必读 [`../s0-material-phase-guard.md`](../s0-material-phase-guard.md)。

## S0 前置条件检查

> **位置**：S1 之前，用户首次描述"书"或"我想写什么"
> **触发**：用户说"写书"或"**开始写书**"，触发 S0 原料激活；用户说"跳过原料"则"直接写稿"可在确认后跳过
> **执行规则**：S0 会自动执行联网查证、激活原料库、完成书稿路径选择，在 S0 到 S6 全流程中只执行一次

### 快速起步预检（P0 强制）
**说明**：三条路径选择后，书稿类型与目标字数将自动决定走 S0、跳过 S0 还是简化 S0（S0 仅初始化简要路径）
```
S0 快速起步预检步骤：
1. 确认用户的书稿目标，并在记录中记录 "[书稿目标激活]"
2. 根据目标字数与书型自动选择路径，输出"**路径**：[路径名称]"
3. 检查联网查证状态，确认是否需要 S0 联网查证
4. 书稿若有历史对话或过去的书稿版本，需要告知用户："[书稿状态确认]：确认后继续"，等待确认后开始执行 S0 初始化步骤

**快速起步三条路径**：
- 新书稿·无原料：触发完整 S0 → 联网查证 → 原料库初始化
- 新书稿·有原料：触发 S0 原料激活 → 跳过联网查证 → 原料库激活
- 继续写稿：触发 S0 状态恢复 → 读取 .fbs/ 工件 → 从上次断点继续

```

**三条路径说明**：
- 新书稿/无原料时，按 S0 完整流程（S0-A → S0-E）
- 新书稿/有原料：可跳过联网查证，直接激活原料库
- 继续写稿/回来继续：S0 状态恢复，不重新执行联网查证

### 写作轨道选择

#### 写作轨道说明
> 写作轨道在 S0 阶段选定，决定后续工作流的密度与节点配置

```
写作轨道 → 根据书稿目标自动匹配推荐轨道：
书稿：{书名} / {目标字数} / {书稿类型}
→ 推荐 Fast Track（快速轨道）
   → 适合：快速交付报告、中短篇叙事
   → S2 目录简化，一轮完成
   → Chapter Brief 只需关键点
   → S2 定稿与 S2.5 合并执行
   → 字符数 / 章节数 <30 章以下 / 不含大规模
   → 轨道标记：F（快速）

→ 适合大规模（Quality Track·精品轨道）
   → 适合：深度报告、大规模书稿
   → Chapter Brief 详细规格
   → S2 定稿充分讨论
   → 原料丰富深度 ≥ 3 层 / 字数 超10 万以上 / 不含
   → 轨道标记：Q（精品轨道）

→ 规模选择：
   → 字数 超10 万字 推荐 M3
   → 字数 <30 万以下 推荐 M2
   → 30~10 万字 推荐 M1 或 M2（视章节密度）
→ 等待用户确认轨道选择，确认后写入 project-config.json
```

**写入字段** ：`.fbs/project-config.json` 的 `"writingTrack": "fast"/"quality"`：
**说明**：轨道选定后，工作流密度自动匹配，后续跳级/合并节点规则见 `project-config.json` 字段说明

| 配置 | 快速轨道（Fast） | 精品轨道（Quality·深度） |
|------|----------------|------------------------|
| 书稿类型 | 中短篇/报告/行研 | 深度专著/长篇叙事 |
| Chapter Brief | 只需关键点 | 完整规格 |
| S2 定稿节点 | 一轮快速完成 | 充分讨论多版本 |
| 原料深度 | 浅层（原料简要） | 深层（原料丰富） |
| 100万字项目 | 不推荐 | 推荐 |

---

**S0 = 原料激活 + 联网查证 + 路径选择**

```
S0 激活流程（含联网查证 + 原料激活 5-10 分钟）：
  调用 工具（P0，联网查证如宿主支持 S0 联网则开启 WebSearch 查证）
  调用 S0-A 书稿激活（告知用户进入 S0，输出激活摘要）
  调用 S0-B 原料库激活
  调用 S0-C 联网查证（自动执行，若联网不可用则降级为模型知识查证）

> **v1.8.1 规范强化（P1-4）**：S0 联网至少 3 轮有效查证：成功查证 + 来源记录 + 摘要生成记录；禁止在 S0 跳过联网查证，即使联网失败也需要记录查证尝试结果，记录宿主环境的联网状态

  调用 S0-D 原料充分性评估
  调用 完成汇总输出
  调用 输出激活摘要（格式：*日期：YYYY年MM月DD日*，生成轨道）
  调用 路径选择
```

---

### S0-A 书稿激活（原料盘点入口）

> **S0-A 作用**：书稿激活是 S0 的第一步，读取用户提供的原料、历史对话、已有书稿片段，生成书稿激活摘要

**激活摘要输出格式**：
```markdown
→ S0 激活摘要

书稿名称：{书名/暂定名}
书稿类型：{书型标签}
目标读者：{读者画像简述}
预计字数：{N} 万字 / {M} 章节
原料状态：{已有原料数量/类型概述}
联网查证：{开启/关闭/降级}
写作轨道：{Fast/Quality}

→ 进入 S0-Init 7锁文件初始化
```

---

### S0-Init 7锁文件初始化（v2.1.1 新增，P0）

> **触发条件**：S0-A 完成后立即执行，首次写作或新书稿必做；续写已存在文件时检查完整性。
> **目的**：建立全书级「钉住」体系，防止长上下文漂移。

**必须创建的 7 个锚点文件**：

| 文件 | 路径 | 初始化内容 | 注入时机 |
|------|------|-----------|---------|
| `author-meta.md` | `.fbs/author-meta.md` | 核心主张（1句）+ 目标读者（1句）+ 作者声音标签 + 目标字数 | 每次会话启动 + Chapter Brief |
| `术语锁定记录.md` | `.fbs/术语锁定记录.md` | 5–10 个核心术语：标准写法 + 禁用变体 | 每次 Chapter Brief |
| `commitments.md` | `.fbs/commitments.md` | 空承诺注册表（待 ch00 成文后填入） | S3 成文前 + S4 质检 |
| `character-registry.md` | `.fbs/character-registry.md` | 预制 3–5 个案例人物：姓名+背景+适用场景 | S3 成文前（查重） |
| `track-linkage.md` | `.fbs/track-linkage.md` | 章节/赛道联动矩阵（S1 大纲后生成完整版） | S1 大纲阶段 + S3 成文前 |
| `project-config.json` | `.fbs/project-config.json` | 目标字数 `targetWordCount` 字段必填 | S4 字数完成度门禁 |
| `叙事策略.md` | `.fbs/叙事策略.md` | 各章/赛道的叙事策略分配（S1 大纲阶段填入） | S3 成文前 |

**初始化模板（`commitments.md`）**：
```markdown
# 全书承诺注册表

> 更新时机：ch00 成文后首批注册；每章成文后更新兑现状态；S4 质检时全量核对

| 承诺 | 出处 | 兑现章节 | 兑现状态 |
|------|------|---------|---------|
| （待 ch00 成文后填入） | | | |

S4 承诺兑现率 = 已兑现数 / 总承诺数 × 100%（阈值：100%）
```

**初始化模板（`character-registry.md`）**：
```markdown
# 案例人物注册表

> 用途：防止跨章案例人物同名冲突
> 命名规范：禁止「小X/大X/老X」泛化命名，改为带姓氏的半具体名

| 姓名 | 首次出现 | 章节/赛道 | 背景 | 状态 |
|------|---------|----------|------|------|
| （S0 预制人物或 S3 首次出现时注册） | | | | |
```

**S0-Init 完成条件**：以上文件均已创建（可为空模板），`esm-state.md` 更新 `s0InitDone: true`。

> **长上下文钉住机制**：S0-Init 完成后，AI 须将以下锚点写入宿主系统记忆（create）：
> - `FBS-{书名}-主题锁`：核心主张 + 目标读者 + 作者声音
> - `FBS-{书名}-术语锁`：5–10 个核心术语标准写法
> - `FBS-{书名}-字数目标`：目标字数 + 0%（当前完成度）
> 
> 每次续写会话启动时，读取这些系统记忆并与 `.fbs/` 文件真值对照，不一致时以文件真值为准并更新记忆。

---

### S0-B 原料库激活

> **S0-B 作用**：将用户提供的所有原料（文档、访谈、数据、网页等）注册到原料库

**原料库格式**：写入 `.fbs/material-library.md`
```markdown
## 原料清单

| 序号 | 原料标题 | 类型 | 字数/规模 | 来源 | 与书稿关联章节 |
|------|---------|------|----------|------|--------------|
| 1 | {原料标题} | 文章/访谈/数据 | {N}字 | {来源URL或文件名} | {关联章节} |
```

---

### S0-C 联网查证（自动执行）

> **S0-C 作用**：基于书稿主题和章节初步规划，执行联网查证，收集核心参考资料
> **宿主降级规则**：宿主不支持联网时，自动降级为模型知识查证，并记录降级原因

**联网查证执行步骤**：
```
S0-C 联网查证执行步骤：

Step 1：根据书稿主题生成查证 query 列表（建议 5~10 个）
Step 2：依次执行查证，记录每条结果到 search-ledger.jsonl
  格式：{timestamp, query, url, ok, resultSummary, chapterId, depthLevel}
Step 3：汇总查证结果，标注哪些章节已有充分参考资料
  - 综合评估 ok=true 的查证 → 标记为原料充足，对应章节 {N}/{M} 章获得参考资料
  - 原料不足的章节列出，告知用户补充原料或确认接受模型知识补充
  - 超出查证有效期（数据过期）的结果标记为 过期

Step 4：输出查证摘要
  - 记录 S0 查证时间戳，{N}/{M} 个主题查证，覆盖{N}/{M} 章
  - 写入 .fbs/project-config.json 字段 "s0TimestampBaseline"

Step 5：若所有查证结果 ok=false 均为 = 模型知识替代
  ⚠️ 写入 S0 降级标记，宿主不支持联网查证，100% 使用模型知识
   说明：宿主联网 → 推荐开启 → RSS 订阅查证 → 已全部降级为模型知识查证
  写入 .fbs/project-config.json 字段 "s0SearchStatus": "all-failed-model-knowledge-only"
```

**说明**：
- 联网查证失败不影响后续流程，但需要如实记录降级状态
- 降级后写稿质量风险由用户确认，不得隐瞒降级情况
- 模型知识替代联网查证的结果，需要在 S0 联网查证报告中标注

### S0-E 原料库充分性评估

> **触发条件**：**M1/M2/M3 规模超过20章以上 P0 强制**，5~10 章以下则 P1 强制
> **说明**：S0 充分性评估在 S0 阶段完成，不影响 S1 后续推进，但 S2.5 节点确认时将再次检查

#### 充分性评估输出格式
S0 充分性评估完成后，输出原料充分性报告，格式如下：

```markdown
## ⚡ 原料充分性报告·供参考 S3 写稿前对照

**已录入原料**：{N}条 / {M}章
**充分性目标** ≥ 1000 字/章，建议 3类 ≥ 3个多元来源/章节
**充分性分布**：{A}章充足/{B}章不足/{C}章未匹配

### ⚡ 原料充分性一览表（供 S3 阶段对照）
| 章节范围 | 已匹配原料 | 来源多元度 | 原料充分性 | 备注建议 |
|---------|---------|------------|---------|---------|
| {章节范围} | 充足 | {N}类 | {充足/待补充} | {充足/待补充/原料类型} |
| {章节范围} | 不足 | {N}类 | {不足} | {建议补充类型} |

### ⚡ 待查找清单（S3 写稿前）
- [ ] {待查找原料1} 来源建议：{关键词 query / 推荐数据库/可搜索平台与来源}
- [ ] {待查找原料2} 来源建议：…

> **充分性说明**：以上仅供[参考]，具体来源由用户补充 ≥ 确认后再进入写稿
```

#### 原料充分性阈值
根据 `search-policy.json` 的 `materialSufficiency` 标准（单位统一为素材条数 `items`）：

| 书稿规模 | 推荐原料条数 | 严重不足阈值 |
|---------|-------------|--------------|
| 5~10万字 | ≥30条 | <10条 |
| 10~30万字 | ≥80条 | <25条 |
| 30~100万字 | ≥200条 | <60条 |
| >100万字 | ≥500条 | <150条 |


---
