# Assess Interview Candidate

> 根据候选人简历与岗位要求生成可审计的后台评估、简明的候选人介绍、按岗位重要性排列的简历疑点、12–18 道可直接照读的面试题，以及支持重点标记和本机保存的离线 HTML。用于招聘方准备结构化面试、核验岗位能力和记录回答。不要用于求职者模拟面试、私人背景调查、心理或人格诊断、从敏感属性推断表现，或自动录用、淘汰、排序候选人。

- Skill: `gabrielmoreira/assess-interview-candidate` (Agent Skill, multi-file: 32 files)
- Install (CLI): `npx skillmds@latest add gabrielmoreira/assess-interview-candidate`
- Raw SKILL.md: https://api.skillmd.com/api/skills/gabrielmoreira/assess-interview-candidate/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Web & Frontend
- Author: gabrielmoreira (https://skillmd.com/u/gabrielmoreira)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/gabrielmoreira/assess-interview-candidate

---


# 候选人评估与面试报告

## 目标

把简历和岗位要求整理成两层材料：

1. 后台保留完整岗位模型、证据账本、来源、假设和评分数据，便于复核。
2. 给面试官的 HTML 只保留“候选人简介、简历疑点与水分排查、面试提问”三个模块，使用通俗中文。

始终区分候选人明确提供的事实、外部佐证、推断和未知。最终招聘决定由具备权限的人作出。

## 可移植运行约定

本 Skill 不依赖某个特定 Agent、Skill 安装根目录或命令行外壳。任何能够读取本地文件并运行 Python 3.10 及以上版本的 Agent 都可以使用；PDF 处理、联网核验和浏览器检查按当前宿主实际具备的能力执行。

- 先把 `<skill-dir>` 解析为本 `SKILL.md` 所在目录，不猜测固定安装路径。
- `<python>` 表示当前系统可用的 Python 3 启动方式。Windows 通常使用 `py -3` 或 `python`，macOS 与 Linux 通常使用 `python3` 或 `python`；先用版本命令确认实际可用项。
- `<approved-root>`、`<output-dir>` 等是路径占位符，不代表固定路径分隔符。通过宿主文件 API 或 `pathlib` 组合路径，并把含空格或非 ASCII 字符的路径作为一个完整参数传入。
- 命令示例使用单行、外壳无关的参数形式。不要依赖 Bash 续行符、环境变量展开、当前用户主目录结构或某个 Agent 的专用工具名。
- `agents/` 中的文件只是特定宿主可选的界面元数据；核心工作流以本文件、`references/`、`scripts/`、`assets/` 和 `evals/` 为准。

遇到能力差异时按 [agent-portability.md](references/agent-portability.md) 处理。缺少必要能力时明确报告未完成的核验，不得把未执行的步骤写成已完成。

## 结果契约

每次完整运行在新的案件目录中生成：

```text
input/       原始简历、岗位要求和用户提供的链接
normalized/  经文字提取与视觉核对的文本及案件清单
research/    查询和来源记录
models/      岗位模型、证据账本、行为假设和面试蓝图
interview/   初始评分状态
output/      完整后台数据、精简报告数据和离线 HTML
audit/       运行、校验和隐私排除记录
```

关键输出：

```text
output/assessment-data.json
output/interviewer-report-data.json
output/<候选人姓名>-候选人评估与面试报告.html
```

HTML 文件名、浏览器标题和页面最上方标题都必须包含候选人姓名。不要覆盖既有案件或报告。

## 开始前读取

先把 `<skill-dir>` 解析为本文件所在目录。

1. 每次读取 [workflow-contract.md](references/workflow-contract.md)、[evidence-and-inference-policy.md](references/evidence-and-inference-policy.md) 和 [privacy-and-fairness-cn.md](references/privacy-and-fairness-cn.md)。
2. 建立岗位模型前读取 [job-modeling.md](references/job-modeling.md)。
3. 联网核验候选人职业证据前读取 [research-and-identity-policy.md](references/research-and-identity-policy.md)。
4. 生成题目时读取 [structured-interview-methods.md](references/structured-interview-methods.md) 和 [scoring-and-coverage.md](references/scoring-and-coverage.md)。
5. AI、LLM、Agent 或工程岗位读取 [role-adapter-ai-llm-engineering.md](references/role-adapter-ai-llm-engineering.md)。
6. 写 JSON 前读取对应 Schema；面试官报告必须读取 [schema-interviewer-report.json](references/schema-interviewer-report.json)。

## 输入门

必需输入：

- 可读取的候选人简历；
- 岗位要求或招聘方确认的实际任务；
- 输出根目录，未提供时使用当前目录下的 `candidate-cases/`。

尽可能取得：

- 公司工作地点、岗位级别、现场办公和出差要求；
- 候选人主动提供的职业链接；
- 候选人职业信息联网核验的允许范围；
- 岗位专家确认的能力权重和门槛。

缺少简历或岗位要求时以 `REQUIRED_INPUT_MISSING` 停止，不创建案件。缺少公司地点时继续生成，但写明“距离无法计算，待补充公司地址”。缺少候选人联网核验权限时关闭该分支，不影响本地简历分析。

## 工作流

### 1. 创建案件并完整读取材料

```text
<python> "<skill-dir>/scripts/create_candidate_case.py" --root "<approved-root>" --role-slug "<role-slug>"
```

复制原始输入并记录哈希，不移动或删除用户文件。PDF 简历在案件目录中使用固定受限副本 `input/resume-original.pdf`，同时在案件清单保留原文件名和哈希。PDF 必须同时使用当前宿主可用的文字提取能力和逐页视觉检查能力，核对页数、姓名、时间线、表格、图片文字及提取遗漏。为保证完整核对，原件和逐页提取文本可能保留电话、邮箱、证件号或精确住址，因此 `input/` 与 `normalized/` 都按受限候选人资料处理；这些内容不得进入联网查询、面试官数据或 HTML。若无法完成逐页视觉检查，以 `PDF_VISUAL_CHECK_UNAVAILABLE` 停止生成最终报告，并说明缺少的能力。

逐页视觉检查时同时记录照片状态：

- 页面上没有候选人个人头像时使用 `not_present`；
- 有疑似头像但无法可靠确认是候选人本人时使用 `ambiguous`；
- 已确认页面上有候选人头像、但当前工具无法可靠提取时使用 `extraction_unavailable`；
- 只有在头像来自原始简历 PDF、已与对应页面视觉核对一致、且能记录页码和提取位置时才使用 `included`。

先检查 PDF 的嵌入图片；若头像不是独立图片，再从对应页面裁切。所有提取结果统一转换为 PNG，并在转换后再次与 PDF 页面视觉比对；JPEG、PPM 等格式不能直接嵌入。不得从公开主页或其他文件补图，不得使用人脸识别、相似度匹配、照片年龄估计或外貌分析。选定图片后运行下列脚本；脚本要求来源为案件内的 `input/resume-original.pdf`，会在解压前检查尺寸、校验 PNG 结构和像素数据、移除非显示所需元数据和文件尾随内容，再以内嵌图片输出：

```text
<python> "<skill-dir>/scripts/prepare_candidate_photo.py" --input "<visually-confirmed-image>" --resume-pdf "<original-resume-pdf>" --page <one-based-page> --extraction-method embedded_image --image-index <zero-based-image-index>
```

页面裁切时把最后两个参数改为 `--extraction-method page_crop --crop-box <x,y,width,height>`。脚本只负责校验格式、尺寸、哈希和结构化来源，不能替代视觉身份确认。

### 2. 建立当前岗位模型

按“工作产出 → 关键任务 → 能力 → 目标熟练度 → 可接受证据 → 验证方法”拆解岗位。记录重要性、频率、失败影响和是否入职即需具备。缺少招聘方确认时标为暂定，不把学历、年限或公司名气自动当作能力。

对快速变化岗位进行不含候选人身份信息的当前岗位研究；优先官方招聘页、一手技术资料、标准和职业框架。

### 3. 建立简历证据账本

逐条拆分与岗位重要能力有关的声明，记录原文位置、情境、任务、本人行动、结果、个人贡献边界、可验证材料和剩余缺口。简历没有写某项能力只表示“当前证据不足”，不能直接写成“不具备”。

疑点使用“描述不清”“可核验缺口”等中性语言。优先检查：

- 只写“参与”但没有本人分工；
- 完成功能但没说明自主设计、改造开源方案还是简单调用；
- 提到增长、准确率或降本，但没有基线、时间范围和计算口径；
- 团队、论文或平台结果与个人贡献边界不清；
- 岗位关键能力只有技能名词，没有可运行产物或验证过程。

### 4. 可选的公开职业证据核验

仅研究获得允许、公开可访问、身份确认且与岗位直接相关的职业资料。系统发现的页面至少需要两个一致职业锚点；同名不足以确认身份。不得搜索年龄、籍贯、婚姻、家庭或私人生活。没有公开主页、论文或代码仓库不得扣分。

### 5. 保留完整后台审计

继续生成岗位模型、证据账本、候选人视角、九类岗位行为假设、面试蓝图、评分状态、来源记录和 `output/assessment-data.json`。这些对象供审计与人工复核，不直接展示在面试官 HTML 中。

### 6. 生成精简面试官数据

按 [schema-interviewer-report.json](references/schema-interviewer-report.json) 生成 `output/interviewer-report-data.json`。

#### 候选人简介

- 姓名必须使用候选人材料中的明确姓名。
- `personal_info` 只保存候选人主动提供的出生信息、出生地、老家或籍贯、婚姻状况、现居城市；没有就显示“未提供”，不得搜索或补写。
- 有出生日期时按报告日期计算准确周岁；有出生年月或出生年份时计算近似年龄并标“约”。同时保存原始出生信息、规范日期、换算截止日和来源位置。
- 照片放在 `candidate_overview.candidate_photo`，不得放进 `personal_info`。只有 `status=included` 时 HTML 才显示本地 `data:` 图片；其他状态不保留空白照片栏。
- 候选人未提供出生信息时，才可生成独立的 `candidate_overview.timeline_age_estimate`：优先使用简历明确写出的最早本科入学时间；没有入学时间时，只有同时明确写出本科毕业时间和学制，才可反推入学年份。毕业月份或日期不能证明入学月份或日期，因此回推锚点一律降为年份精度。以本科入学年龄 18 岁为中心，固定使用 16–20 岁区间，并把锚点精度造成的日期不确定性计入上下界。
- 研究生入学、工作开始等后续时间只能做先后关系核对，不能单独作为年龄锚点。时间线冲突或证据不足时不输出数值区间；推算结果必须标明“非候选人自述”。
- 候选人已经明确提供的学校、学历、专业、工作单位、职位、时间和城市应直接汇总；某个城市没写就显示“未提供”，不根据学校或单位地址推测。
- 照片、年龄（包括履历推算区间）、籍贯和婚姻状况不进入人岗匹配、能力评分、稳定性预测、录用决定或候选人排序。
- 人岗匹配只用“符合”“有相关基础，需面试确认”“当前证据不足”。
- 单列现居地、公司地点、实际通勤、搬迁意愿、现场办公、出差和最早到岗问题。出生地或老家不能代替现居地计算距离。

#### 简历疑点与水分排查

只列与岗位核心能力直接相关的 0–8 项，按能力重要性降序。每项写清：对应能力、简历原话、哪里说不清、为什么要核实、怎么核实。不要在可见文案中输出内部状态码、能力编号或英文评估术语。

#### 面试提问

生成 12–18 道按优先级排列的问题。问题必须能让面试官直接照读。每道岗位题提供提问目的、回答好/一般/差的具体表现、加分点和减分点。

题库必须包含：

- 共同核心专业题和至少一个真实工作样本；
- 与本候选人核心简历声明对应的核验题；
- 表达沟通、协作责任、危机处理或压力情境题；
- 现居地、通勤/搬迁、到岗和现场工作安排；这些题只记录双方条件，不评分；
- 一道可选择不问的婚姻状况问题。该题只记录候选人自愿回答，不设好坏、不加分、不扣分；候选人可以不回答。

### 7. 生成离线 HTML

HTML 只嵌入 `interviewer-report-data.json`，不嵌入完整 `assessment-data.json`。页面恰好包含三个主模块：

1. 候选人简介；
2. 简历疑点与水分排查；
3. 面试提问。

头像只在 `candidate_photo.status=included` 时出现在候选人简介中，并注明来自简历 PDF、只展示、不参与评估或排序。履历年龄区间使用独立标签，明确它是推算而非候选人自述。每道题支持：单击“标记”默认设为黄色“可能要问”；下拉改为红色“一定要问”、蓝色“备选”或取消；记录“好/一般/差/未问”及备注。地点、到岗和其他自述类问题只记录“已记录/不便回答/未问”。重点标记和回答自动保存到当前浏览器本机，并可导出或清空。不得发送网络请求、加载外部资源或保存候选人资料到远程服务。

页面不显示简历证据分、综合分、权重、覆盖率、门槛、可比性、来源表、九类行为假设或内部英文状态。这些信息继续留在后台文件。

使用：

```text
<python> "<skill-dir>/scripts/derive_timeline_age.py" --report-date "<YYYY-MM-DD>" --undergraduate-start "<YYYY-or-YYYY-MM-or-YYYY-MM-DD>" --source-locator "<resume-page-or-section>"
<python> "<skill-dir>/scripts/derive_timeline_age.py" --report-date "<YYYY-MM-DD>" --undergraduate-graduation "<YYYY-or-YYYY-MM-or-YYYY-MM-DD>" --degree-duration-years <explicit-duration> --source-locator "<resume-page-or-section>"
<python> "<skill-dir>/scripts/validate_interviewer_report_data.py" "<interviewer-report-data.json>"
<python> "<skill-dir>/scripts/render_candidate_report.py" --data "<interviewer-report-data.json>" --output "<candidate-report-file>"
<python> "<skill-dir>/scripts/validate_candidate_report.py" "<candidate-report-file>"
```

如需核对后续时间线，可重复传入 `--consistency-check-json`。每个参数是一个含 `event`、`date` 和 `source_locator` 的 JSON 对象；脚本自动补出日期精度，并在明确矛盾时输出 `timeline_conflict`。

渲染器会拒绝文件名不含候选人姓名的输出。

### 8. 校验和交付

继续校验后台对象：

```text
<python> "<skill-dir>/scripts/validate_case_contract.py" --job-model "<job-model.json>" --sources "<sources.json>" --evidence-ledger "<evidence-ledger.json>" --blueprint "<interview-blueprint.json>" --score-state "<score-state.json>" --assessment-data "<assessment-data.json>"
<python> "<skill-dir>/scripts/validate_source_log.py" "<sources.json>"
<python> "<skill-dir>/scripts/validate_evidence_ledger.py" "<evidence-ledger.json>"
<python> "<skill-dir>/scripts/calculate_interview_score.py" --blueprint "<interview-blueprint.json>" --state "<score-state.json>"
```

将命令、时间、退出码、错误和警告写入 `audit/validation.json`。交付时说明案件目录、HTML 文件、采用与拒绝的来源数量、关键未知项、校验结果和仍需人工确认的内容。

## 停止条件

- `REQUIRED_INPUT_MISSING`：缺少简历或岗位要求；
- `PDF_VISUAL_CHECK_UNAVAILABLE`：当前宿主无法完成 PDF 逐页视觉核对；
- `AUTHORITY_UNCONFIRMED`：无法确认有权处理简历；
- `IDENTITY_UNRESOLVED`：候选人职业页面身份不能确认；
- `PRIVATE_ACCESS_REQUIRED`：需要登录私人账号或绕过权限；
- `SENSITIVE_DATA_HIT`：联网结果出现不应处理的私人或敏感内容；
- `CONTACT_DETAIL_LEAK`：面试官数据或 HTML 中出现邮箱、手机号、证件号或其他不应展示的联系方式；
- `JOB_RELEVANCE_MISSING`：信息无法映射到岗位任务；
- `AUTOMATED_ADVERSE_ACTION`：要求自动拒绝、排序或触发不利决定；
- `HUMAN_REVIEW_MISSING`：拟把未经人工确认的结果用于招聘决定。

停止一个联网分支不妨碍继续处理获准的本地材料。

## 完成检查

- PDF 已通过文字提取和逐页视觉检查。
- 照片状态已逐页确认；显示照片时，其规范化字节、尺寸、哈希、原始 PDF 哈希、页码和提取位置可追溯，非显示元数据与尾随内容已移除，且没有使用公开头像或生物识别分析。
- 后台岗位、证据、来源、蓝图和评分对象可互相追溯。
- HTML 文件名、浏览器标题和页面主标题都包含候选人姓名。
- HTML 只有三个主模块，问题数为 12–18。
- 面试官数据和 HTML 不含邮箱、手机号、证件号或精确住址。
- 候选人已明确提供的学校、工作单位和城市已汇总；缺失项没有被推测。
- 出生信息存在时年龄已按报告日期换算，并禁用履历推算；出生信息不存在时，年龄事实显示“未提供”，履历推算对象按明确本科时间锚点生成，或透明记录证据不足/时间冲突。
- 照片、年龄（含履历推算区间）、籍贯和婚姻没有进入岗位匹配、评分、稳定性判断或排序。
- 简历疑点按岗位重要性排序，使用中性、通俗中文。
- 问题可直接照读，判断参考和加减分标准具体。
- 重点标记、回答、备注、本机恢复、导出和清空均可用。
- 页面离线可用、无外部资源、文本安全转义、移动端可读。
- 最终输出不含自动录用、淘汰、排序、人格诊断或虚假确定性。

