---
name: study-plan
license: Apache-2.0 (adapted from anthropics/claude-for-legal, law-student/skills/study-plan + law-student/skills/session; complete terms in LICENSE.txt)
description:
  制定/更新长期学习计划——分阶段、按薄弱程度分配学习时间、每天的学习安排，
  并且根据实际练习结果自适应调整；也支持跑一次聚焦N题/N卡片的学习小节，
  把结果记入计划。Use when 用户说"帮我做个学习计划""安排一下复习进度"
  "这门课/这场考试该怎么复习""来10道题练一下并更新我的计划"，或想知道
  "今天该学什么""进度怎么样"。
metadata:
  origin: 阶段划分方法(学习期/刷题期/复习期)、按薄弱程度加权分配时间、
    生活约束现实性核验(强制询问)、备考课程"补充vs替代"二选一决策、
    冲刺模式(临近考试<4周)、session_history 自适应调整机制，
    改编自 anthropics/claude-for-legal 的 law-student/skills/study-plan 与
    law-student/skills/session（Apache-2.0）；已移除全部美国司法考试
    (NCBE/NextGen/UBE/MBE/MEE)相关内容，替换为通用的考试/学期备考场景
---

# Skill: study-plan

坐下来学习却不知道该学什么，是几周时间悄悄溜走的常见原因。这个技能负责
搭一份计划——距考试还有几周、每天几节课、每周哪些学科、用什么方法——然后
根据用户实际完成的练习结果动态调整。是一份活的计划，不是一次性的日历
导出。

它也给 `flashcards`、`weak-point-drill`、`outline-builder` 这些技能提供
一份共享的进度记录，这样用户每次打开对话不用被反复问"今天想学什么"。

## 置信度纪律

计划是判断，不是教条。清楚标出哪些是估算：

- **每个知识点的时间估算**是一般性参考（基于典型的学习节奏），标注为
  估算——用户实际的学习速度会不一样。
- **学科权重分配**来自用户自己报告的薄弱环节和实际练习记录，这部分有
  把握。
- **冲刺模式下的高频考点优先级**基于"哪些内容历史上更容易考/更基础"这类
  一般性经验，任何"这个肯定会考"的说法都要标 `[不确定——历史频率不是
  预测]`。

## 工作流程

### 第一步：明确是为什么做计划

> 我们是为什么制定这份计划？
>
> 1. **一场具体的考试**（有明确日期，比如期末考、资格考、语言考试）
> 2. **一段学期/学习周期的整体节奏**（背诵、刷题、复习交替进行，没有单一
>    的终点考试）

按用户的回答确定锚点日期。

### 第二步：逐项收集信息，一次问一个，等回答

**逐个问，等回答。** 不要一次性把所有问题堆在一起丢给用户。

- **考试日期：** 确认了吗？
- **要覆盖的学科/知识点：** 参考大纲/教学计划，和用户确认"有没有要加/去掉
  的"。
- **最擅长的学科：** 优先级最低，仍然复习，但不用重点刷题。
- **最薄弱的学科：** 优先级最高，分配更多学习小节。
- **每周能投入的小时数：** 要现实，不要理想化。"我能做20小时"和"我能连续
  8周每周做20小时"是两回事，问用户实际能维持多久的强度。
- **生活约束现实性核验——必须问，不能跳过。** 用户给出小时数之后，问
  （一次一个问题，不要跳）：

  > 你说每周[N]小时。在我搭计划之前，说说你这周还有什么安排——工作/上课
  > (每周几小时)、家庭(带娃、照顾家人)、通勤、锻炼、其他占用时间的事。
  > 计划应该适配你的生活，而不是反过来。一个跟不上的计划，比一个轻一点
  > 但能坚持下来的计划更糟。

  等用户回答，再核对这个小时数现不现实：

  > 这相当于每个学习日[X]小时，算上[工作/家庭/通勤/其他]。按我的经验这
  > [现实/偏紧/不现实]。要不要在我搭计划前调整一下每周小时数目标，还是
  > 先按这个来，看第一周实际情况再说？

  即使用户之前已经说过一个目标小时数，这一步也不能跳过——之前说的是
  "想要多少"，这一步核实的是"能不能坚持"。如果核实后数字更低，用更低的
  数字搭计划，并在 `confidence_flags` 里记下这次调整。

  如果用户拒绝聊生活细节（"直接搭就行"），尊重这个选择，但加一条
  `confidence_flags`："未做生活约束核验；计划假设每周[N]小时可持续，
  如果第2周结束时执行率低于[X]%，重新评估。"
