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