---
name: 课评生成
description: 快速生成个性化课评，你只需提供学生本节课的表现，自动匹配班级风格生成高质量课评
type: skill
---

# 🎯 课评生成器技能包

## 🌟 功能说明
本技能专为穹狼科创编程课程设计，**使用超简单：你只需要告诉我学生的基本信息和本节课表现，我就能自动生成符合班级风格的个性化课评**。

✅ 支持四大课程：C++/AICODE/Kitten/体验课
✅ 自动匹配班级专属风格：AICODE03温暖鼓励型/K4温和鼓励型/CSP03要求型/体验课转化型
✅ **CSP班级必须查询OJ做题数据**（用户提供token后自动获取A包答题情况）

## 💡 使用方式

### 交互式问答（推荐）

输入 `/课评生成`，我会按顺序问你以下信息：

```
📝 问题1：这次是什么类型的班？
- [ ] AICODE（AI创意编程）
- [ ] CSP（C++信息奥赛）
- [ ] K4（编程猫Kitten）
- [ ] 体验课

📝 问题2：课堂录音文件路径是什么？（.docx格式）

📝 问题3：这是第几周的课？课程名称是什么？

📝 问题4：具体是哪个班次？（根据你选的班型显示对应选项）
  AICODE班选项：
  - [ ] AICODE03橙子周六1900
  - [ ] AICODE03橙子周日0845
  - [ ] AICODE03橙子周日1400
  CSP班选项：
  - [ ] CSP03橙子周六0830
  - [ ] CSP03橙子周六1400
  - [ ] CSP03橙子周日1030
  K4班选项：
  - [ ] K4橙子周五1900
  - [ ] K4橙子周日1900

📝 问题5（AICODE班）：作品文件夹路径是什么？
📝 问题5（CSP班）：OJ题目的token是什么？

📝 问题6：本节课出勤情况如何？（来了哪些学生，谁请假）
```

你回答完所有问题，我就会自动完成整个课评生成流程！

---

## 🔄 自动完成的工作

你提供信息后，我会自动完成：

### 第1阶段：课评准备
1. 使用python-docx读取录音转写文件
2. AI分析录音文本，识别"发言人1,2,3"对应的学生
3. **AICODE班**：查看作品文件夹，分析每个学生作品的创意和亮点
4. 读取课程计划，获取5个知识点
5. 读取每个学生的画像
6. **CSP班**：使用token查询OJ做题数据

### 第2阶段：课评生成
1. 读取班级风格指南
2. 为每个学生生成个性化课评（约200字）
   - 引用录音中的具体例子
   - **AICODE班**：描述作品创意和亮点
   - **CSP班**：包含OJ做题数据
3. 生成班级总结
4. 展示给你确认

### 第3阶段：课评收尾
1. 课评质检（CSP班调用证据审计员）
2. 丰富度评分（告诉你每个学生的分数）
3. 保存归档（个人课评 + 周汇总 + 班级总结）
4. 更新学生画像
5. 输出完成报告

---

## 📂 从课堂录音批量生成课评（推荐工作流）

橙子提供课堂录音转写文件（`.docx`格式），文件路径会直接告诉我，我会自动完成以下流程：

### 🤖 交互式问答流程

当橙子输入 `/课评生成` 时，使用 **AskUserQuestion** 工具按顺序询问：

**第1轮：基本信息**
- 问题1：班型（单选：AICODE/CSP/K4/体验课）
- 问题2：录音文件路径（文本输入）
- 问题3：第几周 + 课程名称（文本输入）

**第2轮：确认班次**
- 问题4：具体班次（根据班型显示对应选项）

**第3轮：补充材料**
- 问题5（AICODE班）：作品文件夹路径
- 问题5（CSP班）：OJ题目的token
- 问题6：出勤情况（文本输入，说明谁来了、谁请假）

**收集完成后**，自动调用三个阶段的agent完成课评生成。

### 🔄 智能体流水线模式

课评生成已拆分为3个独立智能体，按流水线方式协作完成：

```
┌─────────────────┐     ┌─────────────────┐     ┌─────────────────┐
│  课评准备阶段    │ ──→ │  课评生成阶段    │ ──→ │  课评收尾阶段    │
│  (Agent 1)      │     │  (Agent 2)      │     │  (Agent 3)      │
└─────────────────┘     └─────────────────┘     └─────────────────┘
        │                       │                       │
        ▼                       ▼                       ▼
   收集所有数据            生成课评内容            质检+保存+归档
   • 确认班型班次           • 读取风格指南         • 课评质检
   • 录音解析(AI分析)     • 读取课评模板         • 保存课评
   • 课程计划匹配         • 生成个人课评         • 保存班级总结
   • 学生画像读取         • 生成班级总结         • 更新学生画像
   • OJ数据获取           • 质量自检             • 更新学生画像
```

**优势**：
- 每个阶段职责清晰，便于调试和优化
- 可以单独重跑某个阶段（如只重跑质检）
- 阶段间数据传递标准化，减少错误

---

### 输入文件格式
橙子提供的课堂录音转写文件为 `.docx` 格式，包含整节课的完整录音转写文本。

**录音转写文件特点**：
- 自由文本格式，包含老师和学生的对话
- 只有"发言人1"、"发言人2"、"发言人3"这样的标识，没有具体姓名
- 可能包含时间戳（如"[00:05:30]"）
- 内容为整节课的完整记录，需要AI分析识别发言人

**示例内容**：
```
[00:00:15] 发言人1：好，同学们，今天我们来学习循环嵌套...
[00:02:30] 发言人2：老师，我有个问题...
[00:05:45] 发言人1：问得很好，大家注意看...
[00:10:20] 发言人3：老师，我这个程序运行不出来...
```

