# S0 素材阶段 · 阶段守护与强制推进（防「无限 S0」）

> **版本**：2.1.2
> **背景**：WorkBuddy 实测复盘（2026-04-13）— 素材已超额达标仍长期停留在 S0，未进入 S1/S2/S3。  
> **受众**：`fbs-team-lead`、主持 S0 的 Agent

---

## 1. 问题定义

S0 的使命是 **「素材够用即可」**，不是 **「素材完美」**。若缺少强制退出条件，Agent 容易进入：

「用户提细化要求 → 立即执行 → 用户说继续 → 仍停在 S0」的循环，**永远不进入写作**。

---

## 2. S0 强制退出条件（满足任一即须提议推进）

team-lead **必须**在下列时机输出**阶段推进提议**（人话，勿堆内部代号），并更新 `.fbs/esm-state.md` / 本节与 `chapter-status` 中的阶段备注：

| # | 条件 | 对用户说什么（示例） |
|---|------|---------------------|
| A | 素材条数 ≥ 项目约定的「最低充分线」（如赛道数×3，或 `project-config` / 用户已确认的目标） | 「素材已达标（N 条），建议进入【需求确认 / 大纲】。细化可在写作中同步完善。」 |
| B | 用户**连续 2 次**说「继续」且上一轮 S0 动作已收尾（无未完成子任务） | 「继续收到。素材侧已可收束，是否进入下一阶段？」 |
| C | 同一阶段内用户已**第 3 次**在同一轮补充中追加「再均衡 / 再唯一」类要求，且当前条数已 ≥ 最低充分线 | 「已记录您的质量要求；建议先定大纲与章节权重，写作中再落细。」 |
| D | 调用外部技能（如 `wechat-article-search`）**完成一批**入库后，条数从「严重不足」变为「达到或超过充分线」 | 立即做一次 **S0 退出评估**（数条数 + 看赛道覆盖），达标则提议进入 S1 |

**原则**：达标后**禁止**无期限留在 S0；用户若坚持再补，须**显式确认**「继续留在 S0」并写入 `session-resume-brief` 或 `quality-constraints.md` 备注。

### 2.1 素材搜集预算与增量登记（`materialGatherBudget`）

- **达标后**（条数 ≥ 充分线或 team-lead 已判定可推进）：新增素材须走 **增量登记**（记缺口编号、一行摘要），禁止无登记的同主题大规模重检；见 `search-policy.json` → `materialGatherBudget`。
- **笔记体量**：`project-config.materialGatherNotesMaxChars` 可对 `material-inventory.md` 累计字符设软上限；超限为 **Warning**，扩预算须用户确认。
- **校验**：`node scripts/writing-contract-gate.mjs --book-root <本书根>`（可选 `--strict` 用于 CI）。

---

## 3. 「继续」的语义（与 SKILL 意图表一致）

| 用户表述 | 当前阶段任务状态 | team-lead 行为 |
|----------|------------------|----------------|
| 继续 / 接着 | **S0 且已达标** | **推进**：提议 S1，给出「确认读者画像 → 大纲 → 先写第一章」等 **最多 3 步** |
| 继续 | **S0 且未达标** | 继续 S0，并**明确还差多少条/哪些赛道** |
| 继续写 / 接着写 | **S3 及以后** | 读 `workbuddy-resume.json` / `chapter-status`，接写作 |
| 继续完成未完成的任务 | 若 S0 已达标 | **不得**默认理解为「继续补素材」；先核对是否应转阶段 |

输出**阶段转换**时可用简短分隔，例如：

```text
── 阶段推进 ──
素材收集（S0）已满足当前约定目标 → 建议进入需求确认与大纲（S1/S2）。
```

---

## 4. S0 中用户新增「质量要求」时（防无限细化）

若用户在 **S0** 提出「每赛道不少于三条」「全局案例唯一」等**合理但可延后**的要求：

1. **写入** `.fbs/quality-constraints.md`（由 `init-fbs-multiagent-artifacts` 生成模板；无则 team-lead 创建）。
2. **口头确认**：「已记录为写作阶段约束，S0 以『够用』为准；是否先进入大纲？」
3. **禁止**：为满足该要求在 S0 **无限轮**补素材；除非用户明确要求留在 S0。

---

## 5. 素材唯一性（入库约定，P1）

向 `material-library.md`（或项目约定的素材库路径）**追加**新条目前：

- 扫一眼是否已有**同一标题/同一 URL** 出现在**其他赛道**；若重复，标记「待拆分 / 待替换」或合并引用，**避免**攒到上百条后再做大审计。

（自动化校验可后续接脚本；当前以 **team-lead 入库前自检** 为准。）

---

## 6. 工作区边界（防读错项目）

- **默认只读写当前 `bookRoot`**（用户打开的书稿根）。
- **禁止**在无用户明确要求时，去 `read_file` **兄弟目录**下其他书籍/白皮书工程（例如同盘其他 `*/deliverables/`）。
- 若需参考范例，应使用用户**粘贴路径**或**明确说「参考某文件」**后再读。

---

## 7. 与 `esm-state.md`、`chapter-status` 的同步

阶段切换时：

1. 更新 `.fbs/esm-state.md` 中「当前阶段」。
2. 在 `.fbs/chapter-status.md` 顶部 **阶段进度** 区（若已初始化）更新「当前阶段」一行，便于恢复会话时一眼看到**卡在 S0 还是已进入 S2**。

---

返回：[`SKILL.md`](../../SKILL.md) · [`intake-and-routing.md`](./intake-and-routing.md)
