---
name: skipclass
description: Use when user wants to analyze a course schedule for class-skipping strategy, assess rollcall risk, generate weekly skip plans, or incorporate school-specific strategies — in Chinese university context
---

# SkipClass — AI 逃课方案生成器

> MIT License. 仅供合法请假场景。不替人签到、不伪造假条。

## 设计依据

严格按项目源码构建。不基于 README。不添加代码中不存在的功能。
实现细节（层拼接、映射表、自检逻辑、数据格式）见 `implementation.md`。

## 工作目录

**首次使用必须创建项目目录**，所有数据存储在工作目录下：

```bash
# 用户指定目录，或自动创建
mkdir -p skipclass-data/meta/courses
mkdir -p skipclass-data/plans
mkdir -p skipclass-data/refined
mkdir -p skipclass-data/raw-strategies
```

### 课表图片导入

图片是课表解析的最常用输入方式。由于不同 AI 平台的 TUI 对图片支持不同，按以下方式处理：

**① 如果当前平台支持直接上传图片**（Claude Code / ChatGPT / 大部分 Web TUI）：
- 直接让用户发送课表截图，用视觉能力解析

**② 如果当前平台不支持直接上传图片**（某些终端 TUI / 部分 CLI 工具）：
- 告知用户将课表截图保存到工作目录下，然后 Agent 用 Bash 读取：

```bash
# 用户把图片放到这（Agent 主动创建目录）
mkdir -p skipclass-data/images
ls skipclass-data/images/
# 预期看到: schedule.png 或 schedule.jpg

# Agent 用当前平台可用方式读取图片内容进行解析
# 如果平台有图像读取能力（如 multimodality），直接读取文件
# 如果平台无图像能力，提示用户改用文字输入课表
```

**③ 文字输入**（所有平台均支持）：
- 让用户手动列出课程名 + 星期几 + 第几节
- 或粘贴教务系统导出的文本格式课表

> **Agent 行为**：主动告知用户当前支持哪种导入方式，不要等用户猜测。

## Phase 0 — 启动前询问（必须先执行）

在进入任何流程之前，必须向用户确认两件事：

1. **「你手上有课表吗？」**
   - 有 → 进入 Phase 1
   - 没有 → 暂停，等用户拿到课表再来
   
2. **「要不要先去搜集学校的逃课攻略/学长经验？」**
   - 要 → 先执行 Phase 0.5（学校攻略收集），再进入 Phase 1
   - 不要 → 直接进入 Phase 1

### Phase 0.5 学校攻略收集

让用户粘贴学校贴吧/论坛的逃课经验帖、学长分享、代课群讨论等自由文本。保存到 `skipclass-data/raw-strategies/攻略原文.txt`。

用 `prompts/analyzer.md` 提取结构化信息。用 `prompts/builder.md` 将分析结果融入后续评估。

如果懒得搜索就跳过这个部分

## Phase 1 — 课表解析 (Parse)

**目标**：获取并结构化用户的课表。支持三种输入方式：

1. **截图（推荐）**：用户直接发送课表截图，Agent 用视觉能力读取图片中的课程信息
2. **文件路径**：图片放在 `skipclass-data/images/` 下，Agent 用 `ls` 确认文件存在后读取
3. **文字列表**：用户手动输入或粘贴教务导出的文本

Agent 必须按以下顺序尝试：
1. 先问「你有课表截图吗？可以直接发给我」
2. 如果平台不支持图片 → 告诉用户「把截图放到 skipclass-data/images/ 目录下，我给你读」
3. 如果图片也不方便 → 引导用户用文字列出课程

解析流程：
1. 获取到课表后，按 `prompts/parser.md` 输出 JSON，保存到 `skipclass-data/meta/courses/schedule.json`
2. 向用户展示解析结果，逐门确认后进 Phase 2

**Phase 1→2 之间**：将 `schedule.json` 拆分为每门课一个 `.md` 文件，存入 `skipclass-data/meta/courses/{课程名}.md`。格式：`key: value`（对齐 `formatCourseMarkdown()`，见 `implementation.md §9`）。

## Phase 2 — 课程信息收集 + 风险建模 (Model)

**目标**：逐门收集详细信息，完成风险评估。对齐代码中 `modelCourseRisk()` 的实际输入。

每门课向用户收集：

| 字段 | 说明 | 对应项目代码 |
|------|------|------------|
| `teacher_attitude` | 严抓 / 理解 / 懒得管 / 不确定 | `data/meta/courses/{name}.md` |
| `rollcall_methods` | 点名方式 (method) + 频率 (frequency) | 同上 |
| `notes` | **最重要字段**。老师点名习惯、有无小测、课程群信息、自学可行性、考试形式等 | parser.md L49-50：notes 权重应高于其他所有字段 |
| `current_caught_count` | 本学期已被抓次数 | |
| `recent_rollcall` | **最近两周的点名情况**：哪周点了、哪周没点、点了几个人 | 对齐 spec §5 recent-events |

