sn-ppt-story · git:20260917.b47f4e7 · 2026-09-17 · sha256 1c87ccd30f629280

sn-ppt-story git:20260917.b47f4e7A

Immutable. This exact content is served forever at /api/v1/blob/1c87ccd30f629280.

---
name: sn-ppt-story
description: 当前 PPT 任务已由 sn-ppt-entry 建好 DECK_DIR(task_pack.json 与 info_pack.json 已写入)后,必须由本 skill 将 query、全部用户材料与已完成 Research 编排为唯一可编辑的 outline.md 时使用。本 skill 是 entry → 出口(standard / dazzle / creative)之间的强制中间环节:不允许执行 Agent 跳过本 skill 直接依据 task_pack / info_pack 即兴编写大纲,不允许出口 skill 代写或改写大纲;前置产物缺失时停止并返回 sn-ppt-entry 补齐,不得自行补做研究。
metadata:
  project: SenseNova-Skills
  tier: 1
  category: scene
  user_visible: false
triggers:
  - "sn-ppt-story"
  - "生成大纲"
  - "修改大纲"
  - "storyline"
  - "outline.md"
---

# sn-ppt-story

把 query、全部用户材料和已经完成的研究综合成一份清楚、完整、可直接修改的
`outline.md`。Story 统一管理内容理解和页面叙事,不生成页面,不自行开展外部研究。

## 输入边界

只接受 Entry 传入的绝对 `DECK_DIR`。开始前读取:

- `<DECK_DIR>/task_pack.json`
- `<DECK_DIR>/info_pack.json`
- `info_pack.raw_documents` 指向的完整 `raw_documents.json`(存在时)
- `info_pack.research_report` 指向的 Research 主报告(存在时)
- 用户明确要求读取的其他源文件
- 当前 `<DECK_DIR>/outline.md`(修改或继续任务时)

用户材料是事实来源,query 是任务目标,Research 是外部证据补充。三者冲突时明确区分
“用户要求”“材料事实”“外部证据”和“推断”,不得用顺畅文案掩盖冲突。

`task_pack.state.research.required == true` 时,Story 开始前必须已有
`info_pack.research_report` 指向的可读报告。缺失时停止并返回 Entry 完成
`task_pack.state.research.executor` 指定的证据路径;不得先写 outline 再补研究。Standard
默认读取 Entry 写入的定向搜索摘要,Deep 默认读取 `sn-deep-research` 的完整报告,Story
不把 Standard 自动升级为 Deep。

## 输出和状态

- 唯一用户叙事文件:`<DECK_DIR>/outline.md`
- 不创建 `outline_v2.md`、story spec、页面 JSON 或另一份并行大纲。
- 开始时把 `task_pack.state.current_stage` 更新为 `story`,状态更新为 `storytelling`。
- 完成时把 `story` 加入 `completed_stages`,把 outline 绝对路径写入
  `state.artifacts.outline`,把 `task_pack.params.page_count` 同步为当前连续页数,状态更新为
  `story_ready`。
- 修改现有大纲时覆盖同一文件,并清晰标记哪些下游页面需要重新生产;不要清除
  Research 和材料解析的完成状态。

## 工作方法

### 1. 完整理解

阅读与任务相关的全部内容,而不是只看标题、摘要或开头。材料较长时可以分段读取,
但最终综合必须覆盖:

- 可以直接使用的事实、数据、案例、定义和结论;
- Markdown/DOCX 表格及文档内图片所承载的信息;
- 多份材料的重复、冲突、时效和口径差异;
- 受众真正需要做出的理解、判断或行动;
- 仍然缺少证据、只能作为推断或需要弱化表达的内容。

`document_digest` 是索引和辅助,不替代原文。决定性数字、专有名词、时间、单位和引用
必须回到原材料或 Research 主报告核对。

### 2. 先确定整套 Story

在排页前明确:

1. 谁在什么场景下向谁表达;
2. 演示希望受众理解、相信或决定什么;
3. 全套唯一的核心观点;
4. 采用什么论证路径,为什么按这个顺序;
5. 最后一页应留下什么结论或行动方向。

不要把材料目录机械改成页面目录。内容应形成连续推进,例如“建立背景 -> 暴露关键矛盾
-> 给出判断框架 -> 用证据验证 -> 落到方案或行动”,具体结构由任务决定。