**AI识别说明**：
- 发言人1通常是老师（讲解知识、提问、点评）
- 发言人2、3等通常是学生（回答问题、提问、讨论）
- 需要根据对话内容判断每个发言人对应的学生

**Word文档格式**：
- 同样包含表格，记录学生姓名、出勤状况和课评描述
- 使用 `python-docx` 库自动读取，无需手动转换

### 工作流程
```
确认班型班次 → 读取录音转写(docx) → AI分析识别发言人 → 获取课程知识点 → 读取学生画像 → 润色生成 → 确认修改 → 课评质检 → 保存
```

### 1. 读取课堂录音转写文件
解析用户提供的课堂录音转写文件（`.docx` 格式）：

**⚠️ 关键：docx 中文在终端显示会乱码，必须分两步读取！**

**第一步：用 python-docx 提取文本并保存为 UTF-8 txt 文件**
```python
from docx import Document

def extract_docx_to_txt(docx_path):
    """从docx提取文本，保存为UTF-8 txt文件（避免终端乱码）"""
    doc = Document(docx_path)
    # 提取所有段落文本
    text = '\n'.join([p.text for p in doc.paragraphs if p.text.strip()])
    # 保存为UTF-8 txt
    txt_path = docx_path.replace('.docx', '_提取.txt')
    with open(txt_path, 'w', encoding='utf-8') as f:
        f.write(text)
    return txt_path

# 对每个录音文件执行
for fpath in [r'input/录音1.docx', r'input/录音2.docx']:
    txt_path = extract_docx_to_txt(fpath)
    print(f'已提取: {txt_path}')
```

**第二步：用 Read 工具读取 txt 文件**
```
Read 工具直接读取 _提取.txt 文件，中文显示完全正常
```

> **为什么这样做？** python-docx 底层 XML 是 UTF-8 编码，能正确读取中文。但 bash 终端渲染 UTF-8 中文时会产生乱码。保存为 txt 后，用 Read 工具读取即可正常显示。
>
> **清理**：课评保存完成后，删除 `_提取.txt` 临时文件。

**录音文本特点**：
- 语音转文字质量参差不齐，常见同音字、模糊识别
- 整节课的完整转写，包含老师和学生的对话
- 带时间戳（如"发言人 00:04"）
- 可能有"发言人1"、"发言人2"等编号（老师通常是发言人1）
- 学生姓名可能被转写为同音字（如"圆振"→"原证"、"艺嘉"→"YGX"）

**AI分析提取学生表现**：
直接读取 `_提取.txt` 文件内容，分析时注意：
- 结合学生姓名和可能的同音字变体来定位个体表现
- 语音识别误差大的段落需结合上下文推断
- 关注：被点名回答、主动提问、完成进度、老师评语等关键事件

```python
# 分析提示词
analysis_prompt = f"""
分析以下课堂录音转写文本，提取每个学生的表现信息。

班级学生名单：{student_list}
注意：语音转文字可能存在同音字，请结合上下文推断学生身份（如"原证"可能是"圆振"）。

请为每个学生提供：
1. 出勤状况：正常上课 / 请假 / 未到
2. 课堂表现摘要（100-200字）：
   - 参与度如何
   - 哪些知识点掌握得好
   - 遇到什么问题
   - 有什么亮点表现

录音文本：
{recording_text}

请以JSON格式输出。
"""
```

> **日期规则**：根据用户提供的周次信息推算具体日期，或在交互式问答时直接询问用户确认授课日期。

### 2. 匹配课程计划
根据班级标题中的关键词匹配对应课程计划：

| 班级标题关键词 | 课程计划路径 | 课程编号 |
|---|---|---|
| AICODE03 | `.claude/lesson/AICODE/课程计划.md` | AICODE03 |
| CSP03 | `.claude/lesson/CSP03/课程计划.md` | CSP03 |
| Kitten04 / K4 | `.claude/lesson/Kitten04/课程计划.md` | Kitten04 |

从课程计划中提取对应课次的：
- **课程名称**（如《进制转换》）
- **教学目标 5个知识点**

> **重要**：教案中的"教学目标"5条直接作为课评的5个知识点，不得修改或编造。

### 3. 读取学生画像
对每个学生，读取其个人画像档案：
**路径**：`.claude/memory/class/[班级]/[姓名]/profile.md`

### 4. 润色生成课评
对录音中提取的**每一个学生**，根据出勤状况处理，确保每个人都有对应记录：

| 出勤状况 | 处理方式 | 保存位置 |
|---|---|---|
| 正常上课 | 读取画像 + 润色表现摘要 → 生成完整课评 | 本班学生feedback目录 |
| 请假 | 生成请假记录 | 本班学生feedback目录 |
| 未上课 | 生成未到课记录 | 本班学生feedback目录 |
| 补课-来自XX班 | 读取画像 + 润色表现摘要 → 生成完整课评 | **补课班级**的`补课/[姓名]/feedback/`目录 |

**润色规则**（对正常上课和补课学生）：
- 保留录音中提取的所有事实（不能遗漏任何信息）
- 根据学生画像调整语气和侧重（如内向学生多鼓励，活泼学生提专注）
- 套用对应班级的固定开头（5个知识点）和结尾风格
- 将100-200字的表现摘要扩展为约200字的完整家长信格式课评
- **绝不编造**录音中没有提到的内容

**⚠️ CSP班级专属（必须执行）**：
对每个CSP学生，**在生成课评之前**必须先查询OJ做题数据：
```bash
python scripts/get_student_oj.py \
  --homework-id <作业ID> \
  --student "<学生姓名>"
```
将返回的OJ数据Markdown拼接到课评内容中。**没有OJ数据的CSP课评是不完整的！**