- **偏好的学习方式：** 多选。刷题/论述/记忆卡片/搭大纲/定向练习/重读材料。
  按用户说的实际会去做的方式来分配安排，而不是理论上最优但用户不会执行
  的方式。
- **每周休息天数：** 休息日很重要。排满7/7天的计划通常撑不过第三周。

### 第二步半：如果用户在跟一门现成的备考课程/教材体系

如果用户已经在跟一套现成的备考课程（网课、教材配套计划表等），这套计划
本身就有一个逐日的安排。这个技能的计划必须在两个角色里选一个——不能在
不把用户拖垮的前提下和现成课程并行跑两套完整课程。

问一个问题，等回答：

> 你说在跟[课程/教材]的进度表。这份计划可以扮演两种角色，选一个：
>
> 1. **补充。** 现成课程是主线，这份计划只负责补：薄弱学科额外加练习、
>    定向出题、记忆卡片循环。不重建现成课程的日程表，只是叠加在上面。
> 2. **替代。** 不跟现成课程的进度表了（可能因为节奏不适合你的生活），
>    这份计划从头搭完整安排——学科、时间、阶段、日程，你放下现成的
>    进度表。
>
> 不要两个都选。两套完整课程互相打架，是很多人在第4周崩掉的原因。

等回答，记入计划：`prep_course_mode: 补充 | 替代`。

如果选**补充**：日程安排更轻——只加薄弱学科的定向练习，不重复现成课程
已经覆盖的内容。在 `confidence_flags` 里标注："补充模式——这份计划假设
你在跟[课程]的主线进度，如果落后了告诉我，我们重新规划。"

如果选**替代**：按下面的完整流程搭计划。

如果用户没有跟任何现成课程，跳过这一步。

### 第三步：搭日程

从今天到考试日期算出剩余周数，然后：

**正常模式（距考试4周以上）：**
- 按阶段划分：
  - **学习期**（前~60%时间）：每3-5天一个学科，搭大纲/读材料为主，
    穿插记忆卡片和少量练习。
  - **刷题期**（接下来~30%）：加大练习量，各学科轮换，逐步接近考试
    的真实条件（限时、闭卷等）。
  - **复习期**（最后~10%）：聚焦练习记录里显示的薄弱子知识点，做一两次
    完整模拟，强项轻量回顾即可。
- 按薄弱程度分配时间：薄弱学科分到的时间大约是强项学科的2倍。
- 按天排：哪个学科、用什么方法、多长时间。给用户实际生活留出余量。

**冲刺模式（距考试不足4周）：**
- 明确告知："距考试不到4周了，这是冲刺模式——计划会优先覆盖高频/基础
  内容而不是全面覆盖，会留一些盲区，这是这个阶段的取舍。"
- 二八原则：历史上更常考、更基础的内容优先分配大部分时间，冷门内容
  只做最低限度覆盖。
- 每日安排：每天都有练习量（这个阶段量比什么都重要），隔天一次论述/
  长题练习，每周一次完整模拟。
- 最后2-3天收尾放缓。考前一晚不要安排高强度刷题——这是真实的经验，
  硬扛到考前的人分数反而更差。

### 第四步：写入计划

写入 `~/.octo/learning-data/study-plan.yaml`：

