# 课评写入决策规则

## 场景总览

| 场景 | 说明 | 写入位置 |
|------|------|---------|
| 正常上课 | 固定班级固定时间，学生正常到课 | 本班学生 feedback/ |
| 正常请假 | 固定班级固定时间，学生请假 | 本班学生 feedback/(请假) |
| 外班来补课 | 其他班的学生来本班上课 | 本班 补课/学生名/feedback/ |
| 本班临时调时间 | 固定班级但本次课改了时间 | 本班学生 feedback/，课评中注明实际时间 |
| 临时凑班 | 不属于任何固定班级的一次性排课 | 建临时班级目录或按补课处理 |

## 场景1：本班正常到课

- 位置：`班级目录/学生名/feedback/YYYYMMDD_课程编号-课次.md`
- 操作：在学生 feedback 目录下新增课评文件
- 学生目录已存在 → 直接写
- 学生目录不存在 → 先创建学生目录和 feedback 子目录

## 场景2：本班请假

- 位置：`班级目录/学生名/feedback/YYYYMMDD_课程编号-课次(请假).md`
- 操作：在学生 feedback 目录下新增请假记录文件
- 请假记录也要写，保证每位学生每次课都有对应文件

## 场景3：外班来补课

- 位置：`班级目录/补课/学生名/feedback/YYYYMMDD_课程编号-课次.md`
- 操作：
  1. 检查 `班级目录/补课/学生名/` 是否已存在
  2. 已存在 → 直接在 feedback 下新增课评文件
  3. 不存在 → 创建 `补课/学生名/feedback/` 目录，再写课评
- 补课学生不需要 profile.md

## 场景4：本班临时调时间

**核心原则：写回原班级，不新建目录。** 班级目录名中的时间是常规标签，不是精确到每次课的约束。

### 老师操作流程

1. 确认是哪个固定班级的课（比如 CSP01六六周六1045）
2. 正常在该班级目录下为每个学生写课评
3. 课评文件中**加一行注明实际时间**：

```markdown
# 课程名称：CSP01-10 变量与运算

**授课日期**: 2026-05-10
**实际时间**: 16:00-18:00（临时调整，原定 10:45-12:45）

**课评内容**：
...
```

### 三种学生的处理

| 学生状态 | 操作 |
|---------|------|
| 到课 | 和场景1一样，在学生 feedback/ 下写课评，注明实际时间 |
| 请假 | 和场景2一样，写请假记录 |
| 外班来补课 | 和场景3一样，在补课/ 下写课评 |

### 为什么不新建临时目录

1. 目录会越积越多，长期仓库很乱
2. 学生课评会被拆到两个目录，历史不连续
3. 老师不需要纠结写哪个目录，班级目录就那几个
4. 课评文件名已有日期精确标识，目录名只是标签

## 场景5：临时凑班

不属于任何固定班级的一次性排课（如集训、体验课等）：

- 如果有对应的固定班级 → 按场景4处理，写回固定班级
- 如果完全无对应 → 建临时班级目录（如 `CSP01六六集训0510`），按场景1/2/3处理
- 临时班级目录用完后不删除，保留历史记录

## 查找课评的反向逻辑

统计课评完成度时，只在排课老师T的仓库中查找（谁上课谁写课评），从最精确到最模糊逐级查找，每一级找到即停：

```
校宝记录：学生S 在日期D 到课，排课老师T，课程编号B，上课时间TIME

第1级（精确匹配）：课程编号B + 时间TIME + 老师T
  1a. 在T仓库找 目录名含B 且 含TIME 的班级目录
      → 在该目录的 S/feedback/ 中找日期D的课评
      → 找到 → 结束
  1b. 未找到 → 在该目录的 补课/S/feedback/ 中找日期D的课评
      → 找到 → 结束
      → 未找到 → 进入第2级

第2级（放宽时间）：课程编号B + 老师T，时间不限
  2a. 在T仓库找 目录名含B 的所有其他班级目录（排除第1级已查的）
      → 排除非常规班（目录名含"集训"、"体验"、"临时"等）
      → 在这些目录的 S/feedback/ 中找日期D的课评
      → 找到 → 结束
  2b. 未找到 → 在这些目录的 补课/S/feedback/ 中找日期D的课评
      → 找到 → 结束
      → 未找到 → 标记缺失
```