**输出示例**：
```markdown
嘉博家长好，本周学习的内容是《魔幻俄罗斯方块（下）》：
1. 理解"自动化测试"的概念
2. 理解"测试覆盖"：每条规则都应有对应测试
3. 功能扩展的增量思维
4. 增量需求文档的编写方法
5. 测试脚本生成与结果解读

嘉博今天表现特别棒～对增量需求文档的理解很到位，能够自己写出清晰的测试用例～
和AI协作完成俄罗斯方块的调试，遇到困难没有放弃，特别有韧性～
要是可以在写需求文档的时候再仔细检查一下边界条件就更好啦～
老师会继续关注嘉博的表现，期待看到更多精彩！🌟💡
```

### 6. 生成班级总结（所有班级）
录音中提取的**每一个班级**都会生成本节课的班级总结，不局限于特定班级：

**内容来源**：
- 课程名称 + 5个知识点（来自课程计划）
- 该班级所有学生的整体表现（基于录音中提取的表现摘要汇总）
- 亮点学生、共性问题、课堂趣事

**保存路径**：`.claude/memory/class/[班级]/summaries/YYYYMMDD_课程编号-课次_班级反馈.md`

**格式**：使用对应班级自己的模板（`.claude/memory/class/[班级]/summaries/群发文案模板.md`或`班级反馈模板.md`）

### 7. 确认流程（橙子检查）

所有课评和班级总结生成后，**先展示给橙子看，不保存**：
- 按班级分组展示：个人课评 + 班级总结
- 等待橙子确认或提出修改意见
- 如有修改，即时调整后再次展示，直到橙子满意

### 8. 课评质检（橙子确认修改后执行）

**橙子确认课评内容无误后**，自动调用课评质检系统进行最终质检：

**触发条件**：橙子说"可以了"、"没问题"、"确认"等表示确认的语句

**质检流程**：
1. 调用「课评质检调度器」Agent
2. 输入：橙子确认后的班级总结 + 所有学生的个人课评
3. 调度器自动协调9个质检Agent（证据审计员、质量评审员、5位家长、终稿编辑）
4. 输出：质检报告 + 修订稿（如有问题）

**三档放行规则**：
- **直接发送**（≥85分且无硬伤）：保持原稿，附质检报告供参考，进入保存流程
- **修订后发送**（70-84分或有改进点）：展示质检报告和修订稿给橙子，橙子确认后进入保存流程
- **必须重写**（<70分或触发硬伤）：展示质检报告给橙子，橙子决定如何修改

**质检报告格式**：
```
📋 课评质检报告

【总分】XX / 100
【结论】直接发送 / 修订后发送 / 必须重写

【一、证据审计】
- 已核实：...
- 存疑/风险：...

【二、硬伤检查】
- 触发：无 / 第X项（说明）

【三、主要问题】（按严重程度排）
1. ...

【四、修订稿】
（若结论为"修订后发送"或"必须重写"，给出完整修订后的课评）

【五、修改说明】
- 改了什么、为什么改
```

**质检报告位置**：质检报告附在课评后面，供橙子参考，但不发给家长。

**质检后流程**：
- 如果质检通过（直接发送）：自动执行保存操作
- 如果质检发现问题：展示给橙子，橙子确认后再保存

**⚠️ CSP课评质检优先使用 Agents 系统**：

CSP课评必须使用 `.claude/agents/` 目录下的质检Agent系统进行质检，该系统包含：

| Agent | 路径 | 功能 |
|-------|------|------|
| **课评质检调度器** | `.claude/agents/课评质检调度器/agent.md` | 协调9个质检Agent的工作流程 |
| **课评证据审计员** | `.claude/agents/课评证据审计员/agent.md` | 事实核对（OJ数据、知识点等） |
| **课评质量评审员** | `.claude/agents/课评质量评审员/agent.md` | 100分制评分 + 硬伤检查 |
| **课评终稿编辑** | `.claude/agents/课评终稿编辑/agent.md` | 根据反馈生成修订稿 |
| **家长-忙碌实用型** | `.claude/agents/家长-忙碌实用型/agent.md` | 快速扫读体验 |
| **家长-结果导向型** | `.claude/agents/家长-结果导向型/agent.md` | 信息缺口检查 |
| **家长-细节核对型** | `.claude/agents/家长-细节核对型/agent.md` | 文内一致性检查 |
| **家长-焦虑保护型** | `.claude/agents/家长-焦虑保护型/agent.md` | 情绪风险检查 |
| **家长-成长陪伴型** | `.claude/agents/家长-成长陪伴型/agent.md` | 成长性反馈 |

**CSP质检执行方式**：
```
调用 课评质检调度器 → 调度器自动协调9个Agent → 输出质检报告 + 修订稿
```

**核心原则**（来自Agents系统）：
1. **事实以证据审计员为准**：家长视角的数字意见一律忽略
2. **不做学生横向比较**：揪出"最高/最快/分水岭/紧随XX"等比较词
3. **术语家长能懂**：OLE/CE/WA/SJF/AC这类缩写要解释或换成白话
4. **结合学生性格**：完美主义型先肯定韧性再谈方法；佛系型正向收尾不施压
5. **老师是最终决策者**：给建议和修订稿，老师决定用不用

### 9. 保存归档（保存的是质检后的课评）

**橙子最终确认后**（此时课评已完成质检，是三档放行后的版本），执行以下保存操作：

