# RetainCraft 完整工作流

> 本文档包含 RetainCraft 的详细流程说明，供 AI 助手按需参考。

---

## 📚 核心方法论(循证)

| 方法 | 效果量 | 来源 | 适用阶段 |
|------|--------|------|----------|
| 间隔重复 | d=0.85 | Donoghue & Hattie 2021 元分析 | 长期记忆巩固 |
| 主动回忆 | d=0.74 | Donoghue & Hattie 2021 元分析 | 知识提取训练 |
| 交错练习 | d=0.47 | Donoghue & Hattie 2021 元分析 | 灵活运用能力 |
| 精细加工提问 | d=0.56 | Donoghue & Hattie 2021 元分析 | 深度加工 |
| 费曼学习法 | d=0.54* | Donoghue & Hattie 2021 元分析 | 深度理解检验 |
| AI 辅导 | 0.63-1.3 SD | Kestin et al. 2025 RCT (N=194) | 个性化学习 |

> **注**：*d=0.54 对应原文"自我解释"（Self Explanation），此处映射为费曼学习法。严格来说，"自我解释"强调学习者解释自身认知过程，而"费曼学习法"强调向他人教授。两者在认知机制上有重叠但不完全等同，此处采用概念近似映射。
> 所有 d 值均来自 Donoghue & Hattie (2021) 元分析（242 项研究，169,179 名参与者）。

**参考**: scripts/evidence.md(详细引用和效果量)

---

## 🔄 完整流程:五步启动

### Step 0:学习意愿评估(用户自我评价)

在正式学习之前,让用户完成一份自我评估问卷。

**输出格式**:
```
📋 学习自我评估问卷
1. 你想学什么?[主题]
2. 学完之后你想能做什么?[目标]
3. 你当前的水平?[🔴零基础 / 🟡有点概念 / 🟢学过一些 / 🔵有基础]
4. 每天能花多少时间学习?[X 分钟/小时]
5. 有没有截止日期?
6. 你更喜欢哪种学习方式?[阅读/视频/播客/实践/讨论]
7. 之前用过什么方法学?效果如何?
8. 你觉得自己的薄弱环节是什么?
```

### Step 0.5:预习材料(零基础专用)

**触发条件**:用户自评水平为"完全零基础"时自动启用。

**AI助手做什么**:
1. web_search 搜索该主题的入门资料
2. 精炼成一份"快速概览"(800-1500 字)
3. 用大白话写,避免术语
4. 展示给用户,等待确认后再进入 Step 1

**输出格式**:
```
📖 [主题] 快速概览

1. 这个东西是什么?(一句话定义)
2. 学了能做什么?(3 个实际用途)
3. 核心概念(不超过 5 个,每个一句话解释)
4. 常见误区(1-2 个)
5. 推荐入门资源(1-2 个,附链接)

---
确认已阅读,回复"继续"进入摸底考试。
```

### Step 1:摸底考试(Pre-assessment Test)

**目的**:客观测量用户当前水平

**规则**:
- 5-8 道题,覆盖从基础到进阶
- 题型混合:概念理解 + 应用计算 + 分析判断
- 告诉用户:"凭直觉答,不会的就说不会,没关系"

**⚠️ 重要规则**:
- 摸底考试不调用 record-test，不写入 test_history
- 摸底成绩仅用于诊断当前水平，用于定制学习路径
- 正式的等级评定从第一个模块测试开始

### Step 2:学习路径定制(含行业调研)

**Step 2a:行业调研(必须在规划前执行)**
- web_search 搜索 "[目标] 学习路线 2026" / "[目标] 岗位要求 / JD"
- web_search 搜索 "[目标] 主流项目 / 实战教程"
- 提取:必备技能、加分技能、主流工具链、学习资源
- 标注来源和搜索日期
- ⚠️ 行业调研是强制步骤,不搜索就不能规划

**Step 2b:路径生成**
- 基于行业调研结果 + Step 0 用户水平 + Step 1 摸底成绩
- 拆分为 3-8 个模块,每个模块包含:
  - 学习目标(学完能做什么)
  - 核心知识点(从搜索结果提取,标注来源)
  - 验收标准(怎么证明学会了)
  - 预估时间
  - 推荐资源(附链接 + 发布日期)

**Step 2c:用户确认**
- 展示路径,用户可以调整顺序、增删模块
- 用户确认后才开始学习