```yaml
plan_type: exam  # 或 semester
exam_date: 2026-07-28
created: 2026-05-08
last_updated: 2026-05-08
weeks_to_exam: 12
hours_per_week: 25
days_per_week: 6
mode: normal  # 或 cram
phases:
  - name: 学习期
    start: 2026-05-08
    end: 2026-06-20
    focus: 搭大纲、记忆卡片、入门练习
  - name: 刷题期
    start: 2026-06-21
    end: 2026-07-18
    focus: 大量练习、论述题、接近真实考试条件
  - name: 复习期
    start: 2026-07-19
    end: 2026-07-27
    focus: 薄弱子知识点回顾、完整模拟
subjects:
  有机化学:
    priority: high  # 薄弱
    weekly_hours: 5
    methods: [练习题, 记忆卡片, 论述]
  # ...
schedule:
  - date: 2026-05-08
    day: 周四
    sessions:
      - subject: 有机化学
        method: 大纲复习
        duration_min: 90
      - subject: 有机化学
        method: 练习题
        duration_min: 60
        n_questions: 25
  # ...
session_history: []  # 由 flashcards / weak-point-drill / study-plan 的 session 模式追加
```

### 第五步：向用户确认

写文件前先用大白话总结（不是直接甩YAML），确认：

> 这是我搭的计划。距[考试]还有[X]周，每周[Y]小时，分[Z]天。薄弱学科
> （比如有机化学）分到2倍的时间。分三个阶段：学习期到[日期]、刷题期到
> [日期]、最后[N]天复习期。前两周已经排到每天，之后先按周分配，等你
> 实际做完小节我再填进逐日安排——这样计划会跟着你的实际进度走。
>
> 感觉合适吗？太紧还是太松？漏了哪个学科？

按回答调整，再写入文件。

## `--session <subject> <n>`：跑一次聚焦小节

用户说"来10道有机化学的题"、"做个5张卡片的小节"这类需求时用这个模式。

1. 解析学科和N。缺失就问："哪个学科，多少题/卡片？（比如'有机化学 10'
   或'合同法 5 --论述'）"
2. 读取 `~/.octo/learning-data/study-plan.yaml`（如果存在），看
   `session_history` 里这个学科之前哪些子主题错得多，按此加权。
3. 按方式分流：
   - 练习题模式：加载 `weak-point-drill` 技能，跑N道题。
   - 记忆卡片模式：加载 `flashcards` 技能，跑N张卡的 `--drill` 模式。
4. 逐题/逐卡呈现，答完给出对错解析。
5. 小节结束，写入结果：
   - 如果 `study-plan.yaml` 存在：追加到 `session_history`（格式见上面
     `flashcards`/`weak-point-drill` 里的示例）。
   - 不存在就写到 `~/.octo/learning-data/session-history.yaml`。
6. 汇报：得分/正确率、错题子主题、这次的薄弱子主题、和之前小节的对比
   （如果历史记录有2次以上）、计划接下来建议学什么。

## 计划的自适应调整

每次 `flashcards`/`weak-point-drill` 的小节结束后，结果会追加到
`session_history`。下次运行 `study-plan`（或任何技能检测到计划该更新了）
时：

- 得分持续偏低的学科，在 `priority`/`weekly_hours` 里往上调。
- 学科内部的薄弱子主题，标记为下次该学科小节的重点。
- 如果用户进度落后于计划（该完成的小节没出现在历史记录里），调整：
  压缩覆盖范围，或者标出差距直接问用户。
- 如果用户进度超前，腾出时间给薄弱学科做更深入的练习。

## 模式

`--build`（默认，没有计划时）——从头搭一份新计划
`--update`（默认，已有计划时）——重读 `session_history`，调整权重，
填入接下来的逐日安排
`--status`——今天/本周该学什么，得分趋势，哪些学科在掉队
`--cram`——即使距考试超过4周，也强制切冲刺模式（用户主动要求时用）

## 这个技能不做的事

- **保证考出好成绩。** 计划是脚手架，具体执行在用户自己。
- **预测考试内容。** 冲刺模式的高频优先级基于历史经验，历史上常考不等于
  这次一定考。
- **替代用户已经在跟的现成课程节奏。** 如果在跟一套现成的备考课程，这份
  计划可以补充，不要两套完整课程互相打架。
- **替用户安排生活。** 每周能投入的时间是用户自己说的。如果高估了，
  计划会在第2周就跟不上——生活约束核验就是为了防止这个。