| 质检结论 | 保存的版本 | 说明 |
|---------|-----------|------|
| 直接发送（≥85分） | 原稿（已通过质检） | 原稿本身就是高质量的，直接保存 |
| 修订后发送（70-84分） | **修订稿**（质检后修改版） | 质检发现问题 → 终稿编辑修订 → 橙子确认 → 保存修订版 |
| 必须重写（<70分） | **橙子修改后的最终版** | 质检发现问题 → 橙子决定如何修改 → 保存最终版 |

1. 保存到学生个人单次课评文件
2. **保存到统一周课评汇总**（`E:/cc/4work_project/ClassFeedback/output/课评汇总/`），**后写的课评放在最前面**
3. 保存班级总结
4. 更新学生画像

### 10. 更新学生画像（自动）
保存课评的同时，根据本节课表现**适当更新**学生画像 `profile.md`：

**更新原则**：
- 只记录**新发现**或**明显变化**，不重复已有信息
- 更新位置：在 profile.md 的"近期表现"或"课堂观察"部分追加

**触发更新的典型情况**：
- 展现出新的兴趣点（如"首次表现出对XX的浓厚兴趣"）
- 能力有明显进步（如"打字速度比上学期快了很多"）
- 性格/态度变化（如"从内向变得愿意主动提问"）
- 需要持续关注的问题（如"近两次课专注力有所下降"）
- 特殊事件（如"第一次独立完成完整作品"）

**不更新的情况**：
- 表现和画像中已有描述一致
- 只是常规课堂表现，无特殊变化
- 一次性的小问题（如"今天迟到"）

更新格式示例：
```markdown
**2026-05-14 第11课观察**：
- 对增量需求文档的理解力有提升，能自己写出测试用例
- 遇到困难时不再马上求助，会先尝试独立调试
```

---

## 📊 课评质量评分标准（生成时必须遵循）

> 总分 100 分 = 规范性（50 分） + 丰富度（50 分）
> **生成课评时必须按照此标准自检，确保每条课评都达到高质量要求！**

### 一、规范性（自动检测，合计 50 分）

| 评分项目 | 分值 | 满分判定规则 | 扣分规则 |
|----------|------|--------------|----------|
| **字数合规** | 10 | 正文字数区间：180–350 字 | 超出 / 低于区间按梯度扣分 |
| **禁用词检查** | 10 | 全文无禁用词汇 | 每出现 1 个禁用词扣 2 分，扣完本项为止 |
| **结构完整性** | 10 | 评语必须包含三要素：知识点总结 + 学情反馈 + 教师签名 | 缺任一要素酌情扣分 |
| **Emoji 使用** | 10 | 全篇使用数量 3–5 个 | 过少 / 过多酌情扣分 |
| **称呼规范** | 10 | 使用学生小名、或去掉姓氏直呼名字 | 称呼格式不规范扣分 |

**禁用词清单**（生成时必须避免）：
- 笼统空泛词：表现不错、继续努力、很好、很棒（无具体细节时）
- 敷衍词：还可以、一般、还行
- 批评词：太差、不认真、不用心、态度有问题

**自检要点**：
- ✅ 字数：课评正文（不含知识点和OJ数据）在 180–350 字之间
- ✅ 禁用词：不使用上述禁用词，用具体描述代替笼统评价
- ✅ 结构：必须有知识点总结（固定开头）+ 学情反馈（主体）+ 教师签名（结尾）
- ✅ Emoji：全篇 3–5 个，分布在夸奖、建议、结尾等位置
- ✅ 称呼：三字姓名去掉姓氏（如"陈圆振"→"圆振"），两字姓名直呼名字

### 二、丰富度（AI 语义分析，合计 50 分）

| 评分项目 | 分值 | 高分评判标准 |
|----------|------|--------------|
| **具体化程度** | 15 | 评语包含具体行为细节，描述有画面感，不笼统空泛 |
| **课后建议质量** | 15 | 给出可落地、可执行的个性化课后练习 / 提升方案，不是套话建议 |
| **个性化纵向对比** | 10 | 结合学生过往学情画像，对比本次表现，体现进步 / 退步追踪 |
| **专业知识点体现** | 10 | 紧扣课程核心知识点点评，体现授课专业度，不泛泛闲聊 |

**丰富度提升技巧**：

**具体化程度（15分）**：
- ❌ "嘉博今天表现不错"（笼统，0分）
- ✅ "嘉博今天自己一字一字打字，和AI聊了一节课，特别专注"（具体行为，15分）
- ✅ "嘉博今天主动问老师'内层循环每执行完一次，外层循环的变量会变吗？'，说明在认真思考"（引用原话，15分）
- 技巧：引用学生在录音中的原话，或描述具体行为，让家长看到孩子真实的课堂表现

**课后建议质量（15分）**：
- ❌ "继续加油"、"多练习"（套话，0分）
- ✅ "课后可以试着用AI生成一个故事，然后自己改编结尾，锻炼创意表达"（可执行，15分）
- 技巧：给出"做什么"、"怎么做"、"达到什么效果"

**个性化纵向对比（10分）**：
- ❌ 不提过往表现（0分）
- ✅ "比上节课专注力明显提升，能完整听完讲解再动手"（有对比，10分）
- 技巧：读取学生画像，对比上次表现，指出进步/需要保持的地方

**专业知识点体现（10分）**：
- ❌ "今天学了新知识"（泛泛，0分）
- ✅ "对角色设置+限制条件+输出格式的系统提示词优化，有一定了解"（专业，10分）
- 技巧：紧扣本节课教案中的知识点，用专业术语点评

---

## ⚙️ 核心生成逻辑（自动完成，你不需要操作）
```
1. 确认班型和班次 → 2. 读取参考资料 → 3. AICODE班分析作品/CSP班拉取OJ数据 → 4. 生成个性化课评 → 5. 橙子确认修改 → 6. 自动质检 → 7. 自动保存
```