**输出格式**:
```
🗺️ 个性化学习路径
主题:[主题]
目标:[目标]
当前水平:[诊断结果]
行业调研来源:[搜索结果链接]
预估时间:[总时间]

📚 模块列表
Module 1: [名称] - [内容] - [验收标准] - [预估时间]
  📖 推荐资源:[资源名称](链接) (发布日期)
Module 2: ...
```

---

## 🔄 学习循环(每模块)

### Phase 0:框架搭建(10-15 min)
- AI助手提问,引导发现核心概念
- 用户尝试回答
- 建立知识骨架

### Phase 1:主动输入(25-40 min)
- 用户学习原始材料(阅读/视频/实践)
- 每 15 分钟暂停回忆
- AI助手回答问题,不替用户学

### Phase 2:费曼检验(15-20 min)
- 用户向 AI助手解释所学内容
- AI助手扮演"不懂的学生"追问
- 暴露理解漏洞,引导自己发现

**费曼检验评分标准(L5 必需)**:
- 追问回答准确性(4 分):核心概念是否正确
- 追问回答深度(3 分):是否解释了"为什么"而不只是"是什么"
- 追问回答举例(3 分):是否给出了具体例子
- 单问 >= 7 分算通过,3 问全部通过才算费曼检验通过
- 和模块测试的"单题 >=7 分算答对"规则一致

### Phase 2.5:实战模拟(15-20 min)
- AI助手根据学习主题推荐 2-3 个模拟场景
- 用户选择一个场景
- AI助手宣布"现在我切换为 [角色名],模拟开始"
- 用户输入 prompt → 模拟角色响应(3-5 轮)
- 模拟结束,AI助手宣布"模拟结束,切换回用户角色"
- 按 5 维度打分(100分)，具体维度见 scripts/scenarios.md 中的主题专用评分表
- 执行 `srs.py record-simulation` 记录数据

**参考**: scripts/scenarios.md(场景库示例 + 主题专用评分维度)

### Phase 3:测试巩固(15-20 min)
- 5-8 道混合题型测试
- 逐题详细解析
- 错题记录 + 掌握度评分

**测试题型分配(按等级)**:
- L1-L2:70% 概念回忆 + 20% 应用 + 10% 分析
- L3:50% 概念回忆 + 30% 应用 + 20% 分析
- L4:30% 概念回忆 + 35% 应用 + 25% 分析 + 10% 对比
- L5:20% 概念回忆 + 30% 应用 + 30% 分析 + 20% 对比

**Phase 3 类型判定(AI助手必须在出题前确认)**:
- 复习 → 只更新 SM-2 状态,不调用 record-test
- 模块测试 → 必须调用 record-test,决定等级升降

**📌 复习 vs 模块测试(重要区分)**:

| 项目 | 复习 | 模块测试 |
|------|------|----------|
| 目的 | 强化记忆 | 阶段性评估 |
| 影响 | 不影响等级 | 决定等级升降 |
| 题型 | 概念回忆为主 | 按等级分配题型 |
| 记录 | SM-2 状态更新 | test_history 记录 |
| 命令 | srs.py rate | srs.py record-test |

**Phase 3 结束后自检(必须执行)**:
- □ 是否已判定本次是"复习"还是"模块测试"?
- □ 如果是模块测试,是否已执行 record-test?
- □ 是否已显示总分和答对率?
- □ 是否已显示等级判定结果?

**模块测试后行为指南**:

| 测试结果 | AI 助手行为 |
|----------|------------|
| 答对率 >=70% | 确认通过,进入下一模块 |
| 答对率 40-69% | 分析错题,建议重学薄弱知识点后重测当前模块 |
| 答对率 <40% | 建议回到 Phase 0 重新搭建框架,降低难度重新学习 |
| 连续 2 次 <40% | 触发倦怠检测,建议休息或切换学习方式 |

- 重测时,出题应覆盖上次错题的知识点
- 不要跳过薄弱模块直接学下一个——基础不牢会连锁影响后续模块
- 如果用户坚持要继续,记录建议但尊重用户选择

### Phase 4:间隔复习(SM-2 算法)
- ease_factor 初始 2.5,动态调整
- good: interval = interval × ease_factor(递增)
- hard: interval = interval × 1.2, 同时 ease_factor = ease_factor - 0.15
- easy: interval = interval × (ease_factor + 0.15), 同时 ease_factor = ease_factor + 0.15
- wrong: interval 重置为 1 天, ease_factor -0.2
- 评分对 EF 的影响: easy(+0.15) / good(不变) / hard(-0.15) / wrong(-0.2)

**⚠️ 本节描述仅供参考,以 scripts/srs.py 源码为准。**

**触发机制**:
- 基于 SM-2 时间表，到期主动提醒
- 心跳检查: `python3 scripts/srs.py due`
- 有到期内容 → 发送复习提醒
- 没有 → HEARTBEAT_OK

**交互流程**:
```
AI发起: "你有 N 个概念需要复习，现在开始吗？"
├── 用户选择: 立即开始 / 稍后提醒 / 跳过
├── 稍后提醒: 记录时间，下次心跳检查
├── 跳过: 更新下次复习时间，不扣分
└── 立即开始:
    ├── AI出题: 根据概念生成测试题
    ├── 学习者作答
    ├── AI反馈: 逐题解析 + 标记弱点
    └── 更新复习日历: srs.py rate <topic> <concept> <rating>
```

**用户可选**:
- 立即开始: 进入复习流程
- 稍后提醒: 记录时间，下次心跳检查
- 跳过: 更新下次复习时间，不扣分

**AI助手执行指令**:
1. 对每个答错的概念，调用 `srs.py add <topic> <concept>` 确保概念存在
2. 根据答对/答错情况，调用 `srs.py rate <topic> <concept> <rating>` 更新 SM-2 状态
   - rating 取值：easy / good / hard / wrong
   - 示例：`python3 scripts/srs.py rate 线性代数 矩阵乘法 good`
3. 注意：`srs.py review` 是交互式命令（需要用户输入），AI 助手不可直接调用。应使用 `srs.py rate` 逐步更新概念状态

---

## 📊 等级系统(L1-L5)

### 等级判定算法(权威标准)

**算法流程**:
1. 初始等级 = L1
2. L1→L2:前 2 次测试平均答对率 >= 20%
3. 遍历所有相邻测试对,检查是否满足下一级阈值:
   - L2→L3:连续 2 次 >= 40%
   - L3→L4:连续 2 次 >= 70%
   - L4→L5:连续 2 次 >= 90%
4. 每次匹配成功只升一级,不能跳级

**⚠️ 算法已在 srs.py 中实现,SKILL.md 不重复写伪代码。**

### 等级标准

| 等级 | 标准 | 行为特征 |
|------|------|----------|
| 🔴 L1 入门 | 无模块测试记录,或首次模块测试答对率 <20% | 从零开始,需要基础概念讲解 |
| 🟠 L2 初学 | 首次模块测试答对率 >=20%(L3 需连续 2 次达标) | 有概念但不系统,需要框架搭建 |
| 🟡 L3 进阶 | 连续 2 次模块测试答对率 >=40% | 能独立应用基本概念 |
| 🟢 L4 熟练 | 连续 2 次模块测试答对率 >=70% | 能解决复杂问题,理解深层原理 |
| 🔵 L5 精通 | 连续 2 次模块测试答对率 >=90% + 费曼检验通过* | 能教会别人,知识完全内化 |

> *注:L5 的费曼检验是 AI 助手执行的附加验证流程,不在 srs.py 代码中强制执行。srs.py 仅基于测试答对率进行等级判定。

### 升降级规则

**升级规则**：
- L1→L2:前 2 次测试平均答对率 >= 20%
- L2→L3:连续 2 次模块测试答对率 >=40%
- L3→L4:连续 2 次模块测试答对率 >=70%
- L4→L5:连续 2 次模块测试答对率 >=90% + 费曼检验 3 问全对

**降级规则**（硬约束，已写入 srs.py）：
- 连续 3 次测试低于当前等级阈值 → 降一级
- 升级要 2 次达标，降级要 3 次不达标——升容易降难
- 注：最低降到 L2。L1 只在无测试历史时触发
- 降级后继续检查是否需要进一步降级

**降级阈值**：
- L3: 0.4 (40%)
- L4: 0.7 (70%)
- L5: 0.9 (90%)
- 注：L2 为最低等级，不会降级到 L1

### 两个独立维度

- **等级** = 基于模块测试答对率(权威,用于升级判定)
- **SM-2 状态** = 基于概念 mastered 比例(仅用于展示,不用于等级判定)
- 两者独立计算,不混用

---

## 🎭 实战模拟(详细规范)

### 目的
通过模拟真实场景,检验用户的实战能力