### 3. 再规划逐页逻辑

每页只承担一个主要任务,并明确:

- 页面标题;
- 受众看完必须记住的完整结论;
- 支撑结论的事实、数据、案例和自然语言来源;
- 它如何承接上一页并推动下一页;
- 信息之间的关系和建议的表达方式。

页面表达只描述用户能理解的意图,例如“用统一维度对比三种方案”或“用趋势图说明拐点”。
不要写像素、坐标、HTML 节点、组件 ID、内部页型代码或出口实现细节。

### 4. 做三轮 Story 自审

这不是模型评测,也不产生测试文件。写入前在当前上下文中连续复读三次:

1. **证据审查**:决定性结论是否有材料或 Research 支持,事实/推断/待确认是否清楚。
2. **逻辑审查**:是否存在结论先于依据、页面重复、因果跳跃、前后矛盾或最后没有落点。
3. **演示审查**:每页是否只有一个主要任务,页数是否合理,标题和结论是否让用户一眼
   看懂,整体思路是否能独立概括全套。

发现问题直接改 `outline.md` 草稿,不生成审查报告。

## `outline.md` 格式

只用普通 Markdown 和少量标题层级:

```markdown
# 演示标题

## 整体思路

说明受众、场景、目标、核心观点、叙事路径及最终落点。

## 第 1 页:页面标题

### 这一页要说明什么

一句完整、明确、可验证的结论。

### 内容与依据

- 需要呈现的事实、数据、论点或案例。
- 来源用自然语言说明,例如“来自 planning_plan.md 的 Presentation Skill 部分”。
- 只能推断或仍缺证据时明确写“推断”或“待补充”。

### 前后关系

说明本页如何承接上一页并推动下一页;封面可说明它如何设定问题。

### 页面表达

说明信息关系、视觉重点和建议表达方式。

## 第 2 页:页面标题
...
```

硬约束:

- `## 第 N 页` 的顺序就是最终页序,编号连续。
- 开头必须有“整体思路”,单独阅读它就能明白全局逻辑。
- 每页必须有“这一页要说明什么”,不能只写宽泛主题。
- 用户指定页数时遵守;材料明显无法支撑时先说明,不用空页凑数。
- 不自动添加用户未要求且叙事不需要的目录、过渡、行动或结束页。
- 不把设计丰富度误写成 Story 复杂度;Story 对所有出口相同。

## 新建与修改

### 新建

1. 读取全部输入和 Research。
2. 确定整体 Story。
3. 完成逐页编排。
4. 做三轮自审。
5. 写入唯一 `outline.md` 并更新 `task_pack.json`。
6. 返回路径、页数和一行叙事摘要。

### 修改

磁盘上的 `outline.md` 是唯一基线:

- 先完整读取,再修改;
- 局部要求只改相关页面及保持逻辑连续所必需的相邻内容;
- 用户调换页序后保留该顺序,只修正承接关系;
- 用户删除页面或观点后,不用同义措辞补回;
- 用户明确写下的标题、结论和原文尽量原样保留;
- 新事实需要 Research 时返回 Entry,Research 完成后再改;
- 新证据与用户修改冲突时保留磁盘版本,报告冲突并等待决定,不擅自覆盖。

## 与出口的契约

所有出口必须在开始和恢复时重新读取当前 `outline.md`。它决定:

- 整体目标、受众、核心观点和叙事路径;
- 最终页数、页序和页面标题;
- 每页角色、核心结论、必须出现的事实与内容关系。

出口可以补逐字文案、视觉系统、素材、版式、动画和实现细节,但不能重新研究、另写内容
大纲、恢复用户删除的内容或改变核心结论。出口发现事实不足时应停止相关页面,返回
Entry/Story 说明缺口。

## 不得做

- 不调用外部模型客户端或第二套 API。
- 不直接搜索网页;外部证据由 Entry 在 Story 之前完成:Standard 使用定向普通搜索,
  Deep 使用 `sn-deep-research`。
- 不生成 HTML、图片、渲染图或 PPTX。
- 不创建细碎跨 Skill spec。
- 不把未经支持的数字写成事实。
- 不把 Story 变成某个出口的视觉模板选择器。