# Course Material Intake

> 课程材料盘点与证据化摄取。扫描本地课程目录、飞书文档或 Wiki、飞书妙记转录、PDF、Word、Markdown、音视频转写和已有课程稿，生成可追溯的 materials.jsonl 与材料缺口报告。Use when the user says 盘点课程材料、读取课程素材、整理访谈文件、建立材料清单、检查哪些资料能用，或 Course Producer 进入 intake 阶段。

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

---


# 课程材料摄取

只建立材料证据索引与可读性缺口，不在本阶段确定课程定位、课纲或正文。

## 输入与工具路由

读取用户给出的项目目录、文件和 URL。优先复用已安装工具：

- PDF、DOCX、表格、音视频分别调用对应文件 Skill；不要自建通用解析器。
- PDF、EPUB、MOBI、Markdown 或纯文本书稿仍复用现有文件 Skill；不要为书籍新增解析器。
- 飞书 Wiki 先解析真实对象，再用 `lark-doc` / `lark-drive` 读取。
- 飞书妙记用 `lark-minutes` 获取 transcript；摘要和关键词只用于导航。
- 无法读取的来源保留原路径或 URL，状态写为 `blocked`，记录真实错误，不猜内容。

## 执行流程

1. 确认课程项目已经用 `tools/course-project.mjs init` 初始化；未初始化则先初始化。
2. 递归盘点用户明确放入范围的文件，排除 `.course-producer/`、版本库、缓存和构建产物。
3. 对书籍材料按下游课程用途选择最低够用的 `processing_mode`；用户明确指定模式时优先：
   - `notes`：按章节整理概念、论证、案例与行动项，保留页码或章节位置；课程需要系统取证时默认使用；
   - `summary`：只判断全书相关性与覆盖范围，用于材料初筛，登记为 `partial`，不能冒充完整证据；
   - `quotes`：只提取教学真正需要的少量短引文，逐条保留页码、章节和版本；
   - `study`：在章节笔记之外生成自测问题，帮助讲师理解材料；问题与模型答案属于派生内容，不是来源事实。
4. 为每个来源生成稳定 `source_id`，计算本地文件 SHA-256；远程对象优先记录对象 token、版本或更新时间，无法取得时记录 `fingerprint: null`。
5. 识别同一材料的版本与派生关系。只有文件内容、更新时间、明确版本声明或用户决定能证明权威性；不能因为文件名含“最终版”就自动设为当前版本。为每组相关材料记录 `source_group`、`version_relation` 与 `authority_status`，证据不足时使用 `candidate` 或 `conflict`。
6. 读取可读正文并分类，分类只能是：
   - `execution_instruction`：给 Agent 的执行约束，不进入学员正文；
   - `course_material`：观点、方法、案例、数据、故事、原话和教学决策；
   - `meeting_chatter`：问候、排期、掉线和无关闲聊；
   - `unreadable`：缺权限、损坏、格式不支持或内容缺失。
7. 判断每个来源可用于定位、访谈、知识萃取、课纲、逐字稿、审校或海报中的哪些阶段。
8. 把一行一个 JSON 对象追加或幂等更新到 `.course-producer/materials.jsonl`。同一 `source_id + fingerprint` 不重复写入。
9. 在 `.course-producer/artifacts/material-gap-report.md` 汇总可用材料、版本冲突、重复、不可读项和后续阶段真正缺少的证据；单独列出每组材料的当前权威候选与判定依据。书籍只有 `summary` 时，明确登记尚未覆盖的章节证据。
10. 用状态工具把 intake 标记完成，登记 `materials.jsonl` 与缺口报告、输入指纹和验证结果。

## materials.jsonl 契约

每条记录至少包含：

```json
{"source_id":"src-001","source_group":"book-01","source_type":"epub","location":"/path/book.epub","title":"参考书","fingerprint":"sha256:...","status":"ready","classification":"course_material","version_relation":"canonical","authority_status":"confirmed","processing_mode":"notes","coverage":"chapter_complete","purposes":["knowledge_extraction","lesson_writing"],"evidence_locator":"chapter 2","notes":null}
```

- `status`：`ready`、`partial`、`blocked`、`ignored`。
- `source_type`：写真实类型，如 `local_markdown`、`pdf`、`docx`、`audio`、`minutes_transcript`、`lark_doc`。
- `processing_mode`：书籍使用 `notes`、`summary`、`quotes` 或 `study`；其他来源可为 `null`。
- `coverage`：记录 `chapter_complete`、`selected_sections`、`whole_book_summary` 或 `unknown`，不能从文件可读推断为内容已完整处理。
- `version_relation`：`canonical`、`supersedes`、`superseded_by`、`parallel`、`duplicate`、`unknown`。
- `authority_status`：`confirmed`、`candidate`、`conflict`、`not_applicable`；只有证据充分时使用 `confirmed`。
- `evidence_locator`：页码、段落标题、时间戳或 block id；暂时未知可为 `null`，后续抽取时补齐。
- 记录错误时使用 `error.code` 和 `error.message`，不要记录凭据。

## 完成检查

- 所有用户指定来源都已登记，数量能与原始输入对上。
- 每条记录都有来源、类型、位置、状态、分类和用途。
- transcript 与摘要没有混用；执行指令和会议闲聊没有进入课程素材。
- 书籍处理模式和覆盖范围已登记；`summary` 没有被当成全书完整证据。
- 引文保留版本与页码/章节位置，且没有为做笔记复制大段受版权保护的正文。
- `study` 的自测问题与回答没有进入来源事实。
- 不可读项全部进入缺口报告，错误可复现。
- 同组多版本材料的权威关系有证据；未解决冲突不会被文件名或修改时间静默覆盖。
- `materials.jsonl` 每行都是合法 JSON，且没有重复的 `source_id + fingerprint`。

完成后只交付材料索引与缺口报告，把下一阶段交给 `course-positioning`。