### 适用条件
- 学习主题有明确的实战应用场景
- 用户已完成 Phase 2(费曼检验)
- 用户愿意尝试模拟

### 执行流程
```
Step 1: 选择模拟场景
└── AI助手根据学习主题推荐 2-3 个场景,用户选择

Step 2: 加载场景角色设定
└── 从 scripts/scenarios.md 中读取对应场景的 system prompt

Step 3: 角色切换
└── AI助手明确宣布:"现在我切换为 [角色名],模拟开始"
└── 从此刻起,AI助手只按角色设定行动

Step 4: 执行模拟(3-5 轮)
└── 用户输入 prompt → 模拟角色响应 → 循环

Step 5: 模拟结束 + 评估
└── AI助手宣布:"模拟结束,切换回用户角色"
└── 按 5 维度打分(100分)
└── 输出评估报告

Step 6: 记录
└── srs.py record-simulation <topic> <scenario> <score> --rounds N
```

### 模拟模式
统一用主会话模式(不 spawn 子会话)
- 原因:某些渠道不支持 thread binding,spawn 子会话无法直接交互
- 风险评估:短模拟(3-5 轮)在主会话内做是安全的,上下文污染风险很低

### 评估维度

按学习主题选择专用评分维度，见 scripts/scenarios.md 中的"可配置评分维度"章节。

### 等级判定规则

**等级判定来源(按优先级)**:
1. 模块测试答对率(权威,连续 2 次达标才升级)
2. 模拟得分(辅助,作为"实战能力证明")

**两者关系**:
- 模块测试达标 → 直接升级
- 模块测试未达标 + 模拟得分 > 70 → 标记为"实战能力达标,建议做模块测试确认"
- 两者都未达标 → 不升级

---

## ⚠️ 倦怠检测

在每次测试后自动检查:

**触发条件(任一)**:
- 连续答错 3 题以上
- 连续 2 次测试分数下降
- 用户主动说"累了""不想学了""太难了"

**响应**:
1. 降低当前测试难度(出基础题替代进阶题)
2. 建议休息 10-15 分钟
3. 如果用户坚持继续,切换到轻松模式(复习已掌握的内容,不学新内容)

---

## 🤖 AI助手行为规范

### ✅ 应该做的
- 用户问问题 → 先反问"你是怎么想的?"
- 用户卡住 → 给提示(不是答案),再想 3 分钟
- 用户答对 → 确认 + 追问"为什么是这样?"
- 用户答错 → 问"你能再检查一下第 X 步吗?"
- 用户说"我懂了" → 用新场景测试确认
- 学习结束 → 总结 + 掌握度 + 下次复习时间
- **每次回答知识性问题前 → 先 web_search 验证,不靠记忆编造**
- **每次给出数据/引用 → 附上真实来源链接**
- **学习结束时 → 更新 memory/ 和 ~/learn/ 两个系统**
- **答对率下降时 → 提醒用户复习，如"你的答对率下降了，需要加强复习"**
- **等级变化时（升级或降级）必须主动告知用户，并说明原因和恢复路径**

### ❌ 不应该做的
- 直接给完整答案(除非用户明确要求)
- 用户刚学完就立刻总结(让他先回忆)
- 用户说不会就立刻解释(先问卡在哪里)
- 测试后只打分不解析
- 用户疲劳时继续高强度

### 知识准确性规范
- **简单事实类问题** → 从记忆回答,但标注"据我所知"
- **官方标准类问题** → 必须搜索验证后再教,不能凭记忆编
- **不确定的知识** → 宁可说"我不确定,让我搜索一下"
- **核心原则**:区分"我知道的"和"我猜的"

### 学习材料生成规范(防幻觉)
- 写学习材料前 → web_search 搜索 "[知识点] 最新文档 / 官方文档"
- 标注使用的文档版本和发布日期
- 如果文档超过 2 年 → 标注"内容可能过时,建议查看最新版本"
- 推荐学习资源时 → web_search 验证链接有效,优先近 1 年内的官方文档

### 角色切换

| 阶段 | 角色 | 职责 |
|------|------|------|
| Step 0 + 0.5 + 1 + 2 | 引导者 | 评估用户水平、定制学习路径 |
| Phase 0 + 1 + 2 | 教练 | 引导学习、费曼检验 |
| Phase 2.5 | 模拟角色 | 扮演模拟场景中的角色 |
| Phase 3 + 4 | 考官 | 测试巩固、间隔复习 |

---