### 1. 自动读取参考资料
我会自动找到以下资料用于生成课评：
- **学生画像**：`.claude/memory/class/[班级]/[姓名]/profile.md`（了解学生性格特点和适用风格）
- **班级风格指南**：根据课程类型读取对应规则（`.claude/rules/[课程].md`）
- **课评格式模板**：根据课程类型选择对应模板（`.claude/templates/[课程].md`），包含标准版和极简版
- **本节课教案**：到 `.claude/lesson/` 目录下查找对应班级、对应课次的教案，确保课评内容与实际教学一致，不编造内容
- **过往课评**：读取该学生的历史课评，避免重复用词
- **课堂录音转写**：`.docx`格式，使用python-docx库读取，AI分析提取学生表现
- **AICODE班作品**：查看作品文件夹，分析每个学生作品的创意和亮点

> 💡 **模板库路径**：`../../templates/`
> - `AICODE.md`：AICODE创意编程课评模板（标准版 + 极简版）
> - `CSP.md`：C++/CSP课程课评模板
> - `KITTEN.md`：Kitten课程课评模板
> - `课评汇总网页.html`：家长版课评汇总HTML网页模板（翻页浏览、温暖画册风格）

### 2. AICODE班级专属：查看作品文件夹（必须执行）

**⚠️ 这是强制步骤，AICODE课评必须包含作品创意描述！**

**执行时机**：在生成每个AICODE学生的课评**之前**，先查看该学生的作品文件夹。

**执行流程**：
1. 识别出AICODE班级的学生
2. 查看作品文件夹（橙子提供的本地路径）
3. 分析每个学生作品的：
   - 创意点：有什么独特的想法
   - 技术点：用了什么技术实现
   - 亮点：有什么特别出彩的地方
4. 将作品分析**用中文写进课评**中

**示例**（生成陈嘉博的AICODE课评）：
```
嘉博今天表现特别棒～主动问老师关于循环嵌套的问题，说明在认真思考～

自己完成了课堂练习，特别专注！作品是一个猜数字游戏，用了独特的渐变色背景，
还添加了音效和暂停功能，创意很棒！

老师会继续关注嘉博的表现，期待看到更多精彩！🌟💡
```

### 3. CSP班级专属：自动获取OJ做题数据（必须执行）

**⚠️ 这是强制步骤，CSP课评必须包含OJ数据！**

**执行时机**：在生成每个CSP学生的课评**之前**，先查询该学生的OJ数据。

**查询命令**（对每个CSP学生执行）：
```bash
python scripts/get_student_oj.py \
  --homework-id <作业ID> \
  --student "<学生姓名>"
```

**执行流程**：
1. 识别出CSP班级的学生
2. 对每个CSP学生，运行上述命令获取OJ数据
3. 命令会输出该学生的OJ数据Markdown（包含A包每道题的完成情况）
4. 将返回的OJ数据Markdown**直接拼接**到该学生的课评内容中

**示例**（生成杨林轩的CSP课评）：
```bash
# 第1步：获取OJ数据
python scripts/get_student_oj.py \
  --homework-id 6a2bbd65aeff4da880b8f01d \
  --student "杨林轩"

# 第2步：把返回的OJ数据整合到课评中
```

**返回格式示例**：
```markdown
## 【OJ做题数据】

**完成情况**: 4/5 (共8次提交)

| 题目 | 状态 | 提交次数 | 错误类型 |
|------|------|----------|----------|
| CSP0309A1 银行叫号模拟 | ✅ 通过 | 1 | — |
| CSP0309A2 模拟发牌 | ✅ 通过 | 2 | WA×1 |
...

**📊 分析**: 完成4题，第5题有尝试但尚未通过...
```

**注意事项**：
- 作业ID需要从OJ系统获取（如 `6a2bbd65aeff4da880b8f01d`）
- 如果学生姓名在OJ系统中不匹配，会返回空数据
- 返回的Markdown直接拼接到课评正文后面，不要修改格式

**docx文件处理注意事项**：
- 确保已安装python-docx库：`pip install python-docx`
- docx文件中的表格会自动转换为Markdown表格格式
- 文件编码问题已解决，无需担心乱码

### 3. 自动生成课评（统一格式，所有课程通用）
**固定格式（必须严格遵守）**：
```markdown
【学生姓名】家长好，我们本周上课的课程是《XXX》

课程目标：
1. 【知识点1】
2. 【知识点2】
3. 【知识点3】

课评反馈：
【具体课评内容，约200字，包含优点、建议、期望】

老师签名：橙子
```

生成规则：
- 课程目标从本节课教案中提取真实知识点，禁止编造
- 课评反馈包含：优点表扬 + 温和建议 + 鼓励期望
- **表情包丰富原则**：课评正文中适当穿插表情符号，让文字更生动有温度，每个课评至少使用3-5个表情，分布在夸奖、建议、结尾等位置
- **CSP班级专属要求**：必须查询OJ系统的**A包作业完成情况**，进行详细分析（包含完成率、思考模式、错误分布、改进建议），【OJ做题数据】板块放在课评反馈的最后部分
- 称呼规则：三字姓名默认去掉姓氏，直呼后两个字（如"陈圆振"→"圆振"），更亲切
- 内容完全基于从录音中提取的表现信息和教案知识点，不编造内容
- **⚠️ 质量自检（必须执行）**：每条课评生成后，按照「课评质量评分标准」自检：
  - 字数：正文 180–350 字 ✓
  - 禁用词：无笼统空泛词 ✓
  - 结构：知识点总结 + 学情反馈 + 教师签名 ✓
  - Emoji：3–5 个 ✓
  - 称呼：去掉姓氏直呼名字 ✓
  - 具体化：有具体行为细节 ✓
  - 建议质量：可落地执行的个性化建议 ✓
  - 纵向对比：结合画像对比过往表现 ✓
  - 专业点评：紧扣课程知识点 ✓