**核心原则：谁上课谁写课评，只查排课老师的仓库。** 不需要跨老师查找，别的老师上的课不会出现在自己仓库里。

**覆盖的4种情况**：

| 查找 | 含义 |
|------|------|
| 1a. 精确班级学生目录 | 固定班固定时间，本班学生写的课评 |
| 1b. 精确班级补课目录 | 固定班固定时间，补课学生写的课评 |
| 2a. 同阶段不同时间学生目录 | 临时调了时间，写在了另一个同编号班级目录下 |
| 2b. 同阶段不同时间补课目录 | 临时调了时间，补课学生的课评在另一个同编号班级的补课目录 |

**关键过滤规则**：
- **全程限定课程编号B**：缺B补B，不跨课程编号
- 第2级排除"集训/体验/临时"等非常规班目录名
- 每一步找到就停，不重复计数

## 关键原则

1. **以学生为中心**：查找时先找学生名，再检查日期
2. **课程编号是全程硬约束**：只在课程编号B范围内查找，缺B补B
3. **谁上课谁写课评**：只查排课老师T的仓库，不跨老师
4. **每位学生每次课必须有文件**：到课写课评，请假写请假记录，不能遗漏
5. **补课学生按实际补课班级归类**：去哪个班补课，课评就写在那个班的补课目录下
6. **补课目录可复用**：同一个补课学生多次来同一个班补课，目录已存在就不再创建
7. **临时调时间写回原班级**：不新建目录，课评内容中注明实际时间即可

## 两种查找模式

老师仓库是独立的，不同场景需要不同的查找范围：

| 目的 | 查找范围 | 约束 |
|------|---------|------|
| 课评完成度统计 | 只查排课老师T的仓库 | 限定课程编号B，逐级查找 |
| 写阶段总结 | 遍历所有老师仓库（15个） | 不限课程编号，按学生名收集全部课评，按时间排序 |

**阶段总结查找逻辑**：

```
目标：为学生S 生成阶段总结

1. 遍历所有老师仓库的 .claude/memory/class/ 下所有班级目录
2. 在每个班级目录中查找 S/feedback/ 和 补课/S/feedback/
3. 收集所有 YYYYMMDD_*.md 文件
4. 按日期排序，汇总输出
```

学生可能换班换老师（如CSP01升CSP02换了老师），课评分散在多个仓库，只能全扫。

## 学生索引机制

### 目的

教学督导（可读所有仓库）每周定时扫描15个老师仓库，生成统一的学生索引文件，避免后续查询反复全扫。

### 索引结构

```
.claude/memory/student_index/
├── 刘毅潇.md
├── 张祺琪.md
└── ...
```

每个索引文件：

```markdown
# 刘毅潇

## 当前班级
- CSP05克力周六1600

## 课评记录
| 日期 | 老师 | 班级 | 路径 |
|------|------|------|------|
| 2026-05-10 | 克力 | CSP05克力周六1600 | keli_ClassFeedback/.../feedback/20260510_CSP05-10.md |
| 2026-05-03 | 克力 | CSP05克力周六1600 | keli_ClassFeedback/.../feedback/20260503_CSP05-09.md |
| 2026-04-19 | 六六 | CSP01六六周六1400 | liuliu_ClassFeedback/.../feedback/20260419_CSP01-08.md |
```

### 更新方式

- **定时扫描**：每周执行课评整理时自动扫描所有仓库，更新索引
- **增量更新**：只追加新发现的课评，不删除历史记录
- **升班/换老师**：索引中追加新班级记录，"当前班级"取最新一条

### 索引的好处

1. **老师仓库不动**：写入逻辑完全不变
2. **课评完成度统计**：读索引即可，不用全扫15个仓库
3. **阶段总结**：直接读索引文件，按日期排序就完事
4. **升班/换老师**：索引里追加记录，学生历史自然连续
5. **统一视图**：教学督导和所有协作者都能看到学生完整课评轨迹