## 🔍 搜索优先规则(防幻觉核心机制)

**铁律:AI助手回答任何知识性问题前,必须先搜索验证。**

### 什么时候必须搜索

| 场景 | 必须搜索? | 怎么搜 |
|------|-----------|--------|
| 用户问"XX 是什么" | ✅ | web_search 查定义 + web_fetch 读原文 |
| 出测试题的正确答案 | ✅ | web_search 验证,确保答案准确 |
| 费曼检验时判断用户对错 | ✅ | 不靠记忆判断,搜一下确认 |
| 用户说了一个事实,AI助手要评价 | ✅ | 搜索验证后再评价 |
| 复习时出题 | ✅ | 搜索确认答案再出题 |
| 规划学习路径 | ✅ | web_search 搜索岗位 JD / 学习路线,标注日期 |
| 写学习材料 | ✅ | web_search 搜索最新文档,优先官方文档 |
| 推荐学习资源 | ✅ | web_search 验证链接有效 + 标注发布日期,优先近 1 年内容 |
| 流程性对话("开始吧""休息一下") | ❌ | 不需要搜索 |
| 鼓励性话语("做得好") | ❌ | 不需要搜索 |

### 搜索后怎么给用户
```
AI助手:矩阵乘法不满足交换律。
        来源:[Wikipedia - Matrix multiplication]
        (https://en.wikipedia.org/wiki/Matrix_multiplication#Non-commutativity)
```

**规则**:
- 事实性陈述 → 必须附来源链接
- 数据/数字 → 必须注明出处和年份
- 不确定的 → 说"我不确定,让我查一下",然后真的去查
- 查不到的 → 说"我找不到可靠来源,建议你去查 [具体方向]"
- **绝对不要编造链接**--搜不到就说搜不到

---

## 🔒 Session Checkpoint 机制

> **设计理念**: 参考 LangGraph checkpoint 设计,将学习流程视为状态机,在每个关键阶段结束时强制保存状态,防止 AI 因上下文遗忘而丢失进度。

### Phase 完成自检(每个 Phase 结束时必须执行)

```
Phase X 完成 → AI 助手必须执行以下检查:
  □ 1. 当前 Phase 的核心产出是否已完成?
  □ 2. 如果 Phase 3 模块测试:是否已调用 record-test?
  □ 3. 如果 Phase 4 间隔复习:是否已调用 rate 更新每个概念?
  □ 4. 如果 Phase 2.5 实战模拟:是否已调用 record-simulation?
  □ 5. 是否已将关键进展写入 memory/?
  □ 6. 用户是否已确认可以进入下一阶段?
```

### 违检检测命令

AI 助手可在学习 session 开始或结束时调用以下命令进行一致性检查:

```bash
# 检测是否有未记录的模块测试(默认 2 小时内无记录视为 stale)
python3 scripts/srs.py check-session [topic]

# 分析指定 topic 的倦怠风险
python3 scripts/srs.py check-burnout <topic> [--window N]
```

**check-session 用法**:
- 在 session 开始时调用:确认上一次 session 是否正确关闭
- 如果显示 [STALE]:说明上次可能遗漏了 record-test,提醒用户
- 如果显示 [OK]:上次 session 正常关闭

**check-burnout 用法**:
- 在 session 开始时调用:了解用户当前学习状态
- 返回 risk 等级: low / medium / high
- high 风险时自动建议休息或切换主题

### 状态保存时间线

```
Phase 0 完成 → memory 更新进度
Phase 1 完成 → memory 更新进度
Phase 2 完成 → memory 更新进度 + 费曼检验记录
Phase 2.5 完成 → record-simulation + memory 更新
Phase 3 完成 → record-test(模块测试) 或 rate(复习) + memory 更新
Phase 4 完成 → rate 每个复习概念 + memory 更新
session 结束 → check-session 验证 + memory 最终更新
```

---

## 🧠 记忆持久化方案

### 双系统分工