---
### 📋 生成后确认流程（必须遵守）
1. 一批课评全部生成后，我会先把所有课评展示给你，不保存
2. 等待你确认没问题后，再执行保存操作
3. 如果你需要修改，我会根据你的要求修改后再次给你确认，直到你满意再保存

---

## 🎨 各班级风格规范（自动匹配）
### AICODE03班 - 家长信格式·温暖鼓励型
- 固定开头："【学生名】家长好，本周学习的内容是《...》" + 5个知识点（开头加学生称呼，如"梓宁家长好"，与 CSP03 一致）
- 课程目标后空一行，再写"课评反馈："正文
- 多用"很棒"、"特别棒"、"超棒"和波浪号"～"
- 描述具体行为："一字一字打字"、"和AI聊了一节课"
- 温和建议用"要是...就更好啦～"
- **必须描述作品创意和亮点**：用中文描述学生作品的创意、技术点、亮点
- **表情包使用**：课评正文中适当穿插表情，让文字更生动温暖
  - 夸奖时：🌟✨🎉👍
  - 鼓励时：💪🔥🚀
  - 温和建议时：😊💡🌸
  - 结尾固定："老师会继续关注【姓名】的表现，期待看到更多精彩！🌟💡"

**⚠️ AICODE03班强制要求**：
- **必须查看作品文件夹**，了解每个学生作品的创意和亮点
- **必须用中文描述作品**，写进课评中
- 描述技巧：
  - ❌ "嘉博的作品做得不错"（笼统）
  - ✅ "嘉博的作品是一个猜数字游戏，用了独特的渐变色背景，还添加了音效和暂停功能，创意很棒！"（具体描述）

#### AICODE03班作品描述示例
```markdown
嘉博今天表现特别棒～对循环嵌套的理解很到位，能快速理解并动手尝试～

自己完成了课堂练习，特别专注！作品是一个猜数字游戏，用了独特的渐变色背景，
还添加了音效和暂停功能，创意很棒！

要是可以在代码注释上再详细一点就更好啦～

老师会继续关注嘉博的表现，期待看到更多精彩！🌟💡
```

### K4班 - 家长信格式·温和鼓励型
- 固定开头："【学生名】家长好，本周学习的内容是《...》" + 5个知识点（开头加学生称呼，如"圆振家长好"）
- 肯定创意："能够有自己的创意"
- 温和指出："不过老师发现...专注力有些下降"
- **表情包使用**：K4班学生年龄小，多用可爱活泼的表情增加亲和力
  - 表扬创意时：🎨🌈✨🌟
  - 鼓励坚持时：💪🐱🚀
  - 提醒专注时：👀💡😊
  - 结尾可用："继续加油哦！🌟"、"相信你会把程序做得更完整！🚀"

### CSP03班 - 家长信格式·要求型
- 固定开头："【学生名】家长好，本周学习的内容是《...》" + 5个知识点（开头加学生称呼，如"圆振家长好"）
- 表扬积极："状态在线"、"早早到校等候超积极"
- 期望要求："希望多思考"、"理解为什么这么写，不只是抄完就好～"
- **表情包使用**：CSP班学生偏大，表情偏励志和认可风格
  - 表扬状态时：💪✨🎯🔥
  - 肯定进步时：📈👏🌟
  - 提出期望时：💡📝😊
  - 结尾固定："加油呀！💪✨"

**⚠️ CSP03班强制要求**：
- **必须查询OJ做题数据**，没有OJ数据的CSP课评是不完整的
- 执行命令：`python scripts/get_student_oj.py --homework-id <作业ID> --student "<姓名>"`
- OJ数据板块放在课评正文后面，格式见下方模板

#### CSP03班 OJ数据板块格式（自动生成）
**OJ作业包定位说明**：
- A包 = 课堂练习（**包含5道具体题目，必须全部列出**）
- B包 = 必须完成的课后家庭作业（未完成会明确提醒家长督促）
- C包 = 拓展训练（学有余力的同学可挑战）

```markdown
## 【OJ做题数据】

**A包（课堂练习）完成情况**: 4/5 (共8次提交)

| 题目 | 类型 | 状态 | 提交次数 | 思考模式 | 错误类型 |
|------|------|------|----------|----------|----------|
| CSP03-XXA1 | 基础题 | ✅ 通过 | 1 | 一气呵成 | — |
| CSP03-XXA2 | 基础题 | ✅ 通过 | 1 | 一气呵成 | — |
| CSP03-XXA3 | 基础题 | ✅ 通过 | 2 | 调试改进 | WA×1 |
| CSP03-XXA4 | 提高题 | ✅ 通过 | 2 | 调试改进 | WA×1 |
| CSP03-XXA5 | 提高题 | ❌ 未通过 | 2 | 遇到困难 | CE×1, WA×1 |

---
| CSP03-XXB | 课后作业（必做） | ✅ 已完成 | 3 | 反复调试 | WA×2 |
| CSP03-XXC | 拓展训练（选做） | ⬜ 未提交 | 0 | — | — |

**📊 分析**: A包5道题完成了4道，基础题全部掌握，提高题第5道考察的是边界条件处理，还需要加强；B包必做课后作业已完成，知识点巩固得不错；C包拓展题未提交，学有余力可以尝试挑战。
**错误分布**: 编译错误1次，答案错误4次，主要是边界条件考虑不周全，建议课后多练类似题目。
```

