# Resume Screening

> 从本机 macOS Mail 里导出某个岗位的应聘邮件（BOSS直聘等转发的简历附件），逐份阅读并按 A/B/C 档评估，提取联系方式，生成可直接发给 HR 的 PDF 评估报告（附原始简历）。当用户说"看一下邮箱里应聘 XX 的简历""筛选简历""整理简历给 HR""简历评估报告"时使用。

- Skill: `maweis1981/resume-screening` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds@latest add maweis1981/resume-screening`
- Raw SKILL.md: https://api.skillmd.com/api/skills/maweis1981/resume-screening/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Docs & Writing
- Author: maweis1981 (https://skillmd.com/u/maweis1981)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/maweis1981/resume-screening

---


# 简历筛选 → HR 评估报告

整个流程在本机完成：Mail（AppleScript）→ 提取文本和联系方式 → 通读评估 → 生成 PDF 报告。

脚本目录：`~/.claude/skills/resume-screening/scripts/`（下文记作 `$S`）。
工作目录：放在会话 scratchpad，例如 `$W=<scratchpad>/screening-<岗位>`。

## 0. 明确输入
- **岗位关键词**：匹配邮件标题，逗号分隔，要覆盖各种写法，例如 `ai开发,AI人工智能开发`。不要用 `AI` 这种太短的词，会误中其他标题。
- **时间范围**：默认最近 30 天。
- **岗位要求/薪资预算**：优先从标题里读，例如 `重庆10-15K`。评估时把薪资匹配也算进去。
- 用户没说清楚岗位时才问，其余都用默认值。

## 1. 导出邮件
```bash
mkdir -p "$W/export"
osascript $S/export_mail.applescript "$W/export" "ai开发,AI人工智能开发" 30
```
- 每封邮件导出为 `export/<邮件id>/body.txt` 加所有附件；返回值是清单，每行包含 id、账户、日期、标题。
- `~/Library/Mail` 没有完全磁盘访问权限，所以只能走 AppleScript。第一次运行时 macOS 会弹窗请求控制 Mail，需要用户点允许。
- 邮件多时比较慢，timeout 设为 600000。
- 先看一眼清单，确认标题都是目标岗位；混进来的无关岗位直接删掉对应目录。

## 2. 提取
```bash
python3 $S/extract.py "$W/export" "$W/candidates.json"
```
- 解析 BOSS直聘通知里的姓名/性别/年龄/城市/学历/年限/期望薪资/当前公司，从简历里提取电话和邮箱，并把 BOSS 水印清洗掉，写入 `resume_clean.txt`。
- 同名重复投递只保留最新的一封。
- 标了 `[文本过少]` 的是图片型简历，要用 Read 直接读原 PDF。
- 联系方式没提取到的，在 `resume_clean.txt` 里搜 `电话|手机|邮箱|@`，手动补进 evaluation.json。

## 3. 逐份通读并评估
**每份简历都要完整读完**：用 Read 读 `resume_clean.txt`，可以并行读多份。不能只看摘要或前几行。

评估维度（按岗位调整权重）：
1. **岗位核心能力深度**：以 AI 应用开发为例，看 RAG/Agent 是否真正落地，有没有做过评测闭环（金标、bad case、指标），部署和性能优化是否具体。
2. **可信度**：数字是否具体且合理，项目描述是否像亲手做过的。
3. **匹配度**：方向（应用开发、算法、前端、RPA 等）、年限、城市、薪资预算。
4. **可验证的加分项**：GitHub/开源 Star、论文、真实用户量。

常见风险信号，发现就写进"风险/核实"：
- **工作时间和在校时间重叠**：毕业前就算工作年限，或者多段经历时间交叉。
- **复制粘贴痕迹**：项目领域前后不一致，例如电商项目里出现"医学文本分类"。
- **术语堆砌**：满篇"精通"、MCP/A2A/AutoGen 全都有但没有细节；不同候选人的项目高度雷同。
- **明显夸大**：例如小公司 10万+ QPS、每个指标都提升几十个百分点。
- **方向不符**：纯后端/前端/RPA 投 AI 岗；或者本人意向是算法岗。
- **期望薪资明显超预算**，或人在异地。
- **合规灰色地带**：群控、账号池、Hook 微信之类。

分档：**A 优先面试**（贴岗且可信）/ **B 备选**（有亮点但有明显短板）/ **C 不推荐**（写清原因，一句话即可）。

## 4. 写 evaluation.json
路径 `$W/evaluation.json`。报告读者是 HR，文字要简洁、口语化，技术名词要附带解释：
```json
{
  "title": "AI开发工程师 简历评估报告",
  "role": "AI开发工程师（重庆 10-15K）",
  "source": "Mail「工作邮箱」收件箱 · BOSS直聘 · 8/26–9/14 · 共 19 份",
  "generated": "2026-09-14",
  "criteria": "岗位核心能力深度、项目可信度、方向匹配、薪资匹配",
  "recommendations": ["先约 X、Y……", "Z 面试前电话核实工作时间线"],
  "interview_questions": ["……"],
  "attach_tiers": ["A", "B"],
  "candidates": [
    {"id": "26400", "tier": "A", "expect": "15-20K",
     "headline": "硕士(重庆邮电) · 1年 · 传音 AI Agent 开发",
     "highlights": ["……", "……"], "risks": ["……"]}
  ]
}
```
- `id` 对应 candidates.json 里的 id。姓名、电话、邮箱、期望薪资、PDF 路径会自动合并；evaluation 里写了同名字段则覆盖，例如 BOSS 昵称和真名不一致时写 `"name"`，手动补的联系方式写 `"phones"`。
- `candidates` 的顺序就是报告里的顺序，同一档内把更推荐的放前面。
- C 档只需要写 `risks`，作为不推荐原因。

## 5. 生成 PDF
```bash
python3 $S/build_report.py "$W/candidates.json" "$W/evaluation.json" "<输出目录>/<岗位>_简历评估报告.pdf"
```
- 报告包含：概览、结论与建议、A/B 档联系方式速查表（带附件页码）、每人的评估卡片、C 档原因表、面试问题；后面按顺序附上 A/B 档原始简历 PDF。加 `--no-attach` 则不附简历。
- 依赖：Google Chrome（HTML 转 PDF）、poppler 的 `pdfinfo`/`pdfunite`（`brew install poppler`）。
- 输出目录：用户没指定时，放在当前工作目录下的 `<岗位>_简历筛选/`。
- **生成后必须核对**：用 Read 读输出 PDF 的前几页，确认中文、表格、页码显示正常，联系方式没有串行或错位。

## 6. 回复用户
在终端里汇报：A/B/C 档各几人，每人一句话结论，PDF 路径，以及需要人工核实的点。

**隐私**：报告里有候选人手机号和邮箱。不要发布成 Artifact，不要上传或发送到任何外部服务（包括代发邮件），除非用户明确要求。