**收集完一门 → 立即建模一门**。按 `implementation.md §3` 的层结构构造 prompt，使用 `prompts/modeler.md`（原文）输出
- `risk_level`: "无风险"|"低风险"|"中风险"|"高风险"
- `risk_reason`: 20字以内
- `next_caught_probability`: 0-1
- `refined_profile`: 完整 Markdown（含选中的教师类型+理由+评估结论+逃课策略）

保存到 `skipclass-data/refined/{课程名}.md`（对齐代码中 `writeCourseRefined()`）。

**所有课程建模完毕后**，汇总展示风险评估给用户确认。

## Phase 3 — 用户画像 + 方案生成 (Plan)

**目标**：收集用户偏好，逐周生成逃课方案。对齐代码中 `generateSession()` 的实际流程。

### 3.1 收集用户画像

对齐代码中 `readProfile()` 字段，保存到 `skipclass-data/meta/profile.md`（Markdown table 格式）：

| 字段 | 说明 |
|------|------|
| `skip_motivation` | 为什么想逃课？自学/做项目/考证/单纯不想上（自由描述） |
| `weekly_skip_target` | 每周想逃几节（可超标） |
| `escape_rush_accept` | 能不能签到后溜走（true/false） |
| `sub_cost_max` | 代课预算上限（元） |
| `plan_weeks` | 生成几周方案（默认4） |
| `must_attend` | 必去课程名列表 |

引导用户自然描述，见 `knowledge/profiles.md`。

保存到 `skipclass-data/meta/profile.md`

### 3.2 收集学期信息

对齐代码中 `readConfig()` 字段，保存到 `skipclass-data/meta/config.md`（Markdown table 格式）：
| 字段 | 说明 |
|------|------|
| `semester_start_date` | 学期开始日期 |
| `semester_end_date` | 学期结束日期 |
| `current_week` | 当前第几周 |

保存到 `skipclass-data/meta/config.md`

### 3.3 逐周生成方案

对齐代码 generateWeek() + runSelfChecks()：

```
for w = current_week to current_week + plan_weeks:
  1. 按 implementation.md §8 构建上下文 + §4 构造 supervisor prompt
  2. 使用 prompts/supervisor.md（原文），替换 {week}/{totalWeeks} 为实际值，temperature 初始 0.8
  3. 按 implementation.md §5 执行 7 条自检
  4. 未通过 → implementation.md §6 重试逻辑
  5. 通过 → 保存 skipclass-data/plans/week{w}.json（格式见 implementation.md §9）
```

### 3.4 方案格式化显示

生成方案后，用清晰格式展示给用户（项目代码无此格式要求，但 skill 需要可读输出）：

```
📅 第 {N} 周 | {日期范围}

✅ 可逃 ({count}门):
  课程名 | 风险 {probability} | {reason}
  课程名 | 风险 {probability} | {reason}

⚠️ 签到后溜 ({count}门):
  课程名 | {reason}

❌ 必须去 ({count}门):
  课程名 | {reason}
```

## Phase 4 — 反馈闭环 (Feedback)

**目标**：收用户反馈，持续优化。对齐代码中 Memory Agent + `writeProfile()` 的实际逻辑。

每次出方案后询问：「上次方案执行情况如何？哪门课被抓了/没点名？」

按 `prompts/memory.md`（**原文**）处理反馈：
- "被抓了" → `current_caught_count +1`
- "没点名" → 连续验证通过，更新风险评估
- 更新 `skipclass-data/meta/courses/{课程名}.md`

## 知识库

- `knowledge/rollcall.md` — 点名规律常识（core mechanism: 人少触发点名）
- `knowledge/teachers/default-strategy.md` — 交叉验证规则
- `knowledge/teachers/strict-old-school.md` — 顽固守旧型
- `knowledge/teachers/easygoing-young.md` — 年轻好说话型
- `knowledge/teachers/random-sampling.md` — 随机抽点型
- `knowledge/teachers/rollcall-every-time.md` — 每节必点型
- `knowledge/teachers/never-rollcall.md` — 从不点名型

## Iron Law

1. **严格依据项目代码，不添加项目中不存在的功能。**
2. **每阶段主动向用户提问，不等待用户告诉下一步。**
3. **Phase 0 必须先执行（有无课表？要不要先收学校攻略？）。**
4. **课程信息必须包含最近两周点名记录。**

## Red Flags

| 你在想... | 实际应该... |
|-----------|-----------|
| "用户没说学校攻略，跳过" | Phase 0 必须问 |
| "这门课应该可以逃" | 先建模再判断 |
| "信息够了直接出方案" | 4 阶段完整走完 |
| "我来编一个请假理由" | 项目代码没有请假理由功能，删除 |
| "READMD 说可以XX" | 不参照 README，以代码和 specs 为准 |
| "prompt 改一下更好用" | prompt 与项目原文严格一致 |