**自动判断规则**：
- ✅ A包所有5道题必须全部列出，不管是否完成，不能只显示1个A包
- ✅ 如果B包未完成/未通过：明确标注"【重要提醒】B包是必须完成的课后家庭作业，麻烦家长督促孩子在本周内完成提交"
- ✅ 如果B包已完成：表扬"课后作业完成及时，知识点巩固得不错"
- ✅ 如果C包完成了：重点表扬"主动完成拓展训练，探索精神值得鼓励"
- ✅ 如果C包未完成：不做硬性要求，只提"学有余力可以尝试挑战"
- ✅ 对A包中未完成的题目，给出具体的知识点建议，帮助孩子针对性提高

### 体验课 - 家长信格式·转化导向型
- 固定开头："【学生名】家长好，今天体验的是《...》课程" + 课程价值介绍（开头加学生称呼，如"小明家长好"）
- 突出"第一次"：强调新体验，降低焦虑，突出潜力
- 建立愿景：描述继续学习后孩子能达到的水平
- 自然引导报课：用期待和相信引导，不硬推销
- **表情包使用**：体验课要展示活力和吸引力，表情丰富但不过度
  - 欢迎首次体验时：🎉👋✨🌟
  - 展示潜力时：💡🚀🎯💪
  - 建立愿景时：📈🌈🔮
  - 结尾固定："期待在正式课堂上再次见到【姓名】！💻✨"

---

## 💾 保存规则（你确认后自动执行）
你确认课评没问题后，我会自动保存到多个位置，严格遵守课评规范V1.0要求：

### 📌 命名规范（必须严格遵守）
- **课程编号规则**：C++竞赛班统一用`CSP`，AI编程班统一用`AICODE`，不得使用`AI`、`C++`等缩写
- **文件名规则**：`YYYYMMDD_课程编号-课次.md`（如`20260418_CSP05-07.md`、`20260330_AICODE03-02.md`）
- **日期要求**：根据用户提供的周次信息推算具体日期，或询问用户确认
- **特殊状态文件**：
  - 请假：`YYYYMMDD_课程编号-课次(请假).md`
  - 未上课：`YYYYMMDD_课程编号-课次(未到).md`
  - 补课：正常文件名 `YYYYMMDD_课程编号-课次.md`，放在补课班级下的 `补课/` 目录中

### 1. 保存到学生个人单次课评文件（必须，用于自动化统计）
为每位学生生成单独的单次课评文件，这是课评完成率统计的依据：
**路径**：`.claude/memory/class/[班级]/[姓名]/feedback/YYYYMMDD_课程编号-课次.md`

**格式**：
```markdown
# 课程名称：[课程名称]

**授课日期**: [YYYY-MM-DD]

**课评内容**：
[生成的课评正文]

---
**老师签名：橙子**
```

### 2. 保存到统一周课评汇总（后写的放上面）
同时保存到统一的课评汇总目录，同一周的课评放在同一个文件里，新生成的放在最顶部：
**根目录**：`E:/cc/4work_project/ClassFeedback/output/课评汇总/`
**文件名规则**：`202X年第X周课评汇总.md`（比如「2026年第18周课评汇总.md」）
**排序规则**：最新生成的课评放在文件的最前面，旧的课评在后面，倒序排列
**班级分组**：同一个班级的课评放在一起，按班级分组展示

### 4. 补课学生处理
> 核心原则：学生来哪个班补课，课评就保存在**那个班的 `补课/` 目录下**。

- **保存路径**：`.claude/memory/class/[补课班级]/补课/[学生姓名]/feedback/`
- **文件名**：`YYYYMMDD_课程编号-课次.md`
  - 这里的**课程编号**使用补课班级本身的编号（如去CSP03班补课，就用 `CSP03`）
- 文件内容正常写课评，无需特殊标记

### 5. 班级总结保存
为每个班级保存本节课的班级总结：
**路径**：`.claude/memory/class/[班级]/summaries/YYYYMMDD_课程编号-课次_班级反馈.md`
**格式**：使用课评规范V1.0中的班级群发文案模板

### 6. 未到课记录生成
学生请假或未上课（人没到且无请假），都要生成记录文件：

**请假**：
- **路径**：`.claude/memory/class/[班级]/[姓名]/feedback/YYYYMMDD_课程编号-课次(请假).md`
- **格式**：使用课评规范V1.0中的请假记录模板

**未上课**：
- **路径**：`.claude/memory/class/[班级]/[姓名]/feedback/YYYYMMDD_课程编号-课次(未到).md`
- **格式**：简要记录本次未到课，无课评内容

---

### 7. 生成课评汇总网页（新增）

为每个班级生成本节课的**家长版课评汇总HTML网页**，方便橙子直接发给家长浏览。

**执行时机**：在所有课评保存完成后执行（无论是否已有Markdown汇总）。

**判断逻辑**：
1. 计算本节课所属的教学周次（第X周）
2. 构造文件名：`第{X}周{星期时间}{课程编号}课评.html`
   - 星期时间从用户提供的班次信息中提取（如"周日下午"、"周六早上"）
   - 课程编号如 `AICODE03`、`CSP03`、`K4`
   - 示例：`第14周周日下午AICODE03课评.html`
3. 检查 `output/课评汇总/` 目录下是否已存在该文件
4. 如果**已存在**，**跳过不覆盖**（避免误删橙子手动修改过的网页）
5. 如果**不存在**，基于模板生成新的HTML文件

**模板路径**：`.claude/templates/课评汇总网页.html`

**生成规则**（基于模板，替换以下动态内容）：