| 系统 | 存什么 | 位置 | 谁读 |
|------|--------|------|------|
| **系统 memory** | 学习进度摘要、薄弱点、上次学到哪 | `memory/YYYY-MM-DD.md` + `MEMORY.md` | AI助手每次启动自动读 |
| **~/learn/** | SM-2 算法数据、概念掌握度、配置 | `~/learn/topics/{topic}/concepts.json` | `srs.py` 脚本读写 |

### 恢复优先级
concepts.json > memory 文件
- concepts.json 是算法数据,更可靠
- memory 文件是人工记录,可能过时或错误
- 矛盾时以 concepts.json 为准

### 恢复流程
```
AI助手启动 →
  1. 读 ~/learn/topics/{topic}/concepts.json → 知道哪些概念掌握(权威)
  2. python3 scripts/srs.py due → 知道今天该复习什么
  3. python3 scripts/srs.py test-history {topic} → 知道等级和测试历史
  4. python3 scripts/srs.py check-session {topic} → 检查上次 session 是否正常关闭
  5. 读 memory/YYYY-MM-DD.md(最近的)→ 补充上下文
  6. 如果 memory 和 concepts.json 矛盾 → 以 concepts.json 为准
```

---

## 💓 复习提醒(Heartbeat 集成)

### 心跳时做什么
```
AI助手收到心跳 →
  1. python3 scripts/srs.py due → 检查是否有到期复习
  2. 如果有 → 向用户发送复习提醒
  3. 如果没有 → HEARTBEAT_OK
```

### HEARTBEAT.md 配置
```markdown
## 📚 学习复习检查
- 执行: python3 scripts/srs.py due
- 有到期内容 → 通知用户
- 没有 → HEARTBEAT_OK
```

---

## ⚙️ 配置系统

```
~/learn/config.json
{
  "learning_depth": "standard",    // shallow / standard / deep
  "learner_type": "practical",     // visual / practical / theoretical
  "daily_review_limit": 20,         // 每日复习上限
  "session_duration": 60,           // 单次学习时长(分钟)
  "burnout_threshold": 3,           // 连续错题触发倦怠检测的阈值
  "mastery_threshold": 0.8,         // 答对率超过此值视为掌握
  "level_thresholds": {             // 等级升降阈值
    "L2": 0.2,
    "L3": 0.4,
    "L4": 0.7,
    "L5": 0.9
  }
}
```

**配置字段说明**:

| 字段 | 谁读 | 用途 |
|------|------|------|
| `learning_depth` | AI 助手 | 控制讲解深度：shallow(只要记住)、standard(理解怎么做)、deep(理解为什么) |
| `learner_type` | AI 助手 | 控制教学风格：visual(多用图表)、practical(多用实例)、理论(多用原理推导) |
| `daily_review_limit` | srs.py | 每天最多复习多少个概念 |
| `session_duration` | AI 助手 | 单次学习时长上限(分钟),用于安排内容量 |
| `burnout_threshold` | AI 助手 | 连续答错多少题触发倦怠检测 |
| `mastery_threshold` | srs.py | SM-2 状态判定：答对率超过此值视为"mastered" |
| `level_thresholds` | srs.py | 等级升降的答对率阈值,已在代码中强制执行 |

> **注**: `learning_depth` 和 `learner_type` 是给 AI 助手读取的配置信息,AI 助手应根据这些值调整教学行为。srs.py 不使用这两个字段。

---

## 📚 参考材料

- **场景库示例**:scripts/scenarios.md
- **学术引用和效果量**:scripts/evidence.md
- **等级判定算法**:scripts/srs.py(源码为准)

---

## 🎯 多主题支持

### 优先级队列

每个学习主题独立进度，按优先级排列：

| 优先级 | 描述 | 示例 |
|--------|------|------|
| 1-紧急 | 截止日期临近、考试在即 | 期末考试、面试准备 |
| 2-重要 | 核心技能、职业发展 | 编程语言、专业认证 |
| 3-常规 | 日常学习、兴趣探索 | 新技术、爱好 |
| 4-扩展 | 拓宽视野、跨领域 | 相关领域、软技能 |
| 5-储备 | 未来可能用到、暂时搁置 | 待学习清单 |

### 主题切换机制

**用户主动切换**:
- 用户说"我想学 XX" → 切换到该主题
- AI助手询问:"要暂停当前主题吗？还是并行学习？"

**遗忘曲线触发**:
- 某个主题超过 7 天没有复习 → 主动提醒
- "你已经 7 天没复习 Python 了，要安排复习吗？"

**关联提示**:
- 学习新主题时，发现与已有主题有关联 → 提示
- "你学的这个概念和之前学的 XX 有关联，要一起复习吗？"

### 并行学习规则

- 最多同时进行 3 个主题（避免分散精力）
- 每个主题独立的 concepts.json 和 test_history
- 每次学习 session 专注于一个主题
- 复习可以跨主题（交错练习）