| 模板位置 | 替换内容 | 数据来源 |
|---------|---------|---------|
| `<title>`、顶部标题 | 第X周 · [课程编号]班课评 | 周次 + 课程编号 |
| 顶部副标题、封面日期 | YYYY年M月D日 · 《课程名称》 · 橙子老师 | 用户提供的日期 + 课程计划 |
| 封面大标题 | 《课程名称》 | 课程计划 |
| 封面副标题 | 课程领域 · 第X课 | 课程计划 |
| 封面信息区 | 📅日期、⏰时间、👩‍🏫老师 | 用户提供的数据 |
| 知识点列表 | 5条知识点 | 课程计划中的教学目标 |
| 学生卡片 | 每张卡片一个学生 | 本节课所有学生的课评 |
| 状态标签 | 正常上课/补课/请假/未到 | 出勤记录 |
| 页脚 | 穹狼科创 · [课程编号]班 · 橙子老师 | 课程编号 |
| JS totalCards | 学生总数 | 实际学生数量 |
| 进度点 | N个，对应N个学生 | 学生数量 |
| 导出内容 | 课程信息和知识点 | 同上 |

**学生卡片生成规则**：
- 为**每个学生**生成一张 `.student-card`
- 第一张卡片必须有 `active` 类，其余没有
- 课评正文中的换行符 `\n` 替换为 `<br>`
- 评价指标根据班级风格选取2~4个：
  - AICODE班：课堂互动、专注度、作品完成、知识点掌握
  - CSP班：课堂互动、专注度、OJ完成情况、知识点掌握
  - K4班：课堂互动、创意表达、作品完成、专注度
- 请假/未到课的学生也要生成卡片，课评内容写简短说明，状态标签用 `badge-absent`

**保存路径**：
```
output/课评汇总/第{X}周{星期时间}{课程编号}课评.html
```

**保存完成后额外提示**：
```
✅ 课评汇总网页已生成：output/课评汇总/第X周[星期时间][课程编号]课评.html
   可直接用浏览器打开，发给家长浏览
```

**如果文件已存在则提示**：
```
⏭️ 课评汇总网页已存在（第X周[星期时间][课程编号]课评.html），跳过生成
   如需更新，请手动删除后重新生成
```

---

### 保存完成后我会告诉你：
✅ 已保存X条课评
✅ 周汇总已更新：[周数]周汇总文件已更新，新课评已放在最顶部
✅ 课评汇总网页：output/课评汇总/第X周[星期时间][课程编号]课评.html（如已存在则跳过）

---

## 📝 示例课评（参考）

**从课堂录音转写生成课评示例**：
```
用户提供：第15课录音转写.docx（任意路径）
↓
系统自动：检测到docx格式 → 使用python-docx读取录音文本 → AI分析提取学生表现
↓
后续流程：匹配课程计划 → 读取学生画像 → 生成课评
```

**AICODE课程 - 鼓励型**
> 李明今天虽然是第一次接触AI绘画，但我看到了你眼里的好奇，这就是最好的开始。你的描述很有画面感，"想要一个会眨眼的可爱猫咪"，这就是好的Prompt。虽然操作还有点生疏，但老师注意到你一直在尝试，这份坚持比做对题目更珍贵。下次可以把想法先写在便签纸上，分点列出，跟AI沟通会更顺畅。记住，编程最大的门槛不是英文或数学，是敢于尝试的勇气，你已经有了。继续和你的"AI搭档"对话吧，它会越来越懂你的。

**CSP03班 - 家长信格式·要求型（含OJ数据）**
> 子煜家长好，本周学习的内容是《字符串处理》：
> 1. string 类型的声明与使用
> 2. 字符串的输入输出（cin / getline）
> 3. 字符串的拼接与比较操作
> 4. 常用字符串函数（size / substr / find）
> 5. 培养独立调试与耐心排查错误的能力
>
> 子煜状态在线，课堂互动积极，能够跟上老师的节奏。对于字符串的基本操作掌握得不错，在讲解 substr 和 find 函数时能迅速理解并动手尝试。
>
> ## 【OJ做题数据】
>
> **A包（课堂练习）完成情况**: 4/5 (共8次提交)
>
> | 题目 | 类型 | 状态 | 提交次数 | 思考模式 | 错误类型 |
> |------|------|------|----------|----------|----------|
> | CSP03-07A1 | 基础题 | ✅ 通过 | 1 | 一气呵成 | — |
> | CSP03-07A2 | 基础题 | ✅ 通过 | 1 | 一气呵成 | — |
> | CSP03-07A3 | 基础题 | ✅ 通过 | 2 | 调试改进 | WA×1 |
> | CSP03-07A4 | 提高题 | ✅ 通过 | 2 | 调试改进 | WA×1 |
> | CSP03-07A5 | 提高题 | ❌ 未通过 | 2 | 遇到困难 | CE×1, WA×1 |
>
> ---
> | CSP03-07B | 课后作业（必做） | ✅ 已完成 | 3 | 反复调试 | WA×2 |
> | CSP03-07C | 拓展训练（选做） | ⬜ 未提交 | 0 | — | — |
>
> **📊 分析**: A包5道题完成了4道，基础题全部掌握，提高题第5道考察的是字符串边界处理，还需要加强；B包必做课后作业已完成，知识点巩固得不错；C包拓展题未提交，学有余力可以尝试挑战。
> **错误分布**: 编译错误1次，答案错误4次，主要是边界条件考虑不周全，建议课后多练类似题目。
>
> A包前4题完成得都不错，说明课堂知识点吸收得很好。第5题虽然没做出来但也尝试了2次，调试能力在进步。希望课后能抽时间把第5题搞明白，理解边界条件的处理方法，而不是放着不管～加油呀！💪✨
